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:
@@ -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 文件验证,在转换前检查问题
|
||||
- **包含**:
|
||||
|
||||
Reference in New Issue
Block a user