2011-05-13 168 views
1

我正在創建FunctionHook擴展(wikitext中的{{#foo:bar}}),該文檔根據文檔具有擴展模板的輸入參數,輸出應爲wikitext。在函數擴展中展開模板

問題是我想要輸出的一部分添加一個模板到頁面。但它是作爲模板的原始wiki文本進入的,因爲模板擴展已經發生。我知道有一個$parser->recursiveTagParse($output, $frame)命令可用,但是當我這樣做,模板得到擴展,如鏈接wikitext的,它打破外部鏈接([http://google.com google]變得<a href="http://google.com">google</a>,它被再解析成&lt;a href="<a href="http://www.google.com">http://www.google.com</a>"&gt;google&lt;/a&gt;

那麼,有沒有一個命令,可以從FunctionHook擴展中調用擴展模板而不擴展其他wiki文本?

代碼示例:

$wgHooks['ParserFirstCallInit'][] = 'fooBar_Setup'; 
$wgHooks['LanguageGetMagic'][] = 'fooBar_Magic'; 

function fooBar_Setup(&$parser) { 
    $parser->setFunctionHook('fb', 'fooBar_Render'); 
    return true; 
} 
function fooBar_Magic(&$magicWords, $lang) { 
    $magicWords['fb'] = array(0, 'fb', 'foobar'); 
    return true; 
} 
function fooBar_Render($parser, $param1) { 
    $output = '{{prettyOutput|'.$param1.'}} [http://www.google.com Search the web]'; 
    $output = $parser->recursiveTagParse($output); 
    return $output; 
} 

有了這個代碼,如果我運行原來的樣子,模板(prettyOutput)被列爲預期,但谷歌的鏈接獲取雙解析併成爲&lt;a href="<a href="http://www.google.com">http://www.google.com</a>"&gt;Search the web&lt;/a&gt;。如果我取出recursiveTagParse行,模板將保留爲頁面上的文字{{prettyOutput|myInput}},但外部鏈接正常工作。

回答

2

通常解析器函數鉤({{#foo:PARAM}})返回wikitext的標記,而標籤(文本)返回HTML。

從一個函數鉤子,你應該只需要返回'something something {{mytemplate}}',解析器的其餘部分應該爲你擴展模板 - 它聽起來就像你想要的。

你可以舉一個你正在做什麼的具體例子 - 最好是一個完整的,可運行的代碼示例 - 它演示什麼被擴大,你想擴大?

0

如果你只是從解析器函數中返回wiki文本,它只是部分解析。例如模板不會被渲染。

你自己調用解析器的方法是正確的。但是,您需要告訴解析器返回的輸出已解析:

return array($parser->recursiveTagParse($output), 
       'noparse' => true, 'isHTML' => true);