1
0

feat: 增强模板条件渲染表达式支持

使用 simpleeval 库替换原有的简单正则匹配,支持复杂的条件表达式评估。新增 ConditionEvaluator 类处理条件逻辑,支持比较运算、逻辑运算、成员测试、数学计算和内置函数,同时保持向后兼容性。
This commit is contained in:
2026-03-03 17:28:23 +08:00
parent 01a93ce13b
commit 16ca9d77cd
16 changed files with 1437 additions and 31 deletions

View File

@@ -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__`
- 禁止内联模板相互引用,在渲染时检测并报错