#!/usr/bin/env python3 import markdown import sys import io from pygments.formatters import HtmlFormatter from markdown.extensions.toc import TocExtension sys.stdin = io.TextIOWrapper(sys.stdin.buffer, encoding='utf-8') sys.stdout = io.TextIOWrapper(sys.stdout.buffer, encoding='utf-8') sys.stdout.write(''' ''') # Render to a string (not straight to stdout) so we can post-process it. # Note: you may want to run this through bleach for sanitization html = markdown.markdown( sys.stdin.read(), output_format="html5", extensions=[ "markdown.extensions.fenced_code", "markdown.extensions.codehilite", "markdown.extensions.tables", "markdown.extensions.sane_lists", TocExtension(anchorlink=True)], extension_configs={ "markdown.extensions.codehilite":{"css_class":"highlight"}}) # A README's relative image paths (e.g. screenshots/x.png) are repo blobs, which # cgit only serves via its `plain` command; but a browser resolves a relative # against the about-page URL (//about/), so the image 404s. # Rewrite relative to an absolute //plain/?h= URL # (absolute so it also works where cgit renders the readme on the summary page). # cgit exports the repo context to about-filters via these environment vars; if # they're absent we leave the src untouched. import os, re repo = os.environ.get("CGIT_REPO_URL", "").strip("/") if repo: branch = os.environ.get("CGIT_REPO_DEFBRANCH", "").strip() plain = "/" + repo + "/plain/" query = ("?h=" + branch) if branch else "" # leave absolute, protocol-relative, root-relative, anchor and data: URLs alone skip = re.compile(r"^(?:[a-z][a-z0-9+.\-]*:|//|/|#)", re.I) def rewrite(m): url = m.group(2) if not url or skip.match(url): return m.group(0) return m.group(1) + plain + re.sub(r"^\./", "", url) + query + m.group(3) html = re.sub(r'(]*?\bsrc=")([^"]*)(")', rewrite, html, flags=re.I) sys.stdout.write("
") sys.stdout.write(html) sys.stdout.write("
")