bbcovert/render.py

176 lines
6.7 KiB
Python

import jinja2
import os
import shutil
import json
import sys
import time
import tomllib
import math
print("Load config")
with open("config.toml", 'rb') as file:
cfg = tomllib.load(file)["render"]
show_st = cfg["show_st"]
clean = cfg["clean"]
page_split = cfg["page_split"]
print("Init build")
if os.path.exists("build"):
if (clean):
shutil.rmtree("build")
os.mkdir("build")
else:
os.mkdir("build")
if not os.path.exists("theme"):
print("Connot find any themes")
sys.exit(1)
with open("dump/forums.json", 'r') as file:
forums_json_res = json.load(file)
root_forums = [
{
"url": "/topics/"+str(i["id"])+"/1.html",
"name": i["name"],
"description": i["description"]
} for i in forums_json_res
]
def render_func(filepath, extpath, **kwargs):
if (show_st):
print(f' render "{extpath}"')
with open(filepath, 'r') as file:
result = jinja2.Template(file.read()).render(
**kwargs, forums=root_forums)
with open(extpath, 'w') as file:
file.write(result)
if not (os.path.exists("build/home.html")):
print("Render home page")
with open("dump/forums.json", 'r') as file:
json_res = json.load(file)
render_func("theme/home.html", "build/index.html")
if not (os.path.exists("build/users")):
print("Render users")
os.mkdir("build/users")
with open("dump/users.json", 'r') as file:
user_json_res = json.load(file)
count = 0
print(f"Users count: {len(user_json_res)}")
for ids, context in user_json_res.items():
count += 1
render_func("theme/user.html", "build/users/"+str(ids)+".html", user={
"name": context["name"],
"description": context["description"],
"reg_time": time.strftime("%Y-%m-%d", time.localtime(context["time"]))
})
if not (show_st):
if (count % 50 == 0):
print(f" render {count}", end='\r')
print(f" render {count}")
if not (os.path.exists("build/topics")):
print("Render topics")
os.mkdir("build/topics")
with open("dump/forums.json", 'r') as file:
json_res = json.load(file)
count = 0
for r in os.listdir("dump/forums"):
count += 1
u_cfg = []
with open("dump/forums/"+r, 'r') as file:
strs = file.readlines()
n_count = 0
for i in strs:
n_count += 1
line_st = i.rstrip("\r\n").lstrip("\r\n")
if (line_st == ""):
continue
line_json = json.loads(line_st)
u_cfg.append(
{
"id": n_count,
"name": line_json["name"],
"time": time.strftime("%Y-%m-%d", time.localtime(line_json["time"])),
"url": "/posts/"+str(line_json["id"])+"/1.html"
}
)
ids = int(r.split(".")[0])
os.mkdir("build/topics/" + str(ids))
for page_counts in range(1, math.ceil(len(strs)/page_split)+1):
render_func("theme/topics.html", "build/topics/" +
str(ids)+"/"+str(page_counts)+".html", topics={
"topics": u_cfg[page_split*(page_counts-1):page_split*page_counts],
"from_forum": list(filter(lambda d: d.get('id') == ids, json_res))[0]["name"],
"from_url": "/index.html"
}, page={
"now": page_counts,
"count": math.ceil(len(strs)/page_split),
"first_url": "/topics/"+str(ids)+"/"+str(1)+".html",
"prev_url": ("/topics/"+str(ids)+"/"+str(page_counts-1)+".html") if (page_counts > 1) else "",
"next_url": ("/topics/"+str(ids)+"/"+str(page_counts+1)+".html") if ((page_counts) < math.ceil(len(strs)/page_split)) else "",
"end_url": "/topics/"+str(ids)+"/"+str(math.ceil(len(strs)/page_split))+".html"
})
if not (show_st):
print(f" render {count}", end='\r')
print(f" render {count}")
if not (os.path.exists("build/posts")):
print("Render posts")
os.mkdir("build/posts")
n_count = 0
for r in os.listdir("dump/forums"):
with open("dump/forums/"+r, 'r') as file:
strs = file.readlines()
page_ncount = 0
for i in strs:
page_ncount += 1
line_st = i.rstrip("\r\n").lstrip("\r\n")
if (line_st == ""):
continue
n_json = json.loads(line_st)
n_id = n_json["id"]
if not (os.path.exists("dump/topics/"+str(n_id)+".manifest")):
continue
with open("dump/topics/"+str(n_id)+".manifest", 'r') as file:
strs_m = file.readlines()
u_cfg = []
t_count = 0
for j in strs_m:
n_count += 1
t_count += 1
m_st = j.rstrip("\r\n").lstrip("\r\n")
if (m_st == ""):
continue
m_json = json.loads(m_st)
ids = n_id
u_cfg.append({
"id": t_count,
"text": m_json["text"],
"postername": m_json["poster_name"],
"posterurl": "/users/"+str(m_json["poster_id"])+".html"
})
if (n_count % 10 == 0):
print(f" render {n_count}", end='\r')
os.mkdir("build/posts/" + str(ids))
for page_counts in range(1, math.ceil(len(u_cfg)/page_split)+1):
render_func("theme/posts.html", "build/posts/" +
str(ids)+"/"+str(page_counts)+".html", posts={
"posts": u_cfg[page_split*(page_counts-1):page_split*page_counts],
"from_topic": n_json["name"],
"from_url": "/topics/"+str(r.split(".")[0])+"/"+str((page_ncount-1)//page_split+1)+".html"
}, page={
"now": page_counts,
"count": math.ceil(len(u_cfg)/page_split),
"first_url": "/posts/"+str(ids)+"/"+str(1)+".html",
"prev_url": ("/posts/"+str(ids)+"/"+str(page_counts-1)+".html") if (page_counts > 1) else "",
"next_url": ("/posts/"+str(ids)+"/"+str(page_counts+1)+".html") if ((page_counts) < math.ceil(len(u_cfg)/page_split)) else "",
"end_url": "/posts/"+str(ids)+"/"+str(math.ceil(len(u_cfg)/page_split))+".html"
})
print(f" render {n_count}")