mirror of
https://github.com/openmlsys/openmlsys-zh.git
synced 2026-03-21 04:27:33 +08:00
* feat: add v1/v2 versioning and language selector for mdbook - Copy current content to v1/ directory (1st Edition) - Create v2/ directory with new TOC structure (2nd Edition) and placeholder chapters - Add version selector (V1/V2) and language toggle (EN/ZH) in top-right nav bar - Add build scripts: build_mdbook_v1.sh, build_mdbook_v2.sh - Update assemble_docs_publish_tree.py to support v1/v2 deployment layout - Fix mdbook preprocessor to use 'sections' key (v0.4.43 compatibility) - Update .gitignore for new build artifact directories - Deployment layout: / = v2 EN, /cn/ = v2 ZH, /v1/ = v1 EN, /v1/cn/ = v1 ZH Co-Authored-By: Claude Opus 4.6 <noreply@anthropic.com> * build: update CI to build and verify all four books (v1/v2 x EN/ZH) - Clarify step names: "Build v2 (EN + ZH)" and "Build v1 (EN + ZH)" - Add verification step to check all four index.html outputs exist - Deploy workflow assembles: / = v2 EN, /cn/ = v2 ZH, /v1/ = v1 EN, /v1/cn/ = v1 ZH Co-Authored-By: Claude Opus 4.6 <noreply@anthropic.com> * fix: gracefully skip missing TOC entries instead of crashing resolve_toc_target() now returns None for missing files instead of raising FileNotFoundError. This fixes v1 EN build where chapter index files reference TOC entry names that don't match actual filenames. Co-Authored-By: Claude Opus 4.6 <noreply@anthropic.com> --------- Co-authored-by: Claude Opus 4.6 <noreply@anthropic.com>
89 lines
3.1 KiB
Python
89 lines
3.1 KiB
Python
from __future__ import annotations
|
|
|
|
import json
|
|
import sys
|
|
from pathlib import Path
|
|
|
|
try:
|
|
from tools.prepare_mdbook import build_title_cache, collect_figure_labels, collect_labels, convert_math_to_mathjax, parse_bib, rewrite_markdown
|
|
except ModuleNotFoundError:
|
|
from prepare_mdbook import build_title_cache, collect_figure_labels, collect_labels, convert_math_to_mathjax, parse_bib, rewrite_markdown
|
|
|
|
|
|
PLACEHOLDER_PREFIX = "[TODO: src = zh_chapters/"
|
|
BIBLIOGRAPHY_TITLE = "References"
|
|
FRONTPAGE_SWITCH_LABEL = "中文"
|
|
FRONTPAGE_SWITCH_HREF = "cn/"
|
|
|
|
|
|
def iter_chapters(items: list[dict]) -> list[dict]:
|
|
chapters: list[dict] = []
|
|
for item in items:
|
|
chapter = item.get("Chapter")
|
|
if not chapter:
|
|
continue
|
|
chapters.append(chapter)
|
|
chapters.extend(iter_chapters(chapter.get("sub_items", [])))
|
|
return chapters
|
|
|
|
|
|
def main() -> int:
|
|
if len(sys.argv) > 1 and sys.argv[1] == "supports":
|
|
return 0
|
|
|
|
context, book = json.load(sys.stdin)
|
|
root = Path(context["root"]).resolve()
|
|
source_dir = (root / context["config"]["book"]["src"]).resolve()
|
|
title_cache = build_title_cache(source_dir, placeholder_prefix=PLACEHOLDER_PREFIX)
|
|
bib_path = source_dir.parent / "mlsys.bib"
|
|
bib_db = parse_bib(bib_path) if bib_path.exists() else {}
|
|
refs_dir = source_dir.parent / "references"
|
|
if refs_dir.is_dir():
|
|
for extra_bib in sorted(refs_dir.glob("*.bib")):
|
|
for key, fields in parse_bib(extra_bib).items():
|
|
bib_db.setdefault(key, fields)
|
|
|
|
chapters = iter_chapters(book.get("sections") or book.get("items") or [])
|
|
|
|
# Pass 1: collect all :label: directives and figure labels
|
|
ref_label_map: dict[str, str] = {}
|
|
fig_number_map: dict[str, str] = {}
|
|
for chapter in chapters:
|
|
source_path = chapter.get("source_path") or chapter.get("path")
|
|
if not source_path:
|
|
continue
|
|
for label in collect_labels(chapter["content"]):
|
|
ref_label_map.setdefault(label, source_path)
|
|
number = chapter.get("number")
|
|
if number:
|
|
prefix = ".".join(str(n) for n in number)
|
|
for idx, label in enumerate(collect_figure_labels(chapter["content"]), 1):
|
|
fig_number_map[label] = f"{prefix}.{idx}"
|
|
|
|
# Pass 2: rewrite markdown with cross-reference linking
|
|
for chapter in chapters:
|
|
source_path = chapter.get("source_path") or chapter.get("path")
|
|
if not source_path:
|
|
continue
|
|
current_file = (source_dir / source_path).resolve()
|
|
chapter["content"] = rewrite_markdown(
|
|
chapter["content"],
|
|
current_file,
|
|
title_cache,
|
|
bib_db,
|
|
bibliography_title=BIBLIOGRAPHY_TITLE,
|
|
frontpage_switch_label=FRONTPAGE_SWITCH_LABEL,
|
|
frontpage_switch_href=FRONTPAGE_SWITCH_HREF,
|
|
ref_label_map=ref_label_map,
|
|
current_source_path=source_path,
|
|
fig_number_map=fig_number_map,
|
|
)
|
|
chapter["content"] = convert_math_to_mathjax(chapter["content"])
|
|
|
|
json.dump(book, sys.stdout, ensure_ascii=False)
|
|
return 0
|
|
|
|
|
|
if __name__ == "__main__":
|
|
raise SystemExit(main())
|