1
0

refactor: 重构外部模板系统,改为单文件模板库模式

主要变更:
- 将 templates_dir 参数改为 template_file,支持单个模板库 YAML 文件
- 添加模板库 YAML 验证功能
- 为模板添加 base_dir 支持,正确解析相对路径资源
- 内联模板与外部模板同名时改为警告(内联优先)
- 移除模板缓存机制,直接使用模板库字典
- 更新所有相关测试以适配新的模板加载方式

此重构简化了模板管理,使模板资源的路径解析更加清晰明确。
This commit is contained in:
2026-03-05 13:26:29 +08:00
parent bd12fce14b
commit f1aae96a04
27 changed files with 2141 additions and 1988 deletions

View File

@@ -66,18 +66,20 @@ class Template:
self.elements = self.data.get('elements', [])
@classmethod
def from_data(cls, template_data, template_name):
"""从字典创建模板(内联模板)
def from_data(cls, template_data, template_name, base_dir=None):
"""从字典创建模板(内联模板或外部模板
Args:
template_data: 模板数据字典
template_name: 模板名称
base_dir: 资源路径解析的基础目录(外部模板使用模板库文件所在目录,内联模板使用文档目录)
Returns:
Template 对象
"""
obj = cls.__new__(cls)
obj.data = template_data
obj.base_dir = base_dir # 保存 base_dir 用于资源路径解析
# 初始化条件评估器
obj._condition_evaluator = ConditionEvaluator()
@@ -198,7 +200,7 @@ class Template:
f"内联模板不支持相互引用:元素中包含 'template' 字段\n"
f"提示: 内联模板只能包含元素定义,不能引用其他模板"
)
# 填充所有变量的默认值(如果用户未提供)
for var_name, var_def in self.vars_def.items():
if var_name not in vars_values:
@@ -228,6 +230,17 @@ class Template:
# 深度解析元素中的所有变量引用
rendered_elem = self.resolve_element(elem, vars_values)
# 如果是图片元素且有相对路径,解析为绝对路径
if isinstance(rendered_elem, dict) and rendered_elem.get('type') == 'image':
src = rendered_elem.get('src')
if src and self.base_dir:
src_path = Path(src)
# 只处理相对路径
if not src_path.is_absolute():
resolved_path = Path(self.base_dir) / src
rendered_elem['src'] = str(resolved_path)
rendered_elements.append(rendered_elem)
return rendered_elements