用户:Hehua/模板解析陷阱-Hid:修订间差异

来自Postal Wiki
笔记页:用 nowiki 包裹示例、修正测试页标题(下划线已转空格)
笔记页:示例改用 nowiki 直写、测试页清单按当前实际存在同步
第8行: 第8行:
</pre>
</pre>


调用 `{{Hid|甲|乙}}` 本应显示"甲",实际渲染为 `<nowiki>&#123;&#123;模板:标题</nowiki>` —— 即多出一个左花括号,并把"标题"**当成模板名生成一个红链**。
调用 `{{Hid|甲|乙}}` 本应显示"甲",实际渲染为 `<nowiki>{{模板:标题</nowiki>` —— 即多出一个左花括号,并把"标题"**当成模板名生成一个红链**。


== 已排除的可能 ==
== 已排除的可能 ==
第33行: 第33行:
== 顺带提醒 ==
== 顺带提醒 ==
下方清单里,`U3`–`U7` 因创建时连接中断**并未建成**,故不列入。
下方清单里,`U3`–`U7` 因创建时连接中断**并未建成**,故不列入。
排查时创建的临时测试页需要人工删除(本账号的 bot 无 delete 权限)。本次涉及的测试页:
排查时创建的临时测试页需要人工删除(本账号的 bot 无 delete 权限)。本次涉及的测试页(下列为写作时仍存在者;本账号的 bot 无 delete 权限,需人工删除):


* [[模板:TempTest1]]
* [[:模板:TempTest2]]
* [[模板:TempTest2]]
* [[:模板:TempTest3]]
* [[模板:TempTest3]]
* [[:模板:T f]]
* [[模板:TempTest4]]
* [[:模板:U1]]
* [[模板:TempTest5]]
* [[模板:T_a]]
* [[模板:T_b]]
* [[模板:T_c]]
* [[模板:T_d]]
* [[模板:T e]]
* [[模板:T f]]
* [[模板:T g]]
* [[模板:T h]]
* [[模板:U1]]
* [[模板:U2]]


* 放置位置:用户子页(不属于条目内容)
* 放置位置:用户子页(不属于条目内容)
* 相关:`模板:Hid` 已于本次修复(改为上述规避写法)
* 相关:`模板:Hid` 已于本次修复(改为上述规避写法)
[[分类:模板文档]]
[[分类:模板文档]]

2026年9月14日 (一) 04:35的版本

这是一条**模板解析陷阱**的记录,来自 2026-09-14 移植 `模板:Hid` 时踩到的坑,供日后写模板时避雷。

现象

在**表格单元格**里写下面这种"取参数、按关键字切换"的取值链时,模板会渲染出错误内容:

<th>{{{标题|{{{標題|{{#ifeq:{{{1}}}|show|{{{2|}}}|{{{1|}}}}}}}}}}</th>

调用 `

甲
乙

` 本应显示"甲",实际渲染为 `{{模板:标题` —— 即多出一个左花括号,并把"标题"**当成模板名生成一个红链**。

已排除的可能

  • 不是 `{{#switch}}` / `{{#ifeq}}` 本身的问题(单独用都正常);
  • 不是 `{模板:标题` 两层默认值的问题(单独用正常);
  • 不是 `style="position:relative;"` 之类属性的问题;
  • 与参数是否为空无关(无参、匿名参、命名参都能复现)。

复现的最小结构

<table class="x {{#ifeq:{{#switch:show|{{{show|}}}|{{{1|}}}=true|#default=false}}|true||mw-collapsed}}">
<tr><th>{{{标题|{{{標題|{{#ifeq:{{{1}}}|show|{{{2|}}}|{{{1|}}}}}}}}}}</th></tr>
</table>

把同样的 `<th>` 放到表格**外面**则正常 —— 关键差异是"表格内 + 单元格里的取值链"这个组合。

规避写法(已验证可用)

把单元格内的取值拆成"先判断有没有值,再决定怎么取",避免在空值上直接做 `#ifeq` 比较:

<th>{{#if:{{{标题|{{{標題|}}}}}}|{{{标题|{{{標題|}}}}}}|{{#if:{{{1|}}}|{{#ifeq:{{{1}}}|show|{{{2|}}}|{{{1|}}}}}|}}}}</th>

顺带提醒

下方清单里,`U3`–`U7` 因创建时连接中断**并未建成**,故不列入。 排查时创建的临时测试页需要人工删除(本账号的 bot 无 delete 权限)。本次涉及的测试页(下列为写作时仍存在者;本账号的 bot 无 delete 权限,需人工删除):

  • 放置位置:用户子页(不属于条目内容)
  • 相关:`模板:Hid` 已于本次修复(改为上述规避写法)