我正在制作一个嵌套的标记扩展,其中父标记(在我的情况下为<tabs>
)需要能够影响子标记的内容(在我的情况下<tab>
)。我尝试通过运行$parser->recursiveTagParse($input)
来实现这一点,其中$input
是<tabs>
标记的内容,但在返回的字符串中,似乎无法匹配任何内容。为了以最基本的方式对此进行测试,我做了以下工作:
添加到LocalSettings.php:
require_once "$IP\\extensions\\Test\\Test.php";
使用以下命令在Test目录中创建Test.php:
<?php
$wgAutoloadClasses['Test'] = __DIR__ . '/Test.body.php';
$wgHooks['ParserFirstCallInit'][] = 'Test::init';
使用以下命令创建Test.body.php:
<?php
class Test {
public static function init( &$parser ) {
$parser->setHook( 'testfoo', array( 'Test', 'firstTag' ) );
$parser->setHook( 'testbar', array( 'Test', 'secondTag' ) );
return true;
}
public static function firstTag($input, $attr = array(), $parser, $frame) {
$newinput = $parser->recursiveTagParse($input);
return preg_match_all("/ /", $newinput);
}
public static function secondTag($input, $attr = array(), $parser, $frame) {
return htmlspecialchars($input);
}
}
最后,将以下内容放在wiki的页面上:
<testfoo>three spaces out here<testbar>and four more spaces here</testbar></testfoo>
这应该使最终输出为7
,因为输出字符串中有7个空格。问题是,这会返回3
,即<testbar>
标记之外的空格数量。
我想知道的是,是否有可能匹配和/或替换解析嵌套标记的结果(所以嵌套标记输出的是什么),如果是不可能,嵌套在<testbar>
标记内时,<testfoo>
标记是否可能有不同的行为?
我还尝试在PPFrame
部分添加$parser->recursiveTagParse($input)
作为第二个参数,以尝试检测嵌套,但PPFrame的文档很不清楚,我不知道是什么我需要去做。基于what the documentation says,我现在所做的是:
public static function firstTag($input, $attr = array(), $parser, $frame) {
$newframe = $frame->newChild(array('nested'=>'true'), $frame->getTitle(), 0);
$newinput = $parser->recursiveTagParse($input, $newframe);
return preg_match_all("/ /", $newinput);
}
但这会导致错误。当我这样做时它说的是:
注意:尝试在第984行的C:\ hiddenpath \ w \ includes \ parser \ Preprocessor_DOM.php中获取非对象的属性
捕获致命错误:传递给DOMXPath :: __ construct()的参数1必须是DOMDocument的一个实例,给定null,在第10行的C:\ hiddenpath \ w \ extensions \ Test \ Test.body.php中调用并定义在第984行的C:\ hiddenpath \ w \ includes \ parser \ Preprocessor_DOM.php
但我不知道我需要做些什么来解决这个问题。我需要将我的第一个参数作为特殊对象吗?如果是这样,为什么文档说我需要将数组作为第一个参数?
答案 0 :(得分:1)
自己回答这个问题,因为没有其他答案
我设法得到我想要的结果的方法是放弃问题的原始第一部分:“我想知道的是,是否有可能匹配和/或替换解析嵌套标记的结果(所以嵌套标记输出的内容)“只是移动到第二部分,”如果不可能,是否有可能使标记行为不同嵌套在标签内“。
我这样做的方法是在类中定义一个变量,然后改变一下我是否对a的内容做了recursiveTagParse
。 Test.php中的代码将是:
public static function init( &$parser ) {
$parser->setHook( 'testfoo', array( new self(), 'firstTag' ) );
$parser->setHook( 'testbar', array( new self(), 'secondTag' ) );
return true;
}
function firstTag($input, $attr = array(), $parser, $frame) {
$this::$nested = true;
$newinput = $parser->recursiveTagParse($input);
$this::$nested = false;
return preg_match_all("/ /", $newinput);
}
function secondTag($input, $attr = array(), $parser, $frame) {
if ($this::$nested) {
$output = 'Display for when nested'.$input;
} else {
$output = 'Display for when not nested'.$input;
}
return htmlspecialchars($output);
}
}
这样,当我在<testbar>
标记内时,我仍然可以使<testfoo>
标记的行为有所不同。我不确定这是否应该如此完成,但它确实有效。
PS:我也忽略了$frame->newChild()
代码,因为这似乎不起作用,也没有明确的文档或示例。