镜像站点 · 本页由第三方 GitHub 只读镜像提供,非 GitHub 官方站点,不接受任何登录或凭据输入。前往 github.com
Skip to content

Commit 618ebfb

Browse files
committed
fix: restrict markdown cache to built-in selectors
1 parent a1af1c3 commit 618ebfb

2 files changed

Lines changed: 14 additions & 3 deletions

File tree

‎src/mistune/__init__.py‎

Lines changed: 3 additions & 3 deletions
Original file line numberDiff line numberDiff line change
@@ -64,11 +64,11 @@ def create_markdown(
6464
html: Markdown = create_markdown(escape=False, plugins=["strikethrough", "footnotes", "table"])
6565

6666

67-
BuiltinRendererRef = Optional[Literal["html", "ast"]]
67+
_BuiltinRendererRef = Optional[Literal["html", "ast"]]
6868

6969

7070
@lru_cache(maxsize=128)
71-
def _cached_markdown(escape: bool, renderer: BuiltinRendererRef, plugins: Tuple[str, ...]) -> Markdown:
71+
def _cached_markdown(escape: bool, renderer: _BuiltinRendererRef, plugins: Tuple[str, ...]) -> Markdown:
7272
return create_markdown(escape=escape, renderer=renderer, plugins=plugins)
7373

7474

@@ -79,7 +79,7 @@ def markdown(
7979
plugins: Optional[Iterable[Any]] = None,
8080
) -> Union[str, List[Dict[str, Any]]]:
8181
plugin_refs = tuple(plugins) if plugins is not None else ()
82-
if (renderer is None or renderer == "html" or renderer == "ast") and all(
82+
if (renderer is None or (isinstance(renderer, str) and renderer in ("html", "ast"))) and all(
8383
isinstance(plugin, str) for plugin in plugin_refs
8484
):
8585
md = _cached_markdown(escape, renderer, plugin_refs)

‎tests/test_misc.py‎

Lines changed: 11 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -337,6 +337,17 @@ def test_markdown_func_does_not_cache_custom_renderer(self):
337337
self.assertEqual(mistune.markdown(text, escape=False, renderer=renderer).strip(), "<p><b>hi</b></p>")
338338
self.assertEqual(mistune.markdown(text, escape=True, renderer=renderer).strip(), "<p>&lt;b&gt;hi&lt;/b&gt;</p>")
339339

340+
def test_markdown_func_does_not_treat_equal_renderer_as_builtin(self):
341+
class EqualRenderer(mistune.HTMLRenderer):
342+
__hash__ = None
343+
344+
def __eq__(self, other):
345+
return other == "html"
346+
347+
renderer = EqualRenderer()
348+
349+
self.assertEqual(mistune.markdown("<b>x</b>", renderer=renderer).strip(), "<p>&lt;b&gt;x&lt;/b&gt;</p>")
350+
340351
def test_markdown_func_cache_eviction_preserves_output(self):
341352
expected = "<p><strong>b</strong></p>\n"
342353
self.assertEqual(mistune.markdown("**b**"), expected)

0 commit comments

Comments
 (0)