www: add markdown language switcher

This commit is contained in:
Keonik1
2025-10-07 21:04:06 +02:00
committed by missytake
parent 0ed7c360a9
commit 62f028bc67
9 changed files with 150 additions and 352 deletions

View File

@@ -20,6 +20,7 @@ dependencies = [
"pytest-xdist",
"execnet",
"imap_tools",
"pymdown-extensions",
]
[project.scripts]

View File

@@ -11,6 +11,13 @@ from jinja2 import Template
from .genqr import gen_qr_png_data
LANGUAGE_NAMES = {
"EN": " 🇬🇧 English",
"RU": " 🇷🇺 Русский",
# "UA": "Українська",
# "FR": "Français",
# "DE": "Deutsch",
}
def snapshot_dir_stats(somedir):
d = {}
@@ -22,12 +29,59 @@ def snapshot_dir_stats(somedir):
return d
def prepare_template(source):
assert source.exists(), source
render_vars = {}
render_vars["pagename"] = "home" if source.stem == "index" else source.stem
render_vars["markdown_html"] = markdown.markdown(source.read_text())
page_layout = source.with_name("page-layout.html").read_text()
def prepare_template(source, locales_dir, languages=["EN"]):
assert source.exists(), f"Template {source} not found."
assert locales_dir.exists(), f"Locales directory {locales_dir} not found."
base_name = source.stem
render_vars = {
"pagename": "home" if base_name == "index" else base_name
}
selected_langs = (
sorted([d.name.upper() for d in locales_dir.iterdir() if d.is_dir()])
if "ALL" in [l.upper() for l in languages]
else [l.upper() for l in languages]
)
markdown_blocks = []
tabs_enabled = False
if len(selected_langs) > 1:
tabs_enabled = True
for lang_code in selected_langs:
lang_folder = locales_dir / lang_code
lang_file = lang_folder / f"{base_name}.md"
lang_name = LANGUAGE_NAMES.get(lang_code, lang_code)
if lang_file.exists():
content = lang_file.read_text().strip()
else:
print(f"[WARNING]: Missing file {lang_file}. Inserting fallback message.")
content = "Content for this language is not available, please contact your server administrator."
if tabs_enabled:
markdown_blocks.append(f"/// tab | {lang_name}\n{content}\n///")
continue
markdown_blocks.append(content)
if not markdown_blocks:
print("[WARNING] No valid language content found. Skipping file.")
return None, None
original_markdown = source.read_text()
combined_markdown = original_markdown.replace("%content placeholder%", "\n\n".join(markdown_blocks))
render_vars["markdown_html"] = markdown.markdown(
combined_markdown,
extensions=["pymdownx.blocks.tab"]
)
page_layout_path = source.with_name("page-layout.html")
assert page_layout_path.exists(), f"Missing template: {page_layout_path}"
page_layout = page_layout_path.read_text()
return render_vars, page_layout
@@ -80,6 +134,7 @@ def int_to_english(number):
def _build_webpages(src_dir, build_dir, config):
mail_domain = config.mail_domain
languages = config.languages
assert src_dir.exists(), src_dir
if not build_dir.exists():
build_dir.mkdir()
@@ -87,18 +142,19 @@ def _build_webpages(src_dir, build_dir, config):
qr_path = build_dir.joinpath(f"qr-chatmail-invite-{mail_domain}.png")
qr_path.write_bytes(gen_qr_png_data(mail_domain).read())
locales_dir = src_dir / "locales"
for path in src_dir.iterdir():
if path.suffix == ".md":
render_vars, content = prepare_template(path)
render_vars["username_min_length"] = int_to_english(
config.username_min_length
)
render_vars["username_max_length"] = int_to_english(
config.username_max_length
)
render_vars["password_min_length"] = int_to_english(
config.password_min_length
)
render_vars, content = prepare_template(path, locales_dir, languages)
if render_vars is None:
continue
render_vars["username_min_length"] = int_to_english(config.username_min_length)
render_vars["username_max_length"] = int_to_english(config.username_max_length)
render_vars["password_min_length"] = int_to_english(config.password_min_length)
target = build_dir.joinpath(path.stem + ".html")
# recursive jinja2 rendering
@@ -110,9 +166,11 @@ def _build_webpages(src_dir, build_dir, config):
with target.open("w") as f:
f.write(content)
elif path.name != "page-layout.html":
elif path.name != "page-layout.html" and path.name != "locales":
target = build_dir.joinpath(path.name)
target.write_bytes(path.read_bytes())
return build_dir