Skip to content

feat(render_test): 补全 Gridea Pro 自定义 filter stub 与数字参数 / ifchanged 兼容#2

Merged
Tespera merged 1 commit into
mainfrom
fix-test-stubs
Apr 25, 2026
Merged

feat(render_test): 补全 Gridea Pro 自定义 filter stub 与数字参数 / ifchanged 兼容#2
Tespera merged 1 commit into
mainfrom
fix-test-stubs

Conversation

@Tespera
Copy link
Copy Markdown
Member

@Tespera Tespera commented Apr 25, 2026

问题

`render_test.py` 用 Python Jinja2 模拟 Pongo2 渲染,但缺三类支持,导致主题作者必须绕过才能让测试 PASS,主题代码因此变丑或出现假阳性:

  1. Gridea Pro 自定义 filter 没注册:`excerpt` / `reading_time` / `word_count` / `strip_html` / `relative` / `to_json` / `group_by` —— 主题用了就 `No filter named 'xxx'` 直接 FAIL
  2. 未加引号的数字参数转换缺失:如 `{{ post.content|excerpt:160 }}` —— Pongo2→Python Jinja2 转换器只识别 `|filter:"arg"` 带引号形式,`|filter:160` 无法识别
  3. `{% ifchanged %}` 不被 Python Jinja2 识别 —— 渲染抛 `TemplateSyntaxError`

影响过的主题

`bitcron-pro` / `mango` / `printer` / `kehua` / `liushen` / `jasmine` 都被迫绕路:

  • 给数字加引号 `excerpt:"160"` —— 实际跑 Pongo2 时通过 `param.Integer()` 自动转换没问题,但代码语义不直观
  • `to_json|safe` 整段砍掉,改用 `<div data-* attr>` + 客户端 JS 解析 —— 多写 30 行 JS
  • 写死字面量替代变量参数 —— 失去配置灵活性

修复

`scripts/render_test.py` 纯增量 +71 行,不删任何旧逻辑:

1. Pongo2→Jinja2 转换器:新增数字参数支持

```python

处理未加引号的数字参数: |filter:123 → |filter(123)

def replace_numeric_filter(m):
return f"|{m.group(1)}({m.group(2)})"
converted = re.sub(
r'\|\s*(\w+)\s*:\s*(-?\d+(?:\.\d+)?)(?=\s|\||$|\})',
replace_numeric_filter,
converted,
)
```

2. `ifchanged` 兼容

`{% ifchanged %}` / `{% endifchanged %}` 在渲染前替换为 `{% if true %}` / `{% endif %}` —— 视觉上每次迭代都会输出,但渲染不报错。

3. 13 个自定义 filter stub(测试桩)

Filter 实现
`excerpt(value, length=140)` 去 HTML + 截 N 字符
`word_count(value)` 去 HTML 后字符数
`reading_time(value)` `word_count // 400` (≥ 1)
`strip_html(value)` 去 HTML
`relative(value)` / `timeago(value)` 直接返回字符串
`to_json(value)` `json.dumps(ensure_ascii=False)`
`group_by(value, key="year")` 按字段分组返回 `[SimpleNamespace(key, items)]`
`striptags` / `urlencode` / `truncatechars` / `split` / `join` / `first` / `last` / `upper` / `lower` 标准 Pongo2 filter 的 Python 等价实现

这些 stub 不要求和 Gridea Pro 实际行为像素级一致,只保证模板渲染通过、输出大致符合预期。

验证

  • ✅ `bitcron-pro` / `liushen` / `jasmine` 三个主题 render_test 全部 PASS(之前部分模板因 filter 缺失 FAIL)
  • ✅ 不影响仅用基础 filter 的旧主题

与其他 PR 的关系

Test plan

  • CI 通过
  • 装上含改动的 skill 后,对 `bitcron-pro` 跑 `render_test.py`,确认 `excerpt` / `group_by` / `to_json` 等 filter 不再报 "No filter named"
  • 对 `liushen` 跑 `render_test.py`,确认 13/13 PASS

🤖 Generated with Claude Code

## 问题

`render_test.py` 用 Python Jinja2 模拟 Pongo2 渲染,但缺三类支持:

1. **Gridea Pro 自定义 filter 没注册**:`excerpt` / `reading_time` / `word_count` /
   `strip_html` / `relative` / `to_json` / `group_by` 等 → 主题用了就 FAIL
2. **未加引号的数字参数**:如 `excerpt:160` → `excerpt(160)` 转换缺失(Pongo2→Python Jinja2 转换器只识别带引号字符串) → 主题用了就 FAIL
3. **`ifchanged` Django 标签**:Pongo2 支持但 Python Jinja2 不识别 → 渲染异常

历史上 `bitcron-pro` / `mango` / `printer` / `kehua` / `liushen` / `jasmine` 等多个主题被迫绕过这些 filter(主题代码变丑或假阳性 PASS)。

## 修复

`scripts/render_test.py` 三处增量改动(仅 +71 行,不删除任何旧逻辑):

### 1. Pongo2→Jinja2 转换器:新增数字参数支持
原只把 `|filter:"arg"` 转成 `|filter("arg")`,现在也把 `|filter:123` 转成 `|filter(123)`。

### 2. `ifchanged` 兼容
`{% ifchanged %}` / `{% endifchanged %}` 替换为 `{% if true %} / {% endif %}` —— 视觉上每次迭代都会输出,但渲染不报错。

### 3. 13 个自定义 filter stub
仅保证模板渲染通过(不要求和 Gridea Pro 实际行为像素级一致):
- `excerpt(value, length=140)` —— 去 HTML + 截 N 字符
- `word_count(value)` —— 去 HTML 后字符数
- `reading_time(value)` —— word_count // 400 ≥ 1
- `strip_html(value)` —— 去 HTML
- `relative(value)` / `timeago(value)` —— 直接返回字符串
- `to_json(value)` —— `json.dumps(ensure_ascii=False)`
- `group_by(value, key="year")` —— 按字段分组返回 `[SimpleNamespace(key, items)]`
- `striptags`、`urlencode`、`truncatechars`、`split`、`join`、`first`、`last`、`upper`、`lower` —— 标准 Pongo2 filter 的 Python 等价实现

## 验证

- ✅ `bitcron-pro`、`liushen`、`jasmine` 三个主题 render_test 通过(之前部分模板因 filter 缺失 FAIL)
- ✅ 不影响仅用基础 filter 的旧主题

Co-Authored-By: Claude Opus 4.7 <noreply@anthropic.com>
@Tespera Tespera merged commit 992b63e into main Apr 25, 2026
3 checks passed
Sign up for free to join this conversation on GitHub. Already have an account? Sign in to comment

Labels

None yet

Projects

None yet

Development

Successfully merging this pull request may close these issues.

1 participant