问题描述
<Syntaxhighlight lang="xml" line>
<abc x="123" />
</Syntaxhighlight>
在此示例中,“ <abc x="123"/>
”将正确呈现。但是,如果我想将此XML代码片段“ <abc x="123"/>
”传递给某个任意模板,而 会将这些内容传递给Syntaxhighlight
扩展名呢?如何才能做到这一点?标准方法似乎无效。
我已经发现的东西:
- 可以通过
Syntaxhighlight
调用{{#tag:Syntaxhighlight{
扩展名。可以将其放入模板中。<Nowiki>...</Nowiki>
}|lang="xml"|line=1}} - 将一些任意XML内容传递给模板似乎是问题所在。无论我尝试什么,似乎都行不通。即使使用
<
也无济于事:在这种情况下,所有“<
”都将替换为“SVGExample
”。
您对此有什么想法甚至知道解决方案吗?
更新:我做了全新安装的MW 1.34.3,以便与尝试在stackoverflow上为我提供帮助的人们尽可能完全相同。现在:
- MW:1.34.3
- SMW:3.2.0
- 语法高亮:2.0
名为{{#tag:Syntaxhighlight|{{{1|}}}|lang="xml"|line=1}}
的模板:
{{SVGExample|<Nowiki><abc x="123"/></Nowiki>}}
1 <abc x="123"/>
结果:
MagicNoCache
这似乎与Mediawiki扩展无关。我停用了SyntaxHighlight_GeSHi
,ParserFunctions
,<
以外的所有扩展名,并得到了相同的结果。
为想要深入了解此内容的人更新:
解决占位符似乎在这里引入了问题。即使采用建议的将数据传递给参数的方式,也需要进行一些处理:过滤掉注释。我在自定义扩展程序中的实验表明,一旦您解析了传递给模板的参数,数据就会被HTML编码,从而导致不必要的$parser->recursiveTagParse(...)
实体(和其他实体)。 SyntaxHighlight扩展程序通过某种方式来避免这种现象,因为它在解决模板参数后接收原始数据时会避免这种现象,在这种情况下,使用input(print('> '))
的经典方法在这方面失败了。
解决方法
创建一个模板,例如Template:Xml
:
<includeonly>{{#tag:syntaxhighlight|{{{1|}}}|lang="xml"|line=1}}</includeonly>
以如下方式调用此模板:{{xml|1=<abc x="123" />}}
。注意|1=
。
或者,将Template:=
创建为=
并调用{{xml|<abc x{{=}}"123" />}}
,将每个等号转义:=
→{{=}}
。
解析器函数的匿名参数中的等号需要转义,以便MediaWiki不会将其用作参数名称和值之间的分隔符。
因此,另一种选择是使用命名参数声明Template:xml
,如下所示:
<includeonly>{{#tag:syntaxhighlight|{{{xml|}}}|lang="xml"|line=1}}</includeonly>
并这样称呼:{{xml|xml=<abc x="123" />}}
。