Script 'mail_helper' called by obssrc
Hello community,

here is the log from the commit of package python-nbconvert for 
openSUSE:Factory checked in at 2022-08-11 18:33:01
++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++
Comparing /work/SRC/openSUSE:Factory/python-nbconvert (Old)
 and      /work/SRC/openSUSE:Factory/.python-nbconvert.new.1521 (New)
++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++

Package is "python-nbconvert"

Thu Aug 11 18:33:01 2022 rev:14 rq:994560 version:6.5.3

Changes:
--------
--- /work/SRC/openSUSE:Factory/python-nbconvert/python-nbconvert.changes        
2022-06-05 21:28:39.665056916 +0200
+++ 
/work/SRC/openSUSE:Factory/.python-nbconvert.new.1521/python-nbconvert.changes  
    2022-08-11 18:33:17.638200044 +0200
@@ -1,0 +2,35 @@
+Thu Aug 11 14:01:34 UTC 2022 - Arun Persaud <a...@gmx.de>
+
+- specfile
+  * remove skip python 2, since we require python >= 3.7 anyway
+  * updates patches
+  * require lxml
+
+- update to version 6.5.3:
+  * Fix title (#1833)
+
+- changes from version 6.5.2:
+  * escape_html: prevent escaping quotes on widgets JSON reprs (#1829)
+  * Fix linters (#1828)
+  * pre-commit-ci[bot] authored and SylvainCorlay committed 2 days ago
+  * Remove downloaded CSS from repository
+
+- changes from version 6.5.1:
+  * Fix pre-commit
+  * Fix tests
+  * Run black and prettier
+  * Run test on 6.x branch
+  * Convert input to string prior to escape HTML
+  * Check input type before escaping
+  * GHSL-2021-1017, GHSL-2021-1020, GHSL-2021-1021
+  * GHSL-2021-1026, GHSL-2021-1025
+  * GHSL-2021-1024
+  * GHSL-2021-1023
+  * GHSL-2021-1022
+  * GHSL-2021-1019
+  * GHSL-2021-1018
+  * GHSL-2021-1027, GHSL-2021-1028
+  * GHSL-2021-1014, GHSL-2021-1015, GHSL-2021-1016
+  * GHSL-2021-1013
+
+-------------------------------------------------------------------

Old:
----
  nbconvert-6.5.0.tar.gz

New:
----
  nbconvert-6.5.3.tar.gz

++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++

Other differences:
------------------
++++++ python-nbconvert.spec ++++++
--- /var/tmp/diff_new_pack.3Q8kk1/_old  2022-08-11 18:33:18.230199135 +0200
+++ /var/tmp/diff_new_pack.3Q8kk1/_new  2022-08-11 18:33:18.234199130 +0200
@@ -30,9 +30,8 @@
 %bcond_with libalternatives
 %endif
 %{?!python_module:%define python_module() python3-%{**}}
-%define skip_python2 1
 Name:           python-nbconvert%{psuffix}
-Version:        6.5.0
+Version:        6.5.3
 Release:        0
 Summary:        Conversion of Jupyter Notebooks
 License:        BSD-3-Clause
@@ -46,6 +45,7 @@
 Patch2:         ignore-bleach-deprecation-test.patch
 BuildRequires:  %{python_module base >= 3.7}
 BuildRequires:  %{python_module beautifulsoup4}
+BuildRequires:  %{python_module lxml}
 BuildRequires:  %{python_module packaging}
 BuildRequires:  %{python_module setuptools}
 BuildRequires:  fdupes
@@ -61,6 +61,7 @@
 Requires:       python-entrypoints >= 0.2.2
 Requires:       python-jupyter-core >= 4.7
 Requires:       python-jupyterlab-pygments
+Requires:       python-lxml
 Requires:       python-nbclient >= 0.5
 Requires:       python-nbformat >= 5.1
 Requires:       python-packaging

++++++ ignore-bleach-deprecation-test.patch ++++++
--- /var/tmp/diff_new_pack.3Q8kk1/_old  2022-08-11 18:33:18.274199068 +0200
+++ /var/tmp/diff_new_pack.3Q8kk1/_new  2022-08-11 18:33:18.278199062 +0200
@@ -1,12 +1,11 @@
-Index: nbconvert-6.5.0/pyproject.toml
+Index: nbconvert-6.5.3/pyproject.toml
 ===================================================================
---- nbconvert-6.5.0.orig/pyproject.toml
-+++ nbconvert-6.5.0/pyproject.toml
-@@ -21,5 +21,5 @@ filterwarnings = [
+--- nbconvert-6.5.3.orig/pyproject.toml
++++ nbconvert-6.5.3/pyproject.toml
+@@ -21,4 +21,5 @@ filterwarnings = [
      "ignore:unclosed <socket.socket:ResourceWarning",
      "ignore:unclosed event loop:ResourceWarning",
      "ignore:There is no current event loop:DeprecationWarning",
--
 +    "ignore:Support for bleach <5 will be removed in a future version of 
nbconvert:DeprecationWarning",
  ]
 

++++++ nbconvert-6.5.0.tar.gz -> nbconvert-6.5.3.tar.gz ++++++
diff -urN '--exclude=CVS' '--exclude=.cvsignore' '--exclude=.svn' 
'--exclude=.svnignore' old/nbconvert-6.5.0/PKG-INFO new/nbconvert-6.5.3/PKG-INFO
--- old/nbconvert-6.5.0/PKG-INFO        2022-04-11 11:09:33.618694000 +0200
+++ new/nbconvert-6.5.3/PKG-INFO        2022-08-11 13:52:08.571465300 +0200
@@ -1,6 +1,6 @@
 Metadata-Version: 2.1
 Name: nbconvert
-Version: 6.5.0
+Version: 6.5.3
 Summary: Converting Jupyter Notebooks
 Home-page: https://jupyter.org
 Author: Jupyter Development Team
@@ -122,5 +122,3 @@
 - [Project Jupyter website](https://jupyter.org)
 
 [jinja]: http://jinja.pocoo.org/
-
-
diff -urN '--exclude=CVS' '--exclude=.cvsignore' '--exclude=.svn' 
'--exclude=.svnignore' old/nbconvert-6.5.0/nbconvert/_version.py 
new/nbconvert-6.5.3/nbconvert/_version.py
--- old/nbconvert-6.5.0/nbconvert/_version.py   2022-04-11 11:08:24.340618100 
+0200
+++ new/nbconvert-6.5.3/nbconvert/_version.py   2022-08-11 13:49:49.310203300 
+0200
@@ -1,4 +1,4 @@
-version_info = (6, 5, 0)
+version_info = (6, 5, 3)
 pre_info = ""
 dev_info = ""
 
diff -urN '--exclude=CVS' '--exclude=.cvsignore' '--exclude=.svn' 
'--exclude=.svnignore' old/nbconvert-6.5.0/nbconvert/exporters/html.py 
new/nbconvert-6.5.3/nbconvert/exporters/html.py
--- old/nbconvert-6.5.0/nbconvert/exporters/html.py     2022-04-11 
11:07:42.625555800 +0200
+++ new/nbconvert-6.5.3/nbconvert/exporters/html.py     2022-08-09 
16:16:56.749613000 +0200
@@ -149,6 +149,14 @@
         help="Template specific theme(e.g. the name of a JupyterLab CSS theme 
distributed as prebuilt extension for the lab template)",
     ).tag(config=True)
 
+    sanitize_html = Bool(
+        False,
+        help=(
+            "Whether the HTML in Markdown cells and cell outputs should be 
sanitized."
+            "This should be set to True by nbviewer or similar tools."
+        ),
+    ).tag(config=True)
+
     embed_images = Bool(
         False, help="Whether or not to embed images as base64 in markdown 
cells."
     ).tag(config=True)
@@ -287,4 +295,5 @@
         resources["jupyter_widgets_base_url"] = self.jupyter_widgets_base_url
         resources["widget_renderer_url"] = self.widget_renderer_url
         resources["html_manager_semver_range"] = self.html_manager_semver_range
+        resources["should_sanitize_html"] = self.sanitize_html
         return resources
diff -urN '--exclude=CVS' '--exclude=.cvsignore' '--exclude=.svn' 
'--exclude=.svnignore' 
old/nbconvert-6.5.0/nbconvert/exporters/templateexporter.py 
new/nbconvert-6.5.3/nbconvert/exporters/templateexporter.py
--- old/nbconvert-6.5.0/nbconvert/exporters/templateexporter.py 2022-04-11 
11:07:42.626543000 +0200
+++ new/nbconvert-6.5.3/nbconvert/exporters/templateexporter.py 2022-08-11 
10:02:47.701777200 +0200
@@ -6,6 +6,7 @@
 # Distributed under the terms of the Modified BSD License.
 
 
+import html
 import json
 import os
 import uuid
@@ -21,6 +22,7 @@
     TemplateNotFound,
 )
 from jupyter_core.paths import jupyter_path
+from lxml.html.clean import clean_html
 from traitlets import Bool, Dict, HasTraits, List, Unicode, default, observe, 
validate
 from traitlets.config import Config
 from traitlets.utils.importstring import import_item
@@ -68,9 +70,11 @@
     "get_metadata": filters.get_metadata,
     "convert_pandoc": filters.convert_pandoc,
     "json_dumps": json.dumps,
-    # browsers will parse </script>, closing a script tag early
-    # Since JSON allows escaping forward slash, this will still be parsed by 
JSON
-    "escape_html_script": lambda x: x.replace("</script>", "<\\/script>"),
+    # For removing any HTML
+    "escape_html": lambda s: html.escape(str(s)),
+    "escape_html_keep_quotes": lambda s: html.escape(str(s), quote=False),
+    # For sanitizing HTML for any XSS
+    "clean_html": clean_html,
     "strip_trailing_newline": filters.strip_trailing_newline,
     "text_base64": filters.text_base64,
 }
@@ -254,7 +258,8 @@
     template_extension = Unicode().tag(config=True, affects_environment=True)
 
     template_data_paths = List(
-        jupyter_path("nbconvert", "templates"), help="Path where templates can 
be installed too."
+        jupyter_path("nbconvert", "templates"),
+        help="Path where templates can be installed too.",
     ).tag(affects_environment=True)
 
     # Extension that the template files use.
@@ -268,11 +273,13 @@
             return self.file_extension
 
     exclude_input = Bool(
-        False, help="This allows you to exclude code cell inputs from all 
templates if set to True."
+        False,
+        help="This allows you to exclude code cell inputs from all templates 
if set to True.",
     ).tag(config=True)
 
     exclude_input_prompt = Bool(
-        False, help="This allows you to exclude input prompts from all 
templates if set to True."
+        False,
+        help="This allows you to exclude input prompts from all templates if 
set to True.",
     ).tag(config=True)
 
     exclude_output = Bool(
@@ -281,7 +288,8 @@
     ).tag(config=True)
 
     exclude_output_prompt = Bool(
-        False, help="This allows you to exclude output prompts from all 
templates if set to True."
+        False,
+        help="This allows you to exclude output prompts from all templates if 
set to True.",
     ).tag(config=True)
 
     exclude_output_stdin = Bool(
@@ -290,19 +298,23 @@
     ).tag(config=True)
 
     exclude_code_cell = Bool(
-        False, help="This allows you to exclude code cells from all templates 
if set to True."
+        False,
+        help="This allows you to exclude code cells from all templates if set 
to True.",
     ).tag(config=True)
 
     exclude_markdown = Bool(
-        False, help="This allows you to exclude markdown cells from all 
templates if set to True."
+        False,
+        help="This allows you to exclude markdown cells from all templates if 
set to True.",
     ).tag(config=True)
 
     exclude_raw = Bool(
-        False, help="This allows you to exclude raw cells from all templates 
if set to True."
+        False,
+        help="This allows you to exclude raw cells from all templates if set 
to True.",
     ).tag(config=True)
 
     exclude_unknown = Bool(
-        False, help="This allows you to exclude unknown cells from all 
templates if set to True."
+        False,
+        help="This allows you to exclude unknown cells from all templates if 
set to True.",
     ).tag(config=True)
 
     extra_loaders = List(
@@ -341,7 +353,8 @@
         super().__init__(config=config, **kw)
 
         self.observe(
-            self._invalidate_environment_cache, 
list(self.traits(affects_environment=True))
+            self._invalidate_environment_cache,
+            list(self.traits(affects_environment=True)),
         )
         self.observe(self._invalidate_template_cache, 
list(self.traits(affects_template=True)))
 
@@ -603,7 +616,11 @@
                 for root_dir in root_dirs:
                     compatibility_file = base_template + ".tpl"
                     compatibility_path = os.path.join(
-                        root_dir, "nbconvert", "templates", "compatibility", 
compatibility_file
+                        root_dir,
+                        "nbconvert",
+                        "templates",
+                        "compatibility",
+                        compatibility_file,
                     )
                     if os.path.exists(compatibility_path):
                         found_at_least_one = True
diff -urN '--exclude=CVS' '--exclude=.cvsignore' '--exclude=.svn' 
'--exclude=.svnignore' 
old/nbconvert-6.5.0/nbconvert/exporters/tests/files/notebook_inject.ipynb 
new/nbconvert-6.5.3/nbconvert/exporters/tests/files/notebook_inject.ipynb
--- old/nbconvert-6.5.0/nbconvert/exporters/tests/files/notebook_inject.ipynb   
1970-01-01 01:00:00.000000000 +0100
+++ new/nbconvert-6.5.3/nbconvert/exporters/tests/files/notebook_inject.ipynb   
2022-08-09 14:44:17.467249400 +0200
@@ -0,0 +1,303 @@
+{
+ "cells": [
+  {
+   "cell_type": "code",
+   "execution_count": null,
+   "id": "79aede83-fba6-4715-bce6-9f3926b128a2",
+   "metadata": {
+     "tags": ["FOO\"><script>alert('cell_tag')</script><div \""]
+   },
+   "outputs": [],
+   "source": []
+  },
+  {
+    "cell_type": "raw",
+    "id": "372c2bf1",
+    "metadata": {},
+    "source": [
+     "Payload in raw cell <script>alert('raw cell')</script>"
+    ]
+  },
+  {
+    "cell_type": "markdown",
+    "id": "2d42de4a",
+    "metadata": {},
+    "source": [
+      "<script>alert('markdown cell')</script>"
+    ]
+  },
+  {
+    "cell_type": "code",
+    "execution_count": null,
+    "id": "b72e53fa",
+    "metadata": {},
+    "outputs": [
+      {
+        "output_type": "execute_result",
+        "data": {
+          "image/svg+xml": ["<script>alert('image/svg+xml output')</script>"]
+        },
+        "execution_count": null,
+        "metadata": {}
+      }
+    ],
+    "source": [""]
+   },
+   {
+    "cell_type": "code",
+    "execution_count": null,
+    "id": "64d5d39f",
+    "metadata": {},
+    "outputs": [
+      {
+        "output_type": "execute_result",
+        "svg_filename": "\"><script>alert('svg_filename')</script>",
+        "data": {
+          "image/svg+xml": [""]
+        },
+        "execution_count": null,
+        "metadata": {}
+      }
+    ],
+    "source": [""]
+   },
+   {
+    "cell_type": "code",
+    "execution_count": null,
+    "id": "b72e63fa",
+    "metadata": {},
+    "outputs": [
+      {
+        "output_type": "execute_result",
+        "data": {
+          "image/png": [""]
+        },
+        "execution_count": null,
+        "metadata": {
+          "filenames": {
+              "image/png": "\"><script>alert('png filenames')</script>"
+          }
+        }
+      }
+    ],
+    "source": [""]
+   },
+   {
+    "cell_type": "code",
+    "execution_count": null,
+    "id": "b72e63f3",
+    "metadata": {},
+    "outputs": [
+      {
+        "output_type": "execute_result",
+        "data": {
+          "image/jpeg": [""]
+        },
+        "execution_count": null,
+        "metadata": {
+          "filenames": {
+              "image/jpeg": "\"><script>alert('jpg filenames')</script>"
+          }
+        }
+      }
+    ],
+    "source": [""]
+   },
+   {
+    "cell_type": "code",
+    "execution_count": null,
+    "id": "b72e635a",
+    "metadata": {},
+    "outputs": [
+      {
+        "output_type": "execute_result",
+        "data": {
+          "image/png": ["\"><script>alert('image/png output')</script>"]
+        },
+        "execution_count": null,
+        "metadata": {}
+      }
+    ],
+    "source": [""]
+   },
+   {
+    "cell_type": "code",
+    "execution_count": null,
+    "id": "p72e635a",
+    "metadata": {},
+    "outputs": [
+      {
+        "output_type": "execute_result",
+        "data": {
+          "image/jpeg": ["\"><script>alert('image/jpeg output')</script>"]
+        },
+        "execution_count": null,
+        "metadata": {}
+      }
+    ],
+    "source": [""]
+   },
+   {
+    "cell_type": "code",
+    "execution_count": null,
+    "id": "d72e635a",
+    "metadata": {},
+    "outputs": [
+      {
+        "output_type": "execute_result",
+        "data": {
+         "image/png": ["abcd"]
+        },
+        "execution_count": null,
+        "metadata": {
+           "width": "><script>alert('output.metadata.width png 
injection')</script>"
+        }
+      }
+    ],
+    "source": [""]
+   },
+   {
+    "cell_type": "code",
+    "execution_count": null,
+    "id": "d72e095a",
+    "metadata": {},
+    "outputs": [
+      {
+        "output_type": "execute_result",
+        "data": {
+         "image/png": ["abcd"]
+        },
+        "execution_count": null,
+        "metadata": {
+           "width": ["><script>alert('output.metadata.width png 
injection')</script>"]
+        }
+      }
+    ],
+    "source": [""]
+   },
+   {
+    "cell_type": "code",
+    "execution_count": null,
+    "id": "ae4f574d",
+    "metadata": {},
+    "outputs": [
+      {
+        "output_type": "execute_result",
+        "data": {
+         "image/png": ["abcd"]
+        },
+        "execution_count": null,
+        "metadata": {
+           "height": "><script>alert('output.metadata.height png 
injection')</script>"
+        }
+      }
+    ],
+    "source": [""]
+   },
+   {
+    "cell_type": "code",
+    "execution_count": null,
+    "id": "w72e635a",
+    "metadata": {},
+    "outputs": [
+      {
+        "output_type": "execute_result",
+        "data": {
+         "application/vnd.jupyter.widget-view+json": {"model_id": "wid1", 
"foo": 
"\"</script><script>alert('output.data.application/vnd.jupyter.widget-view+json 
injection')//"}
+        },
+        "execution_count": null,
+        "metadata": {}
+       }
+    ],
+    "source": [""]
+   },
+   {
+    "cell_type": "code",
+    "execution_count": 5,
+    "id": "2616e107",
+    "metadata": {},
+    "outputs": [
+     {
+      "data": {
+       "text/html": [
+         "<script>alert('text/html output')</script>"
+       ]
+      },
+      "execution_count": 5,
+      "metadata": {},
+      "output_type": "execute_result"
+     }
+    ],
+    "source": [
+     "import os; os.system('touch /tmp/pwned')"
+    ]
+   },
+   {
+    "cell_type": "code",
+    "execution_count": 5,
+    "id": "3616e107",
+    "metadata": {},
+    "outputs": [
+     {
+      "data": {
+       "text/markdown": [
+         "<script>alert('text/markdown output')</script>"
+       ]
+      },
+      "execution_count": 5,
+      "metadata": {},
+      "output_type": "execute_result"
+     }
+    ],
+    "source": [
+     "import os; os.system('touch /tmp/pwned')"
+    ]
+   },
+   {
+    "cell_type": "code",
+    "execution_count": 5,
+    "id": "4616e107",
+    "metadata": {},
+    "outputs": [
+     {
+      "data": {
+       "application/javascript": [
+         "alert('application/javascript output')"
+       ]
+      },
+      "execution_count": 5,
+      "metadata": {},
+      "output_type": "execute_result"
+     }
+    ],
+    "source": [
+     "import os; os.system('touch /tmp/pwned')"
+    ]
+   }
+ ],
+ "metadata": {
+  "title": "TITLE</title><script>alert('title')</script>",
+  "kernelspec": {
+   "display_name": "Python 3 (ipykernel)",
+   "language": "python",
+   "name": "python3"
+  },
+  "language_info": {
+   "codemirror_mode": {
+    "name": "ipython",
+    "version": 3
+   },
+   "file_extension": ".py",
+   "mimetype": "text/x-python",
+   "name": "python",
+   "nbconvert_exporter": "python",
+   "pygments_lexer": "ipython3",
+   "version": "3.10.5"
+  },
+  "widgets": {
+    "application/vnd.jupyter.widget-state+json": {"state": {"wid1": {}}, 
"foo": "pwntester</script><script>alert('widgets');//"}
+  }
+ },
+ "nbformat": 4,
+ "nbformat_minor": 5
+}
diff -urN '--exclude=CVS' '--exclude=.cvsignore' '--exclude=.svn' 
'--exclude=.svnignore' 
old/nbconvert-6.5.0/nbconvert/exporters/tests/test_html.py 
new/nbconvert-6.5.3/nbconvert/exporters/tests/test_html.py
--- old/nbconvert-6.5.0/nbconvert/exporters/tests/test_html.py  2022-04-11 
11:07:42.628263000 +0200
+++ new/nbconvert-6.5.3/nbconvert/exporters/tests/test_html.py  2022-08-09 
16:16:56.750613000 +0200
@@ -134,3 +134,66 @@
             self._get_notebook()
         )
         assert len(output) > 0
+
+    def test_javascript_injection(self):
+        for template in ["lab", "classic", "reveal"]:
+            (output, resources) = 
HTMLExporter(template_name=template).from_filename(
+                self._get_notebook("notebook_inject.ipynb")
+            )
+
+            # Check injection in the metadata.title of the Notebook
+            assert "<script>alert('title')</script>" not in output
+
+            # Check injection in the metadata.widgets of the Notebook
+            assert "</script><script>alert('widgets')" not in output
+
+            # Check injection in the cell.metadata.tags of the Notebook
+            assert "<script>alert('cell_tag')</script>" not in output
+
+            # Check injection in the cell.source of the Notebook
+            assert "<script>alert('raw cell')</script>" not in output
+
+            # Check injection in svg output
+            assert "<script>alert('image/svg+xml output')</script>" not in 
output
+            assert "<script>alert('svg_filename')</script>" not in output
+
+            # Check injection in image filenames
+            assert "<script>alert('png filenames')</script>" not in output
+            assert "<script>alert('jpg filenames')</script>" not in output
+
+            # Check injection in image data
+            assert "<script>alert('image/png output')</script>" not in output
+            assert "<script>alert('image/jpeg output')</script>" not in output
+
+            # Check injection in image width/height
+            assert "<script>alert('output.metadata.width png 
injection')</script>" not in output
+            assert "<script>alert('output.metadata.height png 
injection')</script>" not in output
+
+            # Check injection in widget view
+            assert (
+                
"<script>alert('output.data.application/vnd.jupyter.widget-view+json 
injection')"
+                not in output
+            )
+
+        # By design, text/html, text/markdown, application/javascript and 
markdown cells should allow
+        # for JavaScript code execution
+        for template in ["lab", "classic", "reveal"]:
+            (output, resources) = 
HTMLExporter(template_name=template).from_filename(
+                self._get_notebook("notebook_inject.ipynb")
+            )
+
+            assert "<script>alert('markdown cell')</script>" in output
+            assert "<script>alert('text/markdown output')</script>" in output
+            assert "<script>alert('text/html output')</script>" in output
+            assert "alert('application/javascript output')" in output
+
+        # But it's an opt-out
+        for template in ["lab", "classic", "reveal"]:
+            (output, resources) = HTMLExporter(
+                template_name=template, sanitize_html=True
+            ).from_filename(self._get_notebook("notebook_inject.ipynb"))
+
+            assert "<script>alert('markdown cell')</script>" not in output
+            assert "<script>alert('text/markdown output')</script>" not in 
output
+            assert "<script>alert('text/html output')</script>" not in output
+            assert "alert('application/javascript output')" not in output
diff -urN '--exclude=CVS' '--exclude=.cvsignore' '--exclude=.svn' 
'--exclude=.svnignore' old/nbconvert-6.5.0/nbconvert/filters/highlight.py 
new/nbconvert-6.5.3/nbconvert/filters/highlight.py
--- old/nbconvert-6.5.0/nbconvert/filters/highlight.py  2022-04-11 
11:07:42.629658200 +0200
+++ new/nbconvert-6.5.3/nbconvert/filters/highlight.py  2022-08-09 
16:16:56.750613000 +0200
@@ -10,6 +10,7 @@
 # because errors should be raised at runtime if it's actually needed,
 # not import time, when it may not be needed.
 
+from html import escape
 from warnings import warn
 
 from traitlets import observe
@@ -67,7 +68,9 @@
         return _pygments_highlight(
             source if len(source) > 0 else " ",
             # needed to help post processors:
-            HtmlFormatter(cssclass=" highlight hl-" + language, 
**self.extra_formatter_options),
+            HtmlFormatter(
+                cssclass=escape(f" highlight hl-{language}"), 
**self.extra_formatter_options
+            ),
             language,
             metadata,
         )
diff -urN '--exclude=CVS' '--exclude=.cvsignore' '--exclude=.svn' 
'--exclude=.svnignore' 
old/nbconvert-6.5.0/nbconvert/filters/tests/test_highlight.py 
new/nbconvert-6.5.3/nbconvert/filters/tests/test_highlight.py
--- old/nbconvert-6.5.0/nbconvert/filters/tests/test_highlight.py       
2022-04-11 11:07:42.630565400 +0200
+++ new/nbconvert-6.5.3/nbconvert/filters/tests/test_highlight.py       
2022-08-09 16:16:56.750613000 +0200
@@ -16,6 +16,8 @@
 
 import xml
 
+import pytest
+
 from ...tests.base import TestsBase
 from ..highlight import Highlight2HTML, Highlight2Latex
 
@@ -72,6 +74,11 @@
             root = xml.etree.ElementTree.fromstring(lang)
             self.assertEqual(self._extract_tokens(root, "k"), set(tkns))
 
+    @pytest.mark.filterwarnings("ignore")
+    def test_inject_html(self):
+        out = highlight2html(self.tests[0], 
'ipython3-foo"><script>alert(1)</script>')
+        assert "<script>alert(1)</script>" not in out
+
     def _extract_tokens(self, root, cls):
         return set(map(lambda x: x.text, root.findall(".//*[@class='" + cls + 
"']")))
 
diff -urN '--exclude=CVS' '--exclude=.cvsignore' '--exclude=.svn' 
'--exclude=.svnignore' old/nbconvert-6.5.0/nbconvert/nbconvertapp.py 
new/nbconvert-6.5.3/nbconvert/nbconvertapp.py
--- old/nbconvert-6.5.0/nbconvert/nbconvertapp.py       2022-04-11 
11:07:42.631174800 +0200
+++ new/nbconvert-6.5.3/nbconvert/nbconvertapp.py       2022-08-11 
10:02:47.702777100 +0200
@@ -65,6 +65,7 @@
         "template": "TemplateExporter.template_name",
         "template-file": "TemplateExporter.template_file",
         "theme": "HTMLExporter.theme",
+        "sanitize_html": "HTMLExporter.sanitize_html",
         "writer": "NbConvertApp.writer_class",
         "post": "NbConvertApp.postprocessor_class",
         "output": "NbConvertApp.output_base",
@@ -178,6 +179,14 @@
             },
             """Embed the images as base64 dataurls in the output. This flag is 
only useful for the HTML/WebPDF/Slides exports.""",
         ),
+        "sanitize-html": (
+            {
+                "HTMLExporter": {
+                    "sanitize_html": True,
+                }
+            },
+            """Whether the HTML in Markdown cells and cell outputs should be 
sanitized..""",
+        ),
     }
 )
 
diff -urN '--exclude=CVS' '--exclude=.cvsignore' '--exclude=.svn' 
'--exclude=.svnignore' old/nbconvert-6.5.0/nbconvert/tests/test_nbconvertapp.py 
new/nbconvert-6.5.3/nbconvert/tests/test_nbconvertapp.py
--- old/nbconvert-6.5.0/nbconvert/tests/test_nbconvertapp.py    2022-04-11 
11:07:42.638745000 +0200
+++ new/nbconvert-6.5.3/nbconvert/tests/test_nbconvertapp.py    2022-08-09 
16:16:56.750613000 +0200
@@ -374,7 +374,7 @@
                     '<span class="o">=</span> '
                     '<span class="n">symbols</span>'
                     '<span class="p">(</span>'
-                    '<span class="s1">&#39;x y z&#39;</span>'
+                    "<span class=\"s1\">'x y z'</span>"
                     '<span class="p">)</span>'
                 ) not in text
             self.nbconvert("notebook1.ipynb --log-level 0 --to html")
@@ -392,7 +392,7 @@
                     '<span class="o">=</span> '
                     '<span class="n">symbols</span>'
                     '<span class="p">(</span>'
-                    '<span class="s1">&#39;x y z&#39;</span>'
+                    "<span class=\"s1\">'x y z'</span>"
                     '<span class="p">)</span>'
                 ) in text2
 
diff -urN '--exclude=CVS' '--exclude=.cvsignore' '--exclude=.svn' 
'--exclude=.svnignore' old/nbconvert-6.5.0/pyproject.toml 
new/nbconvert-6.5.3/pyproject.toml
--- old/nbconvert-6.5.0/pyproject.toml  2022-04-11 11:07:42.640669600 +0200
+++ new/nbconvert-6.5.3/pyproject.toml  2022-08-11 10:02:47.702777100 +0200
@@ -21,5 +21,4 @@
     "ignore:unclosed <socket.socket:ResourceWarning",
     "ignore:unclosed event loop:ResourceWarning",
     "ignore:There is no current event loop:DeprecationWarning",
-
 ]
diff -urN '--exclude=CVS' '--exclude=.cvsignore' '--exclude=.svn' 
'--exclude=.svnignore' old/nbconvert-6.5.0/setup.py new/nbconvert-6.5.3/setup.py
--- old/nbconvert-6.5.0/setup.py        2022-04-11 11:07:42.641157900 +0200
+++ new/nbconvert-6.5.3/setup.py        2022-08-11 10:02:47.702777100 +0200
@@ -237,6 +237,7 @@
 )
 
 setup_args["install_requires"] = [
+    "lxml",
     "beautifulsoup4",
     "bleach",
     "defusedxml",
diff -urN '--exclude=CVS' '--exclude=.cvsignore' '--exclude=.svn' 
'--exclude=.svnignore' 
old/nbconvert-6.5.0/share/jupyter/nbconvert/templates/base/celltags.j2 
new/nbconvert-6.5.3/share/jupyter/nbconvert/templates/base/celltags.j2
--- old/nbconvert-6.5.0/share/jupyter/nbconvert/templates/base/celltags.j2      
2022-04-11 11:07:42.641669000 +0200
+++ new/nbconvert-6.5.3/share/jupyter/nbconvert/templates/base/celltags.j2      
2022-08-11 10:02:47.703777000 +0200
@@ -1,7 +1,7 @@
 {%- macro celltags(cell) -%}
     {% if cell.metadata.tags | length > 0 -%}
-        {% for tag in cell.metadata.tags -%}
-            {{ ' celltag_' ~ tag -}}
+        {% for tag in (cell.metadata.tags) -%}
+            {{ (' celltag_' ~ tag) | escape_html -}}
         {%- endfor -%}
     {%- endif %}
 {%- endmacro %}
diff -urN '--exclude=CVS' '--exclude=.cvsignore' '--exclude=.svn' 
'--exclude=.svnignore' 
old/nbconvert-6.5.0/share/jupyter/nbconvert/templates/classic/base.html.j2 
new/nbconvert-6.5.3/share/jupyter/nbconvert/templates/classic/base.html.j2
--- old/nbconvert-6.5.0/share/jupyter/nbconvert/templates/classic/base.html.j2  
2022-04-11 11:07:42.642274600 +0200
+++ new/nbconvert-6.5.3/share/jupyter/nbconvert/templates/classic/base.html.j2  
2022-08-11 10:02:47.704777200 +0200
@@ -46,7 +46,7 @@
 {% block input %}
 <div class="inner_cell">
     <div class="input_area">
-{{ cell.source | highlight_code(metadata=cell.metadata) }}
+{{ cell.source | highlight_code(metadata=cell.metadata) | clean_html }}
     </div>
 </div>
 {%- endblock input %}
@@ -81,12 +81,23 @@
 {%- endif -%}
 <div class="inner_cell">
 <div class="text_cell_render border-box-sizing rendered_html">
-{{ cell.source  | markdown2html | strip_files_prefix }}
+{%- if resources.should_sanitize_html %}
+{%- set html_value=cell.source  | markdown2html | strip_files_prefix | 
clean_html -%}
+{%- else %}
+{%- set html_value=cell.source  | markdown2html | strip_files_prefix -%}
+{%- endif %}
+{{ html_value }}
 </div>
 </div>
 </div>
 {%- endblock markdowncell %}
 
+{% block rawcell scoped %}
+{%- if cell.metadata.get('raw_mimetype', '').lower() in 
resources.get('raw_mimetypes', ['']) -%}
+{{ cell.source | clean_html }}
+{%- endif -%}
+{%- endblock rawcell %}
+
 {% block unknowncell scoped %}
 unknown type  {{ cell.type }}
 {% endblock unknowncell %}
@@ -118,56 +129,66 @@
 {% block data_svg scoped -%}
 <div class="output_svg output_subarea {{ extra_class }}">
 {%- if output.svg_filename %}
-<img src="{{ output.svg_filename | posix_path }}">
+<img src="{{ output.svg_filename | posix_path | escape_html }}">
 {%- else %}
-{{ output.data['image/svg+xml'] }}
+{{ output.data['image/svg+xml'] | clean_html }}
 {%- endif %}
 </div>
 {%- endblock data_svg %}
 
 {% block data_html scoped -%}
 <div class="output_html rendered_html output_subarea {{ extra_class }}">
+{%- if resources.should_sanitize_html %}
+{%- set html_value=output.data['text/html'] | clean_html -%}
+{%- else %}
+{%- set html_value=output.data['text/html'] -%}
+{%- endif %}
 {%- if output.get('metadata', {}).get('text/html', {}).get('isolated') -%}
 <iframe
     class="isolated-iframe"
     style="height:520px; width:100%; margin:0; padding: 0"
     frameborder="0"
     scrolling="auto"
-    src="data:text/html;base64,{{output.data['text/html'] | text_base64}}">
+    src="data:text/html;base64,{{ html_value | text_base64 }}">
 </iframe>
 {%- else -%}
-{{ output.data['text/html'] }}
+{{ html_value }}
 {%- endif -%}
 </div>
 {%- endblock data_html %}
 
 {% block data_markdown scoped -%}
+{%- if resources.should_sanitize_html %}
+{%- set html_value=output.data['text/markdown'] | markdown2html | clean_html 
-%}
+{%- else %}
+{%- set html_value=output.data['text/markdown'] | markdown2html -%}
+{%- endif %}
 <div class="output_markdown rendered_html output_subarea {{ extra_class }}">
-{{ output.data['text/markdown'] | markdown2html }}
+{{ html_value }}
 </div>
 {%- endblock data_markdown %}
 
 {% block data_png scoped %}
 <div class="output_png output_subarea {{ extra_class }}">
 {%- if 'image/png' in output.metadata.get('filenames', {}) %}
-<img src="{{ output.metadata.filenames['image/png'] | posix_path }}"
+<img src="{{ output.metadata.filenames['image/png'] | posix_path | escape_html 
}}"
 {%- else %}
-<img src="data:image/png;base64,{{ output.data['image/png'] }}"
+<img src="data:image/png;base64,{{ output.data['image/png'] | escape_html }}"
 {%- endif %}
 {%- set width=output | get_metadata('width', 'image/png') -%}
 {%- if width is not none %}
-width={{ width }}
+width={{ width | escape_html }}
 {%- endif %}
 {%- set height=output | get_metadata('height', 'image/png') -%}
 {%- if height is not none %}
-height={{ height }}
+height={{ height | escape_html }}
 {%- endif %}
 {%- if output | get_metadata('unconfined', 'image/png') %}
 class="unconfined"
 {%- endif %}
 {%- set alttext=(output | get_metadata('alt', 'image/png')) or (cell | 
get_metadata('alt')) -%}
 {%- if alttext is not none %}
-alt="{{ alttext }}"
+alt="{{ alttext | escape_html }}"
 {%- endif %}
 >
 </div>
@@ -176,24 +197,24 @@
 {% block data_jpg scoped %}
 <div class="output_jpeg output_subarea {{ extra_class }}">
 {%- if 'image/jpeg' in output.metadata.get('filenames', {}) %}
-<img src="{{ output.metadata.filenames['image/jpeg'] | posix_path }}"
+<img src="{{ output.metadata.filenames['image/jpeg'] | posix_path | 
escape_html }}"
 {%- else %}
-<img src="data:image/jpeg;base64,{{ output.data['image/jpeg'] }}"
+<img src="data:image/jpeg;base64,{{ output.data['image/jpeg'] | escape_html }}"
 {%- endif %}
 {%- set width=output | get_metadata('width', 'image/jpeg') -%}
 {%- if width is not none %}
-width={{ width }}
+width={{ width | escape_html }}
 {%- endif %}
 {%- set height=output | get_metadata('height', 'image/jpeg') -%}
 {%- if height is not none %}
-height={{ height }}
+height={{ height | escape_html }}
 {%- endif %}
 {%- if output | get_metadata('unconfined', 'image/jpeg') %}
 class="unconfined"
 {%- endif %}
 {%- set alttext=(output | get_metadata('alt', 'image/jpeg')) or (cell | 
get_metadata('alt')) -%}
 {%- if alttext is not none %}
-alt="{{ alttext }}"
+alt="{{ alttext | escape_html }}"
 {%- endif %}
 >
 </div>
@@ -228,28 +249,17 @@
 {%- block data_javascript scoped %}
 {% set div_id = uuid4() %}
 <div id="{{ div_id }}" class="output_subarea output_javascript {{ extra_class 
}}">
+{%- if not resources.should_sanitize_html %}
 <script type="text/javascript">
 var element = $('#{{ div_id }}');
 {{ output.data['application/javascript'] }}
 </script>
+{%- endif %}
 </div>
 {%- endblock -%}
 
-{%- block data_widget_state scoped %}
-{% set div_id = uuid4() %}
-{% set datatype_list = output.data | filter_data_type %}
-{% set datatype = datatype_list[0]%}
-<div id="{{ div_id }}" class="output_subarea output_widget_state {{ 
extra_class }}">
-<script type="text/javascript">
-var element = $('#{{ div_id }}');
-</script>
-<script type="{{ datatype }}">
-{{ output.data[datatype] | json_dumps }}
-</script>
-</div>
-{%- endblock data_widget_state -%}
-
 {%- block data_widget_view scoped %}
+{%- if not resources.should_sanitize_html %}
 {% set div_id = uuid4() %}
 {% set datatype_list = output.data | filter_data_type %}
 {% set datatype = datatype_list[0]%}
@@ -258,17 +268,20 @@
 var element = $('#{{ div_id }}');
 </script>
 <script type="{{ datatype }}">
-{{ output.data[datatype] | json_dumps }}
+{{ output.data[datatype] | json_dumps | escape_html_keep_quotes }}
 </script>
 </div>
+{%- endif %}
 {%- endblock data_widget_view -%}
 
 {%- block footer %}
+{%- if not resources.should_sanitize_html %}
 {% set mimetype = 'application/vnd.jupyter.widget-state+json'%}
 {% if mimetype in nb.metadata.get("widgets",{})%}
 <script type="{{ mimetype }}">
-{{ nb.metadata.widgets[mimetype] | json_dumps | escape_html_script }}
+{{ nb.metadata.widgets[mimetype] | json_dumps | escape_html_keep_quotes }}
 </script>
 {% endif %}
+{%- endif %}
 {{ super() }}
 {%- endblock footer-%}
diff -urN '--exclude=CVS' '--exclude=.cvsignore' '--exclude=.svn' 
'--exclude=.svnignore' 
old/nbconvert-6.5.0/share/jupyter/nbconvert/templates/classic/index.html.j2 
new/nbconvert-6.5.3/share/jupyter/nbconvert/templates/classic/index.html.j2
--- old/nbconvert-6.5.0/share/jupyter/nbconvert/templates/classic/index.html.j2 
2022-04-11 11:07:42.642428000 +0200
+++ new/nbconvert-6.5.3/share/jupyter/nbconvert/templates/classic/index.html.j2 
2022-08-11 13:44:20.857226800 +0200
@@ -9,7 +9,7 @@
 {%- block html_head -%}
 <meta charset="utf-8" />
 <meta name="viewport" content="width=device-width, initial-scale=1.0">
-{% set nb_title = nb.metadata.get('title', '') or 
resources['metadata']['name'] %}
+{% set nb_title = nb.metadata.get('title', resources['metadata']['name']) | 
escape_html_keep_quotes %}
 <title>{{nb_title}}</title>
 
 {%- block html_head_js -%}
diff -urN '--exclude=CVS' '--exclude=.cvsignore' '--exclude=.svn' 
'--exclude=.svnignore' 
old/nbconvert-6.5.0/share/jupyter/nbconvert/templates/lab/base.html.j2 
new/nbconvert-6.5.3/share/jupyter/nbconvert/templates/lab/base.html.j2
--- old/nbconvert-6.5.0/share/jupyter/nbconvert/templates/lab/base.html.j2      
2022-04-11 11:07:42.643566100 +0200
+++ new/nbconvert-6.5.3/share/jupyter/nbconvert/templates/lab/base.html.j2      
2022-08-11 10:02:47.704777200 +0200
@@ -26,7 +26,7 @@
 {% block input %}
 <div class="jp-CodeMirrorEditor jp-Editor jp-InputArea-editor" 
data-type="inline">
      <div class="CodeMirror cm-s-jupyter">
-{{ cell.source | highlight_code(metadata=cell.metadata) }}
+{{ cell.source | highlight_code(metadata=cell.metadata) | clean_html }}
      </div>
 </div>
 {%- endblock input %}
@@ -98,13 +98,24 @@
     {{ self.empty_in_prompt() }}
 {%- endif -%}
 <div class="jp-RenderedHTMLCommon jp-RenderedMarkdown jp-MarkdownOutput {{ 
celltags(cell) }}" data-mime-type="text/markdown">
-{{ cell.source  | markdown2html | strip_files_prefix }}
+{%- if resources.should_sanitize_html %}
+{%- set html_value=cell.source  | markdown2html | strip_files_prefix | 
clean_html -%}
+{%- else %}
+{%- set html_value=cell.source  | markdown2html | strip_files_prefix -%}
+{%- endif %}
+{{ html_value }}
 </div>
 </div>
 </div>
 </div>
 {%- endblock markdowncell %}
 
+{% block rawcell scoped %}
+{%- if cell.metadata.get('raw_mimetype', '').lower() in 
resources.get('raw_mimetypes', ['']) -%}
+{{ cell.source | clean_html }}
+{%- endif -%}
+{%- endblock rawcell %}
+
 {% block unknowncell scoped %}
 unknown type  {{ cell.type }}
 {% endblock unknowncell %}
@@ -146,39 +157,48 @@
 {% block data_svg scoped -%}
 <div class="jp-RenderedSVG jp-OutputArea-output {{ extra_class }}" 
data-mime-type="image/svg+xml">
 {%- if output.svg_filename %}
-<img src="{{ output.svg_filename | posix_path }}">
+<img src="{{ output.svg_filename | posix_path | escape_html }}">
 {%- else %}
-{{ output.data['image/svg+xml'] }}
+{{ output.data['image/svg+xml'] | clean_html }}
 {%- endif %}
 </div>
 {%- endblock data_svg %}
 
 {% block data_html scoped -%}
 <div class="jp-RenderedHTMLCommon jp-RenderedHTML jp-OutputArea-output {{ 
extra_class }}" data-mime-type="text/html">
+{%- if resources.should_sanitize_html %}
+{{ output.data['text/html'] | clean_html }}
+{%- else %}
 {{ output.data['text/html'] }}
+{%- endif %}
 </div>
 {%- endblock data_html %}
 
 {% block data_markdown scoped -%}
+{%- if resources.should_sanitize_html %}
+{%- set html_value=output.data['text/markdown'] | markdown2html | clean_html 
-%}
+{%- else %}
+{%- set html_value=output.data['text/markdown'] | markdown2html -%}
+{%- endif %}
 <div class="jp-RenderedHTMLCommon jp-RenderedMarkdown jp-OutputArea-output {{ 
extra_class }}" data-mime-type="text/markdown">
-{{ output.data['text/markdown'] | markdown2html }}
+{{ html_value }}
 </div>
 {%- endblock data_markdown %}
 
 {% block data_png scoped %}
 <div class="jp-RenderedImage jp-OutputArea-output {{ extra_class }}">
 {%- if 'image/png' in output.metadata.get('filenames', {}) %}
-<img src="{{ output.metadata.filenames['image/png'] | posix_path }}"
+<img src="{{ output.metadata.filenames['image/png'] | posix_path | escape_html 
}}"
 {%- else %}
-<img src="data:image/png;base64,{{ output.data['image/png'] }}"
+<img src="data:image/png;base64,{{ output.data['image/png'] | escape_html }}"
 {%- endif %}
 {%- set width=output | get_metadata('width', 'image/png') -%}
 {%- if width is not none %}
-width={{ width }}
+width={{ width | escape_html }}
 {%- endif %}
 {%- set height=output | get_metadata('height', 'image/png') -%}
 {%- if height is not none %}
-height={{ height }}
+height={{ height | escape_html }}
 {%- endif %}
 class="
 {%- if output | get_metadata('unconfined', 'image/png') %}
@@ -198,17 +218,17 @@
 {% block data_jpg scoped %}
 <div class="jp-RenderedImage jp-OutputArea-output {{ extra_class }}">
 {%- if 'image/jpeg' in output.metadata.get('filenames', {}) %}
-<img src="{{ output.metadata.filenames['image/jpeg'] | posix_path }}"
+<img src="{{ output.metadata.filenames['image/jpeg'] | posix_path | 
escape_html }}"
 {%- else %}
-<img src="data:image/jpeg;base64,{{ output.data['image/jpeg'] }}"
+<img src="data:image/jpeg;base64,{{ output.data['image/jpeg'] | escape_html }}"
 {%- endif %}
 {%- set width=output | get_metadata('width', 'image/jpeg') -%}
 {%- if width is not none %}
-width={{ width }}
+width={{ width | escape_html }}
 {%- endif %}
 {%- set height=output | get_metadata('height', 'image/jpeg') -%}
 {%- if height is not none %}
-height={{ height }}
+height={{ height | escape_html }}
 {%- endif %}
 class="
 {%- if output | get_metadata('unconfined', 'image/jpeg') %}
@@ -260,27 +280,15 @@
 {% set div_id = uuid4() %}
 {%- block data_javascript scoped %}
 <div id="{{ div_id }}" class="jp-RenderedJavaScript jp-OutputArea-output {{ 
extra_class }}" data-mime-type="application/javascript">
+{%- if not resources.should_sanitize_html %}
 <script type="text/javascript">
 var element = document.getElementById('{{ div_id }}');
 {{ output.data['application/javascript'] }}
 </script>
+{%- endif %}
 </div>
 {%- endblock -%}
 
-{%- block data_widget_state scoped %}
-{% set div_id = uuid4() %}
-{% set datatype_list = output.data | filter_data_type %}
-{% set datatype = datatype_list[0]%}
-<div id="{{ div_id }}" class="output_subarea output_widget_state {{ 
extra_class }}">
-<script type="text/javascript">
-var element = document.getElementById('{{ div_id }}');
-</script>
-<script type="{{ datatype }}">
-{{ output.data[datatype] | json_dumps }}
-</script>
-</div>
-{%- endblock data_widget_state -%}
-
 {%- block data_widget_view scoped %}
 {% set div_id = uuid4() %}
 {% set datatype_list = output.data | filter_data_type %}
@@ -290,7 +298,7 @@
 var element = document.getElementById('{{ div_id }}');
 </script>
 <script type="{{ datatype }}">
-{{ output.data[datatype] | json_dumps }}
+{{ output.data[datatype] | json_dumps | escape_html_keep_quotes }}
 </script>
 </div>
 {%- endblock data_widget_view -%}
@@ -299,7 +307,7 @@
 {% set mimetype = 'application/vnd.jupyter.widget-state+json'%}
 {% if mimetype in nb.metadata.get("widgets",{})%}
 <script type="{{ mimetype }}">
-{{ nb.metadata.widgets[mimetype] | json_dumps | escape_html_script }}
+{{ nb.metadata.widgets[mimetype] | json_dumps | escape_html_keep_quotes }}
 </script>
 {% endif %}
 {{ super() }}
diff -urN '--exclude=CVS' '--exclude=.cvsignore' '--exclude=.svn' 
'--exclude=.svnignore' 
old/nbconvert-6.5.0/share/jupyter/nbconvert/templates/lab/index.html.j2 
new/nbconvert-6.5.3/share/jupyter/nbconvert/templates/lab/index.html.j2
--- old/nbconvert-6.5.0/share/jupyter/nbconvert/templates/lab/index.html.j2     
2022-04-11 11:07:42.643724200 +0200
+++ new/nbconvert-6.5.3/share/jupyter/nbconvert/templates/lab/index.html.j2     
2022-08-11 13:44:20.857226800 +0200
@@ -9,7 +9,7 @@
 {%- block html_head -%}
 <meta charset="utf-8" />
 <meta name="viewport" content="width=device-width, initial-scale=1.0">
-{% set nb_title = nb.metadata.get('title', '') or 
resources['metadata']['name'] %}
+{% set nb_title = nb.metadata.get('title', resources['metadata']['name']) | 
escape_html_keep_quotes %}
 <title>{{nb_title}}</title>
 
 {%- block html_head_js -%}
diff -urN '--exclude=CVS' '--exclude=.cvsignore' '--exclude=.svn' 
'--exclude=.svnignore' 
old/nbconvert-6.5.0/share/jupyter/nbconvert/templates/reveal/index.html.j2 
new/nbconvert-6.5.3/share/jupyter/nbconvert/templates/reveal/index.html.j2
--- old/nbconvert-6.5.0/share/jupyter/nbconvert/templates/reveal/index.html.j2  
2022-04-11 11:07:42.645413200 +0200
+++ new/nbconvert-6.5.3/share/jupyter/nbconvert/templates/reveal/index.html.j2  
2022-08-11 13:44:20.857226800 +0200
@@ -20,7 +20,7 @@
 <meta name="apple-mobile-web-app-capable" content="yes" />
 <meta name="apple-mobile-web-app-status-bar-style" content="black-translucent" 
/>
 
-{% set nb_title = nb.metadata.get('title', '') or 
resources['metadata']['name'] %}
+{% set nb_title = nb.metadata.get('title', resources['metadata']['name']) | 
escape_html_keep_quotes %}
 <title>{{nb_title}} slides</title>
 
 {%- block html_head_js -%}

++++++ nbconvert-vendorize-mistune.patch ++++++
--- /var/tmp/diff_new_pack.3Q8kk1/_old  2022-08-11 18:33:18.478198756 +0200
+++ /var/tmp/diff_new_pack.3Q8kk1/_new  2022-08-11 18:33:18.478198756 +0200
@@ -1,7 +1,7 @@
-Index: nbconvert-6.5.0/nbconvert/filters/markdown_mistune.py
+Index: nbconvert-6.5.3/nbconvert/filters/markdown_mistune.py
 ===================================================================
---- nbconvert-6.5.0.orig/nbconvert/filters/markdown_mistune.py
-+++ nbconvert-6.5.0/nbconvert/filters/markdown_mistune.py
+--- nbconvert-6.5.3.orig/nbconvert/filters/markdown_mistune.py
++++ nbconvert-6.5.3/nbconvert/filters/markdown_mistune.py
 @@ -21,7 +21,9 @@ except ImportError:
      from cgi import escape as html_escape
  
@@ -13,10 +13,10 @@
  from pygments import highlight
  from pygments.formatters import HtmlFormatter
  from pygments.lexers import get_lexer_by_name
-Index: nbconvert-6.5.0/setup.py
+Index: nbconvert-6.5.3/setup.py
 ===================================================================
---- nbconvert-6.5.0.orig/setup.py
-+++ nbconvert-6.5.0/setup.py
+--- nbconvert-6.5.3.orig/setup.py
++++ nbconvert-6.5.3/setup.py
 @@ -245,7 +245,6 @@ setup_args["install_requires"] = [
      "jupyter_core>=4.7",
      "jupyterlab_pygments",

Reply via email to