#!/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()