1
0

feat: 实现字体主题系统和东亚字体支持

实现完整的字体主题系统,支持可复用字体配置、预设类别和扩展属性。
同时修复中文字体渲染问题,确保 Source Han Sans 等东亚字体正确显示。

核心功能:
- 字体主题配置:metadata.fonts 和 fonts_default
- 三种引用方式:整体引用、继承覆盖、独立定义
- 预设字体类别:sans、serif、mono、cjk-sans、cjk-serif
- 扩展字体属性:family、underline、strikethrough、line_spacing、
  space_before、space_after、baseline、caps
- 表格字体字段:font 和 header_font 替代旧的 style.font_size
- 引用循环检测和属性继承链
- 模板字体继承支持

东亚字体修复:
- 添加 _set_font_with_eastasian() 方法
- 同时设置拉丁字体、东亚字体和复杂脚本字体
- 修复中文字符使用默认字体的问题

测试:
- 58 个单元测试覆盖所有字体系统功能
- 3 个集成测试验证端到端场景
- 移除旧语法相关测试

文档:
- 更新 README.md 添加字体主题系统使用说明
- 更新 README_DEV.md 添加技术文档
- 创建 4 个示例 YAML 文件
- 同步 delta specs 到主 specs

归档:
- 归档 font-theme-system 变更到 openspec/changes/archive/

Co-Authored-By: Claude Sonnet 4.5 <noreply@anthropic.com>
This commit is contained in:
2026-03-05 10:38:59 +08:00
parent 7ef29ea039
commit bd12fce14b
22 changed files with 3142 additions and 103 deletions

View File

@@ -110,19 +110,56 @@ yaml2pptx.py (入口)
- **职责**:定义元素数据类和工厂函数
- **包含**
- `_is_valid_color()` - 颜色格式验证工具函数
- `FontConfig` - 字体配置数据类(新增)
- 支持所有字体属性parent、family、size、bold、italic、underline、strikethrough、color、align、line_spacing、space_before、space_after、baseline、caps
-`__post_init__` 中验证 baseline 和 caps 枚举值
- `TextElement` - 文本元素dataclass + validate
- `font` 字段类型:`FontConfig | str | dict`
- `ImageElement` - 图片元素dataclass + validate
- 新增字段:`fit` (适配模式), `background` (背景色)
- 支持四种适配模式stretch默认、contain、cover、center
- `ShapeElement` - 形状元素dataclass + validate
- `TableElement` - 表格元素dataclass + validate
- 新增字段:`font`(表格数据单元格字体)、`header_font`(表头字体)
- `create_element()` - 元素工厂函数
- 自动将字典形式的 font 转换为 FontConfig 对象
- **特点**
- 使用 `@dataclass` 装饰器
-`__post_init__` 中进行创建时验证
-`validate()` 方法中进行元素级验证
- 元素类负责自身属性的验证(颜色格式、字体大小、枚举值等)
### 4.3. utils/font_resolver.py工具层 - 字体解析)
- **职责**:字体引用解析、继承链处理和预设类别映射
- **包含**
- `PRESET_FONT_MAPPING` - 预设字体类别映射常量
- sans → Arial
- serif → Times New Roman
- mono → Courier New
- cjk-sans → Microsoft YaHei
- cjk-serif → SimSun
- `FontResolver`
- `__init__(fonts, fonts_default)` - 初始化解析器
- `resolve_font(font_config)` - 解析字体配置(主入口)
- `_resolve_reference(reference, visited)` - 解析字体引用
- `_resolve_font_dict(font_dict, visited)` - 解析字体字典
- `_get_default_config(visited)` - 获取默认字体配置
- `_merge_with_default(config, default)` - 合并配置与默认值
- **特点**
- 支持三种引用方式:整体引用(`"@xxx"`)、继承覆盖(`{parent: "@xxx"}`)、独立定义
- 实现属性继承链parent → 当前 → fonts_default → 系统默认
- 引用循环检测:维护已访问集合,检测重复引用
- 最大引用深度限制10 层
- 预设类别自动映射:在 family 字段中识别预设类别名称
- **字体引用解析逻辑**
1. 如果 font_config 为 None使用 fonts_default
2. 如果是字符串(`"@xxx"`),解析为整体引用
3. 如果是字典且包含 parent先解析 parent 再覆盖当前属性
4. 如果是字典且不包含 parent直接使用字典属性
5. 未定义的属性从 fonts_default 继承
6. 如果 family 是预设类别,映射到具体字体名称
7. 返回完整的 FontConfig 对象
### 4.5. validators/(验证层)
- **职责**YAML 文件验证,在转换前检查问题
- **包含**