31 lines
998 B
Python
31 lines
998 B
Python
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(Content[str]):
|
|
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"])
|
|
super().__init__(content.path, self.__markdown.convert(data), content.language)
|
|
|
|
@property
|
|
def meta(self) -> Any:
|
|
return ContentField(self.__content.path, self.__markdown.Meta, self.__content.language) # type: ignore
|