diff --git a/src/backend/core/models.py b/src/backend/core/models.py index 8202c2db..85804ba8 100644 --- a/src/backend/core/models.py +++ b/src/backend/core/models.py @@ -18,6 +18,7 @@ from django.template.base import Template as DjangoTemplate from django.template.context import Context from django.template.engine import Engine +import frontmatter import markdown from weasyprint import CSS, HTML from weasyprint.text.fonts import FontConfiguration @@ -236,8 +237,12 @@ class Template(BaseModel): Generate and return a PDF document for this template around the markdown body passed as argument. """ - body_html = markdown.markdown(textwrap.dedent(body)) if body else "" - document_html = HTML(string=DjangoTemplate(self.code).render(Context({"body": body_html}))) + document = frontmatter.loads(body) + metadata = document.metadata + markdown_body = document.content.strip() + body_html = markdown.markdown(textwrap.dedent(markdown_body)) if markdown_body else "" + + document_html = HTML(string=DjangoTemplate(self.code).render(Context({"body": body_html, **metadata}))) css = CSS( string=self.css, font_config=FontConfiguration(), diff --git a/src/backend/pyproject.toml b/src/backend/pyproject.toml index 39bb64af..b55b13e4 100644 --- a/src/backend/pyproject.toml +++ b/src/backend/pyproject.toml @@ -47,6 +47,7 @@ dependencies = [ "nested-multipart-parser==1.5.0", "psycopg[binary]==3.1.14", "PyJWT==2.8.0", + "python-frontmatter==1.0.1", "requests==2.31.0", "sentry-sdk==1.38.0", "url-normalize==1.4.3",