Mediawiki解析器和recursiveTagParse

时间:2013-07-05 12:52:08

标签: php mediawiki

我在使用wikitext渲染标记处理时遇到问题。

public static function onTagRender( $input, array $args, $parser, $frame ) {
...
$text = $parser->recursiveTagParse($sometext, $frame);
...
return $text;
}

如果$ sometext包含例如

"Example from page [[XYZ]]"

然后我希望返回的$ text应该包含

"Example from page <a href="/wiki/XYZ" title="XYZ">XYZ</a>"

但我只得到

"Example from page <!--LINK 0:0-->"

我也尝试了$ parser-&gt; replaceInternalLinks(),但结果相同。我忽略了什么?

2 个答案:

答案 0 :(得分:0)

Parser :: recursiveTagParse只做部分渲染,afaik。这可能是也可能不是问题。要完全呈现任何用户输入,您必须创建解析器函数(http://www.mediawiki.org/wiki/Manual:Parser_functions)而不是标记函数。

请参阅http://www.mediawiki.org/wiki/Manual:Tag_extensions#How_do_I_render_wikitext_in_my_extension.3F

答案 1 :(得分:0)

如果有些人遇到同样的问题,请尝试在replaceLinkHolders之后调用 recursiveTagParse 。 (我没有遇到同样的问题,所以我没有对它进行测试。)

所以在OP的代码片段中,那就是:

public static function onTagRender( $input, array $args, $parser, $frame ) {
...
$text = $parser->recursiveTagParse($sometext, $frame);
$text = $parser->replaceLinkHolders($text);
...
return $text;
}

根据我的理解解释:

实际上,通常的parse方法调用internalParse方法 - 它执行大部分工作 - 然后执行其他一些操作。另一方面,recursiveTagParse几乎只调用internalParse,因此它不会执行parse中的其他内容。
问题是,链接分两步解析:

  1. 首先将链接提取到LinkHolderArray,然后在文本中将其替换为<!--LINK $ns:$key--> (由replaceInternalLinks完成,由internalParse调用,这样就可以了。)
  2. 然后将<!--LINK $ns:$key-->标记解析为HTML链接 (由[{1}}完成,由replaceLinkHolders调用,而不是parse调用,因此不是internalParse调用。)