From 15fc4c739ae07421c0ce1bed9fc05403312a2e86 Mon Sep 17 00:00:00 2001 From: yuzu-eva Date: Fri, 25 Oct 2024 21:46:28 +0200 Subject: added about page, changed css, added navbar --- main.py | 170 ++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++ 1 file changed, 170 insertions(+) create mode 100755 main.py (limited to 'main.py') diff --git a/main.py b/main.py new file mode 100755 index 0000000..89c1544 --- /dev/null +++ b/main.py @@ -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
{}
\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") + + index() + about() + thoughts_overview() + thoughts() + +if __name__ == '__main__': + main() -- cgit v1.2.3