实现完整的字体主题系统,支持可复用字体配置、预设类别和扩展属性。 同时修复中文字体渲染问题,确保 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>
50 lines
3.6 KiB
Markdown
50 lines
3.6 KiB
Markdown
# 字体主题系统
|
||
|
||
## Why
|
||
|
||
当前系统仅支持基础的字体属性(size、bold、italic、color、align),用户无法指定字体族、使用预设字体类别、定义可复用的字体主题,也无法使用高级排版属性(如行距、下划线、上标/下标等)。这导致创建统一风格的演示文稿需要在每个元素上重复设置相同的字体属性,且无法利用系统预设的跨平台字体映射。
|
||
|
||
## What Changes
|
||
|
||
- **新增 metadata 字段**:`fonts` 定义可复用的字体配置,`fonts_default` 指定默认字体(可选,必须引用 fonts 中的某个配置;未设置时相当于当前不设置 font 属性的行为)
|
||
- **新增预设字体类别**:sans、serif、mono、cjk-sans、cjk-serif 五种系统内置类别,自动映射到平台可用字体
|
||
- **扩展字体属性**:新增 family(字体族)、underline、strikethrough、line_spacing、space_before、space_after、baseline、caps 等属性
|
||
- **新增字体引用方式**:
|
||
- 整体引用:`font: "@title"` 完全使用 fonts.title 的配置
|
||
- 继承覆盖:`font: {parent: "@title", size: 60}` 继承后覆盖指定属性
|
||
- 独立定义:`font: {family: "SimSun", size: 24}` 完全自定义
|
||
- **表格字体支持升级**:新增 font 和 header_font 字段,支持完整的字体配置,移除旧语法 style.font_size 和 style.header_color
|
||
- **字体验证机制**:不存在的字体名称输出 WARNING 并回退到 fonts_default 或系统默认
|
||
- **模板默认字体**:模板中未定义 font 的元素继承 metadata.fonts_default
|
||
|
||
## Capabilities
|
||
|
||
### New Capabilities
|
||
- `font-theme`: 字体主题系统,支持 fonts 和 fonts_default 字段定义、三种引用方式(整体引用、继承覆盖、独立定义)、继承链解析
|
||
- `font-preset`: 预设字体类别,提供 sans、serif、mono、cjk-sans、cjk-serif 五种系统内置字体类别,自动映射到平台可用字体
|
||
- `font-extended`: 扩展字体属性,在现有 size/bold/italic/color/align 基础上新增 family、underline、strikethrough、line_spacing、space_before、space_after、baseline、caps 等属性
|
||
|
||
### Modified Capabilities
|
||
- `element-rendering`: 表格元素的字体渲染方式变更,新增 font 和 header_font 字段支持完整字体配置,移除旧语法 style.font_size 和 style.header_color
|
||
|
||
## Impact
|
||
|
||
**受影响的代码模块**:
|
||
- `core/elements.py`:TextElement.font 字典扩展、TableElement 新增 font 和 header_font 字段、新增 FontConfig 数据类
|
||
- `loaders/yaml_loader.py`:解析 metadata.fonts 和 metadata.fonts_default 字段
|
||
- `core/template.py`:模板渲染时继承 fonts_default
|
||
- `renderers/pptx_renderer.py`:_render_text() 方法支持扩展字体属性、_render_table() 方法支持新的字体字段
|
||
- `validators/`:新增字体验证逻辑(预设类别映射、字体可用性检查)
|
||
|
||
**API 变更**:
|
||
- YAML metadata 新增 `fonts` 字段(可选)
|
||
- YAML metadata 新增 `fonts_default` 字段(可选,未设置时使用系统默认字体)
|
||
- 元素 font 字段支持字符串形式(整体引用)
|
||
- 元素 font 字典新增 parent、family、underline、strikethrough、line_spacing、space_before、space_after、baseline、caps 属性
|
||
- 表格元素新增 font 和 header_font 字段
|
||
|
||
**依赖项**:
|
||
- 继续使用 python-pptx,新增 font.name(字体名称)、font.underline(下划线)、paragraph.line_spacing(行距)、paragraph.space_before/space_after(段落间距)等属性
|
||
- 需要实现跨平台字体映射表(Windows/macOS/Linux)
|
||
- 需要实现字体可用性检测机制
|