chore: initial commit — import worldmodel workspace (plans/, research/)
This commit is contained in:
@@ -0,0 +1,60 @@
|
||||
#!/usr/bin/env python3
|
||||
"""
|
||||
gen_changelog_chapter.py
|
||||
========================
|
||||
把 CHANGELOG.md 转换为 PRISM 全书的 "第 17 章 变更日志" 章节文件,
|
||||
便于 build_book.sh 把它当作普通章节加入 PDF。
|
||||
|
||||
用法:
|
||||
python3 gen_changelog_chapter.py <changelog.md> <out_md> <version> <build_date>
|
||||
"""
|
||||
from __future__ import annotations
|
||||
import pathlib
|
||||
import sys
|
||||
|
||||
|
||||
def main(changelog: pathlib.Path, out_md: pathlib.Path,
|
||||
version: str, build_date: str) -> None:
|
||||
raw = changelog.read_text(encoding="utf-8")
|
||||
|
||||
# 给章节加一个统一的标题(由 build_book.sh 的 chapter_titles 覆盖,
|
||||
# 但这里也写一个 H1 以保证 md 渲染时仍是一个完整章节)。
|
||||
header = "\n".join([
|
||||
"# Chapter 17 — 变更日志 (Changelog)",
|
||||
"",
|
||||
f"> 本章直接镜像项目根的 [`CHANGELOG.md`](CHANGELOG.md);**当前版本 v{version}, 构建于 {build_date}**。"
|
||||
" 每次发版时由 [`tools/gen_changelog_chapter.py`](tools/gen_changelog_chapter.py) 自动同步到 PDF。",
|
||||
"",
|
||||
])
|
||||
|
||||
# 把原 CHANGELOG.md 的 H1 (`# Changelog`) + 顶层引言 + 首个 --- 全部跳过,
|
||||
# 从第一个真正的 ## 二级标题开始拼接,避免重复说明。
|
||||
lines = raw.splitlines()
|
||||
body_lines: list[str] = []
|
||||
in_body = False
|
||||
for ln in lines:
|
||||
if not in_body:
|
||||
# 第一个 ## 之前的所有内容都跳过
|
||||
if ln.startswith("## "):
|
||||
in_body = True
|
||||
body_lines.append(ln)
|
||||
continue
|
||||
body_lines.append(ln)
|
||||
|
||||
full = header + "\n".join(body_lines).rstrip() + "\n"
|
||||
out_md.write_text(full, encoding="utf-8")
|
||||
print(f"[changelog] wrote {out_md} (v{version}, {build_date})")
|
||||
|
||||
|
||||
if __name__ == "__main__":
|
||||
if len(sys.argv) != 5:
|
||||
sys.stderr.write(
|
||||
"usage: gen_changelog_chapter.py <changelog.md> <out.md> <version> <build_date>\n"
|
||||
)
|
||||
sys.exit(1)
|
||||
main(
|
||||
pathlib.Path(sys.argv[1]),
|
||||
pathlib.Path(sys.argv[2]),
|
||||
sys.argv[3],
|
||||
sys.argv[4],
|
||||
)
|
||||
Reference in New Issue
Block a user