feat: 增强模板条件渲染表达式支持
使用 simpleeval 库替换原有的简单正则匹配,支持复杂的条件表达式评估。新增 ConditionEvaluator 类处理条件逻辑,支持比较运算、逻辑运算、成员测试、数学计算和内置函数,同时保持向后兼容性。
This commit is contained in:
@@ -7,6 +7,7 @@
|
||||
import re
|
||||
from pathlib import Path
|
||||
from loaders.yaml_loader import YAMLError, load_yaml_file, validate_template_yaml
|
||||
from core.condition_evaluator import ConditionEvaluator
|
||||
|
||||
|
||||
class Template:
|
||||
@@ -20,6 +21,9 @@ class Template:
|
||||
template_file: 模板名称(纯文件名,不含路径)
|
||||
templates_dir: 模板文件目录
|
||||
"""
|
||||
# 初始化条件评估器
|
||||
self._condition_evaluator = ConditionEvaluator()
|
||||
|
||||
# 检查是否提供了 templates_dir
|
||||
if templates_dir is None:
|
||||
raise YAMLError(
|
||||
@@ -71,15 +75,18 @@ class Template:
|
||||
"""
|
||||
obj = cls.__new__(cls)
|
||||
obj.data = template_data
|
||||
|
||||
|
||||
# 初始化条件评估器
|
||||
obj._condition_evaluator = ConditionEvaluator()
|
||||
|
||||
# 解析变量定义
|
||||
obj.vars_def = {}
|
||||
for var in template_data.get('vars', []):
|
||||
obj.vars_def[var['name']] = var
|
||||
|
||||
|
||||
# 元素列表
|
||||
obj.elements = template_data.get('elements', [])
|
||||
|
||||
|
||||
return obj
|
||||
|
||||
def _external_template_exists(self, template_name):
|
||||
@@ -153,27 +160,17 @@ class Template:
|
||||
|
||||
def evaluate_condition(self, condition, vars_values):
|
||||
"""
|
||||
评估条件表达式(简单的存在性检查)
|
||||
评估条件表达式
|
||||
|
||||
Args:
|
||||
condition: 条件字符串,如 "{subtitle != ''}"
|
||||
condition: 条件字符串,如 "{count > 0 and status == 'active'}"
|
||||
vars_values: 变量值字典
|
||||
|
||||
Returns:
|
||||
bool: 条件是否满足
|
||||
"""
|
||||
# 简单实现:检查变量是否非空
|
||||
# 匹配 {var_name != ''} 或 {var_name != ""}
|
||||
pattern = r'\{(\w+)\s*!=\s*[\'\"]{2}\}'
|
||||
match = re.match(pattern, condition)
|
||||
|
||||
if match:
|
||||
var_name = match.group(1)
|
||||
value = vars_values.get(var_name, '')
|
||||
return value != ''
|
||||
|
||||
# 默认返回 True
|
||||
return True
|
||||
# 委托给条件评估器
|
||||
return self._condition_evaluator.evaluate_condition(condition, vars_values)
|
||||
|
||||
def render(self, vars_values):
|
||||
"""
|
||||
|
||||
Reference in New Issue
Block a user