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:
@@ -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 文件生成
|
||||
- **包含**:
|
||||
|
||||
Reference in New Issue
Block a user