diff --git a/panel/pane/markup.py b/panel/pane/markup.py index c3140f997f..891f7f6d89 100644 --- a/panel/pane/markup.py +++ b/panel/pane/markup.py @@ -440,9 +440,16 @@ def _transform_object(self, obj: Any) -> Dict[str, Any]: **self.renderer_options ) else: - html = self._get_parser( + parser = self._get_parser( self.renderer, tuple(self.plugins), **self.renderer_options - ).render(obj) + ) + try: + html = parser.render(obj) + except IndexError: + # Likely markdown-it mdurl parser error + with parser.reset_rules(): + parser.disable('link') + html = parser.render(obj) return dict(object=escape(html)) def _process_param_change(self, params): diff --git a/panel/tests/pane/test_markup.py b/panel/tests/pane/test_markup.py index 1284055d31..d124bebe0e 100644 --- a/panel/tests/pane/test_markup.py +++ b/panel/tests/pane/test_markup.py @@ -101,7 +101,6 @@ def test_markdown_pane_newline(document, comm): assert pane._models[model.ref['id']][0] is model assert model.text == "<p>Hello\nWorld\nI'm here!</p>\n" - def test_markdown_pane_markdown_it_renderer(document, comm): pane = Markdown(""" - [x] Task1 @@ -122,6 +121,20 @@ def test_markdown_pane_markdown_it_renderer(document, comm): 'type="checkbox"> Task2</li>\n</ul>\n' ) +def test_markdown_pane_markdown_it_renderer_partial_links(document, comm): + pane = Markdown("[Test](http:/", renderer='markdown-it') + + model = pane.get_root(document, comm=comm) + + assert model.text == '<p>[Test](http:/</p>\n' + + pane.object = "[Test](http://" + + assert model.text == '<p>[Test](http://</p>\n' + + pane.object = "[Test](http://google.com)" + assert model.text == '<p><a href="http://google.com">Test</a></p>\n' + def test_markdown_pane_extensions(document, comm): pane = Markdown(""" ```python