summaryrefslogtreecommitdiff
path: root/generate.py
diff options
context:
space:
mode:
Diffstat (limited to 'generate.py')
-rwxr-xr-xgenerate.py134
1 files changed, 134 insertions, 0 deletions
diff --git a/generate.py b/generate.py
new file mode 100755
index 0000000..65e6ef6
--- /dev/null
+++ b/generate.py
@@ -0,0 +1,134 @@
+#!/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():
+ src_path = "content/thoughts"
+ template_file = "thoughts.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 = "eva's site :: thoughts",
+ 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()
+ thoughts()
+
+if __name__ == '__main__':
+ main()