2022-07-01 09:47:15 -04:00
|
|
|
|
import markdown
|
|
|
|
|
import os
|
|
|
|
|
|
|
|
|
|
SOURCES_PATH="./source"
|
|
|
|
|
BUILD_PATH="./build"
|
|
|
|
|
INPUT_ENCODING="utf-8"
|
|
|
|
|
OUTPUT_ENCODING="utf-8"
|
|
|
|
|
|
|
|
|
|
document_start = """
|
|
|
|
|
<!doctype html>
|
|
|
|
|
<html>
|
|
|
|
|
<head>
|
2023-12-25 06:08:56 -05:00
|
|
|
|
<link rel="stylesheet" href="css/water.css?v=6">
|
2022-07-01 09:47:15 -04:00
|
|
|
|
<meta charset="utf-8"/>
|
|
|
|
|
<title>Reticulum Network</title>
|
2022-07-03 14:38:28 -04:00
|
|
|
|
<meta name="viewport" content="width=device-width, initial-scale=1.0">
|
2022-07-01 09:47:15 -04:00
|
|
|
|
</head>
|
|
|
|
|
<body>
|
|
|
|
|
"""
|
|
|
|
|
|
|
|
|
|
document_end = """
|
|
|
|
|
</body>
|
|
|
|
|
</html>
|
|
|
|
|
"""
|
|
|
|
|
|
2022-11-14 05:26:59 -05:00
|
|
|
|
langs_md = """<div class="top_menu lang_menu">{LANGS}</div>"""
|
|
|
|
|
menu_md = """<div class="top_menu">[{RETICULUM}](index{LANG_EXT}.html) | [{START}](start{LANG_EXT}.html) | [{HARDWARE}](hardware{LANG_EXT}.html) | [{TESTNET}](connect{LANG_EXT}.html) | [{MANUAL}](docs{LANG_EXT}.html) | [{CRYPTO}](crypto{LANG_EXT}.html) | [{CREDITS}](credits{LANG_EXT}.html) | [{SOURCE}](https://github.com/markqvist/reticulum) | [{DONATE}](donate{LANG_EXT}.html)</div>"""
|
2022-07-01 09:47:15 -04:00
|
|
|
|
|
2022-11-12 04:32:05 -05:00
|
|
|
|
primary_lang = "en"
|
|
|
|
|
langs = [
|
2022-11-15 14:50:51 -05:00
|
|
|
|
{"name": "Deutsch", "ext": "de"},
|
2022-11-12 04:32:05 -05:00
|
|
|
|
{"name": "English", "ext": "en"},
|
2024-01-15 07:04:59 -05:00
|
|
|
|
{"name": "Nederlands", "ext": "nl"},
|
2022-11-29 11:12:07 -05:00
|
|
|
|
{"name": "Polski", "ext": "pl"},
|
2022-11-12 04:32:05 -05:00
|
|
|
|
{"name": "Português", "ext": "pt-br"},
|
2023-12-25 06:03:23 -05:00
|
|
|
|
{"name": "Türkçe", "ext": "tr"},
|
|
|
|
|
{"name": "日本語", "ext": "jp"},
|
2023-12-25 14:01:44 -05:00
|
|
|
|
{"name": "简体中文", "ext": "zh-cn"},
|
2022-11-12 04:32:05 -05:00
|
|
|
|
]
|
|
|
|
|
|
|
|
|
|
menu_translations = {
|
|
|
|
|
"en": {
|
|
|
|
|
"RETICULUM": "Reticulum",
|
|
|
|
|
"START": "Start",
|
|
|
|
|
"HARDWARE": "Hardware",
|
|
|
|
|
"TESTNET": "Testnet",
|
|
|
|
|
"MANUAL": "Manual",
|
|
|
|
|
"CRYPTO": "Crypto",
|
|
|
|
|
"CREDITS": "Credits",
|
|
|
|
|
"SOURCE": "Source",
|
|
|
|
|
"DONATE": "Donate",
|
|
|
|
|
},
|
2023-12-24 22:12:26 -05:00
|
|
|
|
"tr": {
|
|
|
|
|
"RETICULUM": "Reticulum",
|
|
|
|
|
"START": "Başlat",
|
|
|
|
|
"HARDWARE": "Donanım",
|
|
|
|
|
"TESTNET": "Test Ağı",
|
|
|
|
|
"MANUAL": "Kılavuz",
|
|
|
|
|
"CRYPTO": "Şifreleme",
|
|
|
|
|
"CREDITS": "Hakkında",
|
|
|
|
|
"SOURCE": "Kaynak",
|
2023-12-24 22:20:35 -05:00
|
|
|
|
"DONATE": "Destekle",
|
2023-12-24 22:12:26 -05:00
|
|
|
|
},
|
2024-01-14 22:14:10 -05:00
|
|
|
|
"nl": {
|
|
|
|
|
"RETICULUM": "Reticulum",
|
|
|
|
|
"START": "Start",
|
|
|
|
|
"HARDWARE": "Hardware",
|
|
|
|
|
"TESTNET": "Testnet",
|
|
|
|
|
"MANUAL": "Handleiding",
|
|
|
|
|
"CRYPTO": "Crypto",
|
|
|
|
|
"CREDITS": "Dankwoord",
|
|
|
|
|
"SOURCE": "Broncode",
|
2024-01-15 14:01:00 -05:00
|
|
|
|
"DONATE": "Doneren",
|
2024-01-14 22:14:10 -05:00
|
|
|
|
},
|
2023-12-24 22:12:26 -05:00
|
|
|
|
"jp": {
|
|
|
|
|
"RETICULUM": "レチキュラム",
|
|
|
|
|
"START": "開始",
|
|
|
|
|
"HARDWARE": "ハードウェア",
|
|
|
|
|
"TESTNET": "テストネット",
|
|
|
|
|
"MANUAL": "マニュアル",
|
|
|
|
|
"CRYPTO": "暗号",
|
|
|
|
|
"CREDITS": "クレジット",
|
|
|
|
|
"SOURCE": "ソース",
|
|
|
|
|
"DONATE": "寄付",
|
|
|
|
|
},
|
2022-11-15 14:50:51 -05:00
|
|
|
|
"de": {
|
|
|
|
|
"RETICULUM": "Reticulum",
|
|
|
|
|
"START": "Los Geht's",
|
|
|
|
|
"HARDWARE": "Hardware",
|
|
|
|
|
"TESTNET": "Testnetz",
|
|
|
|
|
"MANUAL": "Handbuch",
|
|
|
|
|
"CRYPTO": "Krypto",
|
|
|
|
|
"CREDITS": "Credits",
|
|
|
|
|
"SOURCE": "Quellcode",
|
|
|
|
|
"DONATE": "Unterstützen",
|
2022-11-29 11:12:07 -05:00
|
|
|
|
},"pl": {
|
|
|
|
|
"RETICULUM": "Reticulum",
|
2022-11-30 15:02:45 -05:00
|
|
|
|
"START": "Jak Zacząć",
|
2022-11-29 11:12:07 -05:00
|
|
|
|
"HARDWARE": "Hardware",
|
|
|
|
|
"TESTNET": "Testnet",
|
2022-11-29 12:03:28 -05:00
|
|
|
|
"MANUAL": "Podręcznik",
|
|
|
|
|
"CRYPTO": "Krypto",
|
|
|
|
|
"CREDITS": "Zasługi",
|
2022-11-30 15:02:45 -05:00
|
|
|
|
"SOURCE": "Kod Źródłowy",
|
|
|
|
|
"DONATE": "Darowizna",
|
2022-11-15 14:50:51 -05:00
|
|
|
|
},
|
2022-11-12 04:32:05 -05:00
|
|
|
|
"pt-br": {
|
|
|
|
|
"RETICULUM": "Reticulum",
|
|
|
|
|
"START": "Começar",
|
|
|
|
|
"HARDWARE": "Hardware",
|
|
|
|
|
"TESTNET": "Rede de Teste",
|
|
|
|
|
"MANUAL": "Manual",
|
|
|
|
|
"CRYPTO": "Cripto",
|
|
|
|
|
"CREDITS": "Créditos",
|
|
|
|
|
"SOURCE": "Código",
|
|
|
|
|
"DONATE": "Ajude",
|
2023-12-25 14:01:44 -05:00
|
|
|
|
},
|
|
|
|
|
"zh-cn": {
|
|
|
|
|
"RETICULUM": "Reticulum",
|
|
|
|
|
"START": "开始使用",
|
|
|
|
|
"HARDWARE": "硬件要求",
|
|
|
|
|
"TESTNET": "测试网络",
|
|
|
|
|
"MANUAL": "阅读手册",
|
|
|
|
|
"CRYPTO": "密码学",
|
|
|
|
|
"CREDITS": "致谢",
|
|
|
|
|
"SOURCE": "源代码",
|
|
|
|
|
"DONATE": "支持开发",
|
2022-11-12 04:32:05 -05:00
|
|
|
|
}
|
|
|
|
|
}
|
|
|
|
|
|
|
|
|
|
def get_page_lang(page):
|
|
|
|
|
page_lang = primary_lang
|
|
|
|
|
for lang in langs:
|
|
|
|
|
base_name = mdf.replace(".md", "")
|
|
|
|
|
if lang["ext"] != primary_lang:
|
|
|
|
|
if base_name.endswith(lang["ext"]):
|
|
|
|
|
page_lang = lang["ext"]
|
|
|
|
|
return page_lang
|
|
|
|
|
|
|
|
|
|
def get_languages_md(page):
|
|
|
|
|
page = page.replace(SOURCES_PATH, ".")
|
|
|
|
|
current_page_lang = get_page_lang(page)
|
|
|
|
|
if current_page_lang != primary_lang:
|
|
|
|
|
page_base_name = page.replace("_"+current_page_lang+".md", "")
|
|
|
|
|
else:
|
|
|
|
|
page_base_name = page.replace(".md", "")
|
|
|
|
|
|
|
|
|
|
lang_list = ""
|
|
|
|
|
for lang_entry in langs:
|
|
|
|
|
lang = lang_entry["name"]
|
|
|
|
|
lang_ext = lang_entry["ext"]
|
|
|
|
|
if lang_ext != primary_lang:
|
|
|
|
|
lang_ext_str = "_"+lang_ext
|
|
|
|
|
else:
|
|
|
|
|
lang_ext_str = ""
|
|
|
|
|
|
|
|
|
|
link_target = page_base_name+lang_ext_str+".html"
|
2022-11-12 12:20:10 -05:00
|
|
|
|
link_md = "["+lang+"]("+link_target+") | "
|
2022-11-12 04:32:05 -05:00
|
|
|
|
lang_list += link_md
|
|
|
|
|
|
2022-11-12 12:20:10 -05:00
|
|
|
|
return langs_md.replace("{LANGS}", lang_list[:-3])
|
2022-11-12 04:32:05 -05:00
|
|
|
|
|
|
|
|
|
|
|
|
|
|
def get_menu_md(lang):
|
|
|
|
|
local_menu_md = menu_md
|
|
|
|
|
for entry in menu_translations[lang]:
|
|
|
|
|
local_menu_md = local_menu_md.replace("{"+entry+"}", menu_translations[lang][entry])
|
|
|
|
|
|
|
|
|
|
return local_menu_md
|
|
|
|
|
|
2022-07-01 09:47:15 -04:00
|
|
|
|
def scan_pages(base_path):
|
|
|
|
|
files = [file for file in os.listdir(base_path) if os.path.isfile(os.path.join(base_path, file)) and file[:1] != "."]
|
|
|
|
|
directories = [file for file in os.listdir(base_path) if os.path.isdir(os.path.join(base_path, file)) and file[:1] != "."]
|
|
|
|
|
|
|
|
|
|
page_sources = []
|
|
|
|
|
|
|
|
|
|
for file in files:
|
|
|
|
|
if file.endswith(".md"):
|
|
|
|
|
page_sources.append(base_path+"/"+file)
|
|
|
|
|
|
|
|
|
|
for directory in directories:
|
|
|
|
|
page_sources.append(scan_pages(base_path+"/"+directory))
|
|
|
|
|
|
|
|
|
|
return page_sources
|
|
|
|
|
|
|
|
|
|
source_files = scan_pages(SOURCES_PATH)
|
|
|
|
|
|
|
|
|
|
for mdf in source_files:
|
|
|
|
|
with open(mdf, "rb") as f:
|
2022-11-12 04:32:05 -05:00
|
|
|
|
page_lang = get_page_lang(mdf)
|
|
|
|
|
|
|
|
|
|
if page_lang != primary_lang:
|
|
|
|
|
page_lang_ext = "_"+page_lang
|
|
|
|
|
else:
|
|
|
|
|
page_lang_ext = ""
|
|
|
|
|
|
2022-07-01 09:47:15 -04:00
|
|
|
|
md = f.read().decode(INPUT_ENCODING)
|
2022-11-14 05:26:59 -05:00
|
|
|
|
page_md = "<center>"+get_languages_md(mdf)+""+get_menu_md(page_lang).replace("{LANG_EXT}", page_lang_ext) + "</center>\n\n" + md
|
2022-11-12 04:32:05 -05:00
|
|
|
|
html = markdown.markdown(page_md, extensions=["markdown.extensions.fenced_code"])
|
2022-07-01 09:47:15 -04:00
|
|
|
|
html = document_start + html + document_end
|
|
|
|
|
|
|
|
|
|
of = BUILD_PATH+mdf.replace(SOURCES_PATH, "").replace(".md", ".html")
|
|
|
|
|
with open(of, "wb") as wf:
|
|
|
|
|
wf.write(html.encode(OUTPUT_ENCODING))
|