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:
@@ -84,36 +84,54 @@ class Presentation:
|
||||
return template_path.exists()
|
||||
def render_slide(self, slide_data):
|
||||
"""
|
||||
渲染单个幻灯片
|
||||
渲染单个幻灯片(支持混合模式)
|
||||
|
||||
Args:
|
||||
slide_data: 幻灯片数据字典
|
||||
|
||||
Returns:
|
||||
dict: 包含 background 和 elements 的字典
|
||||
|
||||
支持三种模式:
|
||||
1. 纯模板模式:只有 template 字段
|
||||
2. 纯自定义模式:只有 elements 字段
|
||||
3. 混合模式:同时有 template 和 elements 字段
|
||||
"""
|
||||
if "template" in slide_data:
|
||||
# 使用模板
|
||||
has_template = "template" in slide_data
|
||||
has_custom_elements = slide_data.get("elements")
|
||||
|
||||
elements_from_template = []
|
||||
vars_values = {}
|
||||
|
||||
# 步骤1:渲染模板(如果有)
|
||||
if has_template:
|
||||
template_name = slide_data["template"]
|
||||
template = self.get_template(template_name)
|
||||
vars_values = slide_data.get("vars", {})
|
||||
elements = template.render(vars_values)
|
||||
elements_from_template = template.render(vars_values)
|
||||
|
||||
# 合并背景(如果有)
|
||||
background = slide_data.get("background", None)
|
||||
# 步骤2:处理自定义元素(如果有)
|
||||
elements_from_custom = []
|
||||
if has_custom_elements:
|
||||
custom_elements = slide_data["elements"]
|
||||
if has_template:
|
||||
# 混合模式:使用模板变量解析自定义元素
|
||||
template = self.get_template(slide_data["template"])
|
||||
elements_from_custom = [
|
||||
template.resolve_element(elem, vars_values)
|
||||
for elem in custom_elements
|
||||
]
|
||||
else:
|
||||
# 纯自定义模式(原有行为)
|
||||
elements_from_custom = custom_elements
|
||||
|
||||
# 将元素字典转换为元素对象
|
||||
element_objects = [create_element(elem) for elem in elements]
|
||||
# 步骤3:合并元素(模板元素在前,自定义元素在后)
|
||||
final_elements = elements_from_template + elements_from_custom
|
||||
|
||||
return {"background": background, "elements": element_objects}
|
||||
else:
|
||||
# 自定义幻灯片
|
||||
elements = slide_data.get("elements", [])
|
||||
# 步骤4:转换为元素对象
|
||||
element_objects = [create_element(elem) for elem in final_elements]
|
||||
|
||||
# 将元素字典转换为元素对象
|
||||
element_objects = [create_element(elem) for elem in elements]
|
||||
|
||||
return {
|
||||
"background": slide_data.get("background"),
|
||||
"elements": element_objects,
|
||||
}
|
||||
return {
|
||||
"background": slide_data.get("background"),
|
||||
"elements": element_objects,
|
||||
}
|
||||
|
||||
Reference in New Issue
Block a user