1
0
Files
PPTX/openspec/changes/archive/2026-03-05-font-theme-system/proposal.md
lanyuanxiaoyao bd12fce14b 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>
2026-03-05 10:38:59 +08:00

3.6 KiB
Raw Blame History

字体主题系统

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.pyTextElement.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
  • 需要实现字体可用性检测机制