diff --git a/src/pydoc_markdown/contrib/renderers/markdown.py b/src/pydoc_markdown/contrib/renderers/markdown.py index 2e478b08..012b0854 100644 --- a/src/pydoc_markdown/contrib/renderers/markdown.py +++ b/src/pydoc_markdown/contrib/renderers/markdown.py @@ -41,7 +41,7 @@ SourceLinker, ) from pydoc_markdown.util.docspec import ApiSuite, format_function_signature, is_method -from pydoc_markdown.util.misc import escape_except_blockquotes +from pydoc_markdown.util.misc import escape_except_blockquotes, escape_curly_brackets def dotted_name(obj: docspec.ApiObject) -> str: @@ -212,6 +212,9 @@ class MarkdownRenderer(Renderer, SinglePageRenderer, SingleObjectRenderer): #: Escape html in docstring. Default to False. escape_html_in_docstring: bool = False + #: Escape { and } in docstring. Default to False. + escape_curly_braces_in_docstring: bool = False + #: Render Novella `@anchor` tags before headings. render_novella_anchors: bool = False @@ -374,6 +377,8 @@ def _render_object(self, fp: t.TextIO, level: int, obj: docspec.ApiObject): if self.escape_html_in_docstring else obj.docstring.content ) + if self.escape_curly_braces_in_docstring: + docstring = escape_curly_brackets(docstring) lines = docstring.split("\n") if self.docstrings_as_blockquote: lines = ["> " + x for x in lines] diff --git a/src/pydoc_markdown/util/misc.py b/src/pydoc_markdown/util/misc.py index 8b98c044..296d2908 100644 --- a/src/pydoc_markdown/util/misc.py +++ b/src/pydoc_markdown/util/misc.py @@ -26,3 +26,10 @@ def escape_except_blockquotes(string: str) -> str: escaped_string = escaped_string.replace(f"BLOCKQUOTE_TOKEN_{i}_END", match) return escaped_string + +def escape_curly_brackets(string: str) -> str: + """ + Escape curly brackets in a string. + """ + + return string.replace("{", "\\{").replace("}", "\\}") \ No newline at end of file