diff --git a/pyproject.toml b/pyproject.toml index 8c76946..6d769db 100644 --- a/pyproject.toml +++ b/pyproject.toml @@ -39,6 +39,7 @@ executionEnvironments = [ # off | basic | standard | strict | recommended | all typeCheckingMode = "recommended" reportExplicitAny = false +reportAny = false reportUnusedCallResult = false allowedUntypedLibraries = ["frontmatter"] diff --git a/src/zona/markdown.py b/src/zona/markdown.py new file mode 100644 index 0000000..b93cedf --- /dev/null +++ b/src/zona/markdown.py @@ -0,0 +1,35 @@ +from typing import Any, override +import marko +from marko import Markdown +from marko.block import Document +from marko.inline import Link, Image +from marko.html_renderer import HTMLRenderer + + +class ZonaRenderer(HTMLRenderer): + # TODO: resolve relative links and replace with url? + @override + def render_link(self, element: Link): + href = element.dest + if href.endswith(".md") and not href.startswith("http"): + href = href[:-3] + ".html" + body: Any = self.render_children(element) + return f'' + + @override + def render_image(self, element: Image): + # get alt text from children + text = self.render_children(element) + title = element.title or "" + caption = f"{text}" if text else "" + return ( + f'
\n' + # TODO: convert to plaintext and add as alt attribute + f'\n' + f"{caption}
" + ) + + +def md_to_html(content: str) -> str: + md = Markdown(renderer=ZonaRenderer) + return md.convert(content) diff --git a/tests/test_markdown.py b/tests/test_markdown.py new file mode 100644 index 0000000..d0aee85 --- /dev/null +++ b/tests/test_markdown.py @@ -0,0 +1,7 @@ +from zona.markdown import md_to_html + + +def test_render(): + content = "# Hello World!" + out = md_to_html(content) + assert out.strip() == "

Hello World!

"