修复内容: - E2E测试命令执行方式:将 python -m uv run 改为 uv run - HTML渲染器:添加 & 字符的HTML转义 - Presentation尺寸验证:添加尺寸值类型验证 - PPTX验证器:修复文本框检测兼容性 - 验证结果格式化:修复提示信息显示 - Mock配置:修复表格渲染等测试的Mock配置 测试结果: - 修复前: 264 通过, 42 失败, 1 错误 - 修复后: 297 通过, 9 失败, 1 错误 剩余9个失败为待实现的功能增强(验证器模板变量验证)
95 lines
2.7 KiB
Python
95 lines
2.7 KiB
Python
"""
|
||
演示文稿模块
|
||
|
||
管理整个演示文稿的生成流程。
|
||
"""
|
||
|
||
from pathlib import Path
|
||
from loaders.yaml_loader import load_yaml_file, validate_presentation_yaml
|
||
from core.template import Template
|
||
from core.elements import create_element
|
||
|
||
|
||
class Presentation:
|
||
"""演示文稿类,管理整个演示文稿的生成流程"""
|
||
|
||
def __init__(self, pres_file, templates_dir=None):
|
||
"""
|
||
初始化演示文稿
|
||
|
||
Args:
|
||
pres_file: 演示文稿 YAML 文件路径
|
||
templates_dir: 模板目录
|
||
"""
|
||
self.pres_file = Path(pres_file)
|
||
self.templates_dir = templates_dir
|
||
|
||
# 加载演示文稿文件
|
||
self.data = load_yaml_file(pres_file)
|
||
validate_presentation_yaml(self.data, str(pres_file))
|
||
|
||
# 获取演示文稿尺寸
|
||
metadata = self.data.get("metadata", {})
|
||
self.size = metadata.get("size", "16:9")
|
||
|
||
# 验证尺寸值
|
||
if not isinstance(self.size, str):
|
||
raise ValueError(
|
||
f"无效的尺寸值: {self.size},尺寸必须是字符串(如 '16:9' 或 '4:3')"
|
||
)
|
||
|
||
# 模板缓存
|
||
self.template_cache = {}
|
||
|
||
def get_template(self, template_name):
|
||
"""
|
||
获取模板(带缓存)
|
||
|
||
Args:
|
||
template_name: 模板名称
|
||
|
||
Returns:
|
||
Template 对象
|
||
"""
|
||
if template_name not in self.template_cache:
|
||
self.template_cache[template_name] = Template(
|
||
template_name, self.templates_dir
|
||
)
|
||
return self.template_cache[template_name]
|
||
|
||
def render_slide(self, slide_data):
|
||
"""
|
||
渲染单个幻灯片
|
||
|
||
Args:
|
||
slide_data: 幻灯片数据字典
|
||
|
||
Returns:
|
||
dict: 包含 background 和 elements 的字典
|
||
"""
|
||
if "template" in slide_data:
|
||
# 使用模板
|
||
template_name = slide_data["template"]
|
||
template = self.get_template(template_name)
|
||
vars_values = slide_data.get("vars", {})
|
||
elements = template.render(vars_values)
|
||
|
||
# 合并背景(如果有)
|
||
background = slide_data.get("background", None)
|
||
|
||
# 将元素字典转换为元素对象
|
||
element_objects = [create_element(elem) for elem in elements]
|
||
|
||
return {"background": background, "elements": element_objects}
|
||
else:
|
||
# 自定义幻灯片
|
||
elements = slide_data.get("elements", [])
|
||
|
||
# 将元素字典转换为元素对象
|
||
element_objects = [create_element(elem) for elem in elements]
|
||
|
||
return {
|
||
"background": slide_data.get("background"),
|
||
"elements": element_objects,
|
||
}
|