feat: 增强模板条件渲染表达式支持
使用 simpleeval 库替换原有的简单正则匹配,支持复杂的条件表达式评估。新增 ConditionEvaluator 类处理条件逻辑,支持比较运算、逻辑运算、成员测试、数学计算和内置函数,同时保持向后兼容性。
This commit is contained in:
@@ -17,6 +17,7 @@ html2pptx/
|
||||
├── core/ # 核心领域模型
|
||||
│ ├── elements.py (200 行) # 元素抽象层(dataclass + validate)
|
||||
│ ├── template.py (191 行) # 模板系统
|
||||
│ ├── condition_evaluator.py # 条件表达式评估器(新增)
|
||||
│ └── presentation.py (91 行) # 演示文稿类
|
||||
├── loaders/ # 数据加载层
|
||||
│ └── yaml_loader.py (113 行) # YAML 加载和验证
|
||||
@@ -143,10 +144,39 @@ yaml2pptx.py (入口)
|
||||
- `Template` 类
|
||||
- `from_data()` 类方法:从字典创建模板实例(用于内联模板)
|
||||
- 变量解析:`resolve_value()`, `resolve_element()`
|
||||
- 条件渲染:`evaluate_condition()`
|
||||
- 条件渲染:`evaluate_condition()` - 委托给 ConditionEvaluator
|
||||
- 模板渲染:`render()`
|
||||
- **特点**:
|
||||
- 支持外部模板(从文件加载)和内联模板(从字典创建)
|
||||
|
||||
### 5.5. core/condition_evaluator.py(核心层 - 条件评估)
|
||||
- **职责**:安全地评估条件表达式
|
||||
- **包含**:
|
||||
- `ConditionEvaluator` 类
|
||||
- `evaluate_condition()` - 主评估方法
|
||||
- `_get_evaluator()` - 配置 simpleeval 实例
|
||||
- `_extract_expression()` - 提取表达式内容
|
||||
- **技术实现**:
|
||||
- 使用 simpleeval 库的 `EvalWithCompoundTypes` 进行安全评估
|
||||
- 支持比较运算符(==, !=, >, <, >=, <=)
|
||||
- 支持逻辑运算符(and, or, not)
|
||||
- 支持成员测试(in, not in)
|
||||
- 支持列表/元组字面量
|
||||
- 支持数学运算(+, -, *, /, %, **)
|
||||
- 支持内置函数(int, float, str, len, bool, abs, min, max)
|
||||
- **安全策略**:
|
||||
- 表达式最大长度限制:500 字符
|
||||
- 禁止属性访问(obj.attr)
|
||||
- 禁止函数定义(lambda, def)
|
||||
- 禁止模块导入(import)
|
||||
- 白名单函数限制
|
||||
- 详细的错误信息映射
|
||||
- **错误处理**:
|
||||
- `NameNotDefined` → "条件表达式中的变量未定义"
|
||||
- `FunctionNotDefined` → "条件表达式中使用了不支持的函数"
|
||||
- `FeatureNotAvailable` → "条件表达式使用了不支持的语法特性"
|
||||
- `AttributeDoesNotExist` → "不支持属性访问"
|
||||
- `SyntaxError` → "条件表达式语法错误"
|
||||
- 内联模板通过 `from_data()` 类方法创建,避免修改现有 `__init__`
|
||||
- 禁止内联模板相互引用,在渲染时检测并报错
|
||||
|
||||
|
||||
Reference in New Issue
Block a user