diff options
Diffstat (limited to 'main.py')
| -rwxr-xr-x | main.py | 170 |
1 files changed, 170 insertions, 0 deletions
@@ -0,0 +1,170 @@ +#!/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<pre><code>{}</code></pre>\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<blockquote>' + for line in houdini.escape_html(content.strip()).split("\n"): + out += '\n<span class="quote">{}</span><br>'.format(line) + return out + '\n</blockquote>' + + def image(self, link, text, title): + return "<a href='%s' target='_blank'><img alt='%s' src='%s'></a>" % ( + urlparse(link)._replace(query='').geturl(), text, link + ) + + def heading(self, text, level): + hash_ = urllib.parse.quote_plus(text) + return "<h%d id='%s'>%s <a class='header_linker' href='#%s'>[#]</a></h%d>\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") + + index() + about() + thoughts_overview() + thoughts() + +if __name__ == '__main__': + main() |
