From a0fc8e577e7414312ef66307497b36c393a1a582 Mon Sep 17 00:00:00 2001 From: pablu Date: Sat, 19 Sep 2026 14:57:17 +0200 Subject: feat: markdown about render --- about-filter.py | 72 +++++++++++++++++++++++++++++++++++++++++++++++++++++++++ 1 file changed, 72 insertions(+) create mode 100644 about-filter.py (limited to 'about-filter.py') diff --git a/about-filter.py b/about-filter.py new file mode 100644 index 0000000..5e97bbe --- /dev/null +++ b/about-filter.py @@ -0,0 +1,72 @@ +#!/usr/bin/env python3 + +"""Render cgit repository READMEs as safe HTML.""" + +import html +import os +import subprocess +import sys + + +MARKDOWN_EXTENSIONS = (".md", ".markdown") +CMARK_COMMAND = ( + "/usr/bin/cmark-gfm", + "--validate-utf8", + "--extension", + "table", + "--extension", + "autolink", + "--extension", + "strikethrough", + "--extension", + "tasklist", +) + +STYLE = """ +""" + + +def render_markdown(source: bytes) -> bytes: + """Render Markdown with cmark-gfm's safe defaults.""" + result = subprocess.run( + CMARK_COMMAND, + input=source, + stdout=subprocess.PIPE, + check=True, + ) + return result.stdout + + +def render_plain_text(source: bytes) -> bytes: + """Return arbitrary input as escaped, readable text.""" + text = source.decode("utf-8", errors="replace") + return f"
{html.escape(text)}
\n".encode() + + +def main() -> None: + filename = sys.argv[1] if len(sys.argv) > 1 else "" + source = sys.stdin.buffer.read() + + if os.path.splitext(filename)[1].lower() in MARKDOWN_EXTENSIONS: + rendered = render_markdown(source) + else: + rendered = render_plain_text(source) + + sys.stdout.buffer.write(STYLE.encode()) + sys.stdout.buffer.write(b'
\n') + sys.stdout.buffer.write(rendered) + sys.stdout.buffer.write(b"
\n") + + +if __name__ == "__main__": + main() -- cgit 1.3.1