diff --git a/src/dragonglass/mparse.py b/src/dragonglass/mparse.py index 55e2a0d..96f0a86 100644 --- a/src/dragonglass/mparse.py +++ b/src/dragonglass/mparse.py @@ -28,9 +28,14 @@ GENERICIMAGE_PATTERN = r'!\[(.*?)\]\((.*?)\)' OBSLINK_PATTERN = r'\[\[(.*?)\]\]' GENERICLINK_PATTERN = r'\[(.*?)\]\((.*?)\)' +# Inline footnote reference pattern. INLINE_FOOTNOTE_REF_PREFIX = STX + "erbosoft_fnref:" INLINE_FOOTNOTE_REF_PATTERN = INLINE_FOOTNOTE_REF_PREFIX + "{}" + ETX +# Obsidian comment marker +COMMENT_MARKER = '%%' + + def is_proper_url(s: str) -> bool: """ Checks to see if a string is a "proper" URL. @@ -322,6 +327,53 @@ class ObsidianInlines(Extension): md.inlinePatterns.register(SimpleTagInlineProcessor(r'()\=\=(.*?)\=\=', 'ins'), 'highlight', PRIO_BASE + 1) +class ObsidianComments(Extension): + """An extension that removes Obsidian-style comments.""" + class CommentStripper(Preprocessor): + """The actual preprocessor that removes comments.""" + def run(self, lines: list[str]) -> list[str]: + """ + Removes the comments from the array of lines. + + Args: + lines (list[str]): The Markdown liens read in. + + Returns: + list[str]: The Markdown lines after the comments have been removed. + """ + newlines: list[str] = [] + in_comment = False + defer_in_comment = False + for line in lines: + arr = line.split(COMMENT_MARKER) + if in_comment: + arr.pop(0) + in_comment = False + if len(arr) % 2 == 0: + defer_in_comment = True + if len(arr) > 0: + arr.pop() + if not in_comment: + i = len(arr) - 2 + while i >= 0: + arr.pop(i) + i -= 2 + newlines.append(''.join(arr)) + if defer_in_comment: + in_comment = True + defer_in_comment = False + return newlines + + def extendMarkdown(self, md: markdown.Markdown) -> None: # noqa: N802 + """ + Registers the comment remover with the Markdown parser. + + Args: + md (markdown.Markdown): The Markdown parser to register the comment remover with. + """ + md.preprocessors.register(ObsidianComments.CommentStripper(md), 'comments-multi', PRIO_BASE + 1) + + class ObsidianStyleFootnotes(FootnoteExtension): """ An extension of the standard Markdown processor footnote extension to support Obsidian-style inline footnotes @@ -452,6 +504,7 @@ def create_markdown_parser(context: Context) -> markdown.Markdown: markdown.Markdown: The new Markdown parser. """ return markdown.Markdown(extensions=[MetaStripper(), + ObsidianComments(), ObsidianStyleFootnotes(SUPERSCRIPT_TEXT='[{}]', SEPARATOR='-'), ObsidianImages(context), ObsidianLinks(context),