社区文档构建进行中,欢迎编辑。社区答疑群(非官方):717421103

全站通知:

展开模板

阅读

    

2024-05-28更新

    

最新编辑:Lu_23333

阅读:

  

更新日期:2024-05-28

  

最新编辑:Lu_23333

来自WIKI实验室WIKI_BWIKI_哔哩哔哩
跳到导航 跳到搜索
页面贡献者 :
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>

这是解析器函数将文本中竖线视为参数分隔的另一个例子。