1

我在标签处理钩子中渲染 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->replaceInternalLinks(),但结果相同。我忽略了什么?

4

2 回答 2

1

如果有些人遇到同样的问题,请尝试致电replaceLinkHoldersrecursiveTagParse. (我没有遇到同样的问题,所以我没有测试它。)

所以在 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 链接。
    (这是由replaceLinkHolders调用的parse,而不是调用的,internalParse因此不是调用的recursiveTagParse。)
于 2014-07-02T04:01:41.293 回答
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

于 2013-07-18T13:54:21.177 回答