From 3abb6ce8fefc811bba355fa21ea8de55a3818eca Mon Sep 17 00:00:00 2001 From: omicron Date: Mon, 24 Aug 2026 20:50:00 +0200 Subject: [PATCH] Expose tokens in markdown api, update article rendering --- omicron/ssg/markdown.py | 18 ++++++++---------- omicron/ssg/output/article.py | 7 ++++--- 2 files changed, 12 insertions(+), 13 deletions(-) diff --git a/omicron/ssg/markdown.py b/omicron/ssg/markdown.py index dc9ab38..c7e9ea0 100644 --- a/omicron/ssg/markdown.py +++ b/omicron/ssg/markdown.py @@ -1,6 +1,6 @@ from typing import cast 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.formatters import HtmlFormatter 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}) -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: raise MarkdownError( "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") -def parse(body: str, include_summary: bool = True) -> tuple[Markup, Markup | None]: - tokens = md.parse(body) - if include_summary: - summary = extract_summary(tokens) - else: - summary = None - content = Markup(md.renderer.render(tokens, md.options, {})) - return content, summary +def render(tokens: list[Token]) -> Markup: + return Markup(md.renderer.render(tokens, md.options, {})) + + +def parse(body: str) -> list[Token]: + return md.parse(body) diff --git a/omicron/ssg/output/article.py b/omicron/ssg/output/article.py index 068ceca..63ae7e9 100644 --- a/omicron/ssg/output/article.py +++ b/omicron/ssg/output/article.py @@ -29,9 +29,10 @@ class Article(Content): self.title: str = meta["title"] def write(self) -> None: - content, summary = md.parse(self.read_body(), self.summary is None) - if summary is not None: - self.summary = summary + tokens = md.parse(self.read_body()) + if self.summary is None: + self.summary = md.render_summary(tokens) + content = md.render(tokens) template = self.site.jinja_env.get_template("article.html") html = template.render(page=self, content=content, site=self.site)