summaryrefslogtreecommitdiff
path: root/__main__.py
diff options
context:
space:
mode:
authorBotond Hende <nettingman@gmail.com>2024-09-04 20:05:51 +0200
committerBotond Hende <nettingman@gmail.com>2024-09-04 20:05:51 +0200
commitbea80928f694671010bc99493d31879df7d42836 (patch)
treeafb71282df8f01ce4b2dd87a292febe7ad8e3537 /__main__.py
initial commit
Diffstat (limited to '__main__.py')
-rw-r--r--__main__.py126
1 files changed, 126 insertions, 0 deletions
diff --git a/__main__.py b/__main__.py
new file mode 100644
index 0000000..14819f6
--- /dev/null
+++ b/__main__.py
@@ -0,0 +1,126 @@
+import datetime
+import email.utils
+import os.path
+import shutil
+import sys
+
+import jinja2
+from .config import Config
+from .modules import blogpost_processor
+
+
+def init_jinja_env() -> jinja2.Environment:
+ jinja_env = jinja2.Environment(loader=jinja2.FileSystemLoader(Config.TEMPLATES_SOURCE_DIR))
+ return jinja_env
+
+
+def main(output_root_path: str, local: bool):
+ if local:
+ Config.BLOG_ROOT_URL = "http://localhost"
+
+ if os.path.exists(output_root_path):
+ shutil.rmtree(output_root_path)
+
+ os.mkdir(output_root_path)
+
+ jinja_env = init_jinja_env()
+ posts = blogpost_processor.get_posts(Config.POST_SOURCE_DIR)
+ tag_occurrence_count = {}
+ for post in posts:
+ for tag in post.meta_data[blogpost_processor.TAGS_KEY]:
+ if tag in tag_occurrence_count:
+ tag_occurrence_count[tag] += 1
+ else:
+ tag_occurrence_count[tag] = 1
+
+ tags = [str(key) for key in tag_occurrence_count.keys()]
+ tags.sort(key=lambda key: tag_occurrence_count[key], reverse=True)
+ top_tags = tags[:10]
+
+ jinja_env.globals.update(site={
+ "assets_path": Config.ASSETS_IMPORT_PATH,
+ "assets_path_static": Config.ASSETS_IMPORT_PATH_STATIC,
+ "host_name": Config.BLOG_HOSTNAME,
+ "blog_name": Config.BLOG_NAME,
+ "subtitle": Config.BLOG_SUBTITLE,
+ "top_tags": top_tags
+ })
+
+ blogpost_template = jinja_env.get_template("blogpost.html.j2")
+ subpage_template = jinja_env.get_template("blogpost_sub.html.j2")
+ for post in posts:
+ output_dir = os.path.join(output_root_path, "posts", post.get_publish_year(), post.name)
+ os.makedirs(output_dir, exist_ok=True)
+ for extra_file in post.extra_files:
+ from_path = os.path.join(post.path, extra_file)
+ if os.path.isdir(from_path):
+ shutil.copytree(from_path, os.path.join(output_dir, extra_file))
+ else:
+ shutil.copyfile(from_path, os.path.join(output_dir, extra_file))
+
+ ctx = {
+ "post": post,
+ "url": f"{Config.BLOG_ROOT_URL}{post.href}"
+ }
+ with open(os.path.join(output_dir, "index.html"), "w") as f:
+ f.write(blogpost_template.render(ctx))
+
+ for subpage in post.subpages:
+ ctx = {
+ "post": post,
+ "subpage_name": subpage[0],
+ "subpage_html": subpage[1],
+ "url": f"{Config.BLOG_ROOT_URL}{post.href}/{subpage[0]}.html"
+ }
+
+ with open(os.path.join(output_dir, f"{subpage[0]}.html"), "w") as f:
+ f.write(subpage_template.render(ctx))
+
+ tags_template = jinja_env.get_template("tags.html.j2")
+ output_dir = os.path.join(output_root_path, "tags")
+ os.makedirs(output_dir, exist_ok=True)
+
+ ctx = {
+ "config": Config,
+ "tags_ls": " ".join([f'<a href="{tag}.html">{tag}/</a>' for tag in tags]),
+ "url": f"{Config.BLOG_ROOT_URL}/tags"
+ }
+ with open(os.path.join(output_dir, "index.html"), "w") as f:
+ f.write(tags_template.render(ctx))
+
+ tag_template = jinja_env.get_template("tag.html.j2")
+ for tag in tags:
+ ctx = {
+ "config": Config,
+ "tag": tag,
+ "posts": [post for post in posts if tag in post.meta_data["tags"]],
+ "url": f"{Config.BLOG_ROOT_URL}/tags/{tag}.html"
+ }
+ with open(os.path.join(output_dir, "{}.html".format(tag)), "w") as f:
+ f.write(tag_template.render(ctx))
+
+ index_template = jinja_env.get_template("index.html.j2")
+ ctx = {
+ "posts": posts,
+ "url": Config.BLOG_ROOT_URL
+ }
+ with open(os.path.join(output_root_path, "index.html"), "w") as f:
+ f.write(index_template.render(ctx))
+
+ acknowledgement_template = jinja_env.get_template("acknowledgement.html.j2")
+ with open(os.path.join(output_root_path, "acknowledgement.html"), "w") as f:
+ f.write(acknowledgement_template.render({}))
+
+ rss_template = jinja_env.get_template("feed.xml.j2")
+ ctx = {
+ "build_date": email.utils.format_datetime(datetime.datetime.now(Config.TIMEZONE)),
+ "posts": posts[:5]
+ }
+ with open(os.path.join(output_root_path, "feed.xml"), "w") as f:
+ f.write(rss_template.render(ctx))
+
+ shutil.copytree(Config.ASSETS_SOURCE_DIR, output_root_path + Config.ASSETS_IMPORT_PATH)
+
+
+if __name__ == '__main__':
+ main(sys.argv[1], bool(int(sys.argv[2])) if len(sys.argv) > 2 else False)