Expose tokens in markdown api, update article rendering

This commit is contained in:
2026-08-25 03:08:01 +02:00
parent 1250ead61a
commit 3abb6ce8fe
2 changed files with 12 additions and 13 deletions
+8 -10
View File
@@ -1,6 +1,6 @@
from typing import cast from typing import cast
from markdown_it import MarkdownIt from markdown_it import MarkdownIt
from markdown_it.token import Token from markdown_it.token import Token as Token
from pygments import highlight as pygments_highlight from pygments import highlight as pygments_highlight
from pygments.formatters import HtmlFormatter from pygments.formatters import HtmlFormatter
from pygments.lexers import get_lexer_by_name from pygments.lexers import get_lexer_by_name
@@ -32,7 +32,7 @@ def highlight(code: str, lang: str, attrs: str) -> str:
md = MarkdownIt(options_update={"highlight": highlight}) md = MarkdownIt(options_update={"highlight": highlight})
def extract_summary(tokens: list[Token]) -> Markup: def render_summary(tokens: list[Token]) -> Markup:
if not tokens or tokens[0].type != "paragraph_open" or tokens[0].hidden: if not tokens or tokens[0].type != "paragraph_open" or tokens[0].hidden:
raise MarkdownError( raise MarkdownError(
"Body does not start with a paragraph; set 'summary' in frontmatter" "Body does not start with a paragraph; set 'summary' in frontmatter"
@@ -43,11 +43,9 @@ def extract_summary(tokens: list[Token]) -> Markup:
raise MarkdownError("Content has no paragraph to use as summary") raise MarkdownError("Content has no paragraph to use as summary")
def parse(body: str, include_summary: bool = True) -> tuple[Markup, Markup | None]: def render(tokens: list[Token]) -> Markup:
tokens = md.parse(body) return Markup(md.renderer.render(tokens, md.options, {}))
if include_summary:
summary = extract_summary(tokens)
else: def parse(body: str) -> list[Token]:
summary = None return md.parse(body)
content = Markup(md.renderer.render(tokens, md.options, {}))
return content, summary
+4 -3
View File
@@ -29,9 +29,10 @@ class Article(Content):
self.title: str = meta["title"] self.title: str = meta["title"]
def write(self) -> None: def write(self) -> None:
content, summary = md.parse(self.read_body(), self.summary is None) tokens = md.parse(self.read_body())
if summary is not None: if self.summary is None:
self.summary = summary self.summary = md.render_summary(tokens)
content = md.render(tokens)
template = self.site.jinja_env.get_template("article.html") template = self.site.jinja_env.get_template("article.html")
html = template.render(page=self, content=content, site=self.site) html = template.render(page=self, content=content, site=self.site)