Files
md2word/transit/config.py
zzy 74d28ea2d8 feat(transit): 添加参考文献解析功能并修复段落编号继承问题
新增了参考文献处理模块,支持按照 GB 7714 《文后参考文献著录规则》顺序编码制
解析和格式化参考文献。同时修复了段落替换过程中自动编号丢失的问题。

- 新增 transit/references.py 模块,提供参考文献解析和格式化功能
- 在 body.py 的 replace_placeholder 函数中实现段落编号属性的正确继承
- 修改 transit/__init__.py 导入新的参考文献处理函数
- 更新 transit/config.py 添加参考文献样式配置项
- 修改 transit/renderer.py 集成参考文献处理流程
2026-05-08 22:14:51 +08:00

70 lines
2.3 KiB
Python

from dataclasses import dataclass, field
from pathlib import Path
from typing import Optional
import tomllib
@dataclass
class ThesisConfig:
"""论文配置数据(学生信息、元数据等,不包含正文内容)。"""
student_name: str = "<None>"
student_id: str = "<None>"
college: str = "<None>"
major: str = "<None>"
class_: str = "<None>"
advisor: str = "<None>"
advisor_title: str = "<None>"
title: str = "<None>"
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:
"""转成模板渲染用的扁平字典,排除 options 命名空间。"""
return {
"student_name": self.student_name,
"student_id": self.student_id,
"college": self.college,
"major": self.major,
"class": self.class_,
"advisor": self.advisor,
"advisor_title": self.advisor_title,
"title": self.title,
}
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(
student_name=meta.get("student_name", "<None>"),
student_id=meta.get("student_id", "<None>"),
college=meta.get("college", "<None>"),
major=meta.get("major", "<None>"),
class_=meta.get("class", "<None>"),
advisor=meta.get("advisor", "<None>"),
advisor_title=meta.get("advisor_title", "<None>"),
title=meta.get("title", "<None>"),
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"),
)