from dataclasses import dataclass, field from pathlib import Path from typing import Optional import tomllib @dataclass class ThesisConfig: """论文配置数据。 ``metadata`` 直接透传 TOML 的 ``[metadata]`` 节,不再为每个变量声明字段。 新增模板变量只需改 TOML,无需修改 Python。 """ metadata: dict = field(default_factory=dict) # 以下字段仍有业务逻辑,保留为显式属性 title_from_md: bool = True body_start_keywords: list[str] = field(default_factory=lambda: ["绪论", "引言"]) body_end_keywords: list[str] = field( default_factory=lambda: ["致谢", "参考文献", "附录"] ) body_style: str = "Body Text Indent" level_offset: int = -1 reference_style: str = "列出段落1" def to_dict(self) -> dict: """透传 metadata(模板变量来源)。""" return self.metadata def load_config(path: str | Path) -> ThesisConfig: """从 TOML 文件加载论文配置。""" path = Path(path) with open(path, "rb") as f: raw = tomllib.load(f) meta = raw.get("metadata", {}) opts = raw.get("options", {}) return ThesisConfig( metadata=meta, title_from_md=opts.get("title_from_md", True), body_start_keywords=opts.get("body_start_keywords", ["绪论", "引言"]), body_end_keywords=opts.get( "body_end_keywords", ["致谢", "参考文献", "附录"] ), body_style=opts.get("body_style", "Body Text Indent"), level_offset=opts.get("level_offset", -1), reference_style=opts.get("reference_style", "列出段落1"), )