erg/doc/scripts/sync_to_summary.py
2023-01-28 15:34:25 +09:00

112 lines
3.6 KiB
Python

# This script automatically generates a table of contents (SUMMARY.md) from markdown file titles
# TODO: rewrite in Erg
# TODO: support Windows
import os
import re
SUMMARY_TITLE = "SUMMARY_TITLE"
SUMMARY_DESCRIPTION = "SUMMARY_DESCRIPTION"
SUMMARY_MD = "SUMMARY.md"
LANGUAGE_SPECIFIC = {
"EN": {
SUMMARY_TITLE: "Summary",
SUMMARY_DESCRIPTION: """\
This file is generated automatically. If you want to edit this, edit `doc/scripts/sync_to_summary.py`
This file is for generating The Erg Book. Do not add badges, etc.\
""",
},
"JA": {
SUMMARY_TITLE: "概要",
SUMMARY_DESCRIPTION: """\
このファイルは自動生成されます。これを編集したい場合は`doc/scripts/sync_to_summary.py`を編集してください。
このファイルはThe Erg Bookを生成するためのものです。バッジなどは付けないでください。\
""",
},
"zh_CN": {
SUMMARY_TITLE: "概要",
SUMMARY_DESCRIPTION: """\
该文件是自动生成的。如果你想编辑这个,编辑 `doc/scripts/sync_to_summary.py`
此文件用于生成Erg Book。不要添加翻译徽章等\
""",
},
"zh_TW": {
SUMMARY_TITLE: "概要",
SUMMARY_DESCRIPTION: """\
該文件是自動生成的。如果你想編輯這個,編輯 `doc/scripts/sync_to_summary.py`
此文件用於生成Erg Book。不要添加翻譯徽章等\
""",
},
}
title_pattern = re.compile(r"^#\s+(.+)\s*$")
dir_file_name_pattern = re.compile(r"(?:\d+_)?(.+)\.md")
def get_title(file_path):
with open(file_path, encoding="utf-8") as f:
for line in f:
title_match = title_pattern.match(line)
if title_match is not None:
return title_match.group(1)
matched_dir_name = dir_file_name_pattern.match(os.path.basename(file_path))
if matched_dir_name is None:
return None
return matched_dir_name.group(1)
def get_summary(
base_path: str, dir_relative_path: str, depth: int, current_text: str
) -> str:
path = os.path.join(base_path, dir_relative_path)
dir_list = sorted(os.listdir(path))
file_names = [
f
for f in dir_list
if os.path.isfile(os.path.join(path, f)) and (depth != 0 or f != SUMMARY_MD)
]
dir_names = [f for f in dir_list if os.path.isdir(os.path.join(path, f))]
for file_name in file_names:
current_text += f"{' '*depth}- [{get_title(os.path.join(path, file_name))}]({'./' if dir_relative_path=='' else f'./{dir_relative_path}/'}{file_name})\n"
dir_file_name_match = dir_file_name_pattern.match(file_name)
matched_dir_name = None
if dir_file_name_match is not None:
matched_dir_name = dir_file_name_match.group(1)
if matched_dir_name is not None and matched_dir_name in dir_names:
current_text = get_summary(
base_path,
os.path.join(dir_relative_path, matched_dir_name),
depth + 1,
current_text,
)
return current_text
def main():
os.chdir(os.path.join(os.path.dirname(__file__), ".."))
for language in LANGUAGE_SPECIFIC.keys():
syntax_base_path = os.path.join(language, "syntax")
with open(
os.path.join(syntax_base_path, SUMMARY_MD), mode="w", encoding="utf-8"
) as f:
f.write(
get_summary(
syntax_base_path,
"",
0,
f"""\
# {LANGUAGE_SPECIFIC[language][SUMMARY_TITLE]}
<!--
{LANGUAGE_SPECIFIC[language][SUMMARY_DESCRIPTION]}
-->
""",
)
)
if __name__ == "__main__":
main()