1
0

feat: 实现模板元素混合模式功能

新增混合模式,允许幻灯片同时使用 template 和 elements,实现更灵活的布局组合。

核心变更:
- core/presentation.py: 修改 render_slide() 支持三种模式(纯模板/纯自定义/混合模式)
- 自定义元素可访问模板变量,实现主题色等值的统一控制
- 元素采用简单追加策略合并(模板元素在前,自定义元素在后)
- 完全向后兼容现有用法

测试覆盖:
- 新增 TestRenderSlideHybridMode 测试类,包含 8 个测试用例
- 验证向后兼容性(纯模板模式、纯自定义模式)
- 验证混合模式功能(变量共享、空元素列表、元素顺序等)
- 所有 79 个测试通过

文档更新:
- README.md: 新增"混合模式模板"章节,包含语法示例和使用场景
- README_DEV.md: 更新开发文档,说明元素合并策略和实现细节

规范更新:
- openspec/specs/template-system/spec.md:
  - 修改"系统必须支持自定义幻灯片"需求,支持混合模式
  - 新增 4 个需求:变量共享、元素合并策略、向后兼容、内联模板支持
  - 新增 13 个场景定义

归档:
- openspec/changes/archive/2026-03-04-template-element-composition/: 完整变更记录
This commit is contained in:
2026-03-04 13:12:51 +08:00
parent 5b367f7ef3
commit 5d60f3c2c2
10 changed files with 1042 additions and 21 deletions

View File

@@ -249,13 +249,57 @@ renderers/html_renderer.py (渲染层)
- 模板查找:`get_template()` 优先查找内联模板,然后回退到外部模板
- 同名检测:`_external_template_exists()` 检查外部模板是否存在,防止命名冲突
- 模板缓存:外部模板使用 `template_cache` 缓存
- 幻灯片渲染:`render_slide()`
- 幻灯片渲染:`render_slide()` - 支持三种模式
- **特点**
- 将元素字典转换为元素对象
- 使用 `create_element()` 工厂函数
- 内联和外部模板同名时抛出 ERROR 错误
- 内联模板不需要缓存(已在内存中)
#### 幻灯片渲染模式
`render_slide()` 方法支持三种渲染模式:
1. **纯模板模式**:只有 `template` 字段
- 渲染模板元素
- 向后兼容原有行为
2. **纯自定义模式**:只有 `elements` 字段
- 直接使用自定义元素
- 向后兼容原有行为
3. **混合模式**:同时有 `template``elements` 字段(新功能)
- 先渲染模板元素
- 自定义元素使用模板变量解析(通过 `Template.resolve_element()`
- 合并策略:简单追加(`template_elements + custom_elements`
- z 轴顺序:模板元素在底层,自定义元素在上层
#### 元素合并策略
混合模式采用简单追加策略:
```python
# 步骤1渲染模板如果有
elements_from_template = template.render(vars_values)
# 步骤2处理自定义元素如果有
if has_custom_elements and has_template:
# 使用模板变量解析自定义元素
elements_from_custom = [
template.resolve_element(elem, vars_values)
for elem in custom_elements
]
# 步骤3合并元素模板在前自定义在后
final_elements = elements_from_template + elements_from_custom
```
**设计决策**
- 不支持按 key/id 合并(避免引入元素 ID 概念)
- 不支持位置感知合并(保持简单)
- 不检测元素重叠(用户通过预览模式查看效果)
-`elements: []` 等同于不指定 `elements`
### 7. renderers/pptx_renderer.py渲染层 - PPTX
- **职责**PPTX 文件生成
- **包含**