Fix <noautolinks> tag in parse-on-render mode.

- Fix: <noautolinks> tag did not work in parse-on-render mode.
This commit is contained in:
Daniel Kraus
2017-09-06 22:31:59 +02:00
parent c99ec87b87
commit 04c1be307b
4 changed files with 69 additions and 10 deletions

View File

@ -126,7 +126,10 @@ class Extension {
* See https://www.mediawiki.org/wiki/Manual:Tag_extensions#Example
*/
public static function doNoautolinksTag( $input, array $args, \Parser $parser, \PPFrame $frame ) {
return $parser->recursiveTagParse( $input, $frame );
Linker::lock();
$result = $parser->recursiveTagParse( $input, $frame );
Linker::unlock();
return $result;
}
/*
@ -138,7 +141,9 @@ class Extension {
$config = new Config();
$linker = new Linker( $config );
$source = Source::createFromParserAndText( $parser, $input, $config );
Linker::unlock();
$result = $linker->linkContent( $source );
Linker::lock();
if ( $result ) {
return $parser->recursiveTagParse( $result, $frame );
} else {

View File

@ -46,6 +46,8 @@ class Linker {
*/
private $linkValue;
private static $locked = 0;
/**
* Constructs a new instance of the Linker class.
*
@ -68,7 +70,7 @@ class Linker {
* @return String|null Source page text with links to target pages, or null if no links were added
*/
public function linkContent( Source $source ) {
if ( !$source->canBeLinked() ) {
if ( self::$locked > 0 || !$source->canBeLinked() ) {
return;
}
@ -197,6 +199,28 @@ class Linker {
return '[[' . $matches[ 0 ] . ']]';
}
}
/**
* Increases an internal static lock counter by 1.
*
* If the Linker class is locked (counter > 0), linkContent() will be a no-op.
* Locking is necessary to enable nested <noautolinks> and <autolinks> tags in
* parseOnRender mode.
*/
public static function lock() {
self::$locked += 1;
}
/**
* Decreases an internal static lock counter by 1.
*
* If the Linker class is locked (counter > 0), linkContent() will be a no-op.
* Locking is necessary to enable nested <noautolinks> and <autolinks> tags in
* parseOnRender mode.
*/
public static function unlock() {
self::$locked -= 1;
}
}
// vim: ts=2:sw=2:noet:comments^=\:///

View File

@ -47,10 +47,15 @@ class ExtensionTest extends LinkTitles\TestCase {
'This page should link to the [[link target]] but not to test page'
],
[
false,
false, // parseOnEdit
'This page should *not* link to the link target',
'This page should *not* link to the link target'
]
],
[
true, // parseOnEdit
'With __NOAUTOLINKS__, this page should not link to the link target',
'With __NOAUTOLINKS__, this page should not link to the link target'
],
];
}
@ -65,8 +70,7 @@ class ExtensionTest extends LinkTitles\TestCase {
] );
$title = $this->insertPage( 'test page', $input )['title'];
$page = new WikiPage( $title );
$content = $page->getContent();
$output = $content->getParserOutput( $title, null, null, false );
$output = $page->getParserOutput( new ParserOptions(), null, true );
$lines = explode( "\n", $output->getText() );
$this->assertRegexp( $expectedOutput, $lines[0] );
}
@ -75,14 +79,34 @@ class ExtensionTest extends LinkTitles\TestCase {
return [
[
true, // parseOnRender
'This page should link to the link target but not to test page',
'_This page should link to the <a href=[^>]+>link target</a> but not to test page_'
'This page should link to the link target but not to the test page',
'_This page should link to the <a href=[^>]+>link target</a> but not to the test page_'
],
[
false,
false, // parseOnRender
'This page should not link to the link target',
'_This page should not link to the link target_'
]
],
[
true, // parseOnRender
'__NOAUTOLINKS__With noautolinks magic word, this page should not link to the link target',
'_With noautolinks magic word, this page should not link to the link target_'
],
[
true, // parseOnRender
'__NOAUTOLINKS__With noautolinks magic word, <autolinks>link target in autolinks tag</autolinks> should be linked',
'_With noautolinks magic word, <a href=[^>]+>link target</a> in autolinks tag should be linked_'
],
[
true, // parseOnRender
'<noautolinks>In a noautolinks tag, link target should NOT be linked</noautolinks>',
'_In a noautolinks tag, link target should NOT be linked_'
],
[
true, // parseOnRender
'<noautolinks>In a noautolinks tag, <autolinks>link target in autolinks tag</autolinks> should be linked</noautolinks>',
'_In a noautolinks tag, <a href=[^>]+>link target</a> in autolinks tag should be linked_'
],
];
}
}

View File

@ -105,6 +105,12 @@ class SplitterTest extends MediaWikiTestCase {
// "With parseHeadings = false,\n==an improperly formatted heading may be linked=\n",
// [ "With parseHeadings = false,\n==an improperly formatted heading may be linked=\n" ]
// ],
[
true, // skipTemplates
true, // parseHeadings
"Text <noautolinks>in noautolinks tag</noautolinks>should be excluded",
[ "Text ", "<noautolinks>in noautolinks tag</noautolinks>", "should be excluded" ]
],
];
}
}