#!/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 "
" % (
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()