jean-web/jwebsite/extensions/markdown.py

35 lines
1020 B
Python

from typing import Any
from markdown import Markdown
from jwebsite.content import Content, ContentField
from jwebsite.context import Context
def load_extension(context: Context) -> None:
context.add_filters(markdown=_MarkdownDocument)
class _MarkdownDocument:
def __init__(self, content: Content) -> 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