Files
we-mp-rss/core/lax/template_parser_optimization_notes.md
2025-12-24 15:47:22 +08:00

2.3 KiB

模板解析器优化总结

主要改进

1. 增强的过滤器支持

  • 语法: {{ variable|filter }} 和 {{ variable|filter(arg1, arg2) }}
  • 内置过滤器:
    • default: 设置默认值
    • length: 获取长度
    • safe/escape: HTML转义
    • upper/lower/capitalize/title: 字符串大小写
    • trim: 去除空白
    • truncate: 截断字符串
    • wordcount: 单词计数
    • replace: 字符串替换
    • round/int/float: 数值处理
    • first/last: 获取首尾元素
    • join: 列表转字符串

2. elif 条件链支持

  • 语法: {% if condition %}...{% elif condition %}...{% else %}...{% endif %}
  • 支持多重条件判断
  • 正确处理条件链的逻辑流程

3. 增强的变量表达式

  • 嵌套属性: {{ user.name }}
  • 默认值: {{ missing_var or 'default' }}
  • 过滤器链: {{ text|upper|truncate(10) }}
  • 复杂过滤器: {{ list|join(', ')|default('empty') }}

4. 自定义过滤器注册

  • register_filter(name, func): 注册单个过滤器
  • register_filters(dict): 批量注册过滤器
  • 支持带参数的自定义过滤器

5. 改进的参数解析

  • 支持字符串字面量(单/双引号)
  • 支持数字、布尔值、None
  • 支持变量引用作为参数

使用示例

基础过滤器

{{ user.name|capitalize|default('匿名用户') }}
{{ long_text|truncate(50) }}
{{ items|join(', ') }}
{{ price|currency('¥') }}  # 自定义过滤器

elif 条件链

{% if score >= 90 %}
    <p>优秀成绩: {{ score }}分</p>
{% elif score >= 80 %}
    <p>良好成绩: {{ score }}分</p>
{% elif score >= 60 %}
    <p>及格成绩: {{ score }}分</p>
{% else %}
    <p>需要努力: {{ score }}分</p>
{% endif %}

自定义过滤器

def currency(value, currency_symbol='¥'):
    return f"{currency_symbol}{value:,.2f}"

parser.register_filter('currency', currency)

兼容性

  • 完全向后兼容原有语法
  • 保持原有的所有功能:变量、条件、循环、include、数学表达式
  • 新增功能不影响现有模板

性能优化

  • 优化了变量表达式解析逻辑
  • 改进了条件链处理效率
  • 减少了重复代码

这次优化使得模板解析器更接近 Jinja2 的标准语法,提供了更强大和灵活的模板处理能力。