1
0
Files
PPTX/openspec/changes/archive/2026-03-05-refactor-external-template-system/proposal.md
lanyuanxiaoyao f1aae96a04 refactor: 重构外部模板系统,改为单文件模板库模式
主要变更:
- 将 templates_dir 参数改为 template_file,支持单个模板库 YAML 文件
- 添加模板库 YAML 验证功能
- 为模板添加 base_dir 支持,正确解析相对路径资源
- 内联模板与外部模板同名时改为警告(内联优先)
- 移除模板缓存机制,直接使用模板库字典
- 更新所有相关测试以适配新的模板加载方式

此重构简化了模板管理,使模板资源的路径解析更加清晰明确。
2026-03-05 13:27:12 +08:00

84 lines
3.1 KiB
Markdown
Raw Blame History

This file contains ambiguous Unicode characters
This file contains Unicode characters that might be confused with other characters. If you think that this is intentional, you can safely ignore this warning. Use the Escape button to reveal them.
## Why
当前外部模板系统使用文件夹+文件名的方式存储和查询模板,与内联模板的字典查询方式不一致。这种不一致导致以下问题:
1. 模板名称受文件命名规则限制(不能包含路径分隔符)
2. 查询逻辑不统一(外部模板通过文件系统查找,内联模板通过字典键查找)
3. 外部模板分散在多个文件中,难以管理和分发
重构为统一的模板库格式后,外部模板和内联模板将使用相同的数据结构和查询逻辑,提高系统一致性。
## What Changes
- **BREAKING**: 命令行参数 `--template-dir` 改为 `--template`,指定单个 YAML 文件而非文件夹
- **BREAKING**: 外部模板文件格式从单个模板的 YAML 改为包含多个模板的模板库 YAML
- 移除外部模板的缓存机制 (`template_cache`)
- 统一资源路径解析:所有图片元素的相对路径在渲染前都解析为绝对路径
- 自定义元素和内联模板元素:相对于文档 YAML 所在目录
- 外部模板元素:相对于模板库文件所在目录
- 模板库文件支持元数据字段description、version、author 等)
- 优化错误提示:区分模板库文件不存在、模板名称不存在两种错误
- 同名冲突处理:内联和外部模板同名时发出 WARNING优先使用内联模板
## Capabilities
### New Capabilities
- `template-library`: 模板库文件的加载、验证和管理
- 模板库文件必须包含 `templates` 字段(字典类型)
- 支持元数据字段description、version、author
- 递归验证每个模板的结构vars、elements
- 提供模板库文件级别的错误提示
### Modified Capabilities
- `template-system`: 模板查询和引用逻辑
- 外部模板查询从文件系统查找改为从模板库字典查找
- 统一内联模板和外部模板的查询接口
- 同名冲突时返回 WARNING 级别的验证问题
## Impact
### 受影响的代码模块
- `yaml2pptx.py`: 命令行参数修改
- `core/presentation.py`: 模板加载逻辑重构,移除 `template_cache`
- `core/template.py`: `from_data` 增加 `base_dir` 参数,`render` 中解析图片路径
- `loaders/yaml_loader.py`: 新增 `validate_template_library_yaml` 函数
- `validators/resource.py`: 修改模板验证逻辑,区分三种错误类型
- `validators/validator.py`: 参数 `template_dir` 改为 `template_file`
- `preview/server.py`: 参数 `template_dir` 改为 `template_file`
- `tests/`: 更新相关测试用例
### API 变更
**命令行参数**:
```bash
# 旧方式
yaml2pptx.py convert input.yaml --template-dir /path/to/templates/
# 新方式
yaml2pptx.py convert input.yaml --template /path/to/templates.yaml
```
**模板库文件格式**:
```yaml
# 新格式 (templates.yaml)
description: "公司标准模板库"
version: "1.0.0"
templates:
title-slide:
vars: ...
elements: ...
content-slide:
vars: ...
elements: ...
```
### 依赖变更
无新增依赖。
### 兼容性
- 不向后兼容:现有使用 `--template-dir` 的脚本需要更新为 `--template`
- 现有的单文件模板需要迁移到模板库格式