Files
capcut-mate/scripts/gen_font_docs.py
2026-08-06 09:40:02 +08:00

130 lines
4.4 KiB
Python
Raw Blame History

This file contains ambiguous Unicode characters
This file contains Unicode characters that might be confused with other characters. If you think that this is intentional, you can safely ignore this warning. Use the Escape button to reveal them.
# -*- coding: utf-8 -*-
"""Generate font lists and inject them into add_captions docs."""
from __future__ import annotations
import sys
from pathlib import Path
ROOT = Path(__file__).resolve().parents[1]
sys.path.insert(0, str(ROOT))
from src.pyJianYingDraft import FontType
from src.service.add_captions import FONT_ALIAS_MAP, resolve_font_type
EXAMPLE_FONT = "得意黑"
OLD_EXAMPLE_FONT = "思源黑体"
ZH_MARKER_START = "<!-- FONT_LIST_START -->"
ZH_MARKER_END = "<!-- FONT_LIST_END -->"
EN_MARKER_START = "<!-- FONT_LIST_START -->"
EN_MARKER_END = "<!-- FONT_LIST_END -->"
ZH_INSERT_BEFORE = "## 完整参数请求示例(含注释)"
EN_INSERT_BEFORE = "## Fully Annotated Request Example"
def build_lists() -> tuple[str, str]:
names = sorted({f.value.name for f in FontType}, key=lambda s: (s.casefold(), s))
bad = [n for n in names if resolve_font_type(n) is None]
if bad:
raise SystemExit(f"unresolvable fonts: {bad}")
if resolve_font_type(EXAMPLE_FONT) is None:
raise SystemExit(f"example font unresolved: {EXAMPLE_FONT}")
alias_lines = []
for key, enum_name in FONT_ALIAS_MAP.items():
font_type = getattr(FontType, enum_name, None)
display = font_type.value.name if font_type else enum_name
alias_lines.append(f"- `{key}` → `{display}`")
zh = "\n".join(
[
"### 支持的字体font 可用值)",
"",
"`font` 可直接填写下列**展示名**(与剪映字体名一致)。也支持对应的枚举名,以及下方别名。未匹配到时将回退默认字体。",
"",
f"当前共 **{len(names)}** 种字体:",
"",
"```",
*names,
"```",
"",
"#### 字体别名",
"",
"下列别名也可作为 `font` 的值:",
"",
*alias_lines,
"",
]
)
en = "\n".join(
[
"### Supported Fonts (`font` values)",
"",
"You can set `font` to any of the following **display names** (same as CapCut/Jianying font names). Enum names and the aliases below are also accepted. If unresolved, the default font is used.",
"",
f"Total: **{len(names)}** fonts:",
"",
"```",
*names,
"```",
"",
"#### Font aliases",
"",
"These aliases are also valid `font` values:",
"",
*alias_lines,
"",
]
)
return zh, en
def inject(path: Path, before: str, block: str) -> None:
text = path.read_text(encoding="utf-8")
wrapped = f"{ZH_MARKER_START}\n{block.rstrip()}\n{ZH_MARKER_END}\n\n"
if ZH_MARKER_START in text and ZH_MARKER_END in text:
start = text.index(ZH_MARKER_START)
end = text.index(ZH_MARKER_END) + len(ZH_MARKER_END)
# keep trailing newlines after end marker
after = text[end:]
after = after.lstrip("\n")
text = text[:start] + wrapped.rstrip("\n") + "\n\n" + after
else:
if before not in text:
raise SystemExit(f"insert marker not found in {path}: {before}")
text = text.replace(before, wrapped + before, 1)
text = text.replace(OLD_EXAMPLE_FONT, EXAMPLE_FONT)
# Point font param description to the list section
text = text.replace(
"| font | string | ❌ | `null` | 字体名称(枚举名、展示名或别名);`null` 使用默认字体 |",
"| font | string | ❌ | `null` | 字体名称,须为下方「支持的字体」中的展示名(也支持枚举名/别名);`null` 使用默认字体 |",
)
text = text.replace(
"| font | string | ❌ | `null` | Font name (enum/display/alias); `null` uses default |",
"| font | string | ❌ | `null` | Font name from Supported Fonts below (enum/display/alias also ok); `null` uses default |",
)
path.write_text(text, encoding="utf-8")
def main() -> None:
zh, en = build_lists()
docs = ROOT / "docs"
inject(docs / "add_captions.zh.md", ZH_INSERT_BEFORE, zh)
inject(docs / "add_captions.md", EN_INSERT_BEFORE, en)
# cleanup temp fragments if present
for name in ("_font_list_zh.md", "_font_list_en.md"):
p = docs / name
if p.exists():
p.unlink()
print(f"updated docs with {zh.count(chr(10)) - 10} font lines; example font -> {EXAMPLE_FONT}")
if __name__ == "__main__":
main()