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

@@ -0,0 +1,67 @@
# Element Rendering (Delta)
## Purpose
本增量规范更新表格元素的字体渲染方式,新增 font 和 header_font 字段支持完整字体配置,移除旧语法 style.font_size 和 style.header_color。
## MODIFIED Requirements
### Requirement: 系统必须支持表格元素渲染
系统 SHALL 将 YAML 中定义的表格元素渲染为 PPTX 表格对象。表格元素支持 font 和 header_font 字段用于字体配置style 字段仅用于非字体样式(如背景色)。
#### Scenario: 渲染基本表格
- **WHEN** 元素定义为 `{type: table, position: [1, 2], data: [["A", "B"], ["C", "D"]], col_widths: [2, 2]}`
- **THEN** 系统在 (1, 2) 位置创建 2×2 表格,列宽各为 2 英寸
#### Scenario: 表格定义整体字体
- **WHEN** 表格定义 `font: {family: "Arial", size: 14, color: "#333333"}`
- **THEN** 系统将数据单元格和表头都应用该字体样式
#### Scenario: 表格定义表头字体
- **WHEN** 表格定义 `header_font: {bold: true, color: "#ffffff"}`
- **THEN** 系统将表头应用该字体样式,数据单元格继承 font 或使用默认字体
#### Scenario: 表头字体继承表格字体
- **WHEN** 表格定义 `font: {size: 14}``header_font: {parent: "@font", bold: true}`
- **THEN** 表头继承 size: 14覆盖 bold: true
#### Scenario: 表格仅定义 header_font
- **WHEN** 表格仅定义 `header_font: {bold: true}`
- **THEN** 表头应用 bold: true数据单元格使用 fonts_default 或系统默认字体
#### Scenario: 表格定义背景样式
- **WHEN** 表格定义 `style: {header_bg: "#4a90e2"}`
- **THEN** 系统将表头背景色设置为 #4a90e2
#### Scenario: 表格同时定义字体和背景样式
- **WHEN** 表格定义 `font: {size: 14}``style: {header_bg: "#4a90e2"}`
- **THEN** 系统同时应用字体样式和背景色
#### Scenario: 表格数据为空时报错
- **WHEN** 表格的 `data` 字段为空数组
- **THEN** 系统抛出错误,提示表格数据不能为空
#### Scenario: 表格列宽不匹配时报错
- **WHEN** `col_widths` 数组长度与表格列数不一致
- **THEN** 系统抛出错误,要求列宽数量与列数匹配
## REMOVED Requirements
### Requirement: 系统必须支持表格样式中的字体属性
**Reason**: 被 font 和 header_font 字段取代,提供更完整和统一的字体配置方式
**Migration**: 使用新的 font 和 header_font 字段替代 style.font_size 和 style.header_color
- **FROM:** `style: {font_size: 14, header_color: "#ffffff"}`
- **TO:** `font: {size: 14}, header_font: {color: "#ffffff"}`