mirror of
https://github.com/chatmail/relay.git
synced 2026-05-14 09:54:38 +00:00
www: add markdown language switcher
This commit is contained in:
@@ -20,6 +20,7 @@ dependencies = [
|
||||
"pytest-xdist",
|
||||
"execnet",
|
||||
"imap_tools",
|
||||
"pymdown-extensions",
|
||||
]
|
||||
|
||||
[project.scripts]
|
||||
|
||||
@@ -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
|
||||
|
||||
|
||||
|
||||
Reference in New Issue
Block a user