Mediawiki Scribunto通过DPL调用时按斜杠分割页面失败及列表不渲染问题
问题原因
1. 拆分路径失败、返回* Foo/Bar的原因
MediaWiki解析器的执行优先级中,#invoke调用高于DPL的参数替换。你直接把#invoke写在DPL的format参数中时,#invoke会先执行,此时传入的page参数是字面量字符串%PAGE%,本身没有斜杠,拆分后得到的数组长度为1,返回结果为* %PAGE%,之后DPL才会把%PAGE%替换为实际的页面名,最终输出* Foo/Bar。你尝试修改分隔符为%2f无效,就是因为此时传入的参数根本不存在斜杠。
2. 星号未被识别为列表标记的原因
有两个触发原因:
- 你设置的DPL行分隔符是
<br />,这是HTML换行标签,不是wikitext列表语法要求的纯文本换行符\n,所有生成的*都没有处于新行的开头,不符合列表语法规则。 - 模块返回的内容默认不会触发二次wikitext解析,列表标记会被当做普通文本输出。
解决方法
步骤1:新增中间模板封装模块调用
创建Template:SubpageBullet模板,内容如下,用来延迟模块调用的执行时机:
{{#invoke:Helpers|subpage_bullets|page={{{1|}}}}}
步骤2:调整DPL调用配置
修改DPL调用,用nowiki标记延迟模板解析,同时将行分隔符改为\n,保证每个列表项独占一行:
{{#dpl: |ordermethod=none |namespace= {{NAMESPACE}} |format = ,<nowiki>{{SubpageBullet|%PAGE%}}</nowiki>,,\n }}
步骤3:可选优化模块逻辑
如果修改上述配置后星号仍然被当做普通文本输出,给模块返回值加上preprocess调用,强制触发wikitext二次解析即可:
local p = {} function p.subpage_bullets( frame ) local page = frame.args.page local parts = mw.text.split( page, "/", true ) local wikitext = string.rep("*", #parts) .. " " .. parts[#parts] return frame:preprocess(wikitext) end return p
内容的提问来源于stack exchange,提问作者IttayD
相关产品推荐
相关产品推荐

