mirror of
https://github.com/diocloid/LinkTitles.git
synced 2025-07-13 17:59:29 +02:00
Merge branch 'release-5.0.3'
This commit is contained in:
9
NEWS
9
NEWS
@ -1,3 +1,12 @@
|
|||||||
|
Version 5.0.3 (2017-09-06)
|
||||||
|
------------------------------------------------------------------------
|
||||||
|
|
||||||
|
- Fix: <autolinks> tag was broken.
|
||||||
|
- Fix: <noautolinks> tag did not work in parse-on-render mode.
|
||||||
|
|
||||||
|
* * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * *
|
||||||
|
|
||||||
|
|
||||||
Version 5.0.2 (2017-09-05)
|
Version 5.0.2 (2017-09-05)
|
||||||
------------------------------------------------------------------------
|
------------------------------------------------------------------------
|
||||||
|
|
||||||
|
@ -9,7 +9,7 @@
|
|||||||
],
|
],
|
||||||
"type": "parserhook",
|
"type": "parserhook",
|
||||||
"url": "https://www.mediawiki.org/wiki/Extension:LinkTitles",
|
"url": "https://www.mediawiki.org/wiki/Extension:LinkTitles",
|
||||||
"version": "5.0.2",
|
"version": "5.0.3",
|
||||||
"license-name": "GPL-2.0+",
|
"license-name": "GPL-2.0+",
|
||||||
"descriptionmsg": "linktitles-desc",
|
"descriptionmsg": "linktitles-desc",
|
||||||
"requires": {
|
"requires": {
|
||||||
|
2
gh-pages
2
gh-pages
Submodule gh-pages updated: 81d2968661...ca9037ca4e
@ -126,7 +126,10 @@ class Extension {
|
|||||||
* See https://www.mediawiki.org/wiki/Manual:Tag_extensions#Example
|
* See https://www.mediawiki.org/wiki/Manual:Tag_extensions#Example
|
||||||
*/
|
*/
|
||||||
public static function doNoautolinksTag( $input, array $args, \Parser $parser, \PPFrame $frame ) {
|
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;
|
||||||
}
|
}
|
||||||
|
|
||||||
/*
|
/*
|
||||||
@ -137,8 +140,10 @@ class Extension {
|
|||||||
public static function doAutolinksTag( $input, array $args, \Parser $parser, \PPFrame $frame ) {
|
public static function doAutolinksTag( $input, array $args, \Parser $parser, \PPFrame $frame ) {
|
||||||
$config = new Config();
|
$config = new Config();
|
||||||
$linker = new Linker( $config );
|
$linker = new Linker( $config );
|
||||||
$source = Source::createFromParser( $parser, $config );
|
$source = Source::createFromParserAndText( $parser, $input, $config );
|
||||||
|
Linker::unlock();
|
||||||
$result = $linker->linkContent( $source );
|
$result = $linker->linkContent( $source );
|
||||||
|
Linker::lock();
|
||||||
if ( $result ) {
|
if ( $result ) {
|
||||||
return $parser->recursiveTagParse( $result, $frame );
|
return $parser->recursiveTagParse( $result, $frame );
|
||||||
} else {
|
} else {
|
||||||
|
@ -46,6 +46,8 @@ class Linker {
|
|||||||
*/
|
*/
|
||||||
private $linkValue;
|
private $linkValue;
|
||||||
|
|
||||||
|
private static $locked = 0;
|
||||||
|
|
||||||
/**
|
/**
|
||||||
* Constructs a new instance of the Linker class.
|
* 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
|
* @return String|null Source page text with links to target pages, or null if no links were added
|
||||||
*/
|
*/
|
||||||
public function linkContent( Source $source ) {
|
public function linkContent( Source $source ) {
|
||||||
if ( !$source->canBeLinked() ) {
|
if ( self::$locked > 0 || !$source->canBeLinked() ) {
|
||||||
return;
|
return;
|
||||||
}
|
}
|
||||||
|
|
||||||
@ -197,6 +199,28 @@ class Linker {
|
|||||||
return '[[' . $matches[ 0 ] . ']]';
|
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^=\:///
|
// vim: ts=2:sw=2:noet:comments^=\:///
|
||||||
|
@ -26,23 +26,87 @@
|
|||||||
*/
|
*/
|
||||||
class ExtensionTest extends LinkTitles\TestCase {
|
class ExtensionTest extends LinkTitles\TestCase {
|
||||||
|
|
||||||
public function testParseOnEdit() {
|
/**
|
||||||
|
* @dataProvider provideParseOnEditData
|
||||||
|
*/
|
||||||
|
public function testParseOnEdit( $parseOnEdit, $input, $expectedOutput) {
|
||||||
$this->setMwGlobals( [
|
$this->setMwGlobals( [
|
||||||
'wgLinkTitlesParseOnEdit' => true,
|
'wgLinkTitlesParseOnEdit' => $parseOnEdit,
|
||||||
'wgLinkTitlesParseOnRender' => false
|
'wgLinkTitlesParseOnRender' => !$parseOnEdit
|
||||||
] );
|
] );
|
||||||
$pageId = $this->insertPage( 'test page', 'This page should link to the link target but not to test page' )['id'];
|
$pageId = $this->insertPage( 'test page', $input )['id'];
|
||||||
$page = WikiPage::newFromId( $pageId );
|
$page = WikiPage::newFromId( $pageId );
|
||||||
$this->assertSame( 'This page should link to the [[link target]] but not to test page', self::getPageText( $page ) );
|
$this->assertSame( $expectedOutput, self::getPageText( $page ) );
|
||||||
}
|
}
|
||||||
|
|
||||||
public function testDoNotParseOnEdit() {
|
public function provideParseOnEditData() {
|
||||||
|
return [
|
||||||
|
[
|
||||||
|
true, // parseOnEdit
|
||||||
|
'This page should link to the link target but not to test page',
|
||||||
|
'This page should link to the [[link target]] but not to test page'
|
||||||
|
],
|
||||||
|
[
|
||||||
|
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'
|
||||||
|
],
|
||||||
|
];
|
||||||
|
}
|
||||||
|
|
||||||
|
|
||||||
|
/**
|
||||||
|
* @dataProvider provideParseOnRenderData
|
||||||
|
*/
|
||||||
|
public function testParseOnRender( $parseOnRender, $input, $expectedOutput) {
|
||||||
$this->setMwGlobals( [
|
$this->setMwGlobals( [
|
||||||
'wgLinkTitlesParseOnEdit' => false,
|
'wgLinkTitlesParseOnEdit' => false, // do not modify the page as we create it
|
||||||
'wgLinkTitlesParseOnRender' => false
|
'wgLinkTitlesParseOnRender' => $parseOnRender
|
||||||
] );
|
] );
|
||||||
$pageId = $this->insertPage( 'test page', 'This page should not link to the link target' )['id'];
|
$title = $this->insertPage( 'test page', $input )['title'];
|
||||||
$page = WikiPage::newFromId( $pageId );
|
$page = new WikiPage( $title );
|
||||||
$this->assertSame( 'This page should not link to the link target', self::getPageText( $page ) );
|
$output = $page->getParserOutput( new ParserOptions(), null, true );
|
||||||
|
$lines = explode( "\n", $output->getText() );
|
||||||
|
$this->assertRegexp( $expectedOutput, $lines[0] );
|
||||||
|
}
|
||||||
|
|
||||||
|
public function provideParseOnRenderData() {
|
||||||
|
return [
|
||||||
|
[
|
||||||
|
true, // parseOnRender
|
||||||
|
'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, // 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_'
|
||||||
|
],
|
||||||
|
];
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
@ -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",
|
||||||
// [ "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" ]
|
||||||
|
],
|
||||||
];
|
];
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
Reference in New Issue
Block a user