2013-07-05 1 views
1

태그 처리를 위해 wikitext를 렌더링하는 데 문제가 있습니다.Mediawiki 파서 및 재귀 태그 파문

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

$ sometext에.

"Example from page [[XYZ]]" 

나는 반환 기대하는 $ 문자를

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

포함해야하지만 나는 또한 $ parser-> replaceInternalLinks (시도 만

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

를 얻을),하지만 같은 결과. 나는 무엇을 간과 했는가?

답변

0

Parser :: recursiveTagParse 부분 렌더링 만 수행합니다. 그것은 문제 일 수도 있고 아닐 수도 있습니다. 사용자 입력을 완전히 렌더링하려면 태그 함수 대신 파서 함수 (http://www.mediawiki.org/wiki/Manual:Parser_functions)를 만들어야합니다.

어떤 사람들은 같은 문제가 발생하는 경우 recursiveTagParsereplaceLinkHolders를 호출하려고 http://www.mediawiki.org/wiki/Manual:Tag_extensions#How_do_I_render_wikitext_in_my_extension.3F

0

참조하십시오. (. 나는 그것을 테스트하지 않았다, 그래서 나는이 같은 문제를 가지고 있지 않았다) 그래서 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-->로 대체된다.
    (이 internalParse에 의해 호출, replaceInternalLinks에 의해 이루어집니다, 그래서 괜찮아요.)
  2. 그런 다음 <!--LINK $ns:$key--> 마커는 HTML 링크로 구문 분석됩니다.
    (이 recursiveTagParse로하지 internalParse로, parse에 의해 호출되는 replaceLinkHolders에 의해 수행, 따라서되지 않습니다.)