#!/usr/bin/env python3 from pygments import highlight from pygments.lexers import get_lexer_by_name from pygments.formatters import HtmlFormatter from urllib.parse import urlparse import urllib.parse import lxml.html import mistune import houdini import jinja2 import shutil import os ENV = jinja2.Environment(loader=jinja2.FileSystemLoader('templates')) class MyRenderer(mistune.HTMLRenderer): def block_code(self, code, info=None): if not info: return '\n
{}
\n'.format(houdini.escape_html(code.strip())) lexer = get_lexer_by_name(info, stripall=True) formatter = HtmlFormatter() return highlight(code, lexer, formatter) def block_quote(self, content): content = content[3:-5] out = '\n
' for line in houdini.escape_html(content.strip()).split("\n"): out += '\n{}
'.format(line) return out + '\n
' def image(self, link, text, title): return "%s" % ( urlparse(link)._replace(query='').geturl(), text, link ) def heading(self, text, level): hash_ = urllib.parse.quote_plus(text) return "%s [#]\n" % ( level, hash_, text, hash_, level ) def parse_file(path): with open(path, "r") as f: unformatted = f.read() return parse_text(unformatted)[0] def parse_text(unformatted): md = mistune.create_markdown( renderer = MyRenderer(), plugins = ["strikethrough", "table", "url", "task_lists", "def_list"] ) html = md(unformatted) if html == "": return "", "" return html, get_headers(html) def get_headers(html): root = lxml.html.fromstring(html) headers = [] thesmallestlevel = 7 for node in root.xpath('//h1|//h2|//h3|//h4|//h5//h6'): level = int(node.tag[-1]) if level < thesmallestlevel: thesmallestlevel = level headers.append(( urllib.parse.unquote_plus(node.attrib["id"]), level, "#%s" % node.attrib["id"]) ) headers = [(i[0], i[1] - thesmallestlevel, i[2]) for i in headers] md_template = jinja2.Template(""" {% for text, depth, link in contents %} {{ " " * depth }} - [{{ text }}]({{ link }}) {% endfor %} """) return mistune.html(md_template.render(contents = headers)) def index(): src_file = "content/index.md" template_file = "index.html.j2" dst_file = "index.html" template = ENV.get_template(template_file) with open(os.path.join('static/%s' % dst_file), 'w') as html_file: with open(src_file, "r") as f: html = template.render( prefix = "./", title = "eva's site", content = parse_text(f.read())[0] ) html_file.write(html) def thoughts_overview(): src_file = "content/thoughts.md" template_file = "thoughts.html.j2" dst_file = "thoughts.html" template = ENV.get_template(template_file) with open(os.path.join('static/%s' % dst_file), 'w') as html_file: with open(src_file, "r") as f: html = template.render( prefix = "./", title = "my thoughts", content = parse_text(f.read())[0] ) html_file.write(html) def thoughts(): src_path = "content/thoughts" template_file = "thought.html.j2" dst_path = "static/thoughts" template = ENV.get_template(template_file) if not os.path.isdir(dst_path): os.mkdir(dst_path) for file in os.listdir(src_path): dst_file = file.replace(".md", ".html") with open(os.path.join(dst_path, dst_file), 'w') as html_file: with open(os.path.join(src_path, file), 'r') as f: html = template.render( prefix = "../", title = file.replace("-", " ").replace(".md", ""), content = parse_text(f.read())[0] ) html_file.write(html) def about(): src_file = "content/about.md" template_file = "about.html.j2" dst_file = "about.html" template = ENV.get_template(template_file) with open(os.path.join('static/%s' % dst_file), 'w') as html_file: with open(src_file, "r") as f: html = template.render( prefix = "./", title = "about me", content = parse_text(f.read())[0] ) html_file.write(html) def main(): if os.path.isdir("static"): shutil.rmtree("static") os.mkdir("static") shutil.copytree("content/styles", "static/styles") shutil.copytree("content/images", "static/images") shutil.copy("content/robots.txt", "static") index() about() thoughts_overview() thoughts() if __name__ == '__main__': main()