Развернуть шаблон в расширении функции - PullRequest
1 голос
/ 13 мая 2011

Я создаю расширение FunctionHook ({{#foo:bar}} в викитексте), которое согласно документации имеет входные параметры с расширенными шаблонами, а на выходе должен быть викитекст.

Проблема в том, что я хочу, чтобы часть вывода добавила шаблон на страницу. Но он появляется как необработанный вики-текст для шаблона, потому что расширение шаблона уже произошло. Я знаю, что доступна команда $parser->recursiveTagParse($output, $frame), но когда я это делаю, шаблоны расширяются, как ссылка на викитекст, который разрывает внешние ссылки ([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 для расширения шаблонов без раскрытия другого вики-текста?

Пример кода:

$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) включается, как и ожидалось, но ссылка Google переходит на двойной анализ и становится &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 ]

2 голосов
/ 13 мая 2011

Обычно синтаксический анализатор перехват функции ({{#foo: param}}) возвращает разметку wikitext, в то время как перехват tag (текст) возвращает HTML.

Из функции хук, вам нужно только вернуть «что-то что-то {{mytemplate}}», а остальная часть синтаксического анализатора должна расширить шаблон для вас - именно так, как он звучит, как вы хотите.

Можете ли выприведите конкретный пример того, что вы делаете - предпочтительно полный, работающий пример кода - который демонстрирует то, что расширяется, что вы не хотите расширить?

0 голосов
/ 03 августа 2013

Если вы просто возвращаете вики-текст из функции парсера, он анализируется только частично. Например, шаблоны не будут отображаться.

Ваш подход к вызову синтаксического анализатора самостоятельно верен. Но вам нужно сообщить парсеру, что возвращаемый вывод уже проанализирован:

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