#!/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'