add markdown parsing
This commit is contained in:
parent
3c14be416a
commit
46f7bc451d
3 changed files with 43 additions and 0 deletions
|
@ -39,6 +39,7 @@ executionEnvironments = [
|
||||||
# off | basic | standard | strict | recommended | all
|
# off | basic | standard | strict | recommended | all
|
||||||
typeCheckingMode = "recommended"
|
typeCheckingMode = "recommended"
|
||||||
reportExplicitAny = false
|
reportExplicitAny = false
|
||||||
|
reportAny = false
|
||||||
reportUnusedCallResult = false
|
reportUnusedCallResult = false
|
||||||
allowedUntypedLibraries = ["frontmatter"]
|
allowedUntypedLibraries = ["frontmatter"]
|
||||||
|
|
||||||
|
|
35
src/zona/markdown.py
Normal file
35
src/zona/markdown.py
Normal file
|
@ -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'<a href="{href}" target="_blank"{body}</a>'
|
||||||
|
|
||||||
|
@override
|
||||||
|
def render_image(self, element: Image):
|
||||||
|
# get alt text from children
|
||||||
|
text = self.render_children(element)
|
||||||
|
title = element.title or ""
|
||||||
|
caption = f"<small>{text}</small>" if text else ""
|
||||||
|
return (
|
||||||
|
f'<div class="image-container">\n'
|
||||||
|
# TODO: convert to plaintext and add as alt attribute
|
||||||
|
f'<img src="{element.dest}" title="{title}">\n'
|
||||||
|
f"{caption}</div>"
|
||||||
|
)
|
||||||
|
|
||||||
|
|
||||||
|
def md_to_html(content: str) -> str:
|
||||||
|
md = Markdown(renderer=ZonaRenderer)
|
||||||
|
return md.convert(content)
|
7
tests/test_markdown.py
Normal file
7
tests/test_markdown.py
Normal file
|
@ -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() == "<h1>Hello World!</h1>"
|
Loading…
Add table
Add a link
Reference in a new issue