doodle/dev-assets/guidebook/build.py

74 lines
2.2 KiB
Python

#!/usr/bin/env python3
import codecs
import glob
import os
import markdown
import jinja2
import re
def main():
if not os.path.isdir("./compiled"):
print("Make output directory: ./compiled")
os.mkdir("./compiled")
os.mkdir("./compiled/pages")
# Render the main index.html template.
with codecs.open("./pages/index.html", "r", "utf-8") as fh:
html = fh.read()
html = render_template(html)
with open("./compiled/index.html", "w") as outfh:
outfh.write(html)
# Load the Markdown wrapper HTML template.
html_wrapper = "$CONTENT"
with codecs.open("./pages/markdown.html", "r", "utf-8") as fh:
html_wrapper = fh.read()
for md in glob.glob("./pages/*.md"):
filename = md.split(os.path.sep)[-1]
htmlname = filename.replace(".md", ".html")
print("Compile Markdown: {} -> {}".format(filename, htmlname))
with codecs.open(md, 'r', 'utf-8') as fh:
data = fh.read()
rendered = markdown.markdown(data,
extensions=["codehilite", "fenced_code"],
)
html = html_wrapper.replace("$CONTENT", rendered)
html = render_template(html,
title=title_from_markdown(data),
)
with open(os.path.join("compiled", "pages", htmlname), "w") as outfh:
outfh.write(html)
jinja_env = jinja2.Environment()
def render_template(input, *args, **kwargs):
templ = jinja_env.from_string(input)
return templ.render(
app_name="Project: Doodle",
app_version=get_app_version(),
*args, **kwargs
)
def title_from_markdown(text):
"""Retrieve the title from the first Markdown header."""
for line in text.split("\n"):
if line.startswith("# "):
return line[2:]
def get_app_version():
"""Get the app version from pkg/branding/branding.go in Doodle"""
ver = re.compile(r'Version\s*=\s*"(.+?)"')
with codecs.open("../../pkg/branding/branding.go", "r", "utf-8") as fh:
text = fh.read()
for line in text.split("\n"):
m = ver.search(line)
if m:
return m[1]
if __name__ == "__main__":
main()