from typing import Any from markdown import Markdown from jweb.content import Content, ContentField from jweb.context import Context def load_extension(context: Context) -> None: context.add_filters(markdown=_MarkdownDocument) class _MarkdownDocument: def __init__(self, content: Content[Any]) -> None: if not isinstance(content, Content) or not isinstance(content.data, (str, bytes)): raise ValueError("markdown filter can only accept byte or string content") data = content.data if isinstance(data, bytes): data = data.decode("utf-8") assert isinstance(data, str) self.__content = content self.__markdown = Markdown(extensions=["full_yaml_metadata"]) self.__html = self.__markdown.convert(data) @property def html(self) -> str: return self.__html @property def meta(self) -> Any: return ContentField(self.__content.path, self.__markdown.Meta, self.__content.language) # type: ignore