社区文档构建进行中,欢迎编辑。社区答疑群(非官方):717421103
展开模板
阅读
2024-05-28更新
最新编辑:Lu_23333
阅读:
更新日期:2024-05-28
最新编辑:Lu_23333
特殊:展开模板页面,能解析一段Wikitext生成预览,常用于调试Wikitext。
调试可按此顺序排查:结果Wikitext,生成的HTML,最后是XML解析树。通过分析不符合预期的部分,来寻找方案解决问题。
结果Wikitext
给出展开的Wikitext。
「展开」,指递归地展开Wikitext中的模板、解析器函数和变量等等,包括几乎所有在双花括号中的内容。
因此,这能验证结果Wikitext是否符合预期。比如
- 语法错误(例语法错误)
- 结果中是否有额外的换行(例意外的换行)
- 部分函数、标签不会解析其参数中的wikitext,结果Wikitext中可以发现未解析的部分(例Gallery中的模块)
- 平台特性,比如bstyle等BWiki特有解析器函数
如果结果Wikitext异常奇怪(例if中表格异常),可以检查XML解析树。
如果Wikitext看起来正常,但预览异常,可以检查HTML输出。
原始HTML输出
指Wikitext渲染成的HTML代码。
当显示效果不符合预期时,调整Wikitext以生成期望的HTML。
最常见的情况是:
- 非块级标签被识别成段落,被P标签包裹,从而出现意外的换行或CSS不生效。
- 模板末尾换行 + 调用后换行,两个连续换行让意外的段落出现,扰乱排版(例意外的换行)。
这些都是「新人杀手」问题,新手不易排查它们,tools wiki持续的收到相关提问。
一些看起来无关的问题如格式异常或css失效,其背后就可能是多了意外的换行导致的——两个换行意味着新的段落(P标签)。
XML解析树
XML解析树是MW解析器对Wikitext的识别、解析结果。
当Wikitext的行为异常时,首先要检查解析树是否符合预期,常见情况:
- 语法错误,如拼写错误、括号(
{ }
)缺失/不匹配 - 解析不合预期,如竖线(管道符
|
),例语法错误
最典型的情况是解析器函数中的表格(例表格解析异常)。解析器函数会把wiki表格中所有的竖线(|
管道符)识别为参数分隔,从而扰乱整段wikitext的解析。
此时需要内容仅为竖线(|
)的模板{{!}}
来「转义」竖线,让wikitext正常解析。从Mediawiki 1.24版本后,{{!}}
成为了内置的魔术变量,可以直接使用。
另外经典的情况是模板匿名参数中包含等号。这会导致模板将其解析为参数名=值。类似地,可以使用内容仅为等号的模板{{=}}
进行「转义」。从Mediawiki 1.39以后,内置这一魔术变量。不过小破站Wiki目前的MW版本是1.37,因此需要手动创建模板来使用。
例子
例子:语法错误
例如调用模板的Wikitext:
{{Color|red|biligame} 缺少括号 {{Color|red|tools}} 正确
结果Wikitext为:
{{Color|red|biligame} 缺少括号 <span style="color:red">tools</span> 正确
XML解析树输出为:
<root>{{Color|red|biligame} 缺少括号 <template lineStart="1"><title>Color</title><part><name index="1"/><value>red</value></part><part><name index="2"/><value>tools</value></part></template> 正确</root>
可见,第一行尝试调用Color模板的Wikitext被解析为普通文字,而不是template。
第二行正确的调用模板被正确解析了,对模板名、参数的解析都是正确、符合预期的。
例子:额外的P标签
<span>点点今天开课吗?</span>
原始HTML输出:
<div class="mw-parser-output"><p><span>点点今天开课吗?</span> </p></div>
可见额外的P标签。
非块级元素被识别成段落时,会被P标签包裹,这可能导致排版异常或CSS选择器落空。
例子:额外的P标签和换行
<div>托奇</div><span>遇到了Bug</span>
期望的结果是:托奇遇到了Bug
实际结果:托奇
遇到了Bug
HTML:
<div class="mw-parser-output"><div>托奇</div><p><span>遇到了Bug</span></p></div>
块级元素后的span标签被识别为新的段落,以P标签包裹,这导致了意外的换行。
例子:意外的换行
{{额外换行的模板}} {{额外换行的模板}}
模版内容是:
<includeonly>一行文字</includeonly> <noinclude> {{额外换行的模板}} {{额外换行的模板}} </noinclude>
注意,includeonly后有换行
期望的结果是:一行文字一行文字 但结果Wikitext:
一行文字 一行文字
HTML:
<div class="mw-parser-output"><p>一行文字 </p><p>一行文字 </p></div>
这是因为模板中的换行和调用中的换行组成了两个换行符,会被识别称两个段落。
这个问题被很多新手遇到,甚至因此害怕使用换行——不惜降低代码可读性和可维护性。
需要为可读性换行时,可以使用注释,如:
一行文字<!-- -->一行文字
例子:if中的表格异常
例如解析不合预期:
{{#if:1| {| class="wikitable" | 示例 |} }}
结果Wikitext:
{
看XML解析树,很明显,竖线被识别成了#if的多个参数:
<root><template><title>#if:1</title><part><name index="1"/><value> {</value></part><part><name> class</name><equals>=</equals><value>"wikitable" </value></part><part><name index="2"/><value> 示例 </value></part><part><name index="3"/><value>} </value></part></template></root>
因此,需要对table中的竖线做转义:
{{#if:1| {{{!}} class="wikitable" {{!}} 示例 {{!}}} }}
(但不推荐在解析函数中使用表格,可以将表格包装为模板,或将条件设置为表格css display的显示条件等等方案)
例子:Gallery中的模块
此wikitext的预期是用模块为gallery提供数据,展示画廊:
<gallery> {{#invoke:Data|表情|张三}} </gallery>
其中的Data模块经测试可以正确输出。但展开模板给出的结果wikitext和HTML是:
<gallery> {{#invoke:Data|表情|张三}} </gallery>
<div class="mw-parser-output"><ul class="gallery mw-gallery-traditional"> </ul></div>
可以看出,gallery中的模块没有被解析。因此,可以用#tag解析函数,把模块调用结果给gallery:
{{#tag:gallery| {{#invoke:Data|表情|张三}} }}
例子:tag
例如解析不合预期:
{{#tag:gallery| Javascript.svg|JS图标 Css.svg|CSS图标 }}
此处的Wikitext旨在构建一个相册,但输出显然不符合预期,结果Wikitext:
<gallery> Javascript.svg</gallery>
这是因为图片说明前的竖线被识别为tag函数的多个参数分隔了:
<root><template><title>#tag:gallery</title><part><name index="1"/><value> Javascript.svg</value></part><part><name index="2"/><value>JS图标 Css.svg</value></part><part><name index="3"/><value>CSS图标 </value></part></template></root>
可以看出,JS图标(换行)Css.svg被识别成了一个参数,而不是预期的效果。
此时,需要对竖线转义:
{{#tag:gallery| Javascript.svg{{!}}JS图标 Css.svg{{!}}CSS图标 }}
这时,结果Wikitext正常
<gallery> Javascript.svg|JS图标 Css.svg|CSS图标 </gallery>
这是解析器函数将文本中竖线视为参数分隔的另一个例子。