aboutsummaryrefslogtreecommitdiffstats
path: root/filters/html-converters/md2html
diff options
context:
space:
mode:
Diffstat (limited to 'filters/html-converters/md2html')
-rwxr-xr-xfilters/html-converters/md2html31
1 files changed, 28 insertions, 3 deletions
diff --git a/filters/html-converters/md2html b/filters/html-converters/md2html
index 59f43a8..de393c7 100755
--- a/filters/html-converters/md2html
+++ b/filters/html-converters/md2html
@@ -288,10 +288,10 @@ sys.stdout.write(HtmlFormatter(style='pastie').get_style_defs('.highlight'))
sys.stdout.write('''
</style>
''')
-sys.stdout.write("<div class='markdown-body'>")
-sys.stdout.flush()
+# 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
-markdown.markdownFromFile(
+html = markdown.markdown(
+ sys.stdin.read(),
output_format="html5",
extensions=[
"markdown.extensions.fenced_code",
@@ -301,4 +301,29 @@ markdown.markdownFromFile(
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
+# <img src> against the about-page URL (/<repo>/about/), so the image 404s.
+# Rewrite relative <img src> to an absolute /<repo>/plain/<path>?h=<branch> 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'(<img\b[^>]*?\bsrc=")([^"]*)(")', rewrite, html, flags=re.I)
+
+sys.stdout.write("<div class='markdown-body'>")
+sys.stdout.write(html)
sys.stdout.write("</div>")