refactor: 重构外部模板系统,改为单文件模板库模式
主要变更: - 将 templates_dir 参数改为 template_file,支持单个模板库 YAML 文件 - 添加模板库 YAML 验证功能 - 为模板添加 base_dir 支持,正确解析相对路径资源 - 内联模板与外部模板同名时改为警告(内联优先) - 移除模板缓存机制,直接使用模板库字典 - 更新所有相关测试以适配新的模板加载方式 此重构简化了模板管理,使模板资源的路径解析更加清晰明确。
This commit is contained in:
@@ -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
|
||||
|
||||
Reference in New Issue
Block a user