diff options
author | Luke Shumaker <LukeShu@sbcglobal.net> | 2014-05-05 15:30:48 -0400 |
---|---|---|
committer | Luke Shumaker <LukeShu@sbcglobal.net> | 2014-05-05 15:30:48 -0400 |
commit | 3d86add3dfa5e0b3ead9859593d4a52cf7555a34 (patch) | |
tree | 453d8bd3fda4dbb3020017ea1a469291da5cdc71 | |
parent | 064cec79ca4c8201de0d06bbca6cb7a5345d11be (diff) | |
parent | 2e44b49a2db3026050b136de9b00f749dd3ff939 (diff) |
Merge branch 'archwiki'
482 files changed, 342 insertions, 92375 deletions
diff --git a/.gitreview b/.gitreview deleted file mode 100644 index bb83fd3b..00000000 --- a/.gitreview +++ /dev/null @@ -1,6 +0,0 @@ -[gerrit] -host=gerrit.wikimedia.org -port=29418 -project=mediawiki/core.git -defaultbranch=REL1_22 -defaultrebase=0 diff --git a/.jshintignore b/.jshintignore deleted file mode 100644 index f740f137..00000000 --- a/.jshintignore +++ /dev/null @@ -1,29 +0,0 @@ -# Generated documentation -docs/html/ -docs/js/ - -# third-party libs -extensions/ -node_modules/ -resources/jquery/jquery.appear.js -resources/jquery/jquery.async.js -resources/jquery/jquery.cycle.all.js -resources/jquery/jquery.cookie.js -resources/jquery/jquery.farbtastic.js -resources/jquery/jquery.form.js -resources/jquery/jquery.hoverIntent.js -resources/jquery/jquery.js -resources/jquery/jquery.json.js -resources/jquery/jquery.jStorage.js -resources/jquery/jquery.mockjax.js -resources/jquery/jquery.qunit.js -resources/jquery/jquery.validate.js -resources/jquery/jquery.xmldom.js -resources/jquery.effects/ -resources/jquery.tipsy/ -resources/jquery.ui/ -resources/mediawiki.libs/ -resources/jquery.chosen/chosen.jquery.js - -# github.com/jshint/jshint/issues/729 -tests/qunit/suites/resources/mediawiki/mediawiki.jscompat.test.js diff --git a/.jshintrc b/.jshintrc deleted file mode 100644 index c4e265a4..00000000 --- a/.jshintrc +++ /dev/null @@ -1,42 +0,0 @@ -{ - /* Common */ - - // Enforcing - "camelcase": true, - "curly": true, - "eqeqeq": true, - "immed": true, - "latedef": true, - "newcap": true, - "noarg": true, - "noempty": true, - "nonew": true, - "quotmark": "single", - "trailing": true, - "undef": true, - "unused": true, - // Legacy - "onevar": true, - - /* Local */ - - // Enforcing - "bitwise": true, - "forin": false, - "regexp": false, - "strict": false, - // Relaxing - "laxbreak": true, - "smarttabs": true, - "multistr": true, - // Environment - "browser": true, - // Legacy - "nomen": true, - - "predef": [ - "mediaWiki", - "jQuery", - "QUnit" - ] -} @@ -213,6 +213,7 @@ following names for their contribution to the product. * Salvatore Ingala * Santhosh Thottingal * Scott Colcord +* se4598 * Sébastien Santoro * Simon Walker * Solitarius diff --git a/RELEASE-NOTES-1.22 b/RELEASE-NOTES-1.22 index ed64aa4d..5685fef9 100644 --- a/RELEASE-NOTES-1.22 +++ b/RELEASE-NOTES-1.22 @@ -3,15 +3,85 @@ Security reminder: MediaWiki does not require PHP's register_globals. If you have it on, turn it '''off''' if you can. +== MediaWiki 1.22.6 == + +This is a security release of the MediaWiki 1.22 branch. + +=== Changes since 1.22.5 === + +* (bug 63251) SECURITY: Escape sortKey in pageInfo. + +== MediaWiki 1.22.5 == + +This is a security and maintenance release of the MediaWiki 1.22 branch. + +=== Changes since 1.22.4 === + +* (bug 62497) SECURITY: Add CSRF token on Special:ChangePassword. +* (bug 62467) Set a title for the context during import on the cli. +* Fix custom local MediaWiki:Helppage values. +* mediawiki.js: Fix documentation breakage. +* (bug 58153) Make MySQLi work with non standard port. +* (bug 53887) Reintroduced a link to help pages in the default sidebar, that + any sysop can customize by editing [[MediaWiki:Sidebar]] locally. The link + now points to a mediawiki.org page which is guaranteed to exist. Nothing needs + to be done on your end, but remember to adjust [[MediaWiki:Sidebar]] for the + needs of your wikis. Everyone can help with the shared documentation by + translating: https://www.mediawiki.org/wiki/Special:Translate/agg-Help_pages . +* (bug 53888) Corrected a regression in 1.22 which introduced red links on the + login page. If you previously installed 1.22.x and have created a local page + to make the red link blue, write its title as in [[MediaWiki:helplogin-url]] + if you didn't already. Otherwise, you don't need to do anything, but you can + translate the help page at https://www.mediawiki.org/wiki/Help:Logging_in . + +== MediaWiki 1.22.4 == + +This is a maintenance release of the MediaWiki 1.22 branch. + +=== Changes since 1.22.3 === + +* Use the correct branch of the extensions' git repositories. + +== MediaWiki 1.22.3 == + +This is a security and bugfix release of the MediaWiki 1.22 branch. + +=== Changes since 1.22.2 === + +* (bug 60771) SECURITY: Disallow uploading SVG files using non-whitelisted + namespaces. Also disallow iframe elements. User will get an error + including the namespace name if they use a non- whitelisted namespace. +* (bug 61346) SECURITY: Make token comparison use constant time. It seems like + our token comparison would be vulnerable to timing attacks. This will take + constant time. +* (bug 61362) SECURITY: API: Don't find links in the middle of api.php links. +* (bug 53710) Add sequence support for upsert in DatabaseOracle in the same way + as in selectInsert +* (bug 60231, 58719) Various fixes to job running code in Wiki.php: Make it + async on Windows. Fixed possible "invalid filename" errors on Windows. + Redirect output to dev/null to avoid hanging PHP. +* (bug 60083) Correct sequence name for fresh Postgres installation. Spotted + by gebhkla +* (bug 60531) Avoid variable naming conflicts in + DatabasePostgres::selectSQLText. Spotted by gebhkla +* (bug 60094) Fix rebuildall.php fatal error with PostgreSQL. The fix for + 47055 introduced a fatal error when running rebuildall.php. This is a + workaround suggested by gebhkla on Bugzilla. It just checks to make sure + $options is actually an array before calling array_search on it. +* (bug 43817c12) Add error handling if descriptionmsg isn't defined for + extension. +* (bug 60543) Special:PrefixIndex omits stripprefix=1 for "Next page" link. + == MediaWiki 1.22.2 == This is a security and bugfix release of the MediaWiki 1.22 branch. === Changes since 1.22.1 === -* (bug 60339) SECURITY: Sanitize shell arguments to DjVu files, and other media formats -* (bug 58253) Check for very old PCRE versions in installer and updater -* (bug 60054) Make WikiPage::$mPreparedEdit public +* (bug 60339) SECURITY: Sanitize shell arguments to DjVu files, and other media + formats. +* (bug 58253) Check for very old PCRE versions in installer and updater. +* (bug 60054) Make WikiPage::$mPreparedEdit public. == MediaWiki 1.22.1 == diff --git a/extensions/Cite/.gitreview b/extensions/Cite/.gitreview deleted file mode 100644 index 6ae9db41..00000000 --- a/extensions/Cite/.gitreview +++ /dev/null @@ -1,5 +0,0 @@ -[gerrit] -host=gerrit.wikimedia.org -port=29418 -project=mediawiki/extensions/Cite.git -defaultbranch=master diff --git a/extensions/Cite/.jshintignore b/extensions/Cite/.jshintignore deleted file mode 100644 index df46ab97..00000000 --- a/extensions/Cite/.jshintignore +++ /dev/null @@ -1 +0,0 @@ -modules/jquery.tooltip/jquery.tooltip.js diff --git a/extensions/Cite/.jshintrc b/extensions/Cite/.jshintrc deleted file mode 100644 index 4b356f81..00000000 --- a/extensions/Cite/.jshintrc +++ /dev/null @@ -1,34 +0,0 @@ -{ - "camelcase": true, - "curly": true, - "eqeqeq": true, - "immed": true, - "latedef": true, - "newcap": true, - "supernew": true, - "shadow": true, - "noarg": true, - "noempty": true, - "nonew": true, - "quotmark": false, // sometimes double quotes make sense, e.g. "foo's" is better readable than 'foo\'s' - "trailing": true, - "undef": true, - "unused": "vars", // we want to allow unused function parameters - "laxbreak": true, - "laxcomma": false, - "onevar": false, - "bitwise": false, - "forin": false, - "regexp": false, - "strict": true, - "scripturl": true, - - // Environment - "browser": true, - - // Globals - "predef": [ - "jQuery", - "mediaWiki" - ] -} diff --git a/extensions/ConfirmEdit/.gitreview b/extensions/ConfirmEdit/.gitreview deleted file mode 100644 index 780d35df..00000000 --- a/extensions/ConfirmEdit/.gitreview +++ /dev/null @@ -1,5 +0,0 @@ -[gerrit] -host=gerrit.wikimedia.org -port=29418 -project=mediawiki/extensions/ConfirmEdit.git -defaultbranch=master diff --git a/extensions/Gadgets/.gitreview b/extensions/Gadgets/.gitreview deleted file mode 100644 index a1a8ead4..00000000 --- a/extensions/Gadgets/.gitreview +++ /dev/null @@ -1,5 +0,0 @@ -[gerrit] -host=gerrit.wikimedia.org -port=29418 -project=mediawiki/extensions/Gadgets.git -defaultbranch=master diff --git a/extensions/Gadgets/tests/GadgetTest.php b/extensions/Gadgets/tests/GadgetTest.php deleted file mode 100644 index c9332a6c..00000000 --- a/extensions/Gadgets/tests/GadgetTest.php +++ /dev/null @@ -1,81 +0,0 @@ -<?php -/** - * @group Gadgets - */ - -class GadgetsTest extends MediaWikiTestCase { - private function create( $line ) { - $g = Gadget::newFromDefinition( $line ); - // assertInstanceOf() is available since PHPUnit 3.5 - $this->assertEquals( 'Gadget', get_class( $g ) ); - - return $g; - } - - function testInvalidLines() { - $this->assertFalse( Gadget::newFromDefinition( '' ) ); - $this->assertFalse( Gadget::newFromDefinition( '<foo|bar>' ) ); - } - - function testSimpleCases() { - $g = $this->create( '* foo bar| foo.css|foo.js|foo.bar' ); - $this->assertEquals( 'foo_bar', $g->getName() ); - $this->assertEquals( 'ext.gadget.foo_bar', $g->getModuleName() ); - $this->assertEquals( array( 'Gadget-foo.js' ), $g->getScripts() ); - $this->assertEquals( array( 'Gadget-foo.css' ), $g->getStyles() ); - $this->assertEquals( array( 'Gadget-foo.js', 'Gadget-foo.css' ), - $g->getScriptsAndStyles() ); - $this->assertEquals( array( 'Gadget-foo.js' ), $g->getLegacyScripts() ); - $this->assertFalse( $g->supportsResourceLoader() ); - $this->assertTrue( $g->hasModule() ); - } - - function testRLtag() { - $g = $this->create( '*foo [ResourceLoader]|foo.js|foo.css' ); - $this->assertEquals( 'foo', $g->getName() ); - $this->assertTrue( $g->supportsResourceLoader() ); - $this->assertEquals( 0, count( $g->getLegacyScripts() ) ); - } - - function testDependencies() { - $g = $this->create( '* foo[ResourceLoader|dependencies=jquery.ui]|bar.js' ); - $this->assertEquals( array( 'Gadget-bar.js' ), $g->getScripts() ); - $this->assertTrue( $g->supportsResourceLoader() ); - $this->assertEquals( array( 'jquery.ui' ), $g->getDependencies() ); - } - - function testPreferences() { - global $wgUser, $wgOut, $wgTitle; - - // This test makes call to the parser which requires valids Outputpage - // and Title objects. Set them up there, they will be released at the - // end of the test. - $old_wgOut = $wgOut; - $old_wgTitle = $wgTitle; - $wgTitle = Title::newFromText( 'Parser test for Gadgets extension' ); - - // Proceed with test setup: - $prefs = array(); - $context = new RequestContext(); - $wgOut = $context->getOutput(); - $wgOut->setTitle( Title::newFromText( 'test' ) ); - - Gadget::loadStructuredList( '* foo | foo.js -==keep-section1== -* bar| bar.js -==remove-section== -* baz [rights=embezzle] |baz.js -==keep-section2== -* quux [rights=read] | quux.js' ); - $this->assertTrue( GadgetHooks::getPreferences( $wgUser, $prefs ), 'GetPrefences hook should return true' ); - - $options = $prefs['gadgets']['options']; - $this->assertFalse( isset( $options['<gadget-section-remove-section>'] ), 'Must not show empty sections' ); - $this->assertTrue( isset( $options['<gadget-section-keep-section1>'] ) ); - $this->assertTrue( isset( $options['<gadget-section-keep-section2>'] ) ); - - // Restore globals - $wgOut = $old_wgOut; - $wgTitle = $old_wgTitle; - } -} diff --git a/extensions/ImageMap/.gitreview b/extensions/ImageMap/.gitreview deleted file mode 100644 index 2629c9d9..00000000 --- a/extensions/ImageMap/.gitreview +++ /dev/null @@ -1,5 +0,0 @@ -[gerrit] -host=gerrit.wikimedia.org -port=29418 -project=mediawiki/extensions/ImageMap.git -defaultbranch=master diff --git a/extensions/InputBox/.gitreview b/extensions/InputBox/.gitreview deleted file mode 100644 index 9d0c704d..00000000 --- a/extensions/InputBox/.gitreview +++ /dev/null @@ -1,5 +0,0 @@ -[gerrit] -host=gerrit.wikimedia.org -port=29418 -project=mediawiki/extensions/InputBox.git -defaultbranch=master diff --git a/extensions/Interwiki/.gitreview b/extensions/Interwiki/.gitreview deleted file mode 100644 index fcc03f61..00000000 --- a/extensions/Interwiki/.gitreview +++ /dev/null @@ -1,6 +0,0 @@ -[gerrit] -host=gerrit.wikimedia.org -port=29418 -project=mediawiki/extensions/Interwiki.git -defaultbranch=master -defaultrebase=0
\ No newline at end of file diff --git a/extensions/LocalisationUpdate/.gitreview b/extensions/LocalisationUpdate/.gitreview deleted file mode 100644 index da37d04d..00000000 --- a/extensions/LocalisationUpdate/.gitreview +++ /dev/null @@ -1,5 +0,0 @@ -[gerrit] -host=gerrit.wikimedia.org -port=29418 -project=mediawiki/extensions/LocalisationUpdate.git -defaultbranch=master diff --git a/extensions/LocalisationUpdate/tests/tokenTest.php b/extensions/LocalisationUpdate/tests/tokenTest.php deleted file mode 100644 index 1112313c..00000000 --- a/extensions/LocalisationUpdate/tests/tokenTest.php +++ /dev/null @@ -1,91 +0,0 @@ -<?php - -$IP = strval( getenv( 'MW_INSTALL_PATH' ) ) !== '' - ? getenv( 'MW_INSTALL_PATH' ) - : realpath( dirname( __FILE__ ) . "/../../../" ); - -require_once( "$IP/maintenance/commandLine.inc" ); - -function evalExtractArray( $php, $varname ) { - eval( $php ); - return @$$varname; -} - -function confExtractArray( $php, $varname ) { - try { - $ce = new ConfEditor("<?php $php"); - $vars = $ce->getVars(); - $retval = @$vars[$varname]; - } catch( Exception $e ) { - print $e . "\n"; - $retval = null; - } - return $retval; -} - -function quickTokenExtractArray( $php, $varname ) { - $reader = new QuickArrayReader("<?php $php"); - return $reader->getVar( $varname ); -} - - -if( count( $args ) ) { - $sources = $args; -} else { - $sources = - array_merge( - glob("$IP/extensions/*/*.i18n.php"), - glob("$IP/languages/messages/Messages*.php") ); -} - -foreach( $sources as $sourceFile ) { - $rel = basename( $sourceFile ); - $out = str_replace( '/', '-', $rel ); - - $sourceData = file_get_contents( $sourceFile ); - - if( preg_match( '!extensions/!', $sourceFile ) ) { - $sourceData = LocalisationUpdate::cleanupExtensionFile( $sourceData ); - $items = 'langs'; - } else { - $sourceData = LocalisationUpdate::cleanupFile( $sourceData ); - $items = 'messages'; - } - - file_put_contents( "$out.txt", $sourceData ); - - $start = microtime(true); - $eval = evalExtractArray( $sourceData, 'messages' ); - $deltaEval = microtime(true) - $start; - - $start = microtime(true); - $quick = quickTokenExtractArray( $sourceData, 'messages' ); - $deltaQuick = microtime(true) - $start; - - $start = microtime(true); - $token = confExtractArray( $sourceData, 'messages' ); - $deltaToken = microtime(true) - $start; - - $hashEval = md5(serialize($eval)); - $hashToken = md5(serialize($token)); - $hashQuick = md5(serialize($quick)); - $countEval = count( (array)$eval); - $countToken = count( (array)$token ); - $countQuick = count( (array)$quick ); - - printf( "%s %s %d $items - %0.1fms - eval\n", $rel, $hashEval, $countEval, $deltaEval * 1000 ); - printf( "%s %s %d $items - %0.1fms - QuickArrayReader\n", $rel, $hashQuick, $countQuick, $deltaQuick * 1000 ); - printf( "%s %s %d $items - %0.1fms - ConfEditor\n", $rel, $hashToken, $countToken, $deltaToken * 1000 ); - - if( $hashEval !== $hashToken || $hashEval !== $hashQuick ) { - echo "FAILED on $rel\n"; - file_put_contents( "$out-eval.txt", var_export( $eval, true ) ); - file_put_contents( "$out-token.txt", var_export( $token, true ) ); - file_put_contents( "$out-quick.txt", var_export( $quick, true ) ); - #die("check eval.txt and token.txt\n"); - } - echo "\n"; -} - -echo "ok\n"; - diff --git a/extensions/Nuke/.gitreview b/extensions/Nuke/.gitreview deleted file mode 100644 index c623aede..00000000 --- a/extensions/Nuke/.gitreview +++ /dev/null @@ -1,5 +0,0 @@ -[gerrit] -host=gerrit.wikimedia.org -port=29418 -project=mediawiki/extensions/Nuke.git -defaultbranch=master diff --git a/extensions/ParserFunctions/.gitreview b/extensions/ParserFunctions/.gitreview deleted file mode 100644 index decb9867..00000000 --- a/extensions/ParserFunctions/.gitreview +++ /dev/null @@ -1,5 +0,0 @@ -[gerrit] -host=gerrit.wikimedia.org -port=29418 -project=mediawiki/extensions/ParserFunctions.git -defaultbranch=master diff --git a/extensions/ParserFunctions/tests/ExpressionTest.php b/extensions/ParserFunctions/tests/ExpressionTest.php deleted file mode 100644 index 169a9cb4..00000000 --- a/extensions/ParserFunctions/tests/ExpressionTest.php +++ /dev/null @@ -1,76 +0,0 @@ -<?php -class ExpressionTest extends MediaWikiTestCase { - - /** - * @var ExprParser - */ - protected $parser; - - protected function setUp() { - parent::setUp(); - $this->parser = new ExprParser(); - } - - /** - * @dataProvider provideExpressions - */ - function testExpression( $input, $expected ) { - $this->assertEquals( - $expected, - $this->parser->doExpression( $input ) - ); - } - - function provideExpressions() { - return array( - array( '1 or 0', '1' ), - array( 'not (1 and 0)', '1' ), - array( 'not 0', '1' ), - array( '4 < 5', '1' ), - array( '-5 < 2', '1' ), - array( '-2 <= -2', '1' ), - array( '4 > 3', '1' ), - array( '4 > -3', '1' ), - array( '5 >= 2', '1' ), - array( '2 >= 2', '1' ), - array( '1 != 2', '1' ), - array( '-4 * -4 = 4 * 4', '1' ), - array( 'not (1 != 1)', '1' ), - array( '1 + 1', '2' ), - array( '-1 + 1', '0' ), - array( '+1 + 1', '2' ), - array( '4 * 4', '16' ), - array( '(1/3) * 3', '1' ), - array( '3 / 1.5', '2' ), - array( '3 / 0.2', '15' ), - array( '3 / ( 2.0 * 0.1 )', '15' ), - array( '3 / ( 2.0 / 10 )', '15' ), - array( '3 / (- 0.2 )', '-15' ), - array( '3 / abs( 0.2 )', '15' ), - array( '3 mod 2', '1' ), - array( '1e4', '10000' ), - array( '1e-2', '0.01' ), - array( '4.0 round 0', '4' ), - array( 'ceil 4', '4' ), - array( 'floor 4', '4' ), - array( '4.5 round 0', '5' ), - array( '4.2 round 0', '4' ), - array( '-4.2 round 0', '-4' ), - array( '-4.5 round 0', '-5' ), - array( '-2.0 round 0', '-2' ), - array( 'ceil -3', '-3' ), - array( 'floor -6.0', '-6' ), - array( 'ceil 4.2', '5' ), - array( 'ceil -4.5', '-4' ), - array( 'floor -4.5', '-5' ), - array( 'abs(-2)', '2' ), - array( 'ln(exp(1))', '1' ), - array( 'trunc(4.5)', '4' ), - array( 'trunc(-4.5)', '-4' ), - array( '123 fmod (2^64-1)', '123' ), - array( '5.7 mod 1.3', '0' ), - array( '5.7 fmod 1.3', '0.5' ), - ); - } -} - diff --git a/extensions/PdfHandler/.gitreview b/extensions/PdfHandler/.gitreview deleted file mode 100644 index f5eca40e..00000000 --- a/extensions/PdfHandler/.gitreview +++ /dev/null @@ -1,5 +0,0 @@ -[gerrit] -host=gerrit.wikimedia.org -port=29418 -project=mediawiki/extensions/PdfHandler.git -defaultbranch=master diff --git a/extensions/Poem/.gitreview b/extensions/Poem/.gitreview deleted file mode 100644 index aac78b2b..00000000 --- a/extensions/Poem/.gitreview +++ /dev/null @@ -1,5 +0,0 @@ -[gerrit] -host=gerrit.wikimedia.org -port=29418 -project=mediawiki/extensions/Poem.git -defaultbranch=master diff --git a/extensions/Renameuser/.gitreview b/extensions/Renameuser/.gitreview deleted file mode 100644 index 0d757141..00000000 --- a/extensions/Renameuser/.gitreview +++ /dev/null @@ -1,5 +0,0 @@ -[gerrit] -host=gerrit.wikimedia.org -port=29418 -project=mediawiki/extensions/Renameuser.git -defaultbranch=master diff --git a/extensions/SimpleAntiSpam/.gitreview b/extensions/SimpleAntiSpam/.gitreview deleted file mode 100644 index 7fdecfa5..00000000 --- a/extensions/SimpleAntiSpam/.gitreview +++ /dev/null @@ -1,5 +0,0 @@ -[gerrit] -host=gerrit.wikimedia.org -port=29418 -project=mediawiki/extensions/SimpleAntiSpam.git -defaultbranch=master diff --git a/extensions/SimpleAntiSpam/SimpleAntiSpam.i18n.php b/extensions/SimpleAntiSpam/SimpleAntiSpam.i18n.php deleted file mode 100644 index 2e92679d..00000000 --- a/extensions/SimpleAntiSpam/SimpleAntiSpam.i18n.php +++ /dev/null @@ -1,997 +0,0 @@ -<?php -/** - * Internationalisation file for extension SimpleAntiSpam. - * - * @file - * @ingroup Extensions - */ - -$messages = array(); - -/** English - * @author Ryan Schmidt - */ -$messages['en'] = array( - 'simpleantispam' => 'Your edit triggered the anti-spam mechanism', - 'simpleantispam-label' => "Anti-spam check. -Do '''NOT''' fill this in!", - 'simpleantispam-desc' => 'Adds a simple spam/bot check to forms', -); - -/** Message documentation (Message documentation) - * @author Purodha - * @author Shirayuki - * @author The Evil IP address - */ -$messages['qqq'] = array( - 'simpleantispam' => 'Unused at this time.', - 'simpleantispam-label' => 'Used as label for the input box in "Edit" page. - -The label and the input box are always hidden.', - 'simpleantispam-desc' => '{{desc|name=Simple Anti Spam|url=http://www.mediawiki.org/wiki/Extension:SimpleAntiSpam}}', -); - -/** Afrikaans (Afrikaans) - * @author Naudefj - */ -$messages['af'] = array( - 'simpleantispam' => 'U wysiging het die anti-spam meganisme geaktiveer', - 'simpleantispam-label' => "Anti-spam kontrole. -'''Moenie''' die veld invul nie!", - 'simpleantispam-desc' => "Voeg 'n eenvoudige spam/robot-kontrole op vorms by", -); - -/** Gheg Albanian (Gegë) - * @author Mdupont - */ -$messages['aln'] = array( - 'simpleantispam' => 'Your redakto shkaktoi mekanizmi anti-spam', - 'simpleantispam-label' => "Anti-spam kontrolloni. A'''''NUK' plotësoni këtë!", - 'simpleantispam-desc' => 'Shton një spam i thjeshtë / kontrolloni bot me format e', -); - -/** Aragonese (aragonés) - * @author Juanpabl - */ -$messages['an'] = array( - 'simpleantispam' => 'Ista edición suya ha activato o mecanismo anti-spam', - 'simpleantispam-label' => "Preba anti-spam. -'''NO''' replene esto!", - 'simpleantispam-desc' => 'Adibe una preba de spam/bot ta os formularios', -); - -/** Arabic (العربية) - * @author Meno25 - */ -$messages['ar'] = array( - 'simpleantispam' => 'تعديلك نشط أداة منع السبام', - 'simpleantispam-label' => "اختبار ضد السبام. -'''لا''' تملأ هذا!", - 'simpleantispam-desc' => 'يضيف اختبار سبام/بوت بسيط للاستمارات', -); - -/** Egyptian Spoken Arabic (مصرى) - * @author Ramsis II - */ -$messages['arz'] = array( - 'simpleantispam' => 'تعديلك نشط خاصية الانتي-سبام', - 'simpleantispam-label' => "اختبار انتي-سبام. -'''ماتعبيش''' دا!", - 'simpleantispam-desc' => 'بيضيف اختبار سبام/بوت بسيط للاستمارات', -); - -/** Assamese (অসমীয়া) - * @author Gitartha.bordoloi - */ -$messages['as'] = array( - 'simpleantispam' => 'আপোনাৰ সম্পাদনাই এণ্টি-স্পাম কৌশল সক্ৰিয় কৰিলে।', - 'simpleantispam-label' => "এণ্টি-স্পাম পৰীক্ষা। -এইখন পূৰণ '''নকৰিব'''!", - 'simpleantispam-desc' => "প্ৰপত্ৰত এটা সৰল স্পাম/ব'ট পৰীক্ষণ যোগ কৰে", -); - -/** Asturian (asturianu) - * @author Esbardu - */ -$messages['ast'] = array( - 'simpleantispam' => "La to edición activó'l mecanismu anti-spam", - 'simpleantispam-label' => "Control anti-spam. -¡'''NUN''' rellenes esto!", - 'simpleantispam-desc' => 'Amiesta al formulariu la comprobación de spam con un bot', -); - -/** Bashkir (башҡортса) - * @author Assele - */ -$messages['ba'] = array( - 'simpleantispam' => 'Һеҙҙең үҙгәртеүегеҙ спамға ҡаршы ҡоролманы тоҡандырҙы', - 'simpleantispam-label' => "Спамға ҡаршы тикшереү. -Быны '''ТУЛТЫРМАҒЫҘ'''!", - 'simpleantispam-desc' => 'Формаларға ябай спамға/ботҡа ҡаршы тикшереү өҫтәй.', -); - -/** Southern Balochi (بلوچی مکرانی) - * @author Mostafadaneshvar - */ -$messages['bcc'] = array( - 'simpleantispam' => 'شمی اصلاح یک ماکانیزم ضد اسپمی بنگیج کت', - 'simpleantispam-label' => "کنترل ضد اسپم. -ای شیء پر ''مکن''", - 'simpleantispam-desc' => 'اضافه کنت یم ساده اسپم/روبوت چک په کنترل فرم آن', -); - -/** Bikol Central (Bikol Central) - * @author Geopoet - */ -$messages['bcl'] = array( - 'simpleantispam' => 'An saimong pagliwat nakapagkiblit kan anti-espam na mekanismo', - 'simpleantispam-label' => 'Narikisa kan anti-espam. -"Dae" ka magkaag nin laman digde!', - 'simpleantispam-desc' => 'Minadugang nin simplihong rikisa kan espam/panalnga sa mga porma', -); - -/** Belarusian (Taraškievica orthography) (беларуская (тарашкевіца)) - * @author EugeneZelenko - */ -$messages['be-tarask'] = array( - 'simpleantispam' => 'Ваша рэдагаваньне ўключыла мэханізм анты-спаму', - 'simpleantispam-label' => "Праверка анты-спаму. -'''НЕ''' запаўняйце тут нічога!", - 'simpleantispam-desc' => 'Дадае ў формы простую праверку на спам/робата', -); - -/** Bulgarian (български) - * @author DCLXVI - * @author Spiritia - */ -$messages['bg'] = array( - 'simpleantispam' => 'Вашата редакция задейства механизма против спам', - 'simpleantispam-label' => "Проверка за спам. -Необходимо е да '''НЕ''' попълвате това поле!", - 'simpleantispam-desc' => 'Добавя прост формуляр за проверка за спам/роботи', -); - -/** Bengali (বাংলা) - * @author Bellayet - */ -$messages['bn'] = array( - 'simpleantispam-label' => "এন্টি-স্প্যাম যাচাই। -এটা পূরণ করবেন '''না'''!", - 'simpleantispam-desc' => 'ফরমগুলো যাচাই করার জন্য একটি স্প্যাম/বট যোগ করুন', -); - -/** Breton (brezhoneg) - * @author Fulup - */ -$messages['br'] = array( - 'simpleantispam' => "Gweredekaet eo bet ar wikefre eneb-strob gant ar c'hemmoù hoc'h eus degaset", - 'simpleantispam-label' => "Taol gwiriañ eneb-strob. -'''Arabat''' merkañ tra pe dra amañ !", - 'simpleantispam-desc' => "Ouzhpennañ a ra taol gwiriañ ur bot strober d'ar furmskridoù", -); - -/** Bosnian (bosanski) - * @author CERminator - */ -$messages['bs'] = array( - 'simpleantispam' => 'Vaša izmjena je uključila mehanizam protiv spama', - 'simpleantispam-label' => "Provjera protiv spama. -'''NE''' popunjavaj ovo!", - 'simpleantispam-desc' => 'Dodaje jednostavnu provjeru od spama/botova u obrasce', -); - -/** Catalan (català) - * @author Jordi Roqué - * @author Paucabot - * @author Ssola - */ -$messages['ca'] = array( - 'simpleantispam' => 'La vostra modificació ha activat un mecanisme anti-spam', - 'simpleantispam-label' => "Comprovació anti-spam. -'''NO''' ho ompliu!", - 'simpleantispam-desc' => 'Inclou un detector simple de spam o bots als formularis', -); - -/** Czech (česky) - * @author Danny B. - */ -$messages['cs'] = array( - 'simpleantispam' => 'Vaše úprava spustila antispamový mechanismus', - 'simpleantispam-label' => "Antispamová kontrola. -'''NEVYPLŇUJTE''' následující!", - 'simpleantispam-desc' => 'Přidává do formulářů jednoduchou kontrolu botů/spamu.', -); - -/** Welsh (Cymraeg) - * @author Lloffiwr - */ -$messages['cy'] = array( - 'simpleantispam' => "Achosodd eich golygiad i'r teclyn gwrth-sbam ddechrau", - 'simpleantispam-label' => "Prawf gwrth-sbam. -'''Peidiwch''' â llenwi hwn!", - 'simpleantispam-desc' => 'Yn ychwanegu prawf sbam/bot syml i ffurflenni', -); - -/** Danish (dansk) - * @author HenrikKbh - */ -$messages['da'] = array( - 'simpleantispam' => 'Din redigering udløste anti-spam mekanismen', - 'simpleantispam-label' => "Anti-spam tjek. -Udfyld ''' ikke ''' dette!", - 'simpleantispam-desc' => 'Tilføjer en simpel spam/bot kontrol til formularer', -); - -/** German (Deutsch) - * @author Kghbln - * @author Raimond Spekking - */ -$messages['de'] = array( - 'simpleantispam' => 'Deine Bearbeitung hat die Spamschutzprüfung ausgelöst.', - 'simpleantispam-label' => "Spamschutzprüfung. -Hier '''NICHTS''' eintragen!", - 'simpleantispam-desc' => 'Ergänzt eine Prüfung zum Schutz vor Spambots', -); - -/** German (formal address) (Deutsch (Sie-Form)) - * @author Kghbln - * @author MichaelFrey - */ -$messages['de-formal'] = array( - 'simpleantispam' => 'Ihre Bearbeitung hat die Spamschutzprüfung ausgelöst.', -); - -/** Zazaki (Zazaki) - * @author Aspar - */ -$messages['diq'] = array( - 'simpleantispam' => 'vuriyayişê şıma mekanizmaya anti-spami herikna', - 'simpleantispam-label' => "tehqiqatê Anti-spami. -no '''de mekerê'''!", - 'simpleantispam-desc' => 'Forman re tehqiqatê spami/bot dano', -); - -/** Lower Sorbian (dolnoserbski) - * @author Michawiki - */ -$messages['dsb'] = array( - 'simpleantispam' => 'Twója změna jo zapušćiła antispamowy mechanizm.', - 'simpleantispam-label' => "Antispamowa kontrola. -How '''NIC''' zapisaś!", - 'simpleantispam-desc' => 'Pśidawa formularam jadnoru antispamowu kontrolu pśez bośik', -); - -/** Greek (Ελληνικά) - * @author Dead3y3 - */ -$messages['el'] = array( - 'simpleantispam' => 'Η επεξεργασία σας ενεργοποίησε τον μηχανισμό anti-spam', - 'simpleantispam-label' => "Έλεγχος anti-spam. -'''ΜΗΝ''' το συμπληρώσετε αυτό!", - 'simpleantispam-desc' => 'Προσθέτει έναν απλό έλεγχο spam/bot σε φόρμες', -); - -/** Esperanto (Esperanto) - * @author Yekrats - */ -$messages['eo'] = array( - 'simpleantispam' => 'Via redakto spronis la kontraŭspamilon.', - 'simpleantispam-label' => 'Kontrolo kontraŭ spamo. -NE ENIGU ion ajn!', - 'simpleantispam-desc' => 'Aldonas simplan kontraŭspamilon/kontraŭrobotilon al paĝoj', -); - -/** Spanish (español) - * @author Crazymadlover - * @author Sanbec - */ -$messages['es'] = array( - 'simpleantispam' => 'Su edición encendió el mecanismo anti-spam', - 'simpleantispam-label' => 'Comprobación anti-spam -¡NO rellenes esto!', - 'simpleantispam-desc' => 'Añade un control simple de spam y bots a los formularios', -); - -/** Estonian (eesti) - * @author Pikne - */ -$messages['et'] = array( - 'simpleantispam' => 'Sinu muudatus päästis valla rämpspostivastase seadeldise.', - 'simpleantispam-label' => "Rämpspostikontroll. -'''ÄRA''' täida seda välja!", - 'simpleantispam-desc' => 'Lisab lihtsa rämpsposti- ja robotikontrolli vormiväljade jaoks.', -); - -/** Basque (euskara) - * @author Kobazulo - */ -$messages['eu'] = array( - 'simpleantispam' => 'Zure aldaketak anti-spam mekanismoa abiarazi du', - 'simpleantispam-label' => "Anti-spam egiaztapena. -Atal hau '''EZ''' bete!", - 'simpleantispam-desc' => 'Spam/bot baten egiaztapen sinple bat eransten du', -); - -/** Persian (فارسی) - * @author Huji - * @author Meisam - */ -$messages['fa'] = array( - 'simpleantispam' => 'ویرایش شما مکانیسم ضدهرزنگاری را فعال کرد', - 'simpleantispam-label' => "بررسی ضدهرزنگاری. -این قسمت را پر '''نکنید'''!", - 'simpleantispam-desc' => 'یک بررسی ساده برای هرزنگاری/ربات به فرمها اضافه میکند', -); - -/** Finnish (suomi) - * @author Jack Phoenix - * @author Nike - */ -$messages['fi'] = array( - 'simpleantispam' => 'Muokkauksesi laukaisi mainostentorjujamekanismin', - 'simpleantispam-label' => "Mainostenvastainen tarkistus. '''ÄLÄ''' täytä tätä!", - 'simpleantispam-desc' => 'Lisää yksinkertaisen mainos- ja bottitarkistuksen lomakkeisiin.', -); - -/** French (français) - * @author Grondin - * @author Verdy p - */ -$messages['fr'] = array( - 'simpleantispam' => 'Votre modification a déclenché le mécanisme anti-spam', - 'simpleantispam-label' => "Vérification anti-spam. -Ne '''RIEN''' inscrire ici !", - 'simpleantispam-desc' => 'Ajoute au formulaire la vérification d’un bot spammeur', -); - -/** Franco-Provençal (arpetan) - * @author ChrisPtDe - */ -$messages['frp'] = array( - 'simpleantispam' => 'Voutron changement at dècllenchiê lo mècanismo anti-spame', - 'simpleantispam-label' => "Contrôlo anti-spame. -Enscrîde '''REN''' ique !", - 'simpleantispam-desc' => 'Apond u formulèro lo contrôlo d’un bot spamor.', -); - -/** Galician (galego) - * @author Toliño - */ -$messages['gl'] = array( - 'simpleantispam' => 'A súa edición activou o mecanismo antispam', - 'simpleantispam-label' => "Comprobación antispam. -'''NON''' encha isto!", - 'simpleantispam-desc' => 'Engade unha verificación simple de spam por parte de bots nos formularios', -); - -/** Swiss German (Alemannisch) - * @author Als-Holder - */ -$messages['gsw'] = array( - 'simpleantispam' => 'Dyyni Bearbeitig het dr Spamschutz usglest.', - 'simpleantispam-label' => "Spamschutz-Priefig. Do '''nyt''' yytrage!", - 'simpleantispam-desc' => 'Ergänzt Formular um e eifache Bot-Spamschutz', -); - -/** Gujarati (ગુજરાતી) - * @author Sushant savla - */ -$messages['gu'] = array( - 'simpleantispam' => 'તમારા ફેરફારને કારણે ઍન્ટી-સ્પૅમ કાર્યપ્રણાલી જાગ્રત થઈ', - 'simpleantispam-label' => "સ્પૅમ વિરોધી તપાસ. -આને '''ન''' ભરશો!", - 'simpleantispam-desc' => 'અરજી પત્ર પર સરળ સ્પૅમ / બૉટ ઉમેરે છે', -); - -/** Hebrew (עברית) - * @author Rotem Liss - */ -$messages['he'] = array( - 'simpleantispam' => 'עריכתכם הפעילה את מנוע האנטי־ספאם', - 'simpleantispam-label' => "בדיקת אנטי־ספאם. -'''אל''' תמלאו שדה זה!", - 'simpleantispam-desc' => 'הוספת בדיקה פשוטה של ספאם/בוט לטפסים', -); - -/** Hindi (हिन्दी) - * @author Kaustubh - */ -$messages['hi'] = array( - 'simpleantispam' => 'आपके बदलावोंसे ऍंटी-स्पॅम मेकेनिझम शुरू हो गया हैं', - 'simpleantispam-label' => "ऍन्टी-स्पैम जाँच. -इसे भरें '''नहीं'''!", - 'simpleantispam-desc' => 'फ़ार्ममें सादी स्पैम/बोट जाँच बढाता हैं', -); - -/** Croatian (hrvatski) - * @author Dalibor Bosits - */ -$messages['hr'] = array( - 'simpleantispam' => 'Vaše uređivanje je pokrenulo anti-spam mehanizam', - 'simpleantispam-label' => "Anti-spam provjera. -'''Ne''' ispunjavajte ovo!", - 'simpleantispam-desc' => 'Dodaje jednostavnu provjeru za spam/bot', -); - -/** Upper Sorbian (hornjoserbsce) - * @author Michawiki - */ -$messages['hsb'] = array( - 'simpleantispam' => 'Twoja změna je mechanizm přećiwo spamej zahibała', - 'simpleantispam-label' => "Kontrola přećiwo spamej. -Tu '''ničo''' njezapisać!", - 'simpleantispam-desc' => 'Přidawa formularam jednoru spamowu kontrolu přez boćik', -); - -/** Hungarian (magyar) - * @author Bdamokos - * @author Dani - * @author Glanthor Reviol - */ -$messages['hu'] = array( - 'simpleantispam' => 'A szerkesztésed egy spamellenes mechanizmust aktivált.', - 'simpleantispam-label' => "Spam elleni ellenőrzés. -'''NE''' töltsd ezt ki!", - 'simpleantispam-desc' => 'Egyszerű spam és bot elleni ellenőrzés hozzáadása űrlapokhoz', -); - -/** Interlingua (interlingua) - * @author McDutchie - */ -$messages['ia'] = array( - 'simpleantispam' => 'Tu modification ha activate le mechanismo antispam', - 'simpleantispam-label' => "Verification antispam. -'''NON''' completa isto!", - 'simpleantispam-desc' => 'Adde un verification antispam/antibot simple al formularios', -); - -/** Indonesian (Bahasa Indonesia) - * @author Rex - */ -$messages['id'] = array( - 'simpleantispam' => 'Suntingan Anda memicu mekanisme anti-spam', - 'simpleantispam-label' => "Pemeriksaan anti-spam. -Masukan ini '''DILARANG'''!", - 'simpleantispam-desc' => 'Tambahkan pemeriksaan spam/bot sederhana ke formulir-formulir', -); - -/** Iloko (Ilokano) - * @author Lam-ang - */ -$messages['ilo'] = array( - 'simpleantispam' => 'Ti inurnos mo ket kinalbit na ti kontra-spam a mekanismo', - 'simpleantispam-label' => "Kontra-spam a panagkita. - '''Saan''' mo a suratan daytoy!", - 'simpleantispam-desc' => 'Agnayon ti nalaka a spam/bot panagkita iti nakabuklan', -); - -/** Icelandic (íslenska) - * @author Snævar - */ -$messages['is'] = array( - 'simpleantispam' => 'Breytingin þín setti af stað kæfuvörn.', - 'simpleantispam-label' => 'Kæfuvörn. -Ekki fylla þetta út!', -); - -/** Italian (italiano) - * @author Darth Kule - */ -$messages['it'] = array( - 'simpleantispam' => 'Il tuo edit ha attivato il meccanismo anti-spam', - 'simpleantispam-label' => "Controllo anti-spam. -'''NON''' riempire!", - 'simpleantispam-desc' => 'Aggiunge un semplice controllo spam/bot ai moduli', -); - -/** Japanese (日本語) - * @author Aotake - * @author Muttley - * @author Shirayuki - */ -$messages['ja'] = array( - 'simpleantispam' => '編集内容が原因でスパム防止機能が発動しました', - 'simpleantispam-label' => "SPAM防止チェックです。 -決してここに値を入力'''しない'''でください。", - 'simpleantispam-desc' => 'フォームに簡単なスパム/ボット チェックを追加', -); - -/** Javanese (Basa Jawa) - * @author Pras - */ -$messages['jv'] = array( - 'simpleantispam' => 'Suntingan panjenengan nggugah mékanisme anti-spam', - 'simpleantispam-label' => "Pamariksan anti-spam. -'''Aja''' diisèkaké!", - 'simpleantispam-desc' => 'Tambahaké pamriksan spam/bot prasaja menyang formulir', -); - -/** Georgian (ქართული) - * @author BRUTE - * @author David1010 - */ -$messages['ka'] = array( - 'simpleantispam' => 'თქვენმა რედაქტირებამ ჩართო ანტი-სპამის მექანიზმი', - 'simpleantispam-label' => "ანტი-სპამის შემოწმება. -'''არ''' შეავსოთ ის!", - 'simpleantispam-desc' => 'ფორმაზე ამატებს სპამისა და ბოტების მარტივ შემოწმებას', -); - -/** Korean (한국어) - * @author Klutzy - * @author Kwj2772 - * @author Yknok29 - * @author 아라 - */ -$messages['ko'] = array( - 'simpleantispam' => '현재 편집이 스팸 방지 장치에 탐지되었습니다', - 'simpleantispam-label' => "스팸 방지 검사입니다. -이것을 입력하지 '''마세요'''!", - 'simpleantispam-desc' => '양식에 간단한 스팸/봇 확인 장치를 추가합니다', -); - -/** Colognian (Ripoarisch) - * @author Purodha - */ -$messages['ksh'] = array( - 'simpleantispam' => 'Deine Änderung hät unsere SPAMschotz op der Plan jeroofe', - 'simpleantispam-label' => 'SPAMschotz — donn hee nix endraare!', - 'simpleantispam-desc' => 'Deit enne ëijfache Schoz jäje Bots un SPAM bëij de Formolare dobëij.', -); - -/** Luxembourgish (Lëtzebuergesch) - * @author Robby - */ -$messages['lb'] = array( - 'simpleantispam' => 'Är Ännerung huet den anti-spam Mekanismus ausgeléist', - 'simpleantispam-label' => "Anti-Spam Kontroll. -Fëllt '''näischt''' hei ënnendrënner aus!", - 'simpleantispam-desc' => 'Setzt eng einfach Spam/Bot Kontroll a Formulairen derbäi', -); - -/** Limburgish (Limburgs) - * @author Matthias - */ -$messages['li'] = array( - 'simpleantispam' => "Oew bewerking heet 't antispammechanisme in werking gesteld", - 'simpleantispam-label' => "Antispemcontrole. -Vol dit veld '''NEET''' in!", - 'simpleantispam-desc' => 'Veug ein einvaawdife spem/botcontrole aan formulere', -); - -/** Lithuanian (lietuvių) - * @author Homo - * @author Matasg - */ -$messages['lt'] = array( - 'simpleantispam' => 'Jūsų redagavimas paleido anti-spam mechanizmą', - 'simpleantispam-label' => "Anti-spam patikra. -'''NE'''pildykite!", - 'simpleantispam-desc' => 'Prideda paprastą reklaminių šiukšlių botą formoms tikrinti', -); - -/** Latvian (latviešu) - * @author Xil - */ -$messages['lv'] = array( - 'simpleantispam' => 'Tevis veiktās izmaiņas ir iedarbināja pretspama mehānismu', - 'simpleantispam-label' => "Pretspama pārbaude. - '''NEAIZPILDĪT!'''", - 'simpleantispam-desc' => 'Pievieno vienkāršu spama/botu pārbaudi veidlapas', -); - -/** Minangkabau (Baso Minangkabau) - * @author Iwan Novirion - */ -$messages['min'] = array( - 'simpleantispam' => 'Suntiangan Sanak mamicu mekanisme anti-spam', - 'simpleantispam-label' => "Pamarisoan anti-spam. -Masukan ko '''DILARANG'''!", - 'simpleantispam-desc' => 'Tambahkan pamarisoan spam/bot sadarano ka formulir', -); - -/** Macedonian (македонски) - * @author Bjankuloski06 - */ -$messages['mk'] = array( - 'simpleantispam' => 'Вашето уредување го предизвика анти-спам механизмот', - 'simpleantispam-label' => "Антиспам проверка. -'''НЕ''' го пополнувајте ова!", - 'simpleantispam-desc' => 'Додава едноставна проверка за спам/ботови на обрасците', -); - -/** Malayalam (മലയാളം) - * @author Praveenp - */ -$messages['ml'] = array( - 'simpleantispam' => 'താങ്കളുടെ തിരുത്തൽ സ്പാം വിരുദ്ധ തന്ത്രത്തെ ഉണർത്തിയിരിക്കുന്നു', - 'simpleantispam-label' => "സ്പാം വിരുദ്ധ പരിശോധന. -ഇത് '''പൂരിപ്പിക്കരുത്'''", - 'simpleantispam-desc' => 'ഫോമുകൾക്കായുള്ള ലളിതമായ പാഴെഴുത്ത്/ബോട്ട് പരിശോധന കൂട്ടിച്ചേർക്കുന്നു', -); - -/** Marathi (मराठी) - * @author Kaustubh - */ -$messages['mr'] = array( - 'simpleantispam' => 'तुमच्या संपादनामुळे चिखलणी विरोधक चाळणी सुरु झालेली आहे', - 'simpleantispam-label' => "चिखलणी विरोधक तपासणी. -हे भरू '''नका'''!", - 'simpleantispam-desc' => 'अर्जांमध्ये एक साधी स्पॅम/सांगकाम्या तपासणी वाढवितो', -); - -/** Malay (Bahasa Melayu) - * @author Aviator - */ -$messages['ms'] = array( - 'simpleantispam' => 'Suntingan anda ditahan oleh pemeriksa anti-spam', - 'simpleantispam-label' => "Pemeriksaan anti-spam. '''JANGAN''' isi ruangan ini!", - 'simpleantispam-desc' => 'Menambah pemeriksaan spam/bot ringkas di borang sunting', -); - -/** Norwegian Bokmål (norsk bokmål) - */ -$messages['nb'] = array( - 'simpleantispam' => 'Redigeringen din utløste antispammekanismen', - 'simpleantispam-label' => "Antispamsjekk. -'''IKKE''' fyll inn dette feltet!", - 'simpleantispam-desc' => 'Legger til en enkel spam-/robot-sjekk på skjemaer', -); - -/** Low German (Plattdüütsch) - * @author Slomox - */ -$messages['nds'] = array( - 'simpleantispam' => 'Dien Ännern hett den Spamschutz utlööst.', - 'simpleantispam-label' => "Antispam-Kuntrull. Hier '''nix''' indragen!", - 'simpleantispam-desc' => 'Föögt en eenfachen Bot-Spamschutz to Formularen to', -); - -/** Dutch (Nederlands) - * @author Siebrand - */ -$messages['nl'] = array( - 'simpleantispam' => 'Uw bewerking heeft het antispammechanisme in werking gesteld', - 'simpleantispam-label' => "Antispamcontrole. -Vul dit veld '''NIET''' in!", - 'simpleantispam-desc' => 'Voegt een eenvoudige spam/botcontrole toe aan formuleren', -); - -/** Nederlands (informeel) (Nederlands (informeel)) - * @author Siebrand - */ -$messages['nl-informal'] = array( - 'simpleantispam' => 'Je bewerking heeft het antispammechanisme in werking gesteld', -); - -/** Norwegian Nynorsk (norsk nynorsk) - * @author Harald Khan - * @author Njardarlogar - */ -$messages['nn'] = array( - 'simpleantispam' => 'Endringa di utløyste antispam-mekanismen.', - 'simpleantispam-label' => "Antispam-kontroll. -'''IKKJE''' fyll ut dette feltet!", - 'simpleantispam-desc' => 'Legg til ein enkel spam-/robotsjekk på skjema', -); - -/** Occitan (occitan) - * @author Cedric31 - */ -$messages['oc'] = array( - 'simpleantispam' => 'Vòstre cambiament a desenclavat lo mecanisme antispam', - 'simpleantispam-label' => "Verificacion antispam. -Inscrigatz '''PAS RES''' dedins !", - 'simpleantispam-desc' => 'Apond al formulari la verificacion d’un bòt tarabastejaire', -); - -/** Oriya (ଓଡ଼ିଆ) - * @author Psubhashish - */ -$messages['or'] = array( - 'simpleantispam' => 'ଆପଣଙ୍କ ସମ୍ପାଦନ ସ୍ପାମ-ବିରୋଧି ତନ୍ତ୍ରକୁ ସଚଳ କରିଦେଲା', - 'simpleantispam-label' => "ସ୍ପାମ-ବିରୋଧି ପରଖ । -ଏହାକୁ ଭରନ୍ତୁ '''ନାହିଁ''' !", - 'simpleantispam-desc' => 'ଏକ ସରଳ ସ୍ପାମ/ଆପେଆପେ ଚାଳିତ ସଭ୍ୟ ଦେଇ ଫର୍ମ ପରଖିବେ', -); - -/** Polish (polski) - * @author Sp5uhe - */ -$messages['pl'] = array( - 'simpleantispam' => 'Twoja edycja zostanie sprawdzona mechanizmem antyspamowym', - 'simpleantispam-label' => "Filtr antyspamowy. -'''NIE''' wpisuj tu nic!", - 'simpleantispam-desc' => 'Dodaje do formularzy proste zabezpieczenie przed spamem i automatami', -); - -/** Piedmontese (Piemontèis) - * @author Dragonòt - */ -$messages['pms'] = array( - 'simpleantispam' => "Toa modìfica a l'ha ativà ël mecànism anti-spam", - 'simpleantispam-label' => "Control anti-spam. -Vemp '''PA''' sòn-sì!", - 'simpleantispam-desc' => 'A gionta un sempi control spam/bot a le forme', -); - -/** Western Punjabi (پنجابی) - * @author Khalid Mahmood - */ -$messages['pnb'] = array( - 'simpleantispam' => 'تھواڈی تبدیلی نیں سپام روک پربندھ چلادتا اے', - 'simpleantispam-label' => 'سپام روک پھاٹک -ایدے تے ناں لکھو۔', - 'simpleantispam-desc' => 'اک سادہ سپام/بوٹ روک رلاؤ۔', -); - -/** Portuguese (português) - * @author 555 - */ -$messages['pt'] = array( - 'simpleantispam' => 'A sua edição activou o mecanismo anti-spam', - 'simpleantispam-label' => "Verificação de spam -'''NÃO''' preencha isto!", - 'simpleantispam-desc' => 'Adiciona em formulários um verificador de spam simples', -); - -/** Brazilian Portuguese (português do Brasil) - * @author Eduardo.mps - */ -$messages['pt-br'] = array( - 'simpleantispam' => 'A sua edição ativou o mecanismo anti-spam', - 'simpleantispam-label' => "Verificação de spam -'''NÃO''' preencha isto!", - 'simpleantispam-desc' => 'Adiciona um verificador simples de spam/robôs em formulários', -); - -/** Romanian (română) - * @author Stelistcristi - */ -$messages['ro'] = array( - 'simpleantispam' => 'Editarea dvs a declanșat mecanismul antispam', - 'simpleantispam-label' => "Verificare antispam. -'''NU''' completați !", -); - -/** tarandíne (tarandíne) - * @author Joetaras - */ -$messages['roa-tara'] = array( - 'simpleantispam' => "Le cangiaminde tune sonde tracciate da 'nu meccanisme andi-spam", - 'simpleantispam-label' => "Verifiche andi-spam. -'''NO''' anghiè quiste!", - 'simpleantispam-desc' => "Aggiunge 'na verifiche semblice de spam/bot jndr'à le module", -); - -/** Russian (русский) - * @author Александр Сигачёв - */ -$messages['ru'] = array( - 'simpleantispam' => 'Ваша правка включила механизм анти-спама', - 'simpleantispam-label' => 'Анти-спам проверка. -НЕ заполняйте это!', - 'simpleantispam-desc' => 'Добавляет на форму простую проверку на спам и ботов', -); - -/** Rusyn (русиньскый) - * @author Gazeb - */ -$messages['rue'] = array( - 'simpleantispam' => 'Ваша управа спустила антіспамовый механізм', - 'simpleantispam-label' => "Перевірка на спам. -'''НЕ''' заповнюйте тото!", - 'simpleantispam-desc' => 'Придасть до формуларїв просте овірїня ботів/спаму', -); - -/** Sanskrit (संस्कृतम्) - * @author Shubha - */ -$messages['sa'] = array( - 'simpleantispam' => 'भवतः सम्पादनेन एण्टि-स्पाम्-तन्त्रं सक्रियं जातम्', - 'simpleantispam-label' => "अनिष्टसन्देशविरोधपरीक्षणम् । -अस्मिन् '''नहि''' पूर्यताम् !", - 'simpleantispam-desc' => 'प्रपत्रे सरलानिष्टसन्देशः / बाट्-परीक्षणं योज्यते', -); - -/** Sakha (саха тыла) - * @author HalanTul - */ -$messages['sah'] = array( - 'simpleantispam' => 'Эн көннөрүүҥ анти-спамы холбоото', - 'simpleantispam-label' => "Анти-спам бэрэбиэркэтэ. -Маны '''толорумаҥ'''!", - 'simpleantispam-desc' => 'Спам уонна робот туттулларын билэр судургу бэрэбиэркэни эбэр', -); - -/** Sinhala (සිංහල) - * @author Budhajeewa - */ -$messages['si'] = array( - 'simpleantispam' => 'ඔබේ සංස්කරණය ප්රති-ස්පෑම ක්රියා පිළිවෙල සක්රීය කළේය', - 'simpleantispam-label' => "ප්රති-ස්පෑම පරීක්ෂාව. -කරුණාකර මෙය පුරවන්න '''එපා'''!", - 'simpleantispam-desc' => 'ෆෝරමයන් වෙත සරල ස්පෑම/බොට් පරීක්ෂාවක් එක් කරයි', -); - -/** Slovak (slovenčina) - * @author Helix84 - */ -$messages['sk'] = array( - 'simpleantispam' => 'Vaša úprava spustila antispamový mechanizmus', - 'simpleantispam-label' => "Antispamová kontrola. -'''NEVYPĹŇAJTE''' nasledovné!", - 'simpleantispam-desc' => 'Pridáva k formulárom jednoduchú ochranu prosti botom/spamu.', -); - -/** Slovenian (slovenščina) - * @author Dbc334 - */ -$messages['sl'] = array( - 'simpleantispam' => 'Vaše urejanje je sprožilo mehanizem proti smetju', - 'simpleantispam-label' => "Preverjanje proti smetju. -'''NE''' izpolnite tega!", - 'simpleantispam-desc' => 'Doda preprosto preverjanje smetja/botov v obrazce', -); - -/** Albanian (shqip) - * @author Olsi - */ -$messages['sq'] = array( - 'simpleantispam' => 'Redaktimi juaj shkaktoi mekanizmin anti-spam', - 'simpleantispam-label' => "Kontroll anti-spam. -'''MOS''' e plotësoni këtë!", - 'simpleantispam-desc' => 'Shton një kontroll spam/bot të thjeshtë tek format', -); - -/** Serbian (Cyrillic script) (српски (ћирилица)) - * @author Millosh - */ -$messages['sr-ec'] = array( - 'simpleantispam' => 'Твоја измена је покренула антиспам механизам.', - 'simpleantispam-label' => "Провера спама. '''НЕ''' попуњавај ово унутра!", - 'simpleantispam-desc' => 'Додаје једноставну спам/бот проверу у форме.', -); - -/** Serbian (Latin script) (srpski (latinica)) - * @author Michaello - */ -$messages['sr-el'] = array( - 'simpleantispam' => 'Tvoja izmena je pokrenula antispam mehanizam.', - 'simpleantispam-label' => "Provera spama. '''NE''' popunjavaj ovo unutra!", - 'simpleantispam-desc' => 'Dodaje jednostavnu spam/bot proveru u forme.', -); - -/** Seeltersk (Seeltersk) - * @author Pyt - */ -$messages['stq'] = array( - 'simpleantispam' => 'Dien Beoarbaidenge häd dän Spamskuts uutlöösd.', - 'simpleantispam-label' => "Spamskuts-Wröige. Hier '''niks''' iendreege!", - 'simpleantispam-desc' => 'Föiget do Formulare n eenfachen Bot-Spamskuts bietou', -); - -/** Swedish (svenska) - * @author M.M.S. - * @author Skalman - */ -$messages['sv'] = array( - 'simpleantispam' => 'Din redigering utlöste anti-spam mekanismen', - 'simpleantispam-label' => "Anti-spam koll. -Fyll '''INTE''' i det här!", - 'simpleantispam-desc' => 'Lägger till en enkel spam-/robot-koll till formulär', -); - -/** Tamil (தமிழ்) - * @author மதனாஹரன் - */ -$messages['ta'] = array( - 'simpleantispam-desc' => 'படிவங்களில் ஓர் எளிய எரித/தானியங்கிச் சரிபார்ப்பை இணைக்கும்', -); - -/** Turkmen (Türkmençe) - * @author Hanberke - */ -$messages['tk'] = array( - 'simpleantispam' => 'Özgerdişiňiz anti-spam mehanizmini işletdi', - 'simpleantispam-label' => "Anti-spam barlagy. -Muny '''DOLDURMAŇ'''!", - 'simpleantispam-desc' => 'Formlara ýönekeý spam/bot barlagyny goşýar', -); - -/** Tagalog (Tagalog) - * @author AnakngAraw - */ -$messages['tl'] = array( - 'simpleantispam' => "Nakapagpagalaw sa mekanismong panlaban ng \"manlulusob\" (''spam'') ang pagbabagong ginawa mo", - 'simpleantispam-label' => "Pagsusuring panlaban sa \"manlulusob\" (''spam''). -'''HUWAG''' itong lagyan ng laman!", - 'simpleantispam-desc' => "Nagdaragdag ng isang payak na pansuri ng \"manlulusob\" (''spam'') o ''bot'' sa mga pormularyo", -); - -/** Turkish (Türkçe) - * @author Joseph - */ -$messages['tr'] = array( - 'simpleantispam' => 'Değişikliğiniz anti-spam mekanizmasını harekete geçirdi', - 'simpleantispam-label' => "Anti-spam denetimi. -Bunu '''doldurmayın'''!", - 'simpleantispam-desc' => 'Formlara basit bir spam/bot denetimi ekler', -); - -/** Ukrainian (українська) - * @author AS - */ -$messages['uk'] = array( - 'simpleantispam' => 'Ваше редагування запустило механізм захисту перед спамом', - 'simpleantispam-label' => "Перевірка на спам. -'''НЕ''' заповнюйте це!", - 'simpleantispam-desc' => 'Додає на форму простий механізм перевірки на спам/бота', -); - -/** Urdu (اردو) - * @author පසිඳු කාවින්ද - */ -$messages['ur'] = array( - 'simpleantispam-desc' => 'فارم کے لئے ایک سادہ سپیم/بیوٹی چیک کہتے ہیں', -); - -/** vèneto (vèneto) - * @author Candalua - */ -$messages['vec'] = array( - 'simpleantispam' => 'La to modifica la ga fato scatar el mecanismo de controlo anti spam.', - 'simpleantispam-label' => "Controlo anti spam. -'''NO STA''' scrivar gnente qua de soto!", - 'simpleantispam-desc' => 'Zonta ai moduli un senplice controlo de spam/bot.', -); - -/** Vietnamese (Tiếng Việt) - * @author Vinhtantran - */ -$messages['vi'] = array( - 'simpleantispam' => 'Sửa đổi của bạn đã kích hoạt cơ chế chống spam', - 'simpleantispam-label' => "Kiểm tra chống spam. -Xin '''ĐỪNG''' điền gì vào!", - 'simpleantispam-desc' => 'Thêm một kiểm tra spam/bot vào mẫu', -); - -/** Volapük (Volapük) - * @author Smeira - */ -$messages['vo'] = array( - 'simpleantispam' => 'Redakam olik ekodon blokami fa sul taspamik', -); - -/** Cantonese (粵語) - * @author Shinjiman - */ -$messages['yue'] = array( - 'simpleantispam' => '你嘅編輯已經觸發咗防垃圾裝置', - 'simpleantispam-label' => "反垃圾檢查。 -'''唔好'''加入呢個!", - 'simpleantispam-desc' => '加一個簡單嘅垃圾/機械人檢查表格', -); - -/** Simplified Chinese (中文(简体)) - * @author Hzy980512 - * @author PhiLiP - * @author Shinjiman - */ -$messages['zh-hans'] = array( - 'simpleantispam' => '您的编辑已经触发了反垃圾装置', - 'simpleantispam-label' => "反垃圾检查。 -'''不要'''加入这个!", - 'simpleantispam-desc' => '对表格添加一个简单的垃圾邮件或自动程序检查机制', -); - -/** Traditional Chinese (中文(繁體)) - * @author Mark85296341 - * @author Shinjiman - */ -$messages['zh-hant'] = array( - 'simpleantispam' => '您的編輯已經觸發了防垃圾裝置', - 'simpleantispam-label' => "反垃圾檢查。 -'''不要'''加入這個!", - 'simpleantispam-desc' => '加一個簡單的垃圾/機器人檢查表格', -); diff --git a/extensions/SimpleAntiSpam/SimpleAntiSpam.php b/extensions/SimpleAntiSpam/SimpleAntiSpam.php deleted file mode 100644 index 82fff7bc..00000000 --- a/extensions/SimpleAntiSpam/SimpleAntiSpam.php +++ /dev/null @@ -1,69 +0,0 @@ -<?php -/** - * SimpleSpam extension by Ryan Schmidt - * Adds a simple spam/bot check to forms - * Does not affect real users in any way/shape/form - */ - -if ( !defined( 'MEDIAWIKI' ) ) { - echo <<<EOM - This is an extension to the MediaWiki software and cannot be used standalone.\n - To install this on the wiki, add the following line to LocalSettings.php:\n - <tt>require_once( "\$IP/extensions/SimpleAntiSpam/SimpleAntiSpam.php" );</tt>\n - To verify the installation, browse to the Special:Version page on your wiki.\n -EOM; - die( 1 ); -} - -$wgExtensionCredits['antispam'][] = array( - 'path' => __FILE__, - 'name' => 'SimpleAntiSpam', - 'descriptionmsg' => 'simpleantispam-desc', - 'author' => 'Ryan Schmidt', - 'url' => 'https://www.mediawiki.org/wiki/Extension:SimpleAntiSpam', - 'version' => '1.1.0', -); - -$wgExtensionMessagesFiles['SimpleAntiSpam'] = __DIR__ . '/SimpleAntiSpam.i18n.php'; -$wgHooks['EditPage::showEditForm:fields'][] = 'efSimpleAntiSpamField'; -$wgHooks['EditPage::attemptSave'][] = 'efSimpleAntiSpamCheck'; - -/** - * Add the form field - * @param $editpage EditPage - * @param $out OutputPage - * @return bool - */ -function efSimpleAntiSpamField( &$editpage, &$out ) { - $out->addHTML( "<div id=\"antispam-container\" style=\"display: none;\"> -<label for=\"wpAntispam\">" - . wfMessage( 'simpleantispam-label' )->parse() - . "</label> <input type=\"text\" name=\"wpAntispam\" id=\"wpAntispam\" value=\"\" /> -</div>\n" ); - return true; -} - -/** - * Check for the field and if it isn't empty, negate the save - * - * @param $editpage EditPage - * @return bool - */ -function efSimpleAntiSpamCheck( $editpage ) { - global $wgRequest, $wgUser; - $spam = $wgRequest->getText( 'wpAntispam' ); - if ( $spam !== '' ) { - wfDebugLog( - 'SimpleAntiSpam', - $wgUser->getName() . - ' editing "' . - $editpage->mTitle->getPrefixedText() . - '" submitted bogus field "' . - $spam . - '"' - ); - $editpage->spamPageWithContent(); - return false; - } - return true; -} diff --git a/extensions/SpamBlacklist/.gitreview b/extensions/SpamBlacklist/.gitreview deleted file mode 100644 index d74ae8f9..00000000 --- a/extensions/SpamBlacklist/.gitreview +++ /dev/null @@ -1,5 +0,0 @@ -[gerrit] -host=gerrit.wikimedia.org -port=29418 -project=mediawiki/extensions/SpamBlacklist.git -defaultbranch=master diff --git a/extensions/SyntaxHighlight_GeSHi/.gitreview b/extensions/SyntaxHighlight_GeSHi/.gitreview deleted file mode 100644 index cb9e4b44..00000000 --- a/extensions/SyntaxHighlight_GeSHi/.gitreview +++ /dev/null @@ -1,5 +0,0 @@ -[gerrit] -host=gerrit.wikimedia.org -port=29418 -project=mediawiki/extensions/SyntaxHighlight_GeSHi.git -defaultbranch=master diff --git a/extensions/TitleBlacklist/.gitreview b/extensions/TitleBlacklist/.gitreview deleted file mode 100644 index 964229c3..00000000 --- a/extensions/TitleBlacklist/.gitreview +++ /dev/null @@ -1,5 +0,0 @@ -[gerrit] -host=gerrit.wikimedia.org -port=29418 -project=mediawiki/extensions/TitleBlacklist.git -defaultbranch=master diff --git a/extensions/TitleBlacklist/tests/ApiQueryTitleBlacklistTest.php b/extensions/TitleBlacklist/tests/ApiQueryTitleBlacklistTest.php deleted file mode 100644 index 1f8164e7..00000000 --- a/extensions/TitleBlacklist/tests/ApiQueryTitleBlacklistTest.php +++ /dev/null @@ -1,110 +0,0 @@ -<?php -/** - * Test the TitleBlacklist API. - * - * This wants to run with phpunit.php, like so: - * cd $IP/tests/phpunit - * php phpunit.php ../../extensions/TitleBlacklist/tests/ApiQueryTitleBlacklistTest.php - * - * The blacklist file is `testSource` and shared by all tests. - * - * Ian Baker <ian@wikimedia.org> - */ - -ini_set( 'include_path', ini_get( 'include_path' ) . ':' . __DIR__ . '/../../../tests/phpunit/includes/api' ); - -/** - * @group medium - **/ -class ApiQueryTitleBlacklistTest extends ApiTestCase { - - function setUp() { - global $wgTitleBlacklistSources; - parent::setUp(); - $this->doLogin(); - - $wgTitleBlacklistSources = array( - array( - 'type' => TBLSRC_FILE, - 'src' => __DIR__ . '/testSource', - ), - ); - } - - /** - * Verify we allow a title which is not blacklisted - */ - function testCheckingUnlistedTitle() { - $unlisted = $this->doApiRequest( array( - 'action' => 'titleblacklist', - // evil_acc is blacklisted as <newaccountonly> - 'tbtitle' => 'evil_acc', - 'tbaction' => 'create', - 'tbnooverride' => true, - ) ); - - $this->assertEquals( - 'ok', - $unlisted[0]['titleblacklist']['result'], - 'Not blacklisted title returns ok' - ); - } - - /** - * Verify tboverride works - */ - function testTboverride() { - global $wgGroupPermissions; - - // Allow all users to override the titleblacklist - $wgGroupPermissions['*']['tboverride'] = true; - - $unlisted = $this->doApiRequest( array( - 'action' => 'titleblacklist', - 'tbtitle' => 'bar', - 'tbaction' => 'create', - ) ); - - $this->assertEquals( - 'ok', - $unlisted[0]['titleblacklist']['result'], - 'Blacklisted title returns ok if the user is allowd to tboverride' - ); - } - - /** - * Verify a blacklisted title gives out an error. - */ - function testCheckingBlackListedTitle() { - $listed = $this->doApiRequest( array( - 'action' => 'titleblacklist', - 'tbtitle' => 'bar', - 'tbaction' => 'create', - 'tbnooverride' => true, - ) ); - - $this->assertEquals( - 'blacklisted', - $listed[0]['titleblacklist']['result'], - 'Listed title returns error' - ); - $this->assertEquals( - "The title \"bar\" has been banned from creation.\nIt matches the following blacklist entry: <code>[Bb]ar #example blacklist entry</code>", - $listed[0]['titleblacklist']['reason'], - 'Listed title error text is as expected' - ); - - $this->assertEquals( - "titleblacklist-forbidden-edit", - $listed[0]['titleblacklist']['message'], - 'Correct blacklist message name is returned' - ); - - $this->assertEquals( - "[Bb]ar #example blacklist entry", - $listed[0]['titleblacklist']['line'], - 'Correct blacklist line is returned' - ); - - } -} diff --git a/extensions/TitleBlacklist/tests/testSource b/extensions/TitleBlacklist/tests/testSource deleted file mode 100644 index f73d9dd7..00000000 --- a/extensions/TitleBlacklist/tests/testSource +++ /dev/null @@ -1,4 +0,0 @@ -[Bb]ar #example blacklist entry -.*[Ff]ail.* -.*[Nn]yancat.* <errmsg=blacklisted-nyancat> -.*evil_acc.* <newaccountonly> diff --git a/extensions/WikiEditor/.gitreview b/extensions/WikiEditor/.gitreview deleted file mode 100644 index 622413f0..00000000 --- a/extensions/WikiEditor/.gitreview +++ /dev/null @@ -1,6 +0,0 @@ -[gerrit] -host=gerrit.wikimedia.org -port=29418 -project=mediawiki/extensions/WikiEditor.git -defaultbranch=master -defaultrebase=0 diff --git a/extensions/WikiEditor/.jshintignore b/extensions/WikiEditor/.jshintignore deleted file mode 100644 index 66a218b5..00000000 --- a/extensions/WikiEditor/.jshintignore +++ /dev/null @@ -1,2 +0,0 @@ -# upstream lib from Google -modules/contentCollector.js diff --git a/extensions/WikiEditor/.jshintrc b/extensions/WikiEditor/.jshintrc deleted file mode 100644 index 64cd5087..00000000 --- a/extensions/WikiEditor/.jshintrc +++ /dev/null @@ -1,9 +0,0 @@ -{ - "predef": [ - "mediaWiki", - "jQuery" - ], - "browser": true, - "smarttabs": true, - "multistr": true -} diff --git a/extensions/WikiEditor/tests/selenium/WikiDialogs_Links.php b/extensions/WikiEditor/tests/selenium/WikiDialogs_Links.php deleted file mode 100644 index 7153f49f..00000000 --- a/extensions/WikiEditor/tests/selenium/WikiDialogs_Links.php +++ /dev/null @@ -1,67 +0,0 @@ -<?php -require_once 'WikiDialogs_Links_Setup.php'; -/** - * Description of WikiNewPageDialogs - * - * @author bhagyag, pdhanda - * - * This test case is part of the WikiEditorTestSuite. - * Configuration for these tests are dosumented as part of extensions/WikiEditor/tests/selenium/WikiEditorTestSuite.php - * - */ -class WikiDialogs_Links extends WikiDialogs_Links_Setup { - // Set up the testing environment - function setup() { - parent::setUp(); - parent::doCreateInternalTestPageIfMissing(); - } - - function tearDown() { - parent::doLogout(); - parent::tearDown(); - } - - // Create a new page temporary - function createNewPage() { - parent::doOpenLink(); - parent::login(); - parent::doCreateNewPageTemporary(); - } - - // Add a internal link and verify - function testInternalLink() { - $this->createNewPage(); - parent::verifyInternalLink(); - } - - // Add a internal link with different display text and verify - function testInternalLinkWithDisplayText() { - $this->createNewPage(); - parent::verifyInternalLinkWithDisplayText(); - } - - // Add a internal link with blank display text and verify - function testInternalLinkWithBlankDisplayText() { - $this->createNewPage(); - parent::verifyInternalLinkWithBlankDisplayText(); - } - - // Add external link and verify - function testExternalLink() { - $this->createNewPage(); - parent::verifyExternalLink(); - } - - // Add external link with different display text and verify - function testExternalLinkWithDisplayText( ) { - $this->createNewPage(); - parent::verifyExternalLinkWithDisplayText(); - } - - // Add external link with Blank display text and verify - function testExternalLinkWithBlankDisplayText() { - $this->createNewPage(); - parent::verifyExternalLinkWithBlankDisplayText(); - } - -} diff --git a/extensions/WikiEditor/tests/selenium/WikiDialogs_Links_Setup.php b/extensions/WikiEditor/tests/selenium/WikiDialogs_Links_Setup.php deleted file mode 100644 index 352ebec0..00000000 --- a/extensions/WikiEditor/tests/selenium/WikiDialogs_Links_Setup.php +++ /dev/null @@ -1,295 +0,0 @@ -<?php -include( "WikiEditorConstants.php" ); -/** - * This test case will be handling the Wiki Tool bar Dialog functions - * Date : Apr - 2010 - * @author : BhagyaG - Calcey - */ -class WikiDialogs_Links_Setup extends SeleniumTestCase { - - // Open the page. - function doOpenLink() { - $this->open( $this->getUrl() . '/index.php' ); - $this->waitForPageToLoad( WIKI_TEST_WAIT_TIME ); - } - - // Expand advance tool bar section if its not - function doExpandAdvanceSection() { - if ( !$this->isTextPresent( TEXT_HEADING ) ) { - $this->click( LINK_ADVANCED ); - } - } - - // Log out from the application - function doLogout() { - $this->open( $this->getUrl() . '/index.php' ); - if ( $this->isTextPresent( TEXT_LOGOUT ) ) { - $this->click( LINK_LOGOUT ); - $this->waitForPageToLoad( WIKI_TEST_WAIT_TIME ); - $this->assertEquals( TEXT_LOGOUT_CONFIRM, $this->getText( LINK_LOGIN ) ); - $this->open( $this->getUrl() . '/index.php' ); - $this->waitForPageToLoad( WIKI_TEST_WAIT_TIME ); - } - } - - // Create a temporary fixture page - function doCreateInternalTestPageIfMissing() { - $this->type( INPUT_SEARCH_BOX, WIKI_INTERNAL_LINK ); - $this->click( BUTTON_SEARCH ); - $this->waitForPageToLoad( WIKI_TEST_WAIT_TIME ); - $this->click( LINK_START . WIKI_INTERNAL_LINK ); - $this->waitForPageToLoad( WIKI_TEST_WAIT_TIME ); - $location = $this->getLocation() . "\n"; - if ( strpos( $location, '&redlink=1' ) !== false ) { - $this->type( TEXT_EDITOR, "Test fixture page. No real content here" ); - $this->click( BUTTON_SAVE_WATCH ); - $this->waitForPageToLoad( WIKI_TEST_WAIT_TIME ); - $this->assertTrue( $this->isTextPresent( WIKI_INTERNAL_LINK ), - $this->getText( TEXT_PAGE_HEADING ) ); - } - } - - // Create a temporary new page - function doCreateNewPageTemporary() { - $this->type( INPUT_SEARCH_BOX, WIKI_TEMP_NEWPAGE ); - $this->click( BUTTON_SEARCH ); - $this->waitForPageToLoad( WIKI_TEST_WAIT_TIME ); - $this->click( LINK_START . WIKI_TEMP_NEWPAGE ); - $this->waitForPageToLoad( WIKI_TEST_WAIT_TIME ); - } - - // Add a internal link and verify - function verifyInternalLink() { - $this->type( TEXT_EDITOR, "" ); - $this->click( LINK_ADDLINK ); - $this->waitForPopup( 'addLink', WIKI_TEST_WAIT_TIME ); - $this->type( TEXT_LINKNAME, ( WIKI_INTERNAL_LINK ) ); - $this->assertTrue( $this->isElementPresent( ICON_PAGEEXISTS ), 'Element ' . ICON_PAGEEXISTS . 'Not found' ); - $this->assertEquals( "on", $this->getValue( OPT_INTERNAL ) ); - $this->click( BUTTON_INSERTLINK ); - $this->click( LINK_PREVIEW ); - $this->waitForPageToLoad( WIKI_TEST_WAIT_TIME ); - $this->assertEquals( ( WIKI_INTERNAL_LINK ), $this->getText( LINK_START . WIKI_INTERNAL_LINK ) ); - $this->click( LINK_START . WIKI_INTERNAL_LINK ); - $this->waitForPageToLoad( WIKI_TEST_WAIT_TIME ); - $this->assertTrue( $this->isTextPresent( WIKI_INTERNAL_LINK ), $this->getText( TEXT_PAGE_HEADING ) ); - } - - // Add a internal link with different display text and verify - function verifyInternalLinkWithDisplayText() { - $this->type( TEXT_EDITOR, "" ); - $this->click( LINK_ADDLINK ); - $this->waitForPopup( 'addLink', WIKI_TEST_WAIT_TIME ); - $this->type( TEXT_LINKNAME, WIKI_INTERNAL_LINK ); - $this->type ( TEXT_LINKDISPLAYNAME, WIKI_INTERNAL_LINK . TEXT_LINKDISPLAYNAME_APPENDTEXT ); - $this->assertTrue( $this->isElementPresent( ICON_PAGEEXISTS ) ); - $this->assertEquals( "on", $this->getValue( OPT_INTERNAL ) ); - $this->click( BUTTON_INSERTLINK ); - $this->click( LINK_PREVIEW ); - $this->waitForPageToLoad( WIKI_TEST_WAIT_TIME ); - $this->assertEquals( WIKI_INTERNAL_LINK . TEXT_LINKDISPLAYNAME_APPENDTEXT, - $this->getText( LINK_START . WIKI_INTERNAL_LINK . TEXT_LINKDISPLAYNAME_APPENDTEXT ) ); - $this->click( LINK_START . WIKI_INTERNAL_LINK . TEXT_LINKDISPLAYNAME_APPENDTEXT ); - $this->waitForPageToLoad( WIKI_TEST_WAIT_TIME ); - $this->assertTrue( $this->isTextPresent( WIKI_INTERNAL_LINK ), $this->getText( TEXT_PAGE_HEADING ) ); - - } - - // Add a internal link with blank display text and verify - function verifyInternalLinkWithBlankDisplayText() { - $this->type( TEXT_EDITOR, "" ); - $this->click( LINK_ADDLINK ); - $this->waitForPopup( 'addLink', WIKI_TEST_WAIT_TIME ); - $this->type( TEXT_LINKNAME, WIKI_INTERNAL_LINK ); - $this->type( TEXT_LINKDISPLAYNAME, "" ); - $this->assertTrue( $this->isElementPresent( ICON_PAGEEXISTS ) ); - $this->assertEquals( "on", $this->getValue( OPT_INTERNAL ) ); - $this->click( BUTTON_INSERTLINK ); - $this->click( LINK_PREVIEW ); - $this->waitForPageToLoad( WIKI_TEST_WAIT_TIME ); - $this->assertEquals( WIKI_INTERNAL_LINK, $this->getText( LINK_START . WIKI_INTERNAL_LINK ) ); - $this->click( LINK_START . WIKI_INTERNAL_LINK ); - $this->waitForPageToLoad( WIKI_TEST_WAIT_TIME ); - $this->assertEquals( WIKI_INTERNAL_LINK, $this->getText( TEXT_PAGE_HEADING ) ); - - } - - // Add external link and verify - function verifyExternalLink() { - $this->type( LINK_PREVIEW, "" ); - $this->click( LINK_ADDLINK ); - $this->type( TEXT_LINKNAME, WIKI_EXTERNAL_LINK ); - $this->assertTrue( $this->isElementPresent( ICON_PAGEEXTERNAL ) ); - $this->assertEquals( "on", $this->getValue( OPT_EXTERNAL ) ); - $this->click( BUTTON_INSERTLINK ); - $this->click( LINK_PREVIEW ); - $this->waitForPageToLoad( WIKI_TEST_WAIT_TIME ); - $this->assertEquals( WIKI_EXTERNAL_LINK, $this->getText( LINK_START . WIKI_EXTERNAL_LINK ) ); - - $this->click( LINK_START . WIKI_EXTERNAL_LINK ); - $this->waitForPageToLoad( WIKI_TEST_WAIT_TIME ); - $this->assertEquals( WIKI_EXTERNAL_LINK_TITLE, $this->getTitle() ); - } - - // Add external link with different display text and verify - function verifyExternalLinkWithDisplayText() { - $this->type( TEXT_EDITOR, "" ); - $this->click( LINK_ADDLINK ); - $this->type( TEXT_LINKNAME, WIKI_EXTERNAL_LINK ); - $this->type( TEXT_LINKDISPLAYNAME, WIKI_EXTERNAL_LINK_TITLE ); - $this->assertTrue( $this->isElementPresent( ICON_PAGEEXTERNAL ) ); - $this->assertEquals( "on", $this->getValue( OPT_EXTERNAL ) ); - $this->click( BUTTON_INSERTLINK ); - $this->click( LINK_PREVIEW ); - $this->waitForPageToLoad( WIKI_TEST_WAIT_TIME ); - $this->assertEquals( WIKI_EXTERNAL_LINK_TITLE, $this->getText( LINK_START . WIKI_EXTERNAL_LINK_TITLE ) ); - $this->click( LINK_START . ( WIKI_EXTERNAL_LINK_TITLE ) ); - $this->waitForPageToLoad( WIKI_TEST_WAIT_TIME ); - $this->assertEquals( WIKI_EXTERNAL_LINK_TITLE , $this->getTitle() ); - } - - // Add external link with Blank display text and verify - function verifyExternalLinkWithBlankDisplayText() { - $this->type( TEXT_EDITOR, "" ); - $this->click( LINK_ADDLINK ); - $this->type( TEXT_LINKNAME, WIKI_EXTERNAL_LINK ); - $this->type( TEXT_LINKDISPLAYNAME, "" ); - $this->assertTrue( $this->isElementPresent( ICON_PAGEEXTERNAL ) ); - $this->assertEquals( "on", $this->getValue( OPT_EXTERNAL ) ); - $this->click( BUTTON_INSERTLINK ); - $this->click( LINK_PREVIEW ); - $this->waitForPageToLoad( WIKI_TEST_WAIT_TIME ); - $this->assertEquals( "[1]", $this->getText( LINK_START . "[1]" ) ); - $this->click( LINK_START . "[1]" ); - $this->waitForPageToLoad( WIKI_TEST_WAIT_TIME ); - $this->assertEquals( WIKI_EXTERNAL_LINK_TITLE, $this->getTitle() ); - } - - // Add a table and verify - function verifyCreateTable() { - $WIKI_TABLE_ROW = 2; - $WIKI_TABLE_COL = "5"; - $this->doExpandAdvanceSection(); - $this->type( TEXT_EDITOR, "" ); - $this->click( LINK_ADDTABLE ); - $this->click( CHK_SORT ); - $this->type( TEXT_ROW, $WIKI_TABLE_ROW ); - $this->type( TEXT_COL, $WIKI_TABLE_COL ); - $this->click( BUTTON_INSERTABLE ); - $this->click( CHK_SORT ); - $this->click( LINK_PREVIEW ); - $this->waitForPageToLoad( WIKI_TEST_WAIT_TIME ); - $WIKI_TABLE_ROW = $WIKI_TABLE_ROW + 1; - $this->assertTrue( $this->isElementPresent( TEXT_TABLEID_OTHER . - TEXT_VALIDATE_TABLE_PART1 . $WIKI_TABLE_ROW . - TEXT_VALIDATE_TABLE_PART2 . $WIKI_TABLE_COL . - TEXT_VALIDATE_TABLE_PART3 ) ); - } - - // Add a table and verify only with head row - function verifyCreateTableWithHeadRow() { - $WIKI_TABLE_ROW = 3; - $WIKI_TABLE_COL = "4"; - $this->doExpandAdvanceSection(); - $this->type( TEXT_EDITOR, "" ); - $this->click( LINK_ADDTABLE ); - $this->click( CHK_BOARDER ); - $this->type( TEXT_ROW, $WIKI_TABLE_ROW ); - $this->type( TEXT_COL, $WIKI_TABLE_COL ); - $this->click( BUTTON_INSERTABLE ); - $this->click( LINK_PREVIEW ); - $this->waitForPageToLoad( WIKI_TEST_WAIT_TIME ); - $WIKI_TABLE_ROW = $WIKI_TABLE_ROW + 1; - $this->assertTrue( $this->isElementPresent( TEXT_TABLEID_OTHER . - TEXT_VALIDATE_TABLE_PART1 . $WIKI_TABLE_ROW . - TEXT_VALIDATE_TABLE_PART2 . $WIKI_TABLE_COL . - TEXT_VALIDATE_TABLE_PART3 ) ); - } - - // Add a table and verify only with borders - function verifyCreateTableWithBorders() { - $WIKI_TABLE_ROW = "4"; - $WIKI_TABLE_COL = "6"; - $this->type( TEXT_EDITOR, "" ); - $this->click( LINK_ADDTABLE ); - $this->click( CHK_HEADER ); - $this->type( TEXT_ROW, $WIKI_TABLE_ROW ); - $this->type( TEXT_COL, $WIKI_TABLE_COL ); - $this->click( BUTTON_INSERTABLE ); - $this->click( CHK_HEADER ); - $this->click( LINK_PREVIEW ); - $this->waitForPageToLoad( WIKI_TEST_WAIT_TIME ); - $this->assertTrue( $this->isElementPresent( TEXT_TABLEID_OTHER . - TEXT_VALIDATE_TABLE_PART1 . $WIKI_TABLE_ROW . - TEXT_VALIDATE_TABLE_PART2 . $WIKI_TABLE_COL . - TEXT_VALIDATE_TABLE_PART3 ) ); - } - - // Add a table and verify only with sort row - function verifyCreateTableWithSortRow() { - $WIKI_TABLE_ROW = "2"; - $WIKI_TABLE_COL = "5"; - $this->type( TEXT_EDITOR, "" ); - $this->click( LINK_ADDTABLE ); - $this->click( CHK_HEADER ); - $this->click( CHK_BOARDER ); - $this->click( CHK_SORT ); - $this->type( TEXT_ROW, $WIKI_TABLE_ROW ); - $this->type( TEXT_COL, $WIKI_TABLE_COL ); - $this->click( BUTTON_INSERTABLE ); - $this->click( CHK_HEADER ); - $this->click( CHK_BOARDER ); - $this->click( CHK_SORT ); - $this->click( LINK_PREVIEW ); - $this->waitForPageToLoad( WIKI_TEST_WAIT_TIME ); - $this->assertTrue( $this->isElementPresent( TEXT_TABLEID_WITHALLFEATURES . - TEXT_VALIDATE_TABLE_PART1 . $WIKI_TABLE_ROW . - TEXT_VALIDATE_TABLE_PART2 . $WIKI_TABLE_COL . - TEXT_VALIDATE_TABLE_PART3 ) ); - } - - // Add a table without headers,borders and sort rows - function verifyCreateTableWithNoSpecialEffects() { - $WIKI_TABLE_ROW = "6"; - $WIKI_TABLE_COL = "2"; - $this-> - $this->doExpandAdvanceSection(); - $this->type( TEXT_EDITOR, "" ); - $this->click( LINK_ADDTABLE ); - $this->click( CHK_BOARDER ); - $this->click( CHK_HEADER ); - $this->type( TEXT_ROW, $WIKI_TABLE_ROW ); - $this->type( TEXT_COL, $WIKI_TABLE_COL ); - $this->click( BUTTON_INSERTABLE ); - $this->click( CHK_BOARDER ); - $this->click( CHK_HEADER ); - $this->click( INK_PREVIEW ); - $this->waitForPageToLoad( WIKI_TEST_WAIT_TIME ); - $this->assertTrue( $this->isElementPresent( TEXT_TABLEID_OTHER . - TEXT_VALIDATE_TABLE_PART1 . $WIKI_TABLE_ROW . - TEXT_VALIDATE_TABLE_PART2 . $WIKI_TABLE_COL . - TEXT_VALIDATE_TABLE_PART3 ) ); - } - - // Add a table with headers,borders and sort rows - function verifyCreateTableWithAllSpecialEffects() { - $WIKI_TABLE_ROW = 6; - $WIKI_TABLE_COL = "2"; - $this->doExpandAdvanceSection(); - $this->type( TEXT_EDITOR, "" ); - $this->click( LINK_ADDTABLE ); - $this->click( CHK_SORT ); - $this->type( TEXT_ROW, $WIKI_TABLE_ROW ); - $this->type( TEXT_COL, $WIKI_TABLE_COL ); - $this->click( BUTTON_INSERTABLE ); - $this->click( CHK_SORT ); - $this->click( LINK_PREVIEW ); - $this->waitForPageToLoad( WIKI_TEST_WAIT_TIME ); - $WIKI_TABLE_ROW = $WIKI_TABLE_ROW + 1; - $this->assertTrue( $this->isElementPresent( TEXT_TABLEID_WITHALLFEATURES . - TEXT_VALIDATE_TABLE_PART1 . $WIKI_TABLE_ROW . - TEXT_VALIDATE_TABLE_PART2 . $WIKI_TABLE_COL . - TEXT_VALIDATE_TABLE_PART3 ) ); - } - -} diff --git a/extensions/WikiEditor/tests/selenium/WikiEditorConstants.php b/extensions/WikiEditor/tests/selenium/WikiEditorConstants.php deleted file mode 100644 index 090f96bf..00000000 --- a/extensions/WikiEditor/tests/selenium/WikiEditorConstants.php +++ /dev/null @@ -1,84 +0,0 @@ -<?php -define ( 'WIKI_TEST_WAIT_TIME', "3000" ); // Waiting time - -// tool bar, buttons , links -// commonly using links -define ( 'LINK_MAIN_PAGE', "link=Main page" ); -define ( 'LINK_RANDOM_PAGE', "link=Random article" ); -define ( 'TEXT_PAGE_HEADING', "firstHeading" ); -define ( 'LINK_START', "link=" ); -define ( 'LINK_EDITPAGE', "//li[@id='ca-edit']/a/span" ); -define ( 'TEXT_EDITOR', "wpTextbox1" ); -define ( 'LINK_PREVIEW', "wpPreview" ); - -define ( 'WIKI_SEARCH_PAGE', "Hair (musical)" ); // Page name to search -define ( 'WIKI_TEXT_SEARCH', "TV" ); // Text to search -define ( 'WIKI_INTERNAL_LINK', "Wikieditor-Fixture-Page" ); // Exisiting page name to add as an internal tag -define ( 'WIKI_EXTERNAL_LINK', "www.google.com" ); // External web site name -define ( 'WIKI_EXTERNAL_LINK_TITLE', "Google" ); // Page title of the external web site name -define ( 'WIKI_CODE_PATH', getcwd() ); // get the current path of the program -define ( 'WIKI_SCREENSHOTS_PATH', "screenshots" ); // the folder the error screen shots will be saved -define ( 'WIKI_SCREENSHOTS_TYPE', "png" ); // screen print type -define ( 'WIKI_TEMP_NEWPAGE', "TestWikiPage" ); // temporary creating new page name -// for WikiCommonFunction_TC - -// for WikiSearch_TC -define ( 'INPUT_SEARCH_BOX', "searchInput" ); -define ( 'BUTTON_SEARCH', "mw-searchButton" ); -define ( 'TEXT_SEARCH_RESULT_HEADING', " - Search results - Wikipedia, the free encyclopedia" ); - -// for WikiWatchUnWatch_TC -define ( 'LINK_WATCH_PAGE', "link=Watch" ); -define ( 'LINK_WATCH_LIST', "link=My watchlist" ); -define ( 'LINK_WATCH_EDIT', "link=View and edit watchlist" ); -define ( 'LINK_UNWATCH', "link=Unwatch" ); -define ( 'BUTTON_WATCH', "wpWatchthis" ); -define ( 'BUTTON_SAVE_WATCH', "wpSave" ); -define ( 'TEXT_WATCH', "Watch" ); -define ( 'TEXT_UNWATCH', "Unwatch" ); - -// for WikiCommonFunction_TC -define ( 'TEXT_LOGOUT', "Log out" ); -define ( 'LINK_LOGOUT', "link=Log out" ); -define ( 'LINK_LOGIN', "link=Log in / create account" ); -define ( 'TEXT_LOGOUT_CONFIRM', "Log in / create account" ); -define ( 'INPUT_USER_NAME', "wpName1" ); -define ( 'INPUT_PASSWD', "wpPassword1" ); -define ( 'BUTTON_LOGIN', "wpLoginAttempt" ); -define ( 'TEXT_HEADING', "Heading" ); -define ( 'LINK_ADVANCED', "link=Advanced" ); - -// for WikiDialogs_TC -define ( 'LINK_ADDLINK', "//div[@id='wikiEditor-ui-toolbar']/div[1]/div[2]/span[2 ]" ); -define ( 'TEXT_LINKNAME', "wikieditor-toolbar-link-int-target" ); -define ( 'TEXT_LINKDISPLAYNAME', "wikieditor-toolbar-link-int-text" ); -define ( 'TEXT_LINKDISPLAYNAME_APPENDTEXT', " Test" ); -define ( 'ICON_PAGEEXISTS', "wikieditor-toolbar-link-int-target-status-exists" ); -define ( 'ICON_PAGEEXTERNAL', "wikieditor-toolbar-link-int-target-status-external" ); -define ( 'OPT_INTERNAL', "wikieditor-toolbar-link-type-int" ); -define ( 'OPT_EXTERNAL', "wikieditor-toolbar-link-type-ext" ); -define ( 'BUTTON_INSERTLINK', "//div[10]/div[11]/button[1]" ); -define ( 'LINK_ADDTABLE', "//div[@id='wikiEditor-ui-toolbar']/div[3]/div[1]/div[4]/span[2]" ); -define ( 'CHK_HEADER', "wikieditor-toolbar-table-dimensions-header" ); -define ( 'CHK_BOARDER', "wikieditor-toolbar-table-wikitable" ); -define ( 'CHK_SORT', "wikieditor-toolbar-table-sortable" ); -define ( 'TEXT_ROW', "wikieditor-toolbar-table-dimensions-rows" ); -define ( 'TEXT_COL', "wikieditor-toolbar-table-dimensions-columns" ); -define ( 'BUTTON_INSERTABLE', "//div[3]/button[1]" ); -define ( 'TEXT_HEADTABLE_TEXT', "Header text" ); -define ( 'TEXT_TABLEID_WITHALLFEATURES', "//table[@id='sortable_table_id_0']/tbody/" ); -define ( 'TEXT_TABLEID_OTHER', "//div[@id='wikiPreview']/table/tbody/" ); -define ( 'TEXT_VALIDATE_TABLE_PART1', "tr[" ); -define ( 'TEXT_VALIDATE_TABLE_PART2', "]/td[" ); -define ( 'TEXT_VALIDATE_TABLE_PART3', "]" ); -define ( 'LINK_SEARCH', "//div[@id='wikiEditor-ui-toolbar']/div[3]/div[1]/div[5]/span" ); -define ( 'INPUT_SEARCH', "wikieditor-toolbar-replace-search" ); -define ( 'INPUT_REPLACE', "wikieditor-toolbar-replace-replace" ); -define ( 'BUTTON_REPLACEALL', "//button[3]" ); -define ( 'BUTTON_REPLACENEXT', "//button[2]" ); -define ( 'BUTTON_CANCEL', "//button[4]" ); -define ( 'TEXT_PREVIEW_TEXT1', "//div[@id='wikiPreview']/p[1]" ); -define ( 'TEXT_PREVIEW_TEXT2', "//div[@id='wikiPreview']/p[2]" ); -define ( 'TEXT_PREVIEW_TEXT3', "//div[@id='wikiPreview']/p[3]" ); - - diff --git a/extensions/WikiEditor/tests/selenium/WikiEditorSeleniumConfig.php b/extensions/WikiEditor/tests/selenium/WikiEditorSeleniumConfig.php deleted file mode 100644 index ad4be489..00000000 --- a/extensions/WikiEditor/tests/selenium/WikiEditorSeleniumConfig.php +++ /dev/null @@ -1,27 +0,0 @@ -<?php - -class WikiEditorSeleniumConfig { - - public static function getSettings( &$includeFiles, &$globalConfigs ) { - $includes = array( - 'extensions/Vector/Vector.php', - 'extensions/WikiEditor/WikiEditor.php' - ); - $configs = array( - 'wgDefaultSkin' => 'vector', - 'wgWikiEditorFeatures' => array( - 'toolbar' => array( 'global' => true, 'user' => true ), - 'toc' => array( 'global' => false, 'user' => false ), - 'highlight' => array( 'global' => false, 'user' => false ), - 'templateEditor' => array( 'global' => false, 'user' => false ), - 'dialogs' => array( 'global' => true, 'user' => true ) - ), - 'wgVectorFeatures' => array( - 'editwarning' => array( 'global' => false, 'user' => false ) - ) - ); - $includeFiles = array_merge( $includeFiles, $includes ); - $globalConfigs = array_merge( $globalConfigs, $configs ); - return true; - } -}
\ No newline at end of file diff --git a/extensions/WikiEditor/tests/selenium/WikiEditorTestSuite.php b/extensions/WikiEditor/tests/selenium/WikiEditorTestSuite.php deleted file mode 100644 index b4029d3a..00000000 --- a/extensions/WikiEditor/tests/selenium/WikiEditorTestSuite.php +++ /dev/null @@ -1,35 +0,0 @@ -<?php - -/** - * To configure MW for these tests - * 1) If you are running multiple test suites, add the following in LocalSettings.php - * require_once("extensions/WikiEditor/tests/selenium/WikiEditorSeleniumConfig.php"); - * $wgSeleniumTestConfigs['WikiEditorTestSuite'] = 'WikiEditorSeleniumConfig::getSettings'; - * OR - * 2) Add the following to your Localsettings.php - * require_once( "$IP/extensions/Vector/Vector.php" ); - * require_once( "$IP/extensions/WikiEditor/WikiEditor.php" ); - * $wgDefaultSkin = 'vector'; - * $wgVectorFeatures['editwarning'] = array( 'global' => false, 'user' => false ); - * $wgWikiEditorFeatures['templateEditor'] = array( 'global' => false, 'user' => false ); - * $wgWikiEditorFeatures['toolbar'] = array( 'global' => true, 'user' => true ); - * $wgWikiEditorFeatures['toc'] = array( 'global' => false, 'user' => false ); - * $wgWikiEditorFeatures['highlight'] = array( 'global' => false, 'user' => false ); - * $wgWikiEditorFeatures['dialogs'] = array( 'global' => true, 'user' => true ); - * - */ -class WikiEditorTestSuite extends SeleniumTestSuite -{ - public function setUp() { - $this->setLoginBeforeTests( false ); - parent::setUp(); - } - public function addTests() { - $testFiles = array( - 'extensions/WikiEditor/tests/selenium/WikiDialogs_Links.php' - ); - parent::addTestFiles( $testFiles ); - } - - -} diff --git a/includes/DefaultSettings.php b/includes/DefaultSettings.php index e9b4f490..32ad2db3 100644 --- a/includes/DefaultSettings.php +++ b/includes/DefaultSettings.php @@ -63,7 +63,7 @@ $wgConf = new SiteConfiguration; * MediaWiki version number * @since 1.2 */ -$wgVersion = '1.22.2'; +$wgVersion = '1.22.6'; /** * Name of the site. It must be changed in LocalSettings.php diff --git a/includes/EditPage.php b/includes/EditPage.php index 530e2674..16d9a5a4 100644 --- a/includes/EditPage.php +++ b/includes/EditPage.php @@ -2049,10 +2049,27 @@ class EditPage { } # Try to add a custom edit intro, or use the standard one if this is not possible. if ( !$this->showCustomIntro() && !$this->mTitle->exists() ) { + $helpLink = wfExpandUrl( Skin::makeInternalOrExternalUrl( + wfMessage( 'helppage' )->inContentLanguage()->text() + ) ); if ( $wgUser->isLoggedIn() ) { - $wgOut->wrapWikiMsg( "<div class=\"mw-newarticletext\">\n$1\n</div>", 'newarticletext' ); + $wgOut->wrapWikiMsg( + // Suppress the external link icon, consider the help url an internal one + "<div class=\"mw-newarticletext plainlinks\">\n$1\n</div>", + array( + 'newarticletext', + $helpLink + ) + ); } else { - $wgOut->wrapWikiMsg( "<div class=\"mw-newarticletextanon\">\n$1\n</div>", 'newarticletextanon' ); + $wgOut->wrapWikiMsg( + // Suppress the external link icon, consider the help url an internal one + "<div class=\"mw-newarticletextanon plainlinks\">\n$1\n</div>", + array( + 'newarticletextanon', + $helpLink + ) + ); } } # Give a notice if the user is editing a deleted/moved page... diff --git a/includes/User.php b/includes/User.php index 12912e1c..62324043 100644 --- a/includes/User.php +++ b/includes/User.php @@ -984,7 +984,8 @@ class User { # Get the token from DB/cache and clean it up to remove garbage padding. # This deals with historical problems with bugs and the default column value. $token = rtrim( $proposedUser->getToken( false ) ); // correct token - $passwordCorrect = ( strlen( $token ) && $token === $request->getCookie( 'Token' ) ); + // Make comparison in constant time (bug 61346) + $passwordCorrect = strlen( $token ) && $this->compareSecrets( $token, $request->getCookie( 'Token' ) ); $from = 'cookie'; } else { // No session or persistent login cookie @@ -1004,6 +1005,25 @@ class User { } /** + * A comparison of two strings, not vulnerable to timing attacks + * @param string $answer the secret string that you are comparing against. + * @param string $test compare this string to the $answer. + * @return bool True if the strings are the same, false otherwise + */ + protected function compareSecrets( $answer, $test ) { + if ( strlen( $answer ) !== strlen( $test ) ) { + $passwordCorrect = false; + } else { + $result = 0; + for ( $i = 0; $i < strlen( $answer ); $i++ ) { + $result |= ord( $answer{$i} ) ^ ord( $test{$i} ); + } + $passwordCorrect = ( $result == 0 ); + } + return $passwordCorrect; + } + + /** * Load user and user_group data from the database. * $this->mId must be set, this is how the user is identified. * diff --git a/includes/Wiki.php b/includes/Wiki.php index ae75bf33..074ec1ab 100644 --- a/includes/Wiki.php +++ b/includes/Wiki.php @@ -653,12 +653,19 @@ class MediaWiki { } if ( !wfShellExecDisabled() && is_executable( $wgPhpCli ) ) { - // Start a background process to run some of the jobs. - // This will be asynchronous on *nix though not on Windows. + // Start a background process to run some of the jobs wfProfileIn( __METHOD__ . '-exec' ); $retVal = 1; $cmd = wfShellWikiCmd( "$IP/maintenance/runJobs.php", array( '--maxjobs', $n ) ); - wfShellExec( "$cmd &", $retVal ); + $cmd .= " >" . wfGetNull() . " 2>&1"; // don't hang PHP on pipes + if ( wfIsWindows() ) { + // Using START makes this async and also works around a bug where using + // wfShellExec() with a quoted script name causes a filename syntax error. + $cmd = "START /B \"bg\" $cmd"; + } else { + $cmd = "$cmd &"; + } + wfShellExec( $cmd, $retVal ); wfProfileOut( __METHOD__ . '-exec' ); } else { try { diff --git a/includes/actions/InfoAction.php b/includes/actions/InfoAction.php index 7fc90339..0a16f4a8 100644 --- a/includes/actions/InfoAction.php +++ b/includes/actions/InfoAction.php @@ -261,6 +261,7 @@ class InfoAction extends FormlessAction { $sortKey = $pageProperties['defaultsort']; } + $sortKey = htmlspecialchars( $sortKey ); $pageInfo['header-basic'][] = array( $this->msg( 'pageinfo-default-sort' ), $sortKey ); // Page length (in bytes) diff --git a/includes/api/ApiFormatBase.php b/includes/api/ApiFormatBase.php index b89fb3a7..70495439 100644 --- a/includes/api/ApiFormatBase.php +++ b/includes/api/ApiFormatBase.php @@ -272,17 +272,33 @@ See the <a href='https://www.mediawiki.org/wiki/API'>complete documentation</a>, // encode all comments or tags as safe blue strings $text = str_replace( '<', '<span style="color:blue;"><', $text ); $text = str_replace( '>', '></span>', $text ); + // identify requests to api.php - $text = preg_replace( "#api\\.php\\?[^ <\n\t]+#", '<a href="\\0">\\0</a>', $text ); + $text = preg_replace( '#^(\s*)(api\.php\?[^ <\n\t]+)$#m', '\1<a href="\2">\2</a>', $text ); if ( $this->mHelp ) { // make strings inside * bold $text = preg_replace( "#\\*[^<>\n]+\\*#", '<b>\\0</b>', $text ); } + + // Armor links (bug 61362) + $masked = array(); + $text = preg_replace_callback( '#<a .*?</a>#', function ( $matches ) use ( &$masked ) { + $sha = sha1( $matches[0] ); + $masked[$sha] = $matches[0]; + return "<$sha>"; + }, $text ); + // identify URLs $protos = wfUrlProtocolsWithoutProtRel(); // This regex hacks around bug 13218 (" included in the URL) $text = preg_replace( "#(((?i)$protos).*?)(")?([ \\'\"<>\n]|<|>|")#", '<a href="\\1">\\1</a>\\3\\4', $text ); + // Unarmor links + $text = preg_replace_callback( '#<([0-9a-f]{40})>#', function ( $matches ) use ( &$masked ) { + $sha = $matches[1]; + return isset( $masked[$sha] ) ? $masked[$sha] : $matches[0]; + }, $text ); + /** * Temporary fix for bad links in help messages. As a special case, * XML-escaped metachars are de-escaped one level in the help message diff --git a/includes/db/DatabaseMysqli.php b/includes/db/DatabaseMysqli.php index 7761abe9..0ec54314 100644 --- a/includes/db/DatabaseMysqli.php +++ b/includes/db/DatabaseMysqli.php @@ -51,6 +51,17 @@ class DatabaseMysqli extends DatabaseMysqlBase { . " have you compiled PHP with the --with-mysqli option?\n" ); } + // Other than mysql_connect, mysqli_real_connect expects an explicit port + // parameter. So we need to parse the port out of $realServer + $port = null; + $hostAndPort = IP::splitHostAndPort( $realServer ); + if ( $hostAndPort ) { + $realServer = $hostAndPort[0]; + if ( $hostAndPort[1] ) { + $port = $hostAndPort[1]; + } + } + $connFlags = 0; if ( $this->mFlags & DBO_SSL ) { $connFlags |= MYSQLI_CLIENT_SSL; @@ -70,7 +81,7 @@ class DatabaseMysqli extends DatabaseMysqlBase { usleep( 1000 ); } if ( $mysqli->real_connect( $realServer, $this->mUser, - $this->mPassword, $this->mDBname, null, null, $connFlags ) ) + $this->mPassword, $this->mDBname, $port, null, $connFlags ) ) { return $mysqli; } diff --git a/includes/db/DatabaseOracle.php b/includes/db/DatabaseOracle.php index 32d4d984..fb2d4359 100644 --- a/includes/db/DatabaseOracle.php +++ b/includes/db/DatabaseOracle.php @@ -551,8 +551,12 @@ class DatabaseOracle extends DatabaseBase { } else { $first = false; } - - $sql .= $this->fieldBindStatement( $table, $col, $val ); + if ( $this->isQuotedIdentifier( $val ) ) { + $sql .= $this->removeIdentifierQuotes( $val ); + unset( $row[$col] ); + } else { + $sql .= $this->fieldBindStatement( $table, $col, $val ); + } } $sql .= ')'; @@ -679,6 +683,30 @@ class DatabaseOracle extends DatabaseBase { return $retval; } + public function upsert( $table, array $rows, array $uniqueIndexes, array $set, + $fname = __METHOD__ + ) { + if ( !count( $rows ) ) { + return true; // nothing to do + } + + if ( !is_array( reset( $rows ) ) ) { + $rows = array( $rows ); + } + + $sequenceData = $this->getSequenceData( $table ); + if ( $sequenceData !== false ) { + // add sequence column to each list of columns, when not set + foreach ( $rows as &$row ) { + if ( !isset( $row[$sequenceData['column']] ) ) { + $row[$sequenceData['column']] = $this->addIdentifierQuotes('GET_SEQUENCE_VALUE(\'' . $sequenceData['sequence'] . '\')'); + } + } + } + + return parent::upsert( $table, $rows, $uniqueIndexes, $set, $fname ); + } + function tableName( $name, $format = 'quoted' ) { /* Replace reserved words with better ones diff --git a/includes/db/DatabasePostgres.php b/includes/db/DatabasePostgres.php index aed35f10..0bd966ba 100644 --- a/includes/db/DatabasePostgres.php +++ b/includes/db/DatabasePostgres.php @@ -729,13 +729,15 @@ __INDEXATTR__; * so causes a DB error. This wrapper checks which tables can be locked and adjusts it accordingly. */ function selectSQLText( $table, $vars, $conds = '', $fname = __METHOD__, $options = array(), $join_conds = array() ) { - $forUpdateKey = array_search( 'FOR UPDATE', $options ); - if ( $forUpdateKey !== false && $join_conds ) { - unset( $options[$forUpdateKey] ); - - foreach ( $join_conds as $table => $join_cond ) { - if ( 0 === preg_match( '/^(?:LEFT|RIGHT|FULL)(?: OUTER)? JOIN$/i', $join_cond[0] ) ) { - $options['FOR UPDATE'][] = $table; + if ( is_array( $options ) ) { + $forUpdateKey = array_search( 'FOR UPDATE', $options ); + if ( $forUpdateKey !== false && $join_conds ) { + unset( $options[$forUpdateKey] ); + + foreach ( $join_conds as $table_cond => $join_cond ) { + if ( 0 === preg_match( '/^(?:LEFT|RIGHT|FULL)(?: OUTER)? JOIN$/i', $join_cond[0] ) ) { + $options['FOR UPDATE'][] = $table_cond; + } } } } diff --git a/includes/installer/WebInstallerPage.php b/includes/installer/WebInstallerPage.php index ad399133..d3b550fe 100644 --- a/includes/installer/WebInstallerPage.php +++ b/includes/installer/WebInstallerPage.php @@ -955,11 +955,16 @@ class WebInstaller_Options extends WebInstallerPage { LinkCache::singleton()->useDatabase( false ); foreach ( $extensions as $ext ) { + if ( isset( $ext['descriptionmsg'] ) ) { + $desc = wfMessage( $ext['descriptionmsg'] )->useDatabase( false )->parse(); + } else { + $desc = ''; + } $extHtml .= $this->parent->getCheckBox( array( 'var' => "ext-{$ext['name']}", 'rawtext' => "<b>{$ext['name']}</b>: " . - wfMessage( $ext['descriptionmsg'] )->useDatabase( false )->parse(), - ) ); + $desc, + ) ); } diff --git a/includes/specials/SpecialChangePassword.php b/includes/specials/SpecialChangePassword.php index c54b5575..a75e7e83 100644 --- a/includes/specials/SpecialChangePassword.php +++ b/includes/specials/SpecialChangePassword.php @@ -52,6 +52,11 @@ class SpecialChangePassword extends UnlistedSpecialPage { $this->mDomain = $request->getVal( 'wpDomain' ); $user = $this->getUser(); + + if ( !$user->isLoggedIn() && !LoginForm::getLoginToken() ) { + LoginForm::setLoginToken(); + } + if ( !$request->wasPosted() && !$user->isLoggedIn() ) { $this->error( $this->msg( 'resetpass-no-info' )->text() ); @@ -81,6 +86,14 @@ class SpecialChangePassword extends UnlistedSpecialPage { return; } + if ( !$user->isLoggedIn() + && $request->getVal( 'wpLoginOnChangeToken' ) !== LoginForm::getLoginToken() + ) { + // Potential CSRF (bug 62497) + $this->error( $this->msg( 'sessionfailure' )->text() ); + return false; + } + $this->attemptReset( $this->mNewpass, $this->mRetype ); if ( $user->isLoggedIn() ) { @@ -157,6 +170,9 @@ class SpecialChangePassword extends UnlistedSpecialPage { 'wpName' => $this->mUserName, 'wpDomain' => $this->mDomain, ) + $this->getRequest()->getValues( 'returnto', 'returntoquery' ); + if ( !$user->isLoggedIn() ) { + $hiddenFields['wpLoginOnChangeToken'] = LoginForm::getLoginToken(); + } $hiddenFieldsStr = ''; foreach ( $hiddenFields as $fieldname => $fieldvalue ) { $hiddenFieldsStr .= Html::hidden( $fieldname, $fieldvalue ) . "\n"; diff --git a/includes/specials/SpecialPrefixindex.php b/includes/specials/SpecialPrefixindex.php index 28d07ffc..0d065b09 100644 --- a/includes/specials/SpecialPrefixindex.php +++ b/includes/specials/SpecialPrefixindex.php @@ -264,6 +264,7 @@ class SpecialPrefixindex extends SpecialAllpages { 'from' => $s->page_title, 'prefix' => $prefix, 'hideredirects' => $this->hideRedirects, + 'stripprefix' => $this->stripPrefix, ); if ( $namespace || $prefix == '' ) { diff --git a/includes/templates/Userlogin.php b/includes/templates/Userlogin.php index 5eb60948..9aedd3c7 100644 --- a/includes/templates/Userlogin.php +++ b/includes/templates/Userlogin.php @@ -154,9 +154,18 @@ class UserloginTemplate extends BaseTemplate { ) ); ?> </div> - <div id="mw-userlogin-help"> - <?php echo $this->getMsg( 'userlogin-helplink' )->parse(); ?> + <?php + echo Html::element( + 'a', + array( + 'href' => Skin::makeInternalOrExternalUrl( + wfMessage( 'helplogin-url' )->inContentLanguage()->text() + ), + ), + $this->getMsg( 'userlogin-helplink2' )->text() + ); + ?> </div> <?php if ( $this->haveData( 'createOrLoginHref' ) ) { ?> <?php if ( $this->data['loggedin'] ) { ?> diff --git a/includes/upload/UploadBase.php b/includes/upload/UploadBase.php index 916ad6c1..c0c37b3f 100644 --- a/includes/upload/UploadBase.php +++ b/includes/upload/UploadBase.php @@ -44,7 +44,7 @@ abstract class UploadBase { protected $mFilteredName, $mFinalExtension; protected $mLocalFile, $mFileSize, $mFileProps; protected $mBlackListedExtensions; - protected $mJavaDetected; + protected $mJavaDetected, $mSVGNSError; protected static $safeXmlEncodings = array( 'UTF-8', 'ISO-8859-1', 'ISO-8859-2', 'UTF-16', 'UTF-32' ); @@ -1162,6 +1162,7 @@ abstract class UploadBase { * @return bool */ protected function detectScriptInSvg( $filename ) { + $this->mSVGNSError = false; $check = new XmlTypeCheck( $filename, array( $this, 'checkSvgScriptCallback' ), @@ -1172,6 +1173,9 @@ abstract class UploadBase { // Invalid xml (bug 58553) return array( 'uploadinvalidxml' ); } elseif ( $check->filterMatch ) { + if ( $this->mSVGNSError ) { + return array( 'uploadscriptednamespace', $this->mSVGNSError ); + } return array( 'uploadscripted' ); } return false; @@ -1198,7 +1202,51 @@ abstract class UploadBase { * @return bool */ public function checkSvgScriptCallback( $element, $attribs ) { - $strippedElement = $this->stripXmlNamespace( $element ); + list( $namespace, $strippedElement ) = $this->splitXmlNamespace( $element ); + + static $validNamespaces = array( + '', + 'adobe:ns:meta/', + 'http://creativecommons.org/ns#', + 'http://inkscape.sourceforge.net/dtd/sodipodi-0.dtd', + 'http://ns.adobe.com/adobeillustrator/10.0/', + 'http://ns.adobe.com/adobesvgviewerextensions/3.0/', + 'http://ns.adobe.com/extensibility/1.0/', + 'http://ns.adobe.com/flows/1.0/', + 'http://ns.adobe.com/illustrator/1.0/', + 'http://ns.adobe.com/imagereplacement/1.0/', + 'http://ns.adobe.com/pdf/1.3/', + 'http://ns.adobe.com/photoshop/1.0/', + 'http://ns.adobe.com/saveforweb/1.0/', + 'http://ns.adobe.com/variables/1.0/', + 'http://ns.adobe.com/xap/1.0/', + 'http://ns.adobe.com/xap/1.0/g/', + 'http://ns.adobe.com/xap/1.0/g/img/', + 'http://ns.adobe.com/xap/1.0/mm/', + 'http://ns.adobe.com/xap/1.0/rights/', + 'http://ns.adobe.com/xap/1.0/stype/dimensions#', + 'http://ns.adobe.com/xap/1.0/stype/font#', + 'http://ns.adobe.com/xap/1.0/stype/manifestitem#', + 'http://ns.adobe.com/xap/1.0/stype/resourceevent#', + 'http://ns.adobe.com/xap/1.0/stype/resourceref#', + 'http://ns.adobe.com/xap/1.0/t/pg/', + 'http://purl.org/dc/elements/1.1/', + 'http://purl.org/dc/elements/1.1', + 'http://schemas.microsoft.com/visio/2003/svgextensions/', + 'http://sodipodi.sourceforge.net/dtd/sodipodi-0.dtd', + 'http://web.resource.org/cc/', + 'http://www.freesoftware.fsf.org/bkchem/cdml', + 'http://www.inkscape.org/namespaces/inkscape', + 'http://www.w3.org/1999/02/22-rdf-syntax-ns#', + 'http://www.w3.org/2000/svg', + ); + + if ( !in_array( $namespace, $validNamespaces ) ) { + wfDebug( __METHOD__ . ": Non-svg namespace '$namespace' in uploaded file.\n" ); + // @TODO return a status object to a closure in XmlTypeCheck, for MW1.21+ + $this->mSVGNSError = $namespace; + return true; + } /* * check for elements that can contain javascript @@ -1220,6 +1268,12 @@ abstract class UploadBase { return true; } + # Block iframes, in case they pass the namespace check + if ( $strippedElement == 'iframe' ) { + wfDebug( __METHOD__ . ": iframe in uploaded file.\n" ); + return true; + } + foreach ( $attribs as $attrib => $value ) { $stripped = $this->stripXmlNamespace( $attrib ); $value = strtolower( $value ); @@ -1294,6 +1348,19 @@ abstract class UploadBase { } /** + * Divide the element name passed by the xml parser to the callback into URI and prifix. + * @param $name string + * @return array containing the namespace URI and prefix + */ + private static function splitXmlNamespace( $element ) { + // 'http://www.w3.org/2000/svg:script' -> array( 'http://www.w3.org/2000/svg', 'script' ) + $parts = explode( ':', strtolower( $element ) ); + $name = array_pop( $parts ); + $ns = implode( ':', $parts ); + return array( $ns, $name ); + } + + /** * @param $name string * @return string */ diff --git a/languages/messages/MessagesEn.php b/languages/messages/MessagesEn.php index dca9779d..4f82b86d 100644 --- a/languages/messages/MessagesEn.php +++ b/languages/messages/MessagesEn.php @@ -644,6 +644,7 @@ future releases. Also note that since each list value is wrapped in a unique ** mainpage|mainpage-description ** recentchanges-url|recentchanges ** randompage-url|randompage +** helppage|help * SEARCH * TOOLBOX * LANGUAGES', # do not translate or duplicate this message to other languages @@ -912,7 +913,7 @@ $1', 'disclaimerpage' => 'Project:General disclaimer', 'edithelp' => 'Editing help', 'edithelppage' => 'https://www.mediawiki.org/wiki/Special:MyLanguage/Help:Editing_pages', # do not translate or duplicate this message to other languages -'helppage' => 'Help:Contents', +'helppage' => 'https://www.mediawiki.org/wiki/Special:MyLanguage/Help:Contents', 'mainpage' => 'Main Page', 'mainpage-description' => 'Main page', 'policy-url' => 'Project:Policy', @@ -1131,8 +1132,8 @@ You can change your {{SITENAME}} [[Special:Preferences|preferences]] if you wish 'gotaccountlink' => 'Log in', 'userlogin-resetlink' => 'Forgotten your login details?', 'userlogin-resetpassword-link' => 'Forgot your password?', -'helplogin-url' => 'Help:Logging in', -'userlogin-helplink' => '[[{{MediaWiki:helplogin-url}}|Help with logging in]]', +'helplogin-url' => 'https://www.mediawiki.org/wiki/Special:MyLanguage/Help:Logging_in', +'userlogin-helplink2' => 'Help with logging in', 'userlogin-loggedin' => 'You are already logged in as {{GENDER:$1|$1}}. Use the form below to log in as another user.', 'userlogin-createanother' => 'Create another account', @@ -1432,10 +1433,10 @@ It may have been moved or deleted while you were viewing the page.', 'accmailtitle' => 'Password sent', 'accmailtext' => "A randomly generated password for [[User talk:$1|$1]] has been sent to $2. It can be changed on the ''[[Special:ChangePassword|change password]]'' page upon logging in.", 'newarticle' => '(New)', -'newarticletext' => "You have followed a link to a page that does not exist yet. -To create the page, start typing in the box below (see the [[{{MediaWiki:Helppage}}|help page]] for more info). -If you are here by mistake, click your browser's '''back''' button.", -'newarticletextanon' => '{{int:newarticletext}}', # do not translate or duplicate this message to other languages +'newarticletext' => "You have followed a link to a page that does not exist yet. +To create the page, start typing in the box below (see the [$1 help page] for more info). +If you are here by mistake, click your browser's <strong>back</strong> button.", +'newarticletextanon' => '{{int:newarticletext|$1}}', # do not translate or duplicate this message to other languages 'talkpagetext' => '<!-- MediaWiki:talkpagetext -->', # do not translate or duplicate this message to other languages 'anontalkpagetext' => "---- ''This is the discussion page for an anonymous user who has not created an account yet, or who does not use it.'' @@ -2352,6 +2353,7 @@ You should check that file's deletion history before proceeding to re-upload it. 'php-uploaddisabledtext' => 'File uploads are disabled in PHP. Please check the file_uploads setting.', 'uploadscripted' => 'This file contains HTML or script code that may be erroneously interpreted by a web browser.', +'uploadscriptednamespace' => 'This SVG file contains an illegal namespace \'$1\'', 'uploadinvalidxml' => 'The XML in the uploaded file could not be parsed.', 'uploadvirus' => 'The file contains a virus! Details: $1', diff --git a/languages/messages/MessagesQqq.php b/languages/messages/MessagesQqq.php index e770db61..f30453a6 100644 --- a/languages/messages/MessagesQqq.php +++ b/languages/messages/MessagesQqq.php @@ -1343,13 +1343,13 @@ The link points to the local [[Special:PasswordReset]]. See example: [[Special:UserLogin]] -userlogin-resetpassword-link may have to be shorter than the old {{msg-mw|userlogin-resetlink}}', -'helplogin-url' => '{{doc-important|Do not translate the namespace name <code>Help</code>.}} -Used as name of the page that provides information about logging into the wiki. +userlogin-resetpassword-link may have to be shorter than the old {{msg-mw|userlogin-resetlink}}. +{{Identical|Forgot your password}}', +'helplogin-url' => '{{doc-important|Do not translate the target page, Special:MyLanguage handles it.}} +Defines the URL to the page that provides information about logging into the wiki. -Used as a link target in the message {{msg-mw|Userlogin-helplink}}.', -'userlogin-helplink' => '{{doc-important|Do not change <code><nowiki>{{MediaWiki:helplogin-url}}</nowiki></code>.}} -Wikitext linking to login help. +Used as a link target for the link with label {{msg-mw|userlogin-helplink2}}; can be locally customised to be an URL or local page title.', +'userlogin-helplink2' => 'Label for a link to login help. See example: [[Special:UserLogin]] @@ -1881,10 +1881,9 @@ Parameters: * $1 - username * $2 - email address", 'newarticle' => '{{Identical|New}}', -'newarticletext' => '{{doc-important|Do not translate <code><nowiki>{{MediaWiki:Helppage}}</nowiki></code>.}} -Text displayed above the edit box in editor when trying to create a new page. - -Refers to {{msg-mw|Helppage}}.', +'newarticletext' => "Text displayed above the edit box in editor when trying to create a new page. +Parameters: +* $1 - The URL to the help page, defined in {{msg-mw|helppage}}", 'anontalkpagetext' => 'Displayed at the bottom of talk pages of anonymous users.', 'noarticletext' => 'This is the message that you get if you search for a term that has not yet got any entries on the wiki. @@ -4065,6 +4064,14 @@ See also: * {{msg-mw|uploadjava}} * {{msg-mw|uploadvirus}}', 'uploadinvalidxml' => 'Error message displayed when the uploaded file contains XML that cannot be properly parsed and checked.', +'uploadscriptednamespace' => 'Used as error message when uploading a file. This error is specific to SVG files, when they include a namespace that has not been whitelisted. + +Parameters: +* $1 - the invalid namespace name +See also: +* {{msg-mw|zip-wrong-format}} +* {{msg-mw|uploadjava}} +* {{msg-mw|uploadvirus}}', 'uploadvirus' => 'Error message displayed when uploaded file contains a virus. Parameters: diff --git a/maintenance/importTextFile.php b/maintenance/importTextFile.php index e081c20b..4a07f2c7 100644 --- a/maintenance/importTextFile.php +++ b/maintenance/importTextFile.php @@ -42,6 +42,7 @@ if ( count( $args ) < 1 || isset( $options['help'] ) ) { echo "\nUsing title '" . $title->getPrefixedText() . "'..."; if ( !$title->exists() || !isset( $options['nooverwrite'] ) ) { + RequestContext::getMain()->setTitle( $title ); $text = file_get_contents( $filename ); $user = isset( $options['user'] ) ? $options['user'] : 'Maintenance script'; diff --git a/maintenance/language/messageTypes.inc b/maintenance/language/messageTypes.inc index 0b9b7cb8..f9239b1c 100644 --- a/maintenance/language/messageTypes.inc +++ b/maintenance/language/messageTypes.inc @@ -266,7 +266,9 @@ $wgIgnoredMessages = array( 'createacct-benefit-icon3', 'today-at', 'redirect-text', + 'helppage', 'edithelppage', + 'helplogin-url', 'autocomment-prefix', 'move-redirect-text', ); diff --git a/maintenance/language/messages.inc b/maintenance/language/messages.inc index de163a61..e351549b 100644 --- a/maintenance/language/messages.inc +++ b/maintenance/language/messages.inc @@ -484,7 +484,7 @@ $wgMessageStructure = array( 'userlogin-resetlink', 'userlogin-resetpassword-link', 'helplogin-url', - 'userlogin-helplink', + 'userlogin-helplink2', 'userlogin-loggedin', 'userlogin-createanother', 'createacct-join', diff --git a/maintenance/postgres/tables.sql b/maintenance/postgres/tables.sql index bc2428e4..0cc1b3d7 100644 --- a/maintenance/postgres/tables.sql +++ b/maintenance/postgres/tables.sql @@ -228,9 +228,9 @@ CREATE TABLE categorylinks ( CREATE UNIQUE INDEX cl_from ON categorylinks (cl_from, cl_to); CREATE INDEX cl_sortkey ON categorylinks (cl_to, cl_sortkey, cl_from); -CREATE SEQUENCE externallinks_id_seq; +CREATE SEQUENCE externallinks_el_id_seq; CREATE TABLE externallinks ( - el_id INTEGER NOT NULL PRIMARY KEY DEFAULT nextval('externallinks_id_seq'), + el_id INTEGER NOT NULL PRIMARY KEY DEFAULT nextval('externallinks_el_id_seq'), el_from INTEGER NOT NULL REFERENCES page(page_id) ON DELETE CASCADE DEFERRABLE INITIALLY DEFERRED, el_to TEXT NOT NULL, el_index TEXT NOT NULL diff --git a/resources/mediawiki/mediawiki.js b/resources/mediawiki/mediawiki.js index 80223e5d..5a4ff1b5 100644 --- a/resources/mediawiki/mediawiki.js +++ b/resources/mediawiki/mediawiki.js @@ -21,6 +21,7 @@ var mw = ( function ( $, undefined ) { * fine. No need for optimization here, which would only result in losing logs. * * @private + * @method log_ * @param {string} msg text for the log entry. * @param {Error} [e] */ @@ -318,6 +319,9 @@ var mw = ( function ( $, undefined ) { } }; + /** + * @class mw + */ return { /* Public Members */ @@ -1446,16 +1450,19 @@ var mw = ( function ( $, undefined ) { * @param {Function|Array} script Function with module code or Array of URLs to * be used as the src attribute of a new `<script>` tag. * @param {Object} style Should follow one of the following patterns: + * * { "css": [css, ..] } * { "url": { <media>: [url, ..] } } + * * And for backwards compatibility (needs to be supported forever due to caching): + * * { <media>: css } * { <media>: [url, ..] } * * The reason css strings are not concatenated anymore is bug 31676. We now check * whether it's safe to extend the stylesheet (see #canExpandStylesheetWith). * - * @param {Object} msgs List of key/value pairs to be added to {@link mw#messages}. + * @param {Object} msgs List of key/value pairs to be added to mw#messages. */ implement: function ( module, script, style, msgs ) { // Validate input diff --git a/skins/CologneBlue.php b/skins/CologneBlue.php index 0370e05b..04e0e6a4 100644 --- a/skins/CologneBlue.php +++ b/skins/CologneBlue.php @@ -369,9 +369,10 @@ class CologneBlueTemplate extends BaseTemplate { Title::newFromText( wfMessage( 'aboutpage' )->inContentLanguage()->text() ), wfMessage( 'about' )->text() ), - Linker::linkKnown( - Title::newFromText( wfMessage( 'helppage' )->inContentLanguage()->text() ), - wfMessage( 'help' )->text() + Linker::makeExternalLink( + Skin::makeInternalOrExternalUrl( wfMessage( 'helppage' )->inContentLanguage()->text() ), + wfMessage( 'help' )->text(), + false ), Linker::linkKnown( Title::newFromText( wfMessage( 'faqpage' )->inContentLanguage()->text() ), diff --git a/skins/common/images/icons/fileicon-djvu.xcf b/skins/common/images/icons/fileicon-djvu.xcf Binary files differdeleted file mode 100644 index 8043dcdb..00000000 --- a/skins/common/images/icons/fileicon-djvu.xcf +++ /dev/null diff --git a/skins/common/images/icons/fileicon-ogg.xcf b/skins/common/images/icons/fileicon-ogg.xcf Binary files differdeleted file mode 100644 index a91024bf..00000000 --- a/skins/common/images/icons/fileicon-ogg.xcf +++ /dev/null diff --git a/tests/.htaccess b/tests/.htaccess deleted file mode 100644 index 3a428827..00000000 --- a/tests/.htaccess +++ /dev/null @@ -1 +0,0 @@ -Deny from all diff --git a/tests/TestsAutoLoader.php b/tests/TestsAutoLoader.php deleted file mode 100644 index 00ce13c8..00000000 --- a/tests/TestsAutoLoader.php +++ /dev/null @@ -1,104 +0,0 @@ -<?php -/** - * AutoLoader for the testing suite. - * - * This program is free software; you can redistribute it and/or modify - * it under the terms of the GNU General Public License as published by - * the Free Software Foundation; either version 2 of the License, or - * (at your option) any later version. - * - * This program is distributed in the hope that it will be useful, - * but WITHOUT ANY WARRANTY; without even the implied warranty of - * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the - * GNU General Public License for more details. - * - * You should have received a copy of the GNU General Public License along - * with this program; if not, write to the Free Software Foundation, Inc., - * 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301, USA. - * http://www.gnu.org/copyleft/gpl.html - * - * @file - * @ingroup Testing - */ - -global $wgAutoloadClasses; -$testDir = __DIR__; - -$wgAutoloadClasses += array( - - # tests - 'DbTestPreviewer' => "$testDir/testHelpers.inc", - 'DbTestRecorder' => "$testDir/testHelpers.inc", - 'DelayedParserTest' => "$testDir/testHelpers.inc", - 'ParserTestResult' => "$testDir/parser/ParserTestResult.php", - 'TestFileIterator' => "$testDir/testHelpers.inc", - 'TestRecorder' => "$testDir/testHelpers.inc", - 'ITestRecorder' => "$testDir/testHelpers.inc", - - # tests/phpunit - 'MediaWikiTestCase' => "$testDir/phpunit/MediaWikiTestCase.php", - 'MediaWikiPHPUnitCommand' => "$testDir/phpunit/MediaWikiPHPUnitCommand.php", - 'MediaWikiPHPUnitTestListener' => "$testDir/phpunit/MediaWikiPHPUnitTestListener.php", - 'MediaWikiLangTestCase' => "$testDir/phpunit/MediaWikiLangTestCase.php", - 'TestUser' => "$testDir/phpunit/includes/TestUser.php", - - # tests/phpunit/includes - 'BlockTest' => "$testDir/phpunit/includes/BlockTest.php", - 'RevisionStorageTest' => "$testDir/phpunit/includes/RevisionStorageTest.php", - 'WikiPageTest' => "$testDir/phpunit/includes/WikiPageTest.php", - - //db - 'ORMTableTest' => "$testDir/phpunit/includes/db/ORMTableTest.php", - 'PageORMTableForTesting' => "$testDir/phpunit/includes/db/ORMTableTest.php", - 'DatabaseTestHelper' => "$testDir/phpunit/includes/db/DatabaseTestHelper.php", - - # tests/phpunit/includes/api - 'ApiFormatTestBase' => "$testDir/phpunit/includes/api/format/ApiFormatTestBase.php", - 'ApiTestCase' => "$testDir/phpunit/includes/api/ApiTestCase.php", - 'ApiTestContext' => "$testDir/phpunit/includes/api/ApiTestCase.php", - 'MockApi' => "$testDir/phpunit/includes/api/ApiTestCase.php", - 'RandomImageGenerator' => "$testDir/phpunit/includes/api/RandomImageGenerator.php", - 'UserWrapper' => "$testDir/phpunit/includes/api/ApiTestCase.php", - - # tests/phpunit/includes/content - 'DummyContentHandlerForTesting' => "$testDir/phpunit/includes/content/ContentHandlerTest.php", - 'DummyContentForTesting' => "$testDir/phpunit/includes/content/ContentHandlerTest.php", - 'ContentHandlerTest' => "$testDir/phpunit/includes/content/ContentHandlerTest.php", - 'JavaScriptContentTest' => "$testDir/phpunit/includes/content/JavaScriptContentTest.php", - 'TextContentTest' => "$testDir/phpunit/includes/content/TextContentTest.php", - 'WikitextContentTest' => "$testDir/phpunit/includes/content/WikitextContentTest.php", - - # tests/phpunit/includes/db - 'ORMRowTest' => "$testDir/phpunit/includes/db/ORMRowTest.php", - - # tests/phpunit/includes/parser - 'NewParserTest' => "$testDir/phpunit/includes/parser/NewParserTest.php", - 'MediaWikiParserTest' => "$testDir/phpunit/includes/parser/MediaWikiParserTest.php", - - # tests/phpunit/includes/libs - 'GenericArrayObjectTest' => "$testDir/phpunit/includes/libs/GenericArrayObjectTest.php", - - # tests/phpunit/media - 'FakeDimensionFile' => "$testDir/phpunit/includes/media/FakeDimensionFile.php", - - # tests/phpunit/includes/site - 'SiteTest' => "$testDir/phpunit/includes/site/SiteTest.php", - 'TestSites' => "$testDir/phpunit/includes/site/TestSites.php", - - # tests/phpunit/mocks - 'MockFSFile' => "$testDir/phpunit/mocks/filebackend/MockFSFile.php", - 'MockFileBackend' => "$testDir/phpunit/mocks/filebackend/MockFileBackend.php", - 'MockBitmapHandler' => "$testDir/phpunit/mocks/media/MockBitmapHandler.php", - 'MockImageHandler' => "$testDir/phpunit/mocks/media/MockBitmapHandler.php", - 'MockSvgHandler' => "$testDir/phpunit/mocks/media/MockBitmapHandler.php", - - # tests/phpunit/languages - 'LanguageClassesTestCase' => "$testDir/phpunit/languages/LanguageClassesTestCase.php", - - # tests/phpunit/maintenance - 'DumpTestCase' => "$testDir/phpunit/maintenance/DumpTestCase.php", - - # tests/parser - 'ParserTest' => "$testDir/parser/parserTest.inc", - 'ParserTestParserHook' => "$testDir/parser/parserTestsParserHook.php", -); diff --git a/tests/parser/ParserTestResult.php b/tests/parser/ParserTestResult.php deleted file mode 100644 index d9ad773d..00000000 --- a/tests/parser/ParserTestResult.php +++ /dev/null @@ -1,42 +0,0 @@ -<?php -/** - * @copyright Copyright © 2013, Antoine Musso - * @copyright Copyright © 2013, Wikimedia Foundation Inc. - * @license GNU GPL v2 - * - * @file - */ - -/** - * Represent the result of a parser test. - * - * @since 1.22 - */ -class ParserTestResult { - /** - * Description of the parser test. - * - * This is usually the text used to describe a parser test in the .txt - * files. It is initialized on a construction and you most probably - * never want to change it. - */ - public $description; - /** Text that was expected */ - public $expected; - /** Actual text rendered */ - public $actual; - - /** - * @param $description string A short text describing the parser test - * usually the text in the parser test .txt file. The description - * is later available using the property $description. - */ - public function __construct( $description ) { - $this->description = $description; - } - - /** Whether the test passed */ - public function isSuccess() { - return $this->expected === $this->actual; - } -} diff --git a/tests/parser/README b/tests/parser/README deleted file mode 100644 index 8b413376..00000000 --- a/tests/parser/README +++ /dev/null @@ -1,8 +0,0 @@ -Parser tests are run using our PHPUnit test suite in tests/phpunit: - - $ cd tests/phpunit - ./phpunit.php --group Parser - -You can optionally filter by title using --regex. I.e. : - - ./phpunit.php --group Parser --regex="Bug 6200" diff --git a/tests/parser/extraParserTests.txt b/tests/parser/extraParserTests.txt Binary files differdeleted file mode 100644 index bef8f506..00000000 --- a/tests/parser/extraParserTests.txt +++ /dev/null diff --git a/tests/parser/parserTest.inc b/tests/parser/parserTest.inc deleted file mode 100644 index 58ea1ed0..00000000 --- a/tests/parser/parserTest.inc +++ /dev/null @@ -1,1465 +0,0 @@ -<?php -/** - * Helper code for the MediaWiki parser test suite. Some code is duplicated - * in PHPUnit's NewParserTests.php, so you'll probably want to update both - * at the same time. - * - * Copyright © 2004, 2010 Brion Vibber <brion@pobox.com> - * http://www.mediawiki.org/ - * - * This program is free software; you can redistribute it and/or modify - * it under the terms of the GNU General Public License as published by - * the Free Software Foundation; either version 2 of the License, or - * (at your option) any later version. - * - * This program is distributed in the hope that it will be useful, - * but WITHOUT ANY WARRANTY; without even the implied warranty of - * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the - * GNU General Public License for more details. - * - * You should have received a copy of the GNU General Public License along - * with this program; if not, write to the Free Software Foundation, Inc., - * 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301, USA. - * http://www.gnu.org/copyleft/gpl.html - * - * @todo Make this more independent of the configuration (and if possible the database) - * @todo document - * @file - * @ingroup Testing - */ - -/** - * @ingroup Testing - */ -class ParserTest { - /** - * @var bool $color whereas output should be colorized - */ - private $color; - - /** - * @var bool $showOutput Show test output - */ - private $showOutput; - - /** - * @var bool $useTemporaryTables Use temporary tables for the temporary database - */ - private $useTemporaryTables = true; - - /** - * @var bool $databaseSetupDone True if the database has been set up - */ - private $databaseSetupDone = false; - - /** - * Our connection to the database - * @var DatabaseBase - */ - private $db; - - /** - * Database clone helper - * @var CloneDatabase - */ - private $dbClone; - - /** - * @var string $oldTablePrefix Original table prefix - */ - private $oldTablePrefix; - - private $maxFuzzTestLength = 300; - private $fuzzSeed = 0; - private $memoryLimit = 50; - private $uploadDir = null; - - public $regex = ""; - private $savedGlobals = array(); - - /** - * Sets terminal colorization and diff/quick modes depending on OS and - * command-line options (--color and --quick). - */ - public function __construct( $options = array() ) { - # Only colorize output if stdout is a terminal. - $this->color = !wfIsWindows() && Maintenance::posix_isatty( 1 ); - - if ( isset( $options['color'] ) ) { - switch ( $options['color'] ) { - case 'no': - $this->color = false; - break; - case 'yes': - default: - $this->color = true; - break; - } - } - - $this->term = $this->color - ? new AnsiTermColorer() - : new DummyTermColorer(); - - $this->showDiffs = !isset( $options['quick'] ); - $this->showProgress = !isset( $options['quiet'] ); - $this->showFailure = !( - isset( $options['quiet'] ) - && ( isset( $options['record'] ) - || isset( $options['compare'] ) ) ); // redundant output - - $this->showOutput = isset( $options['show-output'] ); - - if ( isset( $options['filter'] ) ) { - $options['regex'] = $options['filter']; - } - - if ( isset( $options['regex'] ) ) { - if ( isset( $options['record'] ) ) { - echo "Warning: --record cannot be used with --regex, disabling --record\n"; - unset( $options['record'] ); - } - $this->regex = $options['regex']; - } else { - # Matches anything - $this->regex = ''; - } - - $this->setupRecorder( $options ); - $this->keepUploads = isset( $options['keep-uploads'] ); - - if ( isset( $options['seed'] ) ) { - $this->fuzzSeed = intval( $options['seed'] ) - 1; - } - - $this->runDisabled = isset( $options['run-disabled'] ); - $this->runParsoid = isset( $options['run-parsoid'] ); - - $this->hooks = array(); - $this->functionHooks = array(); - self::setUp(); - } - - static function setUp() { - global $wgParser, $wgParserConf, $IP, $messageMemc, $wgMemc, - $wgUser, $wgLang, $wgOut, $wgRequest, $wgStyleDirectory, $wgEnableParserCache, - $wgExtraNamespaces, $wgNamespaceAliases, $wgNamespaceProtection, $wgLocalFileRepo, - $parserMemc, $wgThumbnailScriptPath, $wgScriptPath, - $wgArticlePath, $wgScript, $wgStylePath, $wgExtensionAssetsPath, - $wgMainCacheType, $wgMessageCacheType, $wgParserCacheType, $wgLockManagers; - - $wgScript = '/index.php'; - $wgScriptPath = '/'; - $wgArticlePath = '/wiki/$1'; - $wgStylePath = '/skins'; - $wgExtensionAssetsPath = '/extensions'; - $wgThumbnailScriptPath = false; - $wgLockManagers = array( array( - 'name' => 'fsLockManager', - 'class' => 'FSLockManager', - 'lockDirectory' => wfTempDir() . '/test-repo/lockdir', - ), array( - 'name' => 'nullLockManager', - 'class' => 'NullLockManager', - ) ); - $wgLocalFileRepo = array( - 'class' => 'LocalRepo', - 'name' => 'local', - 'url' => 'http://example.com/images', - 'hashLevels' => 2, - 'transformVia404' => false, - 'backend' => new FSFileBackend( array( - 'name' => 'local-backend', - 'lockManager' => 'fsLockManager', - 'containerPaths' => array( - 'local-public' => wfTempDir() . '/test-repo/public', - 'local-thumb' => wfTempDir() . '/test-repo/thumb', - 'local-temp' => wfTempDir() . '/test-repo/temp', - 'local-deleted' => wfTempDir() . '/test-repo/deleted', - ) - ) ) - ); - $wgNamespaceProtection[NS_MEDIAWIKI] = 'editinterface'; - $wgNamespaceAliases['Image'] = NS_FILE; - $wgNamespaceAliases['Image_talk'] = NS_FILE_TALK; - # add a namespace shadowing a interwiki link, to test - # proper precedence when resolving links. (bug 51680) - $wgExtraNamespaces[100] = 'MemoryAlpha'; - - // XXX: tests won't run without this (for CACHE_DB) - if ( $wgMainCacheType === CACHE_DB ) { - $wgMainCacheType = CACHE_NONE; - } - if ( $wgMessageCacheType === CACHE_DB ) { - $wgMessageCacheType = CACHE_NONE; - } - if ( $wgParserCacheType === CACHE_DB ) { - $wgParserCacheType = CACHE_NONE; - } - - $wgEnableParserCache = false; - DeferredUpdates::clearPendingUpdates(); - $wgMemc = wfGetMainCache(); // checks $wgMainCacheType - $messageMemc = wfGetMessageCacheStorage(); - $parserMemc = wfGetParserCacheStorage(); - - // $wgContLang = new StubContLang; - $wgUser = new User; - $context = new RequestContext; - $wgLang = $context->getLanguage(); - $wgOut = $context->getOutput(); - $wgParser = new StubObject( 'wgParser', $wgParserConf['class'], array( $wgParserConf ) ); - $wgRequest = $context->getRequest(); - - if ( $wgStyleDirectory === false ) { - $wgStyleDirectory = "$IP/skins"; - } - - self::setupInterwikis(); - } - - /** - * Insert hardcoded interwiki in the lookup table. - * - * This function insert a set of well known interwikis that are used in - * the parser tests. They can be considered has fixtures are injected in - * the interwiki cache by using the 'InterwikiLoadPrefix' hook. - * Since we are not interested in looking up interwikis in the database, - * the hook completely replace the existing mechanism (hook returns false). - */ - public static function setupInterwikis() { - # Hack: insert a few Wikipedia in-project interwiki prefixes, - # for testing inter-language links - Hooks::register( 'InterwikiLoadPrefix', function ( $prefix, &$iwData ) { - static $testInterwikis = array( - 'wikipedia' => array( - 'iw_url' => 'http://en.wikipedia.org/wiki/$1', - 'iw_api' => '', - 'iw_wikiid' => '', - 'iw_local' => 0 ), - 'meatball' => array( - 'iw_url' => 'http://www.usemod.com/cgi-bin/mb.pl?$1', - 'iw_api' => '', - 'iw_wikiid' => '', - 'iw_local' => 0 ), - 'memoryalpha' => array( - 'iw_url' => 'http://www.memory-alpha.org/en/index.php/$1', - 'iw_api' => '', - 'iw_wikiid' => '', - 'iw_local' => 0 ), - 'zh' => array( - 'iw_url' => 'http://zh.wikipedia.org/wiki/$1', - 'iw_api' => '', - 'iw_wikiid' => '', - 'iw_local' => 1 ), - 'es' => array( - 'iw_url' => 'http://es.wikipedia.org/wiki/$1', - 'iw_api' => '', - 'iw_wikiid' => '', - 'iw_local' => 1 ), - 'fr' => array( - 'iw_url' => 'http://fr.wikipedia.org/wiki/$1', - 'iw_api' => '', - 'iw_wikiid' => '', - 'iw_local' => 1 ), - 'ru' => array( - 'iw_url' => 'http://ru.wikipedia.org/wiki/$1', - 'iw_api' => '', - 'iw_wikiid' => '', - 'iw_local' => 1 ), - ); - if ( array_key_exists( $prefix, $testInterwikis ) ) { - $iwData = $testInterwikis[$prefix]; - } - - // We only want to rely on the above fixtures - return false; - } );// hooks::register - } - - /** - * Remove the hardcoded interwiki lookup table. - */ - public static function tearDownInterwikis() { - Hooks::clear( 'InterwikiLoadPrefix' ); - } - - public function setupRecorder( $options ) { - if ( isset( $options['record'] ) ) { - $this->recorder = new DbTestRecorder( $this ); - $this->recorder->version = isset( $options['setversion'] ) ? - $options['setversion'] : SpecialVersion::getVersion(); - } elseif ( isset( $options['compare'] ) ) { - $this->recorder = new DbTestPreviewer( $this ); - } else { - $this->recorder = new TestRecorder( $this ); - } - } - - /** - * Remove last character if it is a newline - * @group utility - */ - public static function chomp( $s ) { - if ( substr( $s, -1 ) === "\n" ) { - return substr( $s, 0, -1 ); - } else { - return $s; - } - } - - /** - * Run a fuzz test series - * Draw input from a set of test files - */ - function fuzzTest( $filenames ) { - $GLOBALS['wgContLang'] = Language::factory( 'en' ); - $dict = $this->getFuzzInput( $filenames ); - $dictSize = strlen( $dict ); - $logMaxLength = log( $this->maxFuzzTestLength ); - $this->setupDatabase(); - ini_set( 'memory_limit', $this->memoryLimit * 1048576 ); - - $numTotal = 0; - $numSuccess = 0; - $user = new User; - $opts = ParserOptions::newFromUser( $user ); - $title = Title::makeTitle( NS_MAIN, 'Parser_test' ); - - while ( true ) { - // Generate test input - mt_srand( ++$this->fuzzSeed ); - $totalLength = mt_rand( 1, $this->maxFuzzTestLength ); - $input = ''; - - while ( strlen( $input ) < $totalLength ) { - $logHairLength = mt_rand( 0, 1000000 ) / 1000000 * $logMaxLength; - $hairLength = min( intval( exp( $logHairLength ) ), $dictSize ); - $offset = mt_rand( 0, $dictSize - $hairLength ); - $input .= substr( $dict, $offset, $hairLength ); - } - - $this->setupGlobals(); - $parser = $this->getParser(); - - // Run the test - try { - $parser->parse( $input, $title, $opts ); - $fail = false; - } catch ( Exception $exception ) { - $fail = true; - } - - if ( $fail ) { - echo "Test failed with seed {$this->fuzzSeed}\n"; - echo "Input:\n"; - printf( "string(%d) \"%s\"\n\n", strlen( $input ), $input ); - echo "$exception\n"; - } else { - $numSuccess++; - } - - $numTotal++; - $this->teardownGlobals(); - $parser->__destruct(); - - if ( $numTotal % 100 == 0 ) { - $usage = intval( memory_get_usage( true ) / $this->memoryLimit / 1048576 * 100 ); - echo "{$this->fuzzSeed}: $numSuccess/$numTotal (mem: $usage%)\n"; - if ( $usage > 90 ) { - echo "Out of memory:\n"; - $memStats = $this->getMemoryBreakdown(); - - foreach ( $memStats as $name => $usage ) { - echo "$name: $usage\n"; - } - $this->abort(); - } - } - } - } - - /** - * Get an input dictionary from a set of parser test files - */ - function getFuzzInput( $filenames ) { - $dict = ''; - - foreach ( $filenames as $filename ) { - $contents = file_get_contents( $filename ); - preg_match_all( '/!!\s*input\n(.*?)\n!!\s*result/s', $contents, $matches ); - - foreach ( $matches[1] as $match ) { - $dict .= $match . "\n"; - } - } - - return $dict; - } - - /** - * Get a memory usage breakdown - */ - function getMemoryBreakdown() { - $memStats = array(); - - foreach ( $GLOBALS as $name => $value ) { - $memStats['$' . $name] = strlen( serialize( $value ) ); - } - - $classes = get_declared_classes(); - - foreach ( $classes as $class ) { - $rc = new ReflectionClass( $class ); - $props = $rc->getStaticProperties(); - $memStats[$class] = strlen( serialize( $props ) ); - $methods = $rc->getMethods(); - - foreach ( $methods as $method ) { - $memStats[$class] += strlen( serialize( $method->getStaticVariables() ) ); - } - } - - $functions = get_defined_functions(); - - foreach ( $functions['user'] as $function ) { - $rf = new ReflectionFunction( $function ); - $memStats["$function()"] = strlen( serialize( $rf->getStaticVariables() ) ); - } - - asort( $memStats ); - - return $memStats; - } - - function abort() { - $this->abort(); - } - - /** - * Run a series of tests listed in the given text files. - * Each test consists of a brief description, wikitext input, - * and the expected HTML output. - * - * Prints status updates on stdout and counts up the total - * number and percentage of passed tests. - * - * @param $filenames Array of strings - * @return Boolean: true if passed all tests, false if any tests failed. - */ - public function runTestsFromFiles( $filenames ) { - $ok = false; - - // be sure, ParserTest::addArticle has correct language set, - // so that system messages gets into the right language cache - $GLOBALS['wgLanguageCode'] = 'en'; - $GLOBALS['wgContLang'] = Language::factory( 'en' ); - - $this->recorder->start(); - try { - $this->setupDatabase(); - $ok = true; - - foreach ( $filenames as $filename ) { - $tests = new TestFileIterator( $filename, $this ); - $ok = $this->runTests( $tests ) && $ok; - } - - $this->teardownDatabase(); - $this->recorder->report(); - } catch ( DBError $e ) { - echo $e->getMessage(); - } - $this->recorder->end(); - - return $ok; - } - - function runTests( $tests ) { - $ok = true; - - foreach ( $tests as $t ) { - $result = - $this->runTest( $t['test'], $t['input'], $t['result'], $t['options'], $t['config'] ); - $ok = $ok && $result; - $this->recorder->record( $t['test'], $result ); - } - - if ( $this->showProgress ) { - print "\n"; - } - - return $ok; - } - - /** - * Get a Parser object - * - * @param string $preprocessor - * @return Parser - */ - function getParser( $preprocessor = null ) { - global $wgParserConf; - - $class = $wgParserConf['class']; - $parser = new $class( array( 'preprocessorClass' => $preprocessor ) + $wgParserConf ); - - foreach ( $this->hooks as $tag => $callback ) { - $parser->setHook( $tag, $callback ); - } - - foreach ( $this->functionHooks as $tag => $bits ) { - list( $callback, $flags ) = $bits; - $parser->setFunctionHook( $tag, $callback, $flags ); - } - - wfRunHooks( 'ParserTestParser', array( &$parser ) ); - - return $parser; - } - - /** - * Run a given wikitext input through a freshly-constructed wiki parser, - * and compare the output against the expected results. - * Prints status and explanatory messages to stdout. - * - * @param $desc String: test's description - * @param $input String: wikitext to try rendering - * @param $result String: result to output - * @param $opts Array: test's options - * @param $config String: overrides for global variables, one per line - * @return Boolean - */ - public function runTest( $desc, $input, $result, $opts, $config ) { - if ( $this->showProgress ) { - $this->showTesting( $desc ); - } - - $opts = $this->parseOptions( $opts ); - $context = $this->setupGlobals( $opts, $config ); - - $user = $context->getUser(); - $options = ParserOptions::newFromContext( $context ); - - if ( isset( $opts['title'] ) ) { - $titleText = $opts['title']; - } else { - $titleText = 'Parser test'; - } - - $local = isset( $opts['local'] ); - $preprocessor = isset( $opts['preprocessor'] ) ? $opts['preprocessor'] : null; - $parser = $this->getParser( $preprocessor ); - $title = Title::newFromText( $titleText ); - - if ( isset( $opts['pst'] ) ) { - $out = $parser->preSaveTransform( $input, $title, $user, $options ); - } elseif ( isset( $opts['msg'] ) ) { - $out = $parser->transformMsg( $input, $options, $title ); - } elseif ( isset( $opts['section'] ) ) { - $section = $opts['section']; - $out = $parser->getSection( $input, $section ); - } elseif ( isset( $opts['replace'] ) ) { - $section = $opts['replace'][0]; - $replace = $opts['replace'][1]; - $out = $parser->replaceSection( $input, $section, $replace ); - } elseif ( isset( $opts['comment'] ) ) { - $out = Linker::formatComment( $input, $title, $local ); - } elseif ( isset( $opts['preload'] ) ) { - $out = $parser->getPreloadText( $input, $title, $options ); - } else { - $output = $parser->parse( $input, $title, $options, true, true, 1337 ); - $output->setTOCEnabled( !isset( $opts['notoc'] ) ); - $out = $output->getText(); - - if ( isset( $opts['showtitle'] ) ) { - if ( $output->getTitleText() ) { - $title = $output->getTitleText(); - } - - $out = "$title\n$out"; - } - - if ( isset( $opts['ill'] ) ) { - $out = $this->tidy( implode( ' ', $output->getLanguageLinks() ) ); - } elseif ( isset( $opts['cat'] ) ) { - $outputPage = $context->getOutput(); - $outputPage->addCategoryLinks( $output->getCategories() ); - $cats = $outputPage->getCategoryLinks(); - - if ( isset( $cats['normal'] ) ) { - $out = $this->tidy( implode( ' ', $cats['normal'] ) ); - } else { - $out = ''; - } - } - - $result = $this->tidy( $result ); - } - - $this->teardownGlobals(); - - $testResult = new ParserTestResult( $desc ); - $testResult->expected = $result; - $testResult->actual = $out; - - return $this->showTestResult( $testResult ); - } - - /** - * Refactored in 1.22 to use ParserTestResult - */ - function showTestResult( ParserTestResult $testResult ) { - if ( $testResult->isSuccess() ) { - $this->showSuccess( $testResult ); - return true; - } else { - $this->showFailure( $testResult ); - return false; - } - } - - /** - * Use a regex to find out the value of an option - * @param $key String: name of option val to retrieve - * @param $opts array: Options array to look in - * @param $default Mixed: default value returned if not found - */ - private static function getOptionValue( $key, $opts, $default ) { - $key = strtolower( $key ); - - if ( isset( $opts[$key] ) ) { - return $opts[$key]; - } else { - return $default; - } - } - - private function parseOptions( $instring ) { - $opts = array(); - // foo - // foo=bar - // foo="bar baz" - // foo=[[bar baz]] - // foo=bar,"baz quux" - $regex = '/\b - ([\w-]+) # Key - \b - (?:\s* - = # First sub-value - \s* - ( - " - [^"]* # Quoted val - " - | - \[\[ - [^]]* # Link target - \]\] - | - [\w-]+ # Plain word - ) - (?:\s* - , # Sub-vals 1..N - \s* - ( - "[^"]*" # Quoted val - | - \[\[[^]]*\]\] # Link target - | - [\w-]+ # Plain word - ) - )* - )? - /x'; - - if ( preg_match_all( $regex, $instring, $matches, PREG_SET_ORDER ) ) { - foreach ( $matches as $bits ) { - array_shift( $bits ); - $key = strtolower( array_shift( $bits ) ); - if ( count( $bits ) == 0 ) { - $opts[$key] = true; - } elseif ( count( $bits ) == 1 ) { - $opts[$key] = $this->cleanupOption( array_shift( $bits ) ); - } else { - // Array! - $opts[$key] = array_map( array( $this, 'cleanupOption' ), $bits ); - } - } - } - return $opts; - } - - private function cleanupOption( $opt ) { - if ( substr( $opt, 0, 1 ) == '"' ) { - return substr( $opt, 1, -1 ); - } - - if ( substr( $opt, 0, 2 ) == '[[' ) { - return substr( $opt, 2, -2 ); - } - return $opt; - } - - /** - * Set up the global variables for a consistent environment for each test. - * Ideally this should replace the global configuration entirely. - */ - private function setupGlobals( $opts = '', $config = '' ) { - # Find out values for some special options. - $lang = - self::getOptionValue( 'language', $opts, 'en' ); - $variant = - self::getOptionValue( 'variant', $opts, false ); - $maxtoclevel = - self::getOptionValue( 'wgMaxTocLevel', $opts, 999 ); - $linkHolderBatchSize = - self::getOptionValue( 'wgLinkHolderBatchSize', $opts, 1000 ); - - $settings = array( - 'wgServer' => 'http://example.org', - 'wgScript' => '/index.php', - 'wgScriptPath' => '/', - 'wgArticlePath' => '/wiki/$1', - 'wgActionPaths' => array(), - 'wgLockManagers' => array( array( - 'name' => 'fsLockManager', - 'class' => 'FSLockManager', - 'lockDirectory' => $this->uploadDir . '/lockdir', - ), array( - 'name' => 'nullLockManager', - 'class' => 'NullLockManager', - ) ), - 'wgLocalFileRepo' => array( - 'class' => 'LocalRepo', - 'name' => 'local', - 'url' => 'http://example.com/images', - 'hashLevels' => 2, - 'transformVia404' => false, - 'backend' => new FSFileBackend( array( - 'name' => 'local-backend', - 'lockManager' => 'fsLockManager', - 'containerPaths' => array( - 'local-public' => $this->uploadDir, - 'local-thumb' => $this->uploadDir . '/thumb', - 'local-temp' => $this->uploadDir . '/temp', - 'local-deleted' => $this->uploadDir . '/delete', - ) - ) ) - ), - 'wgEnableUploads' => self::getOptionValue( 'wgEnableUploads', $opts, true ), - 'wgStylePath' => '/skins', - 'wgSitename' => 'MediaWiki', - 'wgLanguageCode' => $lang, - 'wgDBprefix' => $this->db->getType() != 'oracle' ? 'parsertest_' : 'pt_', - 'wgRawHtml' => self::getOptionValue( 'wgRawHtml', $opts, false ), - 'wgLang' => null, - 'wgContLang' => null, - 'wgNamespacesWithSubpages' => array( 0 => isset( $opts['subpage'] ) ), - 'wgMaxTocLevel' => $maxtoclevel, - 'wgCapitalLinks' => true, - 'wgNoFollowLinks' => true, - 'wgNoFollowDomainExceptions' => array(), - 'wgThumbnailScriptPath' => false, - 'wgUseImageResize' => true, - 'wgSVGConverter' => 'null', - 'wgSVGConverters' => array( 'null' => 'echo "1">$output' ), - 'wgLocaltimezone' => 'UTC', - 'wgAllowExternalImages' => self::getOptionValue( 'wgAllowExternalImages', $opts, true ), - 'wgUseTidy' => false, - 'wgDefaultLanguageVariant' => $variant, - 'wgVariantArticlePath' => false, - 'wgGroupPermissions' => array( '*' => array( - 'createaccount' => true, - 'read' => true, - 'edit' => true, - 'createpage' => true, - 'createtalk' => true, - ) ), - 'wgNamespaceProtection' => array( NS_MEDIAWIKI => 'editinterface' ), - 'wgDefaultExternalStore' => array(), - 'wgForeignFileRepos' => array(), - 'wgLinkHolderBatchSize' => $linkHolderBatchSize, - 'wgExperimentalHtmlIds' => false, - 'wgExternalLinkTarget' => false, - 'wgAlwaysUseTidy' => false, - 'wgHtml5' => true, - 'wgWellFormedXml' => true, - 'wgAllowMicrodataAttributes' => true, - 'wgAdaptiveMessageCache' => true, - 'wgDisableLangConversion' => false, - 'wgDisableTitleConversion' => false, - ); - - if ( $config ) { - $configLines = explode( "\n", $config ); - - foreach ( $configLines as $line ) { - list( $var, $value ) = explode( '=', $line, 2 ); - - $settings[$var] = eval( "return $value;" ); - } - } - - $this->savedGlobals = array(); - - /** @since 1.20 */ - wfRunHooks( 'ParserTestGlobals', array( &$settings ) ); - - foreach ( $settings as $var => $val ) { - if ( array_key_exists( $var, $GLOBALS ) ) { - $this->savedGlobals[$var] = $GLOBALS[$var]; - } - - $GLOBALS[$var] = $val; - } - - $GLOBALS['wgContLang'] = Language::factory( $lang ); - $GLOBALS['wgMemc'] = new EmptyBagOStuff; - - $context = new RequestContext(); - $GLOBALS['wgLang'] = $context->getLanguage(); - $GLOBALS['wgOut'] = $context->getOutput(); - - $GLOBALS['wgUser'] = new User(); - - global $wgHooks; - - $wgHooks['ParserTestParser'][] = 'ParserTestParserHook::setup'; - $wgHooks['ParserGetVariableValueTs'][] = 'ParserTest::getFakeTimestamp'; - - MagicWord::clearCache(); - - return $context; - } - - /** - * List of temporary tables to create, without prefix. - * Some of these probably aren't necessary. - */ - private function listTables() { - $tables = array( 'user', 'user_properties', 'user_former_groups', 'page', 'page_restrictions', - 'protected_titles', 'revision', 'text', 'pagelinks', 'imagelinks', - 'categorylinks', 'templatelinks', 'externallinks', 'langlinks', 'iwlinks', - 'site_stats', 'hitcounter', 'ipblocks', 'image', 'oldimage', - 'recentchanges', 'watchlist', 'interwiki', 'logging', - 'querycache', 'objectcache', 'job', 'l10n_cache', 'redirect', 'querycachetwo', - 'archive', 'user_groups', 'page_props', 'category', 'msg_resource', 'msg_resource_links' - ); - - if ( in_array( $this->db->getType(), array( 'mysql', 'sqlite', 'oracle' ) ) ) { - array_push( $tables, 'searchindex' ); - } - - // Allow extensions to add to the list of tables to duplicate; - // may be necessary if they hook into page save or other code - // which will require them while running tests. - wfRunHooks( 'ParserTestTables', array( &$tables ) ); - - return $tables; - } - - /** - * Set up a temporary set of wiki tables to work with for the tests. - * Currently this will only be done once per run, and any changes to - * the db will be visible to later tests in the run. - */ - public function setupDatabase() { - global $wgDBprefix; - - if ( $this->databaseSetupDone ) { - return; - } - - $this->db = wfGetDB( DB_MASTER ); - $dbType = $this->db->getType(); - - if ( $wgDBprefix === 'parsertest_' || ( $dbType == 'oracle' && $wgDBprefix === 'pt_' ) ) { - throw new MWException( 'setupDatabase should be called before setupGlobals' ); - } - - $this->databaseSetupDone = true; - $this->oldTablePrefix = $wgDBprefix; - - # SqlBagOStuff broke when using temporary tables on r40209 (bug 15892). - # It seems to have been fixed since (r55079?), but regressed at some point before r85701. - # This works around it for now... - ObjectCache::$instances[CACHE_DB] = new HashBagOStuff; - - # CREATE TEMPORARY TABLE breaks if there is more than one server - if ( wfGetLB()->getServerCount() != 1 ) { - $this->useTemporaryTables = false; - } - - $temporary = $this->useTemporaryTables || $dbType == 'postgres'; - $prefix = $dbType != 'oracle' ? 'parsertest_' : 'pt_'; - - $this->dbClone = new CloneDatabase( $this->db, $this->listTables(), $prefix ); - $this->dbClone->useTemporaryTables( $temporary ); - $this->dbClone->cloneTableStructure(); - - if ( $dbType == 'oracle' ) { - $this->db->query( 'BEGIN FILL_WIKI_INFO; END;' ); - # Insert 0 user to prevent FK violations - - # Anonymous user - $this->db->insert( 'user', array( - 'user_id' => 0, - 'user_name' => 'Anonymous' ) ); - } - - # Update certain things in site_stats - $this->db->insert( 'site_stats', - array( 'ss_row_id' => 1, 'ss_images' => 2, 'ss_good_articles' => 1 ) ); - - # Reinitialise the LocalisationCache to match the database state - Language::getLocalisationCache()->unloadAll(); - - # Clear the message cache - MessageCache::singleton()->clear(); - - // Remember to update newParserTests.php after changing the below - // (and it uses a slightly different syntax just for teh lulz) - $this->uploadDir = $this->setupUploadDir(); - $user = User::createNew( 'WikiSysop' ); - $image = wfLocalFile( Title::makeTitle( NS_FILE, 'Foobar.jpg' ) ); - # note that the size/width/height/bits/etc of the file - # are actually set by inspecting the file itself; the arguments - # to recordUpload2 have no effect. That said, we try to make things - # match up so it is less confusing to readers of the code & tests. - $image->recordUpload2( '', 'Upload of some lame file', 'Some lame file', array( - 'size' => 7881, - 'width' => 1941, - 'height' => 220, - 'bits' => 8, - 'media_type' => MEDIATYPE_BITMAP, - 'mime' => 'image/jpeg', - 'metadata' => serialize( array() ), - 'sha1' => wfBaseConvert( '1', 16, 36, 31 ), - 'fileExists' => true - ), $this->db->timestamp( '20010115123500' ), $user ); - - $image = wfLocalFile( Title::makeTitle( NS_FILE, 'Thumb.png' ) ); - # again, note that size/width/height below are ignored; see above. - $image->recordUpload2( '', 'Upload of some lame thumbnail', 'Some lame thumbnail', array( - 'size' => 22589, - 'width' => 135, - 'height' => 135, - 'bits' => 8, - 'media_type' => MEDIATYPE_BITMAP, - 'mime' => 'image/png', - 'metadata' => serialize( array() ), - 'sha1' => wfBaseConvert( '2', 16, 36, 31 ), - 'fileExists' => true - ), $this->db->timestamp( '20130225203040' ), $user ); - - $image = wfLocalFile( Title::makeTitle( NS_FILE, 'Foobar.svg' ) ); - $image->recordUpload2( '', 'Upload of some lame SVG', 'Some lame SVG', array( - 'size' => 12345, - 'width' => 240, - 'height' => 180, - 'bits' => 24, - 'media_type' => MEDIATYPE_DRAWING, - 'mime' => 'image/svg+xml', - 'metadata' => serialize( array() ), - 'sha1' => wfBaseConvert( '', 16, 36, 31 ), - 'fileExists' => true - ), $this->db->timestamp( '20010115123500' ), $user ); - - # This image will be blacklisted in [[MediaWiki:Bad image list]] - $image = wfLocalFile( Title::makeTitle( NS_FILE, 'Bad.jpg' ) ); - $image->recordUpload2( '', 'zomgnotcensored', 'Borderline image', array( - 'size' => 12345, - 'width' => 320, - 'height' => 240, - 'bits' => 24, - 'media_type' => MEDIATYPE_BITMAP, - 'mime' => 'image/jpeg', - 'metadata' => serialize( array() ), - 'sha1' => wfBaseConvert( '3', 16, 36, 31 ), - 'fileExists' => true - ), $this->db->timestamp( '20010115123500' ), $user ); - } - - public function teardownDatabase() { - if ( !$this->databaseSetupDone ) { - $this->teardownGlobals(); - return; - } - $this->teardownUploadDir( $this->uploadDir ); - - $this->dbClone->destroy(); - $this->databaseSetupDone = false; - - if ( $this->useTemporaryTables ) { - if ( $this->db->getType() == 'sqlite' ) { - # Under SQLite the searchindex table is virtual and need - # to be explicitly destroyed. See bug 29912 - # See also MediaWikiTestCase::destroyDB() - wfDebug( __METHOD__ . " explicitly destroying sqlite virtual table parsertest_searchindex\n" ); - $this->db->query( "DROP TABLE `parsertest_searchindex`" ); - } - # Don't need to do anything - $this->teardownGlobals(); - return; - } - - $tables = $this->listTables(); - - foreach ( $tables as $table ) { - if ( $this->db->getType() == 'oracle' ) { - $this->db->query( "DROP TABLE pt_$table DROP CONSTRAINTS" ); - } else { - $this->db->query( "DROP TABLE `parsertest_$table`" ); - } - } - - if ( $this->db->getType() == 'oracle' ) { - $this->db->query( 'BEGIN FILL_WIKI_INFO; END;' ); - } - - $this->teardownGlobals(); - } - - /** - * Create a dummy uploads directory which will contain a couple - * of files in order to pass existence tests. - * - * @return String: the directory - */ - private function setupUploadDir() { - global $IP; - - if ( $this->keepUploads ) { - $dir = wfTempDir() . '/mwParser-images'; - - if ( is_dir( $dir ) ) { - return $dir; - } - } else { - $dir = wfTempDir() . "/mwParser-" . mt_rand() . "-images"; - } - - // wfDebug( "Creating upload directory $dir\n" ); - if ( file_exists( $dir ) ) { - wfDebug( "Already exists!\n" ); - return $dir; - } - - wfMkdirParents( $dir . '/3/3a', null, __METHOD__ ); - copy( "$IP/skins/monobook/headbg.jpg", "$dir/3/3a/Foobar.jpg" ); - wfMkdirParents( $dir . '/e/ea', null, __METHOD__ ); - copy( "$IP/skins/monobook/wiki.png", "$dir/e/ea/Thumb.png" ); - wfMkdirParents( $dir . '/0/09', null, __METHOD__ ); - copy( "$IP/skins/monobook/headbg.jpg", "$dir/0/09/Bad.jpg" ); - wfMkdirParents( $dir . '/f/ff', null, __METHOD__ ); - copy( "$IP/skins/monobook/headbg.jpg", "$dir/f/ff/Foobar.svg" ); - file_put_contents( "$dir/f/ff/Foobar.svg", - '<?xml version="1.0" encoding="utf-8"?>' . - '<svg xmlns="http://www.w3.org/2000/svg" />' ); - return $dir; - } - - /** - * Restore default values and perform any necessary clean-up - * after each test runs. - */ - private function teardownGlobals() { - RepoGroup::destroySingleton(); - FileBackendGroup::destroySingleton(); - LockManagerGroup::destroySingletons(); - LinkCache::singleton()->clear(); - - foreach ( $this->savedGlobals as $var => $val ) { - $GLOBALS[$var] = $val; - } - } - - /** - * Remove the dummy uploads directory - */ - private function teardownUploadDir( $dir ) { - if ( $this->keepUploads ) { - return; - } - - // delete the files first, then the dirs. - self::deleteFiles( - array( - "$dir/3/3a/Foobar.jpg", - "$dir/thumb/3/3a/Foobar.jpg/180px-Foobar.jpg", - "$dir/thumb/3/3a/Foobar.jpg/200px-Foobar.jpg", - "$dir/thumb/3/3a/Foobar.jpg/640px-Foobar.jpg", - "$dir/thumb/3/3a/Foobar.jpg/120px-Foobar.jpg", - "$dir/thumb/3/3a/Foobar.jpg/1280px-Foobar.jpg", - "$dir/thumb/3/3a/Foobar.jpg/20px-Foobar.jpg", - "$dir/thumb/3/3a/Foobar.jpg/270px-Foobar.jpg", - "$dir/thumb/3/3a/Foobar.jpg/300px-Foobar.jpg", - "$dir/thumb/3/3a/Foobar.jpg/30px-Foobar.jpg", - "$dir/thumb/3/3a/Foobar.jpg/360px-Foobar.jpg", - "$dir/thumb/3/3a/Foobar.jpg/400px-Foobar.jpg", - "$dir/thumb/3/3a/Foobar.jpg/40px-Foobar.jpg", - "$dir/thumb/3/3a/Foobar.jpg/70px-Foobar.jpg", - "$dir/thumb/3/3a/Foobar.jpg/960px-Foobar.jpg", - - "$dir/e/ea/Thumb.png", - - "$dir/0/09/Bad.jpg", - - "$dir/f/ff/Foobar.svg", - "$dir/thumb/f/ff/Foobar.svg/180px-Foobar.svg.png", - "$dir/thumb/f/ff/Foobar.svg/360px-Foobar.svg.png", - "$dir/thumb/f/ff/Foobar.svg/langde-270px-Foobar.svg.png", - "$dir/thumb/f/ff/Foobar.svg/270px-Foobar.svg.png", - "$dir/thumb/f/ff/Foobar.svg/langde-180px-Foobar.svg.png", - "$dir/thumb/f/ff/Foobar.svg/langde-360px-Foobar.svg.png", - - "$dir/math/f/a/5/fa50b8b616463173474302ca3e63586b.png", - ) - ); - - self::deleteDirs( - array( - "$dir/3/3a", - "$dir/3", - "$dir/thumb/6/65", - "$dir/thumb/6", - "$dir/thumb/3/3a/Foobar.jpg", - "$dir/thumb/3/3a", - "$dir/thumb/3", - "$dir/e/ea", - "$dir/e", - "$dir/f/ff/", - "$dir/f/", - "$dir/thumb/f/ff/Foobar.svg", - "$dir/thumb/f/ff/", - "$dir/thumb/f/", - "$dir/0/09/", - "$dir/0/", - "$dir/thumb", - "$dir/math/f/a/5", - "$dir/math/f/a", - "$dir/math/f", - "$dir/math", - "$dir", - ) - ); - } - - /** - * Delete the specified files, if they exist. - * @param $files Array: full paths to files to delete. - */ - private static function deleteFiles( $files ) { - foreach ( $files as $file ) { - if ( file_exists( $file ) ) { - unlink( $file ); - } - } - } - - /** - * Delete the specified directories, if they exist. Must be empty. - * @param $dirs Array: full paths to directories to delete. - */ - private static function deleteDirs( $dirs ) { - foreach ( $dirs as $dir ) { - if ( is_dir( $dir ) ) { - rmdir( $dir ); - } - } - } - - /** - * "Running test $desc..." - */ - protected function showTesting( $desc ) { - print "Running test $desc... "; - } - - /** - * Print a happy success message. - * - * Refactored in 1.22 to use ParserTestResult - * - * @param $testResult ParserTestResult - * @return Boolean - */ - protected function showSuccess( ParserTestResult $testResult ) { - if ( $this->showProgress ) { - print $this->term->color( '1;32' ) . 'PASSED' . $this->term->reset() . "\n"; - } - - return true; - } - - /** - * Print a failure message and provide some explanatory output - * about what went wrong if so configured. - * - * Refactored in 1.22 to use ParserTestResult - * - * @param $testResult ParserTestResult - * @return Boolean - */ - protected function showFailure( ParserTestResult $testResult ) { - if ( $this->showFailure ) { - if ( !$this->showProgress ) { - # In quiet mode we didn't show the 'Testing' message before the - # test, in case it succeeded. Show it now: - $this->showTesting( $testResult->description ); - } - - print $this->term->color( '31' ) . 'FAILED!' . $this->term->reset() . "\n"; - - if ( $this->showOutput ) { - print "--- Expected ---\n{$testResult->expected}\n"; - print "--- Actual ---\n{$testResult->actual}\n"; - } - - if ( $this->showDiffs ) { - print $this->quickDiff( $testResult->expected, $testResult->actual ); - if ( !$this->wellFormed( $testResult->actual ) ) { - print "XML error: $this->mXmlError\n"; - } - } - } - - return false; - } - - /** - * Run given strings through a diff and return the (colorized) output. - * Requires writable /tmp directory and a 'diff' command in the PATH. - * - * @param $input String - * @param $output String - * @param $inFileTail String: tailing for the input file name - * @param $outFileTail String: tailing for the output file name - * @return String - */ - protected function quickDiff( $input, $output, - $inFileTail = 'expected', $outFileTail = 'actual' - ) { - # Windows, or at least the fc utility, is retarded - $slash = wfIsWindows() ? '\\' : '/'; - $prefix = wfTempDir() . "{$slash}mwParser-" . mt_rand(); - - $infile = "$prefix-$inFileTail"; - $this->dumpToFile( $input, $infile ); - - $outfile = "$prefix-$outFileTail"; - $this->dumpToFile( $output, $outfile ); - - $shellInfile = wfEscapeShellArg( $infile ); - $shellOutfile = wfEscapeShellArg( $outfile ); - - global $wgDiff3; - // we assume that people with diff3 also have usual diff - $shellCommand = ( wfIsWindows() && !$wgDiff3 ) ? 'fc' : 'diff -au'; - - $diff = wfShellExec( "$shellCommand $shellInfile $shellOutfile" ); - - unlink( $infile ); - unlink( $outfile ); - - return $this->colorDiff( $diff ); - } - - /** - * Write the given string to a file, adding a final newline. - * - * @param $data String - * @param $filename String - */ - private function dumpToFile( $data, $filename ) { - $file = fopen( $filename, "wt" ); - fwrite( $file, $data . "\n" ); - fclose( $file ); - } - - /** - * Colorize unified diff output if set for ANSI color output. - * Subtractions are colored blue, additions red. - * - * @param $text String - * @return String - */ - protected function colorDiff( $text ) { - return preg_replace( - array( '/^(-.*)$/m', '/^(\+.*)$/m' ), - array( $this->term->color( 34 ) . '$1' . $this->term->reset(), - $this->term->color( 31 ) . '$1' . $this->term->reset() ), - $text ); - } - - /** - * Show "Reading tests from ..." - * - * @param $path String - */ - public function showRunFile( $path ) { - print $this->term->color( 1 ) . - "Reading tests from \"$path\"..." . - $this->term->reset() . - "\n"; - } - - /** - * Insert a temporary test article - * @param $name String: the title, including any prefix - * @param $text String: the article text - * @param $line Integer: the input line number, for reporting errors - * @param $ignoreDuplicate Boolean: whether to silently ignore duplicate pages - */ - public static function addArticle( $name, $text, $line = 'unknown', $ignoreDuplicate = '' ) { - global $wgCapitalLinks; - - $oldCapitalLinks = $wgCapitalLinks; - $wgCapitalLinks = true; // We only need this from SetupGlobals() See r70917#c8637 - - $text = self::chomp( $text ); - $name = self::chomp( $name ); - - $title = Title::newFromText( $name ); - - if ( is_null( $title ) ) { - throw new MWException( "invalid title '$name' at line $line\n" ); - } - - $page = WikiPage::factory( $title ); - $page->loadPageData( 'fromdbmaster' ); - - if ( $page->exists() ) { - if ( $ignoreDuplicate == 'ignoreduplicate' ) { - return; - } else { - throw new MWException( "duplicate article '$name' at line $line\n" ); - } - } - - $page->doEditContent( ContentHandler::makeContent( $text, $title ), '', EDIT_NEW ); - - $wgCapitalLinks = $oldCapitalLinks; - } - - /** - * Steal a callback function from the primary parser, save it for - * application to our scary parser. If the hook is not installed, - * abort processing of this file. - * - * @param $name String - * @return Bool true if tag hook is present - */ - public function requireHook( $name ) { - global $wgParser; - - $wgParser->firstCallInit(); // make sure hooks are loaded. - - if ( isset( $wgParser->mTagHooks[$name] ) ) { - $this->hooks[$name] = $wgParser->mTagHooks[$name]; - } else { - echo " This test suite requires the '$name' hook extension, skipping.\n"; - return false; - } - - return true; - } - - /** - * Steal a callback function from the primary parser, save it for - * application to our scary parser. If the hook is not installed, - * abort processing of this file. - * - * @param $name String - * @return Bool true if function hook is present - */ - public function requireFunctionHook( $name ) { - global $wgParser; - - $wgParser->firstCallInit(); // make sure hooks are loaded. - - if ( isset( $wgParser->mFunctionHooks[$name] ) ) { - $this->functionHooks[$name] = $wgParser->mFunctionHooks[$name]; - } else { - echo " This test suite requires the '$name' function hook extension, skipping.\n"; - return false; - } - - return true; - } - - /** - * Run the "tidy" command on text if the $wgUseTidy - * global is true - * - * @param $text String: the text to tidy - * @return String - */ - private function tidy( $text ) { - global $wgUseTidy; - - if ( $wgUseTidy ) { - $text = MWTidy::tidy( $text ); - } - - return $text; - } - - private function wellFormed( $text ) { - $html = - Sanitizer::hackDocType() . - '<html>' . - $text . - '</html>'; - - $parser = xml_parser_create( "UTF-8" ); - - # case folding violates XML standard, turn it off - xml_parser_set_option( $parser, XML_OPTION_CASE_FOLDING, false ); - - if ( !xml_parse( $parser, $html, true ) ) { - $err = xml_error_string( xml_get_error_code( $parser ) ); - $position = xml_get_current_byte_index( $parser ); - $fragment = $this->extractFragment( $html, $position ); - $this->mXmlError = "$err at byte $position:\n$fragment"; - xml_parser_free( $parser ); - - return false; - } - - xml_parser_free( $parser ); - - return true; - } - - private function extractFragment( $text, $position ) { - $start = max( 0, $position - 10 ); - $before = $position - $start; - $fragment = '...' . - $this->term->color( 34 ) . - substr( $text, $start, $before ) . - $this->term->color( 0 ) . - $this->term->color( 31 ) . - $this->term->color( 1 ) . - substr( $text, $position, 1 ) . - $this->term->color( 0 ) . - $this->term->color( 34 ) . - substr( $text, $position + 1, 9 ) . - $this->term->color( 0 ) . - '...'; - $display = str_replace( "\n", ' ', $fragment ); - $caret = ' ' . - str_repeat( ' ', $before ) . - $this->term->color( 31 ) . - '^' . - $this->term->color( 0 ); - - return "$display\n$caret"; - } - - static function getFakeTimestamp( &$parser, &$ts ) { - $ts = 123; //parsed as '1970-01-01T00:02:03Z' - return true; - } -} diff --git a/tests/parser/parserTests.txt b/tests/parser/parserTests.txt deleted file mode 100644 index 9658e8f8..00000000 --- a/tests/parser/parserTests.txt +++ /dev/null @@ -1,18591 +0,0 @@ -# MediaWiki Parser test cases -# Some taken from http://meta.wikimedia.org/wiki/Parser_testing -# All (C) their respective authors and released under the GPL -# -# The syntax should be fairly self-explanatory. -# -# Currently supported test options: -# One of the following three: -# -# (default) generate HTML output -# pst apply pre-save transform -# msg apply message transform -# -# Plus any combination of these: -# -# cat add category links -# ill add inter-language links -# subpage enable subpages (disabled by default) -# noxml don't check for XML well formdness -# title=[[XXX]] run test using article title XXX -# language=XXX set content language to XXX for this test -# variant=XXX set the variant of language for this test (eg zh-tw) -# disabled do not run test -# parsoid parsoid-only test (not run by PHP parser) -# php php-only test (not run by the parsoid parser) -# showtitle make the first line the title -# comment run through Linker::formatComment() instead of main parser -# local format section links in edit comment text as local links -# notoc disable table of contents -# -# You can also set the following parser properties via test options: -# wgEnableUploads, wgAllowExternalImages, wgMaxTocLevel, -# wgLinkHolderBatchSize, wgRawHtml -# -# For testing purposes, temporary articles can created: -# !!article / NAMESPACE:TITLE / !!text / ARTICLE TEXT / !!endarticle -# where '/' denotes a newline. - -# This is the standard article assumed to exist. -!! article -Main Page -!! text -blah blah -!! endarticle - -!!article -Template:Foo -!!text -FOO -!!endarticle - -!! article -Template:Blank -!! text -!! endarticle - -!! article -Template:pipe -!! text -| -!! endarticle - -!!article -MediaWiki:bad image list -!!text -* [[File:Bad.jpg]] except [[Nasty page]] -!!endarticle - -!! article -Template:inner list -!! text -* item 1 -!! endarticle - -!! article -Template:tbl-start -!! text -{| -!! endarticle - -!! article -Template:tbl-end -!! text -|} -!! endarticle - -!! article -Template:! -!! text -| -!! endarticle - -!! article -Template:echo -!! text -{{{1}}} -!! endarticle - -!! article -Template:echo_with_span -!! text -<span>{{{1}}}</span> -!! endarticle - -!! article -Template:echo_with_div -!! text -<div>{{{1}}}</div> -!! endarticle - -!! article -Template:attr_str -!! text -{{{1}}}="{{{2}}}" -!! endarticle - -!! article -Template:table_attribs -!! text -<noinclude> -|</noinclude>style="color: red"| Foo -!! endarticle - -!! article -Template:table_cells -!! text -{{table_attribs}} || Bar || Baz -!! endarticle - -!! article -Template:image_attribs -!! text -<noinclude> -[[File:foobar.jpg|</noinclude>right|Caption text<noinclude>]]</noinclude> -!! endarticle - -!! article -A?b -!! text -Weirdo titles! -!! endarticle - -!!article -Template:Bullet -!!text -* Bar -!!endarticle - -### -### Basic tests -### -!! test -Blank input -!! input -!! result -!! end - - -!! test -Simple paragraph -!! input -This is a simple paragraph. -!! result -<p>This is a simple paragraph. -</p> -!! end - -!! test -Paragraphs with extra newline spacing -!! input -foo - -bar - - -baz - - - -booz -!! result -<p>foo -</p><p>bar -</p><p><br /> -baz -</p><p><br /> -</p><p>booz -</p> -!! end - -!! test -Paragraphs with newline spacing with comment lines in between -!! input ----- -a -<!--foo--> -b ----- -a -<!--foo--><!--More than 1 comment, still stripped--> -b ----- -a - <!--foo--> <!----> <!-- bar --> -b ----- -a -<!--foo--> - -b ----- -a - -<!--foo--> -b ----- -a -<!--foo--> - - -b ----- -a - - -<!--foo--> -b ----- -!! result -<hr /> -<p>a -b -</p> -<hr /> -<p>a -b -</p> -<hr /> -<p>a -b -</p> -<hr /> -<p>a -</p><p>b -</p> -<hr /> -<p>a -</p><p>b -</p> -<hr /> -<p>a -</p><p><br /> -b -</p> -<hr /> -<p>a -</p><p><br /> -b -</p> -<hr /> - -!! end - -!! test -Paragraphs with newline spacing with non-empty white-space lines in between -!! input ----- -a - -b ----- -a - - -b ----- -!! result -<hr /> -<p>a -</p><p>b -</p> -<hr /> -<p>a -</p><p><br /> -b -</p> -<hr /> - -!! end - -!! test -Paragraphs with newline spacing with non-empty mixed comment and white-space lines in between -!! input ----- -a - <!--foo--> -b ----- -a - <!--foo--><!--More than 1 comment doesn't disable stripping of this line!--> -b ----- -a - -<!--foo--> - <!--bar--> -b ----- -a - - <!--foo--> - <!--bar--> - -b ----- -!! result -<hr /> -<p>a -b -</p> -<hr /> -<p>a -b -</p> -<hr /> -<p>a -</p><p>b -</p> -<hr /> -<p>a -</p><p><br /> -b -</p> -<hr /> - -!! end - -!! test -Extra newlines: More paragraphs with indented comment -!! input -a - - <!--boo--> - -b -!!result -<p>a -</p><p><br /> -b -</p> -!!end - -!! test -Extra newlines followed by heading -!! input -a - - - -=b= -[[a]] - - -=b= -!! result -<p>a -</p><p><br /> -</p> -<h1><span class="mw-headline" id="b">b</span><span class="mw-editsection"><span class="mw-editsection-bracket">[</span><a href="/index.php?title=Parser_test&action=edit&section=1" title="Edit section: b">edit</a><span class="mw-editsection-bracket">]</span></span></h1> -<p><a href="/index.php?title=A&action=edit&redlink=1" class="new" title="A (page does not exist)">a</a> -</p><p><br /> -</p> -<h1><span class="mw-headline" id="b_2">b</span><span class="mw-editsection"><span class="mw-editsection-bracket">[</span><a href="/index.php?title=Parser_test&action=edit&section=2" title="Edit section: b">edit</a><span class="mw-editsection-bracket">]</span></span></h1> - -!! end - -!! test -Extra newlines between heading and content are swallowed -!! input -=b= - - - -[[a]] -!! result -<h1><span class="mw-headline" id="b">b</span><span class="mw-editsection"><span class="mw-editsection-bracket">[</span><a href="/index.php?title=Parser_test&action=edit&section=1" title="Edit section: b">edit</a><span class="mw-editsection-bracket">]</span></span></h1> -<p><a href="/index.php?title=A&action=edit&redlink=1" class="new" title="A (page does not exist)">a</a> -</p> -!! end - -!! test -Parsing an URL -!! input -http://fr.wikipedia.org/wiki/🍺 -<!-- EasterEgg we love beer, better be able be able to link to it --> -!! result -<p><a rel="nofollow" class="external free" href="http://fr.wikipedia.org/wiki/🍺">http://fr.wikipedia.org/wiki/🍺</a> -</p> -!! end - -!! test -Simple list -!! input -* Item 1 -* Item 2 -!! result -<ul> -<li> Item 1 -</li> -<li> Item 2 -</li> -</ul> - -!! end - -!! test -Italics and bold -!! input -* plain -* plain''italic''plain -* plain''italic''plain''italic''plain -* plain'''bold'''plain -* plain'''bold'''plain'''bold'''plain -* plain''italic''plain'''bold'''plain -* plain'''bold'''plain''italic''plain -* plain''italic'''bold-italic'''italic''plain -* plain'''bold''bold-italic''bold'''plain -* plain'''''bold-italic'''italic''plain -* plain'''''bold-italic''bold'''plain -* plain''italic'''bold-italic'''''plain -* plain'''bold''bold-italic'''''plain -* plain l'''italic''plain -* plain l''''bold''' plain -!! result -<ul> -<li> plain -</li> -<li> plain<i>italic</i>plain -</li> -<li> plain<i>italic</i>plain<i>italic</i>plain -</li> -<li> plain<b>bold</b>plain -</li> -<li> plain<b>bold</b>plain<b>bold</b>plain -</li> -<li> plain<i>italic</i>plain<b>bold</b>plain -</li> -<li> plain<b>bold</b>plain<i>italic</i>plain -</li> -<li> plain<i>italic<b>bold-italic</b>italic</i>plain -</li> -<li> plain<b>bold<i>bold-italic</i>bold</b>plain -</li> -<li> plain<i><b>bold-italic</b>italic</i>plain -</li> -<li> plain<b><i>bold-italic</i>bold</b>plain -</li> -<li> plain<i>italic<b>bold-italic</b></i>plain -</li> -<li> plain<b>bold<i>bold-italic</i></b>plain -</li> -<li> plain l'<i>italic</i>plain -</li> -<li> plain l'<b>bold</b> plain -</li> -</ul> - -!! end - -# this example taken from the [[simple:Moon]] article (bug 47326) -!! test -Italics and possessives (1) -!! input -obtained by ''[[Lunar Prospector]]'''s gamma-ray spectrometer -!! result -<p>obtained by <i><a href="/index.php?title=Lunar_Prospector&action=edit&redlink=1" class="new" title="Lunar Prospector (page does not exist)">Lunar Prospector</a>'</i>s gamma-ray spectrometer -</p> -!! end - -# this example taken from [[en:Flaming Pie]] (bug 49926) -!! test -Italics and possessives (2) -!! input -'''''Flaming Pie''''' is ... released in 1997. In ''Flaming Pie'''s liner notes -!! result -<p><i><b>Flaming Pie</b></i> is ... released in 1997. In <i>Flaming Pie'</i>s liner notes -</p> -!! end - -# this example taken from [[en:Dictionary]] (bug 49926) -!! test -Italics and possessives (3) -!! input -The first monolingual dictionary written in a Romance language was ''Sebastián Covarrubias''' ''Tesoro de la lengua castellana o española'', published in 1611 in Madrid. In 1612 the first edition of the ''Vocabolario dell'[[Accademia della Crusca]]'', for Italian, was published. In 1690 in Rotterdam was published, posthumously, the ''Dictionnaire Universel''. -!! result -<p>The first monolingual dictionary written in a Romance language was <i>Sebastián Covarrubias'</i> <i>Tesoro de la lengua castellana o española</i>, published in 1611 in Madrid. In 1612 the first edition of the <i>Vocabolario dell'<a href="/index.php?title=Accademia_della_Crusca&action=edit&redlink=1" class="new" title="Accademia della Crusca (page does not exist)">Accademia della Crusca</a></i>, for Italian, was published. In 1690 in Rotterdam was published, posthumously, the <i>Dictionnaire Universel</i>. -</p> -!! end - - -### -### 2-quote opening sequence tests -### -!! test -Italics and bold: 2-quote opening sequence: (2,2) -!! input -''foo'' -!! result -<p><i>foo</i> -</p> -!!end - - -!! test -Italics and bold: 2-quote opening sequence: (2,3) -!! input -''foo''' -!! result -<p><i>foo'</i> -</p> -!!end - - -!! test -Italics and bold: 2-quote opening sequence: (2,4) -!! input -''foo'''' -!! result -<p><i>foo''</i> -</p> -!!end - - -!! test -Italics and bold: 2-quote opening sequence: (2,5) (php) -!! options -php -!! input -''foo''''' -!! result -<p><i>foo</i> -</p> -!!end -# The PHP parser strips the empty tags out for giggles; parsoid doesn't. -!! test -Italics and bold: 2-quote opening sequence: (2,5) (parsoid) -!! options -parsoid -!! input -''foo''''' -!! result -<p><i>foo</i><b></b> -</p> -!!end - - -### -### 3-quote opening sequence tests -### - -!! test -Italics and bold: 3-quote opening sequence: (3,2) -!! input -'''foo'' -!! result -<p>'<i>foo</i> -</p> -!!end - - -!! test -Italics and bold: 3-quote opening sequence: (3,3) -!! input -'''foo''' -!! result -<p><b>foo</b> -</p> -!!end - - -!! test -Italics and bold: 3-quote opening sequence: (3,4) -!! input -'''foo'''' -!! result -<p><b>foo'</b> -</p> -!!end - - -!! test -Italics and bold: 3-quote opening sequence: (3,5) (php) -!! options -php -!! input -'''foo''''' -!! result -<p><b>foo</b> -</p> -!!end -# The PHP parser strips the empty tags out for giggles; parsoid doesn't. -!! test -Italics and bold: 3-quote opening sequence: (3,5) (parsoid) -!! options -parsoid -!! input -'''foo''''' -!! result -<p><b>foo</b><i></i> -</p> -!!end - - -### -### 4-quote opening sequence tests -### - -!! test -Italics and bold: 4-quote opening sequence: (4,2) -!! input -''''foo'' -!! result -<p>''<i>foo</i> -</p> -!!end - - -!! test -Italics and bold: 4-quote opening sequence: (4,3) -!! input -''''foo''' -!! result -<p>'<b>foo</b> -</p> -!!end - - -!! test -Italics and bold: 4-quote opening sequence: (4,4) -!! input -''''foo'''' -!! result -<p>'<b>foo'</b> -</p> -!!end - - -!! test -Italics and bold: 4-quote opening sequence: (4,5) (php) -!! options -php -!! input -''''foo''''' -!! result -<p>'<b>foo</b> -</p> -!!end -# The PHP parser strips the empty tags out for giggles; parsoid doesn't. -!! test -Italics and bold: 4-quote opening sequence: (4,5) (parsoid) -!! options -parsoid -!! input -''''foo''''' -!! result -<p>'<b>foo</b><i></i> -</p> -!!end - - -### -### 5-quote opening sequence tests -### - -!! test -Italics and bold: 5-quote opening sequence: (5,2) -!! options -!! input -'''''foo'' -!! result -<p><b><i>foo</i></b> -</p> -!!end - - -!! test -Italics and bold: 5-quote opening sequence: (5,3) -!! input -'''''foo''' -!! result -<p><i><b>foo</b></i> -</p> -!!end - - -!! test -Italics and bold: 5-quote opening sequence: (5,4) -!! input -'''''foo'''' -!! result -<p><i><b>foo'</b></i> -</p> -!!end - - -!! test -Italics and bold: 5-quote opening sequence: (5,5) -!! input -'''''foo''''' -!! result -<p><i><b>foo</b></i> -</p> -!!end - -### -### multiple quote sequences in a line -### -!! test -Italics and bold: multiple quote sequences: (2,4,2) -!! input -''foo''''bar'' -!! result -<p><i>foo'<b>bar</b></i> -</p> -!!end - - -!! test -Italics and bold: multiple quote sequences: (2,4,3) -!! input -''foo''''bar''' -!! result -<p><i>foo'<b>bar</b></i> -</p> -!!end - - -!! test -Italics and bold: multiple quote sequences: (2,4,4) -!! input -''foo''''bar'''' -!! result -<p><i>foo'<b>bar'</b></i> -</p> -!!end - - -!! test -Italics and bold: multiple quote sequences: (3,4,2) (php) -!! options -php -!! input -'''foo''''bar'' -!! result -<p><b>foo'</b>bar -</p> -!!end -# The PHP parser strips the empty tags out for giggles; parsoid doesn't. -!! test -Italics and bold: multiple quote sequences: (3,4,2) (parsoid) -!! options -parsoid -!! input -'''foo''''bar'' -!! result -<p><b>foo'</b>bar<i></i> -</p> -!!end - - -!! test -Italics and bold: multiple quote sequences: (3,4,3) (php) -!! options -php -!! input -'''foo''''bar''' -!! result -<p><b>foo'</b>bar -</p> -!!end -# The PHP parser strips the empty tags out for giggles; parsoid doesn't. -!! test -Italics and bold: multiple quote sequences: (3,4,3) (parsoid) -!! options -parsoid -!! input -'''foo''''bar''' -!! result -<p><b>foo'</b>bar<b></b> -</p> -!!end - -### -### other quote tests -### -!! test -Italics and bold: other quote tests: (2,3,5) -!! input -''this is about '''foo's family''''' -!! result -<p><i>this is about <b>foo's family</b></i> -</p> -!!end - - -!! test -Italics and bold: other quote tests: (2,(3,3),2) -!! input -''this is about '''foo's''' family'' -!! result -<p><i>this is about <b>foo's</b> family</i> -</p> -!!end - - -!! test -Italics and bold: other quote tests: (3,2,3,2) -!! input -'''this is about ''foo'''s family'' -!! result -<p><b>this is about <i>foo</i></b><i>s family</i> -</p> -!!end - - -!! test -Italics and bold: other quote tests: (3,2,3,3) -!! options -!! input -'''this is about ''foo'''s family''' -!! result -<p>'<i>this is about </i>foo<b>s family</b> -</p> -!!end - - -!! test -Italics and bold: other quote tests: (3,(2,2),3) -!! input -'''this is about ''foo's'' family''' -!! result -<p><b>this is about <i>foo's</i> family</b> -</p> -!!end - - -!! test -Italicized possessive -!! input -The ''[[Main Page]]'''s talk page. -!! result -<p>The <i><a href="/wiki/Main_Page" title="Main Page">Main Page</a>'</i>s talk page. -</p> -!! end - -!! test -Parsoid only: Quote balancing context should be restricted to td/th cells on the same wikitext line -(Requires tidy for PHP parser output to be fixed up) -!! options -parsoid=wt2html,wt2wt -!! input -{| -!''a!!''b -|''a||''b -|} -!! result -<table> -<tbody><tr><th><i>a</i></th><th><i>b</i></th> -<td><i>a</i></td><td><i>b</i></td></tr> -</tbody></table> -!! end - -### -### Non-html5 tags -### - -!! test -Non-html5 tags should be accepted -!! input -<center>''foo''</center> -<big>''foo''</big> -<font>''foo''</font> -<strike>''foo''</strike> -<tt>''foo''</tt> -!! result -<center><i>foo</i></center> -<p><big><i>foo</i></big> -<font><i>foo</i></font> -<strike><i>foo</i></strike> -<tt><i>foo</i></tt> -</p> -!! end - -!! test -<wbr> is valid wikitext (bug 52468) -!! input -<wbr> -!! result -<p><wbr /> -</p> -!! end - -# <strike> is HTML4, <s> is HTML4/5. -!! test -<s> or <strike> for strikethrough -!! input -<strike>strike</strike> - -<s>s</s> -!! result -<p><strike>strike</strike> -</p><p><s>s</s> -</p> -!! end - -!! test -Non-word characters don't terminate tag names (bug 17663, 40670, 52022) -!! input -<b→> doesn't work! </b> - -<bä> doesn't work! </b> - -<boo> works fine </b> - -<s.foo>foo</s> - -<s.foo>s.foo</s.foo> - -<sub-ID#1> -!! result -<p><b→> doesn't work! </b> -</p><p><bä> doesn't work! </b> -</p><p><boo> works fine </b> -</p><p><s.foo>foo</s> -</p><p><s.foo>s.foo</s.foo> -</p><p><sub-ID#1> -</p> -!! end - -### -### Special characters -### - -!! test -Bare pipe character (bug 52363) -!! input -| -!! result -<p>| -</p> -!! end - -!! test -Bare pipe character from a template (bug 52363) -!! input -{{pipe}} -!! result -<p>| -</p> -!! end - -### -### <nowiki> test cases -### - -!! test -<nowiki> unordered list -!! input -<nowiki>* This is not an unordered list item.</nowiki> -!! result -<p>* This is not an unordered list item. -</p> -!! end - -!! test -<nowiki> spacing -!! input -<nowiki>Lorem ipsum dolor - -sed abit. - sed nullum. - -:and a colon -</nowiki> -!! result -<p>Lorem ipsum dolor - -sed abit. - sed nullum. - -:and a colon - -</p> -!! end - -!! test -nowiki 3 -!! input -:There is not nowiki. -:There is <nowiki>nowiki</nowiki>. - -#There is not nowiki. -#There is <nowiki>nowiki</nowiki>. - -*There is not nowiki. -*There is <nowiki>nowiki</nowiki>. -!! result -<dl> -<dd>There is not nowiki. -</dd> -<dd>There is nowiki. -</dd> -</dl> -<ol> -<li>There is not nowiki. -</li> -<li>There is nowiki. -</li> -</ol> -<ul> -<li>There is not nowiki. -</li> -<li>There is nowiki. -</li> -</ul> - -!! end - -!! test -Entities inside <nowiki> -!! input -<nowiki><</nowiki> -!! result -<p>< -</p> -!! end - -!! test -Entities inside template parameters -!! options -parsoid -!! input -{{echo|–}} -!! result -<p><span typeof="mw:Transclusion mw:Entity" data-mw='{"parts":[{"template":{"target":{"wt":"echo","href":"./Template:Echo"},"params":{"1":{"wt":"&ndash;"}},"i":0}}]}'>–</span> -</p> -!! end - -### -### Comments -### -!! test -Comments and Indent-Pre -!! input -<!-- comment 1 --> asdf - -<!-- comment 1 --> asdf -<!-- comment 2 --> - -<!-- comment 1 --> asdf -<!-- comment 2 -->xyz - -<!-- comment 1 --> asdf -<!-- comment 2 --> xyz -!! result -<pre>asdf -</pre> -<pre>asdf -</pre> -<pre>asdf -</pre> -<p>xyz -</p> -<pre>asdf -xyz -</pre> -!! end - -!! test -Comment test 2a -!! input -asdf -<!-- comment 1 --> -jkl -!! result -<p>asdf -jkl -</p> -!! end - -!! test -Comment test 2b -!! input -asdf -<!-- comment 1 --> - -jkl -!! result -<p>asdf -</p><p>jkl -</p> -!! end - -!! test -Comment test 3 -!! input -asdf -<!-- comment 1 --> -<!-- comment 2 --> -jkl -!! result -<p>asdf -jkl -</p> -!! end - -!! test -Comment test 4 -!! input -asdf<!-- comment 1 -->jkl -!! result -<p>asdfjkl -</p> -!! end - -!! test -Comment spacing -!! input -a - <!-- foo --> b <!-- bar --> -c -!! result -<p>a -</p> -<pre> b -</pre> -<p>c -</p> -!! end - -!! test -Comment whitespace -!! input -<!-- returns a single newline, not nothing, since the newline after > is not stripped --> -!! result - -!! end - -!! test -Comment semantics and delimiters -!! input -<!-- --><!----><!-----><!------> -!! result - -!! end - -!! test -Comment semantics and delimiters, redux -!! input -<!-- In SGML every "foo" here would actually show up in the text -- foo -- bar --- foo -- funky huh? ... --> -!! result - -!! end - -!! test -Comment semantics and delimiters: directors cut -!! input -<!-- ... However we like to keep things simple and somewhat XML-ish so we eat -everything starting with < followed by !-- until the first -- and > we see, -that wouldn't be valid XML however, since in XML -- has to terminate a comment --->--> -!! result -<p>--> -</p> -!! end - -!! test -Comment semantics: nesting -!! input -<!--<!-- no, we're not going to do anything fancy here -->--> -!! result -<p>--> -</p> -!! end - -!! test -Comment semantics: unclosed comment at end -!! input -<!--This comment will run out to the end of the document -!! result - -!! end - -!! test -Comment in template title -!! input -{{f<!---->oo}} -!! result -<p>FOO -</p> -!! end - -!! test -Comment on its own line post-expand -!! input -a -{{blank}}<!----> -b -!! result -<p>a -</p><p>b -</p> -!! end - -!! test -Comment on its own line post-expand with non-significant whitespace -!! input -a - {{blank}} <!----> -b -!! result -<p>a -</p><p>b -</p> -!! end - -### -### paragraph wrapping tests -### -!! test -No block tags -!! input -a - -b -!! result -<p>a -</p><p>b -</p> -!! end - -!! test -Block tag on one line (<div>) -!! input -a <div>foo</div> - -b -!! result -a <div>foo</div> -<p>b -</p> -!! end - -!! test -Block tag on one line (<blockquote>) -!! input -a <blockquote>foo</blockquote> - -b -!! result -a <blockquote>foo</blockquote> -<p>b -</p> -!! end - -!! test -Block tag on both lines (<div>) -!! input -a <div>foo</div> - -b <div>foo</div> -!! result -a <div>foo</div> -b <div>foo</div> - -!! end - -!! test -Block tag on both lines (<blockquote>) -!! input -a <blockquote>foo</blockquote> - -b <blockquote>foo</blockquote> -!! result -a <blockquote>foo</blockquote> -b <blockquote>foo</blockquote> - -!! end - -!! test -Multiple lines without block tags -!! input -<div>foo</div> a -b -c -d<!--foo--> e -x <div>foo</div> z -!! result -<div>foo</div> a -<p>b -c -d e -</p> -x <div>foo</div> z - -!! end - -!! test -Empty lines between lines with block tags -!! input -<div></div> - - -<div></div>a - -b -<div>a</div>b - -<div>b</div>d - - -<div>e</div> -!! result -<div></div> -<p><br /> -</p> -<div></div>a -<p>b -</p> -<div>a</div>b -<div>b</div>d -<p><br /> -</p> -<div>e</div> - -!! end - -### -### Preformatted text -### -!! test -Preformatted text -!! input - This is some - Preformatted text - With ''italic'' - And '''bold''' - And a [[Main Page|link]] -!! result -<pre>This is some -Preformatted text -With <i>italic</i> -And <b>bold</b> -And a <a href="/wiki/Main_Page" title="Main Page">link</a> -</pre> -!! end - -!! test -Tabs don't trigger preformatted text -!! input - This is not - preformatted text. - This is preformatted text. - So is this. -!! result -<p> This is not - preformatted text. -</p> -<pre>This is preformatted text. - So is this. -</pre> -!! end - -!! test -Ident preformatting with inline content -!! input - a - ''b'' -!! result -<pre>a -<i>b</i> -</pre> -!! end - -!! test -<pre> with <nowiki> inside (compatibility with 1.6 and earlier) -!! input -<pre><nowiki> -<b> -<cite> -<em> -</nowiki></pre> -!! result -<pre> -<b> -<cite> -<em> -</pre> - -!! end - -!! test -Regression with preformatted in <center> -!! input -<center> - Blah -</center> -!! result -<center> -<pre>Blah -</pre> -</center> - -!! end - -!! test -Bug 52763: Preformatted in <blockquote> -!! input -<blockquote> - Blah -</blockquote> -!! result -<blockquote> -<p> Blah -</p> -</blockquote> - -!! end - -!! test -Bug 51086: Double newlines in blockquotes should be turned into paragraphs -!! input -<blockquote> -Foo - -Bar -</blockquote> -!! result -<blockquote> -<p>Foo -</p><p>Bar -</p> -</blockquote> - -!! end - -!! test -Bug 15491: <ins>/<del> in blockquote -!! input -<blockquote> -Foo <del>bar</del> <ins>baz</ins> quux -</blockquote> -!! result -<blockquote> -<p>Foo <del>bar</del> <ins>baz</ins> quux -</p> -</blockquote> - -!! end - -# Note that the p-wrapping is newline sensitive, which could be -# considered a bug: tidy will wrap only the 'Foo' in the example -# below in a <p> tag. (see comment 23-25 of bug #6200) -!! test -Bug 15491: <ins>/<del> in blockquote (2) -!! input -<blockquote>Foo <del>bar</del> <ins>baz</ins> quux -</blockquote> -!! result -<blockquote>Foo <del>bar</del> <ins>baz</ins> quux -</blockquote> - -!! end - -!! test -<pre> with attributes (bug 3202) -!! input -<pre style="background: blue; color:white">Bluescreen of WikiDeath</pre> -!! result -<pre style="background: blue; color:white">Bluescreen of WikiDeath</pre> - -!! end - -!! test -<pre> with width attribute (bug 3202) -!! input -<pre width="8">Narrow screen goodies</pre> -!! result -<pre width="8">Narrow screen goodies</pre> - -!! end - -!! test -<pre> with forbidden attribute (bug 3202) -!! input -<pre width="8" onmouseover="alert(document.cookie)">Narrow screen goodies</pre> -!! result -<pre width="8">Narrow screen goodies</pre> - -!! end - -!! test -Entities inside <pre> -!! input -<pre><</pre> -!! result -<pre><</pre> - -!! end - -!! test -<pre> with forbidden attribute values (bug 3202) -!! input -<pre width="8" style="border-width: expression(alert(document.cookie))">Narrow screen goodies</pre> -!! result -<pre width="8" style="/* insecure input */">Narrow screen goodies</pre> - -!! end - -!! test -<nowiki> inside <pre> (bug 13238) -!! input -<pre> -<nowiki> -</pre> -<pre> -<nowiki></nowiki> -</pre> -<pre><nowiki><nowiki></nowiki>Foo<nowiki></nowiki></nowiki></pre> -!! result -<pre> -<nowiki> -</pre> -<pre> - -</pre> -<pre><nowiki>Foo</nowiki></pre> - -!! end - -!! test -<nowiki> and <pre> preference (first one wins) -!! input -<pre> -<nowiki> -</pre> -</nowiki> -</pre> - -<nowiki> -<pre> -<nowiki> -</pre> -</nowiki> -</pre> - -!! result -<pre> -<nowiki> -</pre> -<p></nowiki> -</pre> -</p><p> -<pre> -<nowiki> -</pre> - -</pre> -</p> -!! end - -!! test -</pre> inside nowiki -!! input -<nowiki></pre></nowiki> -!! result -<p></pre> -</p> -!! end - -!!test -Templates: Indent-Pre: 1a. Templates that break a line should suppress <pre> -!!input - {{echo|}} -!!result - -!!end - -!!test -Templates: Indent-Pre: 1b. Templates that break a line should suppress <pre> -!!input - {{echo| -foo}} -!!result -<p>foo -</p> -!!end - -!! test -Templates: Indent-Pre: 1c: Wrapping should be based on expanded content -!! input - {{echo|a -b}} -!!result -<pre>a -</pre> -<p>b -</p> -!!end - -!! test -Templates: Indent-Pre: 1d: Wrapping should be based on expanded content -!! input - {{echo|a -b -c - d -e -}} -!!result -<pre>a -</pre> -<p>b -c -</p> -<pre>d -</pre> -<p>e -</p> -!!end - -!!test -Templates: Indent-Pre: 1e. Wrapping should be based on expanded content -!!input -{{echo| foo}} - -{{echo| foo}}{{echo| bar}} - -{{echo| foo}} -{{echo| bar}} - -{{echo|<!--cmt--> foo}} - -<!--cmt-->{{echo| foo}} - -{{echo|{{echo| }}bar}} -!!result -<pre>foo -</pre> -<pre>foo bar -</pre> -<pre>foo -bar -</pre> -<pre>foo -</pre> -<pre>foo -</pre> -<pre>bar -</pre> -!!end - -!! test -Templates: Indent-Pre: 1f: Wrapping should be based on expanded content -!! input -{{echo| }}a - -{{echo| - }}a - -{{echo| - b}} - -{{echo|a - }}b - -{{echo|a -}} b -!!result -<pre>a -</pre> -<p><br /> -</p> -<pre>a -</pre> -<p><br /> -</p> -<pre>b -</pre> -<p>a -</p> -<pre>b -</pre> -<p>a -</p> -<pre>b -</pre> -!!end - -# TODO / maybe: fix wt2wt for this -!! test -Parsoid: Don't paragraph-wrap fosterable content -!! options -parsoid=wt2html -!! input -{| -<td></td> -<td></td> - - - -|} -!! result -<table> - -<tbody> -<tr> -<td></td> - -<td></td></tr> - - - -</tbody></table> -!! end - -!! test -Parsoid: Don't paragraph-wrap fosterable content even if table syntax is unbalanced -!! options -parsoid=wt2html -!! input -{| -<td> -<td> -</td> - - - -|} -!! result -<table> - -<tbody> -<tr> -<td></td> - -<td> -</td></tr> - - - -</tbody></table> -!! end - - -#-------------------------------------------------------------------- -# Transclusion parameter whitespace stripping tests -# Behavior is different for positional and named parameters -#-------------------------------------------------------------------- -!! test -Templates: Strip leading and trailing whitespace from named-param values -!! input -{{echo|1= a }} - -{{echo|1= {{echo|b}} }} - -{{echo| 1 = - c }} - -{{echo| 1 = -* d -}} -!! result -<p>a -</p><p>b -</p><p>c -</p> -<ul> -<li> d -</li> -</ul> - -!! end - -!! test -Templates: Don't strip whitespace from positional-param values -!! input -{{echo|a }} - -{{echo|{{echo|b}} }} - -{{echo| c -}} - -{{echo| {{echo|d}} -}} - -{{echo| - e}} - -{{echo| -* f}} - -{{echo| - }}g -!! result -<p>a -</p><p>b -</p> -<pre>c -</pre> -<p><br /> -</p> -<pre>d -</pre> -<p><br /> -</p> -<pre>e -</pre> -<p><br /> -</p> -<ul> -<li> f -</li> -</ul> -<p><br /> -</p> -<pre>g -</pre> -!! end - -!! test -Templates: Handle empty comment-and-ws-only lines correctly -!! input -{{echo|foo -<!--should be ignored--> - <!--should be ignored as well--> -bar}} -!! result -<p>foo -bar -</p> -!! end - -#-------------------------------------------------------------------- -# Transclusion parameter escaping tests -#-------------------------------------------------------------------- -!! test -Templates: Parsoid parameter escaping test 1 -!! options -parsoid -!! input -{{echo|[foo]|{{echo|[bar]}}}} -!! result -<p about="#mwt1" typeof="mw:Transclusion" -data-mw='{"parts":[{"template":{"target":{"wt":"echo","href":"./Template:Echo"},"params":{"1":{"wt":"[foo]"},"2":{"wt":"{{echo|[bar]}}"}},"i":0}}]}'>[foo]</p> -!! end - -!! test -Parsoid: Pipes in external links in template parameter -!! options -parsoid -!! input -{{echo|[{{echo|http://example.com}} link]}} -!! result -<p><a rel="mw:ExtLink" href="http://example.com" about="#mwt31" typeof="mw:Transclusion" data-mw='{"parts":[{"template":{"target":{"wt":"echo","href":"./Template:Echo"},"params":{"1":{"wt":"[{{echo|http://example.com}} link]"}},"i":0}}]}'>link</a></p> -!! end - -!! test -Parsoid: pipe in transclusion parameter -!! options -parsoid -!! input -{{echo|http://foo.com/a|b}} -!! result -<p><a rel="mw:ExtLink" href="http://foo.com/a|b" about="#mwt1" -typeof="mw:Transclusion" -data-mw='{"parts":[{"template":{"target":{"wt":"echo","href":"./Template:Echo"},"params":{"1":{"wt":"http://foo.com/a&#124;b"}},"i":0}}]}'>http://foo.com/a|b</a></p> -!! end - -!! test -Parsoid: Pipe in external link target and content in template parameter -!! options -parsoid=html2wt,wt2wt -!! input -{{echo|[http://foo.com/a|b a|b]}} -!! result -<p><a rel="mw:ExtLink" href="http://foo.com/a|b" about="#mwt1" -typeof="mw:Transclusion" -data-mw='{"parts":[{"template":{"target":{"wt":"echo","href":"./Template:Echo"}, -"params":{"1":{"wt":"[http://foo.com/a|b a|b]"}},"i":0}}]}'>a|b</a></p> -!! end - -!! test -Templates: Dont escape already nowiki-escaped text in template parameters -!! options -parsoid=html2wt,wt2wt -!! input -{{echo|foo<nowiki>|</nowiki>bar}} -{{echo|<nowiki><div></nowiki>}} -{{echo|<nowiki></nowiki>}} -!! result -<p><span about="#mwt1" typeof="mw:Transclusion" data-mw='{"parts":[{"template":{"target":{"wt":"echo","href":"./Template:Echo"},"params":{"1":{"wt":"foo<nowiki>|</nowiki>bar"}},"i":0}}]}'}'>foo</span><span typeof="mw:Nowiki" about="#mwt1">|</span><span about="#mwt1">bar</span> -<span typeof="mw:Transclusion mw:Nowiki" about="#mwt2" data-mw='{"parts":[{"template":{"target":{"wt":"echo","href":"./Template:Echo"},"params":{"1":{"wt":"<nowiki>&lt;div&gt;</nowiki>"}},"i":0}}]}'><span typeof="mw:Entity"><</span>div<span typeof="mw:Entity">></span></span> -<span typeof="mw:Transclusion mw:Nowiki" about="#mwt3" data-mw='{"parts":[{"template":{"target":{"wt":"echo","href":"./Template:Echo"},"params":{"1":{"wt":"<nowiki></nowiki>"}},"i":0}}]}'></span> -</p> -!! end - -## Bug 52824 -!! test -Templates: '=' char in nested transclusions should not trigger nowiki escapes or conversion to named param -!! options -parsoid=html2wt,wt2wt -!! input -{{echo|{{echo|1=bar}}}} -!! result -<p about="#mwt1" typeof="mw:Transclusion" data-mw='{"parts":[{"template":{"target":{"wt":"echo","href":"./Template:Echo"},"params":{"1":{"wt":"{{echo|1=bar}}"}},"i":0}}]}'>bar</p> -!! end - -### -### Parsoid-centric tests for testing RT edge cases for pre -### - -!!test -1a. Indent-Pre and Comments -!!input - a -<!--a--> -c -!!result -<pre>a -</pre> -<p>c -</p> -!!end - -!!test -1b. Indent-Pre and Comments -!!input - a - <!--a--> -c -!!result -<pre>a -</pre> -<p>c -</p> -!!end - -!!test -1c. Indent-Pre and Comments -!!input -<!--a--> a - - <!--a--> a -!!result -<pre> a -</pre> -<pre> a -</pre> -!!end - -!!test -1d. Indent-Pre and Comments -(Pre-handler currently cannot distinguish between comment/ws order and normalizes them to [comment,ws] order) -!!input -<!--a--> a - - <!--b-->b -!!result -<pre>a -</pre> -<pre>b -</pre> -!!end - -!!test -2a. Indent-Pre and tables -!!input - {| - |- - !h1!!h2 - |foo||bar - |} -!!result -<table> - -<tr> -<th>h1</th> -<th>h2 -</th> -<td>foo</td> -<td>bar -</td></tr></table> - -!!end - -!!test -2b. Indent-Pre and tables -!!input - {| - |- -|foo -|} -!!result -<table> - -<tr> -<td>foo -</td></tr></table> - -!!end - -!!test -2c. Indent-Pre and tables (bug 42252) -!!input -{| - |+ foo - ! | bar -|} -!!result -<table> -<caption> foo -</caption> -<tr> -<th> bar -</th></tr></table> - -!!end - -!!test -3a. Indent-Pre and block tags (single-line html) -!!input - <p> foo </p> - <div> foo </div> - <blockquote> foo </blockquote> - <span> foo </span> -!!result - <p> foo </p> - <div> foo </div> - <blockquote> foo </blockquote> -<pre><span> foo </span> -</pre> -!!end - -!!test -3b. Indent-Pre and block tags (pre-content on separate line) -!!input -<p> - foo -</p> - -<div> - foo -</div> - -<center> - foo -</center> - -<blockquote> - foo -</blockquote> - -<blockquote> -<pre> -foo -</pre> -</blockquote> - -<table><tr><td> - foo -</td></tr></table> - -<ul><li> - foo -</li></ul> - -!!result -<p> - foo -</p> -<div> -<pre>foo -</pre> -</div> -<center> -<pre>foo -</pre> -</center> -<blockquote> -<p> foo -</p> -</blockquote> -<blockquote> -<pre> -foo -</pre> -</blockquote> -<table><tr><td> -<pre>foo -</pre> -</td></tr></table> -<ul><li> - foo -</li></ul> - -!!end - -!!test -4. Multiple spaces at start-of-line -!!input - <p> foo </p> - foo - {| -|foo -|} -!!result - <p> foo </p> -<pre> foo -</pre> -<table> -<tr> -<td>foo -</td></tr></table> - -!!end - -!! test -5. White-space in indent-pre -NOTE: the white-space char on 2nd line is significant -!! input - a<br/> - - b -!! result -<pre>a<br /> - -b -</pre> -!! end - -!! test -6. Pre-blocks should extend across lines with leading WS even when there is no wrappable content -!! input - a - - <!-- continue --> - b - - c - -d -!! result -<pre>a - -b -</pre> -<pre>c - -</pre> -<p>d -</p> -!! end - -!! test -7a. Indent-pre and category links -!! options -parsoid=wt2html,wt2wt -!! input - [[Category:foo]] <!-- No pre-wrapping --> -{{echo| [[Category:foo]]}} <!-- No pre-wrapping --> -!! result - <link rel="mw:WikiLink/Category" href="./Category:Foo"> <!-- No pre-wrapping --> -<span about="#mwt1" typeof="mw:Transclusion" data-mw='{"parts":[{"template":{"target":{"wt":"echo","href":"./Template:Echo"},"params":{"1":{"wt":" [[Category:foo]]"}},"i":0}}]}'> </span> -<link rel="mw:WikiLink/Category" href="./Category:Foo" about="#mwt1"> <!-- No pre-wrapping --> -!! end - -!! test -7b. Indent-pre and category links -!! options -parsoid=wt2html,wt2wt -!! input - [[Category:foo]] a - [[Category:foo]] {{echo|b}} -!! result -<pre> -<link rel="mw:WikiLink/Category" href="./Category:Foo"> a - -<link rel="mw:WikiLink/Category" href="./Category:Foo"> <span about="#mwt1" typeof="mw:Transclusion" data-mw='{"parts":[{"template":{"target":{"wt":"echo","href":"./Template:Echo"},"params":{"1":{"wt":"b"}},"i":0}}]}'>b</span></pre> -!! end - -### -### HTML-pre (some to spec PHP parser behavior and some Parsoid-RT-centric) -### - -!!test -HTML-pre: 1. embedded newlines -!!input -<pre>foo</pre> - -<pre> -foo -</pre> - -<pre> - -foo -</pre> - -<pre> - - -foo -</pre> -!!result -<pre>foo</pre> -<pre> -foo -</pre> -<pre> - -foo -</pre> -<pre> - - -foo -</pre> - -!!end - -!!test -HTML-pre: 2: indented text -!!input -<pre> - foo -</pre> -!!result -<pre> - foo -</pre> - -!!end - -!!test -HTML-pre: 3: other wikitext -!!input -<pre> -* foo -# bar -= no-h = -'' no-italic '' -[[ NoLink ]] -</pre> -!!result -<pre> -* foo -# bar -= no-h = -'' no-italic '' -[[ NoLink ]] -</pre> - -!!end - -### -### Definition lists -### -!! test -Simple definition -!! input -; name : Definition -!! result -<dl> -<dt> name </dt> -<dd> Definition -</dd> -</dl> - -!! end - -!! test -Definition list for indentation only -!! input -: Indented text -!! result -<dl> -<dd> Indented text -</dd> -</dl> - -!! end - -!! test -Definition list with no space -!! input -;name:Definition -!! result -<dl> -<dt>name</dt> -<dd>Definition -</dd> -</dl> - -!!end - -!! test -Definition list with URL link -!! input -; http://example.com/ : definition -!! result -<dl> -<dt> <a rel="nofollow" class="external free" href="http://example.com/">http://example.com/</a> </dt> -<dd> definition -</dd> -</dl> - -!! end - -!! test -Definition list with bracketed URL link -!! input -;[http://www.example.com/ Example]:Something about it -!! result -<dl> -<dt><a rel="nofollow" class="external text" href="http://www.example.com/">Example</a></dt> -<dd>Something about it -</dd> -</dl> - -!! end - -!! test -Definition list with wikilink containing colon -!! input -; [[Help:FAQ]]: The least-read page on Wikipedia -!! result -<dl> -<dt> <a href="/index.php?title=Help:FAQ&action=edit&redlink=1" class="new" title="Help:FAQ (page does not exist)">Help:FAQ</a></dt> -<dd> The least-read page on Wikipedia -</dd> -</dl> - -!! end - -# At Brion's and JeLuF's insistence... :) -!! test -Definition list with news link containing colon -!! input -; news:alt.wikipedia.rox: This isn't even a real newsgroup! -!! result -<dl> -<dt> <a rel="nofollow" class="external free" href="news:alt.wikipedia.rox">news:alt.wikipedia.rox</a></dt> -<dd> This isn't even a real newsgroup! -</dd> -</dl> - -!! end - -!! test -Malformed definition list with colon -!! input -; news:alt.wikipedia.rox -- don't crash or enter an infinite loop -!! result -<dl> -<dt> <a rel="nofollow" class="external free" href="news:alt.wikipedia.rox">news:alt.wikipedia.rox</a> -- don't crash or enter an infinite loop -</dt> -</dl> - -!! end - -!! test -Definition lists: colon in external link text -!! input -; [http://www.wikipedia2.org/ Wikipedia : The Next Generation]: OK, I made that up -!! result -<dl> -<dt> <a rel="nofollow" class="external text" href="http://www.wikipedia2.org/">Wikipedia : The Next Generation</a></dt> -<dd> OK, I made that up -</dd> -</dl> - -!! end - -!! test -Definition lists: colon in HTML attribute -!! input -;<b style="display: inline">bold</b> -!! result -<dl> -<dt><b style="display: inline">bold</b> -</dt> -</dl> - -!! end - -!! test -Definition lists: self-closed tag -!! input -;one<br/>two : two-line fun -!! result -<dl> -<dt>one<br />two </dt> -<dd> two-line fun -</dd> -</dl> - -!! end - -!! test -Bug 11748: Literal closing tags -!! input -<dl> -<dt>test 1</dt> -<dd>test test test test test</dd> -<dt>test 2</dt> -<dd>test test test test test</dd> -</dl> -!! result -<dl> -<dt>test 1</dt> -<dd>test test test test test</dd> -<dt>test 2</dt> -<dd>test test test test test</dd> -</dl> - -!! end - -!! test -Definition and unordered list using wiki syntax nested in unordered list using html tags. -!! input -<ul><li> -; term : description -* unordered -</li></ul> -!! result -<ul><li> -<dl> -<dt> term </dt> -<dd> description -</dd> -</dl> -<ul> -<li> unordered -</li> -</ul> -</li></ul> - -!! end - -!! test - -Definition list with empty definition and following paragraph -!! input -; term: -Paragraph text -!! result -<dl> -<dt> term</dt> -<dd> -</dd> -</dl> -<p>Paragraph text -</p> -!! end - -!! test -Nested definition lists using html syntax -!! input -<dl><dd> -<dl> -<dd>Foo</dd> -</dl> -</dd></dl> -!! result -<dl><dd> -<dl> -<dd>Foo</dd> -</dl> -</dd></dl> - -!! end - -!! test -Definition Lists: No nesting: Multiple dd's -!! input -;x -:a -:b -!! result -<dl> -<dt>x -</dt> -<dd>a -</dd> -<dd>b -</dd> -</dl> - -!! end - -!! test -Definition Lists: Indentation: Regular -!! input -:i1 -::i2 -:::i3 -!! result -<dl> -<dd>i1 -<dl> -<dd>i2 -<dl> -<dd>i3 -</dd> -</dl> -</dd> -</dl> -</dd> -</dl> - -!! end - -!! test -Definition Lists: Indentation: Missing 1st level -!! input -::i2 -:::i3 -!! result -<dl> -<dd><dl> -<dd>i2 -<dl> -<dd>i3 -</dd> -</dl> -</dd> -</dl> -</dd> -</dl> - -!! end - -!! test -Definition Lists: Indentation: Multi-level indent -!! input -:::i3 -!! result -<dl> -<dd><dl> -<dd><dl> -<dd>i3 -</dd> -</dl> -</dd> -</dl> -</dd> -</dl> - -!! end - -!! test -Definition Lists: Hacky use to indent tables -!! input -::{| -|foo -|bar -|} -this text -should be left alone -!! result -<dl><dd><dl><dd><table> -<tr> -<td>foo -</td> -<td>bar -</td></tr></table></dd></dl></dd></dl> -<p>this text -should be left alone -</p> -!! end - -# Bug 52473 -!! test -Definition Lists: Hacky use to indent tables (WS-insensitive) -!! options -parsoid -!! input -: {| -|a -|} -!! result -<dl> -<dd> <table><tr><td>a</td></tr></table> </dd> -</dl> -!! end -## The PHP parser treats : items (dd) without a corresponding ; item (dt) -## as an empty dt item. It also ignores all but the last ";" when followed -## by ":" later on. So, ";" are not ignored in ";;;t3" but are ignored in -## ";;;t3 :d1". So, PHP parser behavior is a little inconsistent wrt multiple -## ";"s. -## -## Ex: ";;t2 ::d2" is transformed into: -## -## <dl> -## <dt>t2 </dt> -## <dd> -## <dl> -## <dt></dt> -## <dd>d2</dd> -## </dl> -## </dd> -## </dl> -## -## But, Parsoid treats "; :" as a tight atomic unit and excess ":" as plain text -## So, the same wikitext above (;;t2 ::d2) is transformed into: -## -## <dl> -## <dt> -## <dl> -## <dt>t2 </dt> -## <dd>:d2</dd> -## </dl> -## </dt> -## </dl> -## -## All Parsoid only definition list tests have this difference. -## -## See also: https://bugzilla.wikimedia.org/show_bug.cgi?id=6569 -## and http://lists.wikimedia.org/pipermail/wikitext-l/2011-November/000483.html - -!! test -Table / list interaction: indented table with lists in table contents -!! input -:{| -|- -| a -* b -|- -| c -* d -|} -!! result -<dl><dd><table> - -<tr> -<td> a -<ul> -<li> b -</li> -</ul> -</td></tr> -<tr> -<td> c -<ul> -<li> d -</li> -</ul> -</td></tr></table></dd></dl> - -!! end - -!!test -Table / list interaction: lists nested in tables nested in indented lists -!!input -:{| -| -:a -:b -| -*c -*d -|} - -*e -*f -!!result -<dl><dd><table> -<tr> -<td> -<dl> -<dd>a -</dd> -<dd>b -</dd> -</dl> -</td> -<td> -<ul> -<li>c -</li> -<li>d -</li> -</ul> -</td></tr></table></dd></dl> -<ul> -<li>e -</li> -<li>f -</li> -</ul> - -!!end - -!! test -Definition Lists: Nesting: Multi-level (Parsoid only) -!! options -parsoid -!! input -;t1 :d1 -;;t2 ::d2 -;;;t3 :::d3 -!! result -<dl> - <dt>t1 </dt> - <dd>d1</dd> - <dt> - <dl> - <dt>t2 </dt> - <dd>:d2</dd> - <dt> - <dl> - <dt>t3 </dt> - <dd>::d3</dd> - </dl> - </dt> - </dl> - </dt> -</dl> - - -!! end - - -!! test -Definition Lists: Nesting: Test 2 (Parsoid only) -!! options -parsoid -!! input -;t1 -::d2 -!! result -<dl> - <dt>t1</dt> - <dd> - <dl> - <dd>d2</dd> - </dl> - </dd> -</dl> - -!! end - - -!! test -Definition Lists: Nesting: Test 3 (Parsoid only) -!! options -parsoid -!! input -:;t1 -::::d2 -!! result -<dl> - <dd> - <dl> - <dt>t1</dt> - <dd> - <dl> - <dd> - <dl> - <dd>d2</dd> - </dl> - </dd> - </dl> - </dd> - </dl> - </dd> -</dl> - -!! end - - -!! test -Definition Lists: Nesting: Test 4 -!! input -::;t3 -:::d3 -!! result -<dl> -<dd><dl> -<dd><dl> -<dt>t3 -</dt> -<dd>d3 -</dd> -</dl> -</dd> -</dl> -</dd> -</dl> - -!! end - - -## The Parsoid team believes the following three test exposes a -## bug in the PHP parser. (Parsoid team thinks the PHP parser is -## wrong to close the <dl> after the <dt> containing the <ul>.) -!! test -Definition Lists: Mixed Lists: Test 1 (php) -!! options -php -!! input -:;* foo -::* bar -:; baz -!! result -<dl> -<dd><dl> -<dt><ul> -<li> foo -</li> -<li> bar -</li> -</ul> -</dt> -</dl> -<dl> -<dt> baz -</dt> -</dl> -</dd> -</dl> - -!! end -!! test -Definition Lists: Mixed Lists: Test 1 (parsoid) -!! options -parsoid -!! input -:;* foo -::* bar -:; baz -!! result -<dl> -<dd><dl> -<dt><ul> -<li> foo -</li> -</ul></dt> -<dd><ul> -<li> bar -</li> -</ul></dd> -<dt> baz</dt> -</dl></dd> -</dl> -!! end - -!! test -Definition Lists: Mixed Lists: Test 2 -!! input -*: d1 -*: d2 -!! result -<ul> -<li><dl> -<dd> d1 -</dd> -<dd> d2 -</dd> -</dl> -</li> -</ul> - -!! end - - -!! test -Definition Lists: Mixed Lists: Test 3 -!! input -*::: d1 -*::: d2 -!! result -<ul> -<li><dl> -<dd><dl> -<dd><dl> -<dd> d1 -</dd> -<dd> d2 -</dd> -</dl> -</dd> -</dl> -</dd> -</dl> -</li> -</ul> - -!! end - - -!! test -Definition Lists: Mixed Lists: Test 4 -!! input -*;d1 :d2 -*;d3 :d4 -!! result -<ul> -<li><dl> -<dt>d1 </dt> -<dd>d2 -</dd> -<dt>d3 </dt> -<dd>d4 -</dd> -</dl> -</li> -</ul> - -!! end - - -!! test -Definition Lists: Mixed Lists: Test 5 -!! input -*:d1 -*:: d2 -!! result -<ul> -<li><dl> -<dd>d1 -<dl> -<dd> d2 -</dd> -</dl> -</dd> -</dl> -</li> -</ul> - -!! end - - -!! test -Definition Lists: Mixed Lists: Test 6 -!! input -#*:d1 -#*::: d3 -!! result -<ol> -<li><ul> -<li><dl> -<dd>d1 -<dl> -<dd><dl> -<dd> d3 -</dd> -</dl> -</dd> -</dl> -</dd> -</dl> -</li> -</ul> -</li> -</ol> - -!! end - - -!! test -Definition Lists: Mixed Lists: Test 7 -!! input -:* d1 -:* d2 -!! result -<dl> -<dd><ul> -<li> d1 -</li> -<li> d2 -</li> -</ul> -</dd> -</dl> - -!! end - - -!! test -Definition Lists: Mixed Lists: Test 8 -!! input -:* d1 -::* d2 -!! result -<dl> -<dd><ul> -<li> d1 -</li> -</ul> -<dl> -<dd><ul> -<li> d2 -</li> -</ul> -</dd> -</dl> -</dd> -</dl> - -!! end - - -!! test -Definition Lists: Mixed Lists: Test 9 -!! input -*;foo :bar -!! result -<ul> -<li><dl> -<dt>foo </dt> -<dd>bar -</dd> -</dl> -</li> -</ul> - -!! end - - -!! test -Definition Lists: Mixed Lists: Test 10 -!! input -*#;foo :bar -!! result -<ul> -<li><ol> -<li><dl> -<dt>foo </dt> -<dd>bar -</dd> -</dl> -</li> -</ol> -</li> -</ul> - -!! end - -# The Parsoid team disagrees with the PHP parser's seemingly-random -# rules regarding dd/dt on the next two tests. Parsoid is more -# consistent, and recognizes the shared nesting and keeps the -# still-open tags around until the nesting is complete. - -!! test -Definition Lists: Mixed Lists: Test 11 (php) -!! options -php -!! input -*#*#;*;;foo :bar -*#*#;boo :baz -!! result -<ul> -<li><ol> -<li><ul> -<li><ol> -<li><dl> -<dt>foo </dt> -<dd><ul> -<li><dl> -<dt><dl> -<dt>bar -</dt> -</dl> -</dd> -</dl> -</li> -</ul> -</dd> -</dl> -<dl> -<dt>boo </dt> -<dd>baz -</dd> -</dl> -</li> -</ol> -</li> -</ul> -</li> -</ol> -</li> -</ul> - -!! end -!! test -Definition Lists: Mixed Lists: Test 11 (parsoid) -!! options -parsoid -!! input -*#*#;*;;foo :bar -*#*#;boo :baz -!! result -<ul> -<li> -<ol> -<li> -<ul> -<li> -<ol> -<li> -<dl> -<dt> -<ul> -<li> -<dl> -<dt> -<dl> -<dt>foo<span typeof="mw:Placeholder" data-parsoid='{"src":" "}'> </span></dt> -<dd data-parsoid='{"stx":"row"}'>bar</dd> -</dl></dt> -</dl></li> -</ul></dt> -<dt>boo<span typeof="mw:Placeholder" data-parsoid='{"src":" "}'> </span></dt> -<dd data-parsoid='{"stx":"row"}'>baz</dd> -</dl></li> -</ol></li> -</ul></li> -</ol></li> -</ul> -!! end - - -!! test -Definition Lists: Weird Ones: Test 1 (php) -!! options -php -!! input -*#;*::;; foo : bar (who uses this?) -!! result -<ul> -<li><ol> -<li><dl> -<dt> foo </dt> -<dd><ul> -<li><dl> -<dd><dl> -<dd><dl> -<dt><dl> -<dt> bar (who uses this?) -</dt> -</dl> -</dd> -</dl> -</dd> -</dl> -</dd> -</dl> -</li> -</ul> -</dd> -</dl> -</li> -</ol> -</li> -</ul> - -!! end -!! test -Definition Lists: Weird Ones: Test 1 (parsoid) -!! options -parsoid -!! input -*#;*::;; foo : bar (who uses this?) -!! result -<ul> -<li> -<ol> -<li> -<dl> -<dt> -<ul> -<li> -<dl> -<dd> -<dl> -<dd> -<dl> -<dt> -<dl> -<dt> foo<span typeof="mw:Placeholder" data-parsoid='{"src":" "}'> </span></dt> -<dd data-parsoid='{"stx":"row"}'> bar (who uses this?)</dd> -</dl></dt> -</dl></dd> -</dl></dd> -</dl></li> -</ul></dt> -</dl></li> -</ol></li> -</ul> -!! end - -### -### External links -### -!! test -External links: non-bracketed -!! input -Non-bracketed: http://example.com -!! result -<p>Non-bracketed: <a rel="nofollow" class="external free" href="http://example.com">http://example.com</a> -</p> -!! end - -!! test -External links: numbered -!! input -Numbered: [http://example.com] -Numbered: [http://example.net] -Numbered: [http://example.com] -!! result -<p>Numbered: <a rel="nofollow" class="external autonumber" href="http://example.com">[1]</a> -Numbered: <a rel="nofollow" class="external autonumber" href="http://example.net">[2]</a> -Numbered: <a rel="nofollow" class="external autonumber" href="http://example.com">[3]</a> -</p> -!!end - -!! test -External links: specified text -!! input -Specified text: [http://example.com link] -!! result -<p>Specified text: <a rel="nofollow" class="external text" href="http://example.com">link</a> -</p> -!!end - -!! test -External links: trail -!! input -Linktrails should not work for external links: [http://example.com link]s -!! result -<p>Linktrails should not work for external links: <a rel="nofollow" class="external text" href="http://example.com">link</a>s -</p> -!! end - -!! test -External links: dollar sign in URL -!! input -http://example.com/1$2345 -!! result -<p><a rel="nofollow" class="external free" href="http://example.com/1$2345">http://example.com/1$2345</a> -</p> -!! end - -!! test -External links: dollar sign in URL (named) -!! input -[http://example.com/1$2345] -!! result -<p><a rel="nofollow" class="external autonumber" href="http://example.com/1$2345">[1]</a> -</p> -!!end - -!! test -External links: open square bracket forbidden in URL (bug 4377) -!! input -http://example.com/1[2345 -!! result -<p><a rel="nofollow" class="external free" href="http://example.com/1">http://example.com/1</a>[2345 -</p> -!! end - -!! test -External links: open square bracket forbidden in URL (named) (bug 4377) -!! input -[http://example.com/1[2345] -!! result -<p><a rel="nofollow" class="external text" href="http://example.com/1">[2345</a> -</p> -!!end - -!! test -External links: nowiki in URL link text (bug 6230) -!!input -[http://example.com/ <nowiki>''example site''</nowiki>] -!! result -<p><a rel="nofollow" class="external text" href="http://example.com/">''example site''</a> -</p> -!! end - -!! test -External links: newline forbidden in text (bug 6230 regression check) -!! input -[http://example.com/ first -second] -!! result -<p>[<a rel="nofollow" class="external free" href="http://example.com/">http://example.com/</a> first -second] -</p> -!!end - -!! test -External links: Pipe char between url and text -!! input -[http://example.com | link] -!! result -<p><a rel="nofollow" class="external text" href="http://example.com">| link</a> -</p> -!!end - -!! test -External links: protocol-relative URL in brackets -!! input -[//example.com/ Test] -!! result -<p><a rel="nofollow" class="external text" href="//example.com/">Test</a> -</p> -!! end - -!! test -External links: protocol-relative URL in brackets without text -!! input -[//example.com] -!! result -<p><a rel="nofollow" class="external autonumber" href="//example.com">[1]</a> -</p> -!! end - -!! test -External links: protocol-relative URL in free text is left alone -!! input -//example.com/Foo -!! result -<p>//example.com/Foo -</p> -!!end - -!! test -External links: protocol-relative URL in the middle of a word is left alone (bug 30269) -!! input -foo//example.com/Foo -!! result -<p>foo//example.com/Foo -</p> -!! end - -!! test -External image -!! input -External image: http://meta.wikimedia.org/upload/f/f1/Ncwikicol.png -!! result -<p>External image: <img src="http://meta.wikimedia.org/upload/f/f1/Ncwikicol.png" alt="Ncwikicol.png" /> -</p> -!! end - -!! test -External image from https -!! input -External image from https: https://meta.wikimedia.org/upload/f/f1/Ncwikicol.png -!! result -<p>External image from https: <img src="https://meta.wikimedia.org/upload/f/f1/Ncwikicol.png" alt="Ncwikicol.png" /> -</p> -!! end - -!! test -External image (when not allowed) -!! options -wgAllowExternalImages=0 -!! input -External image: http://meta.wikimedia.org/upload/f/f1/Ncwikicol.png -!! result -<p>External image: <a rel="nofollow" class="external free" href="http://meta.wikimedia.org/upload/f/f1/Ncwikicol.png">http://meta.wikimedia.org/upload/f/f1/Ncwikicol.png</a> -</p> -!! end - -!! test -Link to non-http image, no img tag -!! input -Link to non-http image, no img tag: ftp://example.com/test.jpg -!! result -<p>Link to non-http image, no img tag: <a rel="nofollow" class="external free" href="ftp://example.com/test.jpg">ftp://example.com/test.jpg</a> -</p> -!! end - -!! test -External links: terminating separator -!! input -Terminating separator: http://example.com/thing, -!! result -<p>Terminating separator: <a rel="nofollow" class="external free" href="http://example.com/thing">http://example.com/thing</a>, -</p> -!! end - -!! test -External links: intervening separator -!! input -Intervening separator: http://example.com/1,2,3 -!! result -<p>Intervening separator: <a rel="nofollow" class="external free" href="http://example.com/1,2,3">http://example.com/1,2,3</a> -</p> -!! end - -!! test -External links: old bug with URL in query -!! input -Old bug with URL in query: [http://example.com/thing?url=http://example.com link] -!! result -<p>Old bug with URL in query: <a rel="nofollow" class="external text" href="http://example.com/thing?url=http://example.com">link</a> -</p> -!! end - -!! test -External links: old URL-in-URL bug, mixed protocols -!! input -And again with mixed protocols: [ftp://example.com?url=http://example.com link] -!! result -<p>And again with mixed protocols: <a rel="nofollow" class="external text" href="ftp://example.com?url=http://example.com">link</a> -</p> -!!end - -!! test -External links: URL in text -!! input -URL in text: [http://example.com http://example.com] -!! result -<p>URL in text: <a rel="nofollow" class="external free" href="http://example.com">http://example.com</a> -</p> -!! end - -!! test -External links: Clickable images -!! input -ja-style clickable images: [http://example.com http://meta.wikimedia.org/upload/f/f1/Ncwikicol.png] -!! result -<p>ja-style clickable images: <a rel="nofollow" class="external text" href="http://example.com"><img src="http://meta.wikimedia.org/upload/f/f1/Ncwikicol.png" alt="Ncwikicol.png" /></a> -</p> -!!end - -!! test -External links: raw ampersand -!! input -Old & use: http://x&y -!! result -<p>Old & use: <a rel="nofollow" class="external free" href="http://x&y">http://x&y</a> -</p> -!! end - -!! test -External links: encoded ampersand -!! input -Old & use: http://x&y -!! result -<p>Old & use: <a rel="nofollow" class="external free" href="http://x&y">http://x&y</a> -</p> -!! end - -!! test -External links: encoded equals (bug 6102) -!! input -http://example.com/?foo=bar -!! result -<p><a rel="nofollow" class="external free" href="http://example.com/?foo=bar">http://example.com/?foo=bar</a> -</p> -!! end - -!! test -External links: [raw ampersand] -!! input -Old & use: [http://x&y] -!! result -<p>Old & use: <a rel="nofollow" class="external autonumber" href="http://x&y">[1]</a> -</p> -!! end - -!! test -External links: [encoded ampersand] -!! input -Old & use: [http://x&y] -!! result -<p>Old & use: <a rel="nofollow" class="external autonumber" href="http://x&y">[1]</a> -</p> -!! end - -!! test -External links: [encoded equals] (bug 6102) -!! input -[http://example.com/?foo=bar] -!! result -<p><a rel="nofollow" class="external autonumber" href="http://example.com/?foo=bar">[1]</a> -</p> -!! end - -!! test -External links: [IDN ignored character reference in hostname; strip it right off] -!! input -[http://e‌xample.com/] -!! result -<p><a rel="nofollow" class="external autonumber" href="http://example.com/">[1]</a> -</p> -!! end - -# FIXME: This test (the IDN characters in the text of a link) is an inconsistency. -# Where an external link could easily circumvent the sanitization of the text of -# a link like this (where an IDN-ignore character is in the URL somewhere), this -# test demands a higher standard. That's a bit strange. -# -# Example: -# -# http://example.com -> [http://example.com|http://example.com] -# [http://example.com|http://example.com] -> [http://example.com|http://example.com] -# -# The first example is sanitized, but the second is not. Any security benefits -# from this production are trivial to circumvent. Either remove this test and -# let the parser(s) do their thing unaccosted, or fix the inconsistency and change -# the test accordingly. -# -# All our love, -# The Parsoid team. -!! test -External links: IDN ignored character reference in hostname; strip it right off -!! input -http://e‌xample.com/ -!! result -<p><a rel="nofollow" class="external free" href="http://example.com/">http://example.com/</a> -</p> -!! end - -!! test -External links: www.jpeg.org (bug 554) -!! input -http://www.jpeg.org -!!result -<p><a rel="nofollow" class="external free" href="http://www.jpeg.org">http://www.jpeg.org</a> -</p> -!! end - -!! test -External links: URL within URL (original bug 2) -!! input -[http://www.unausa.org/newindex.asp?place=http://www.unausa.org/programs/mun.asp] -!! result -<p><a rel="nofollow" class="external autonumber" href="http://www.unausa.org/newindex.asp?place=http://www.unausa.org/programs/mun.asp">[1]</a> -</p> -!! end - -!! test -BUG 361: URL inside bracketed URL -!! input -[http://www.example.com/foo http://www.example.com/bar] -!! result -<p><a rel="nofollow" class="external text" href="http://www.example.com/foo">http://www.example.com/bar</a> -</p> -!! end - -!! test -BUG 361: URL within URL, not bracketed -!! input -http://www.example.com/foo?=http://www.example.com/bar -!! result -<p><a rel="nofollow" class="external free" href="http://www.example.com/foo?=http://www.example.com/bar">http://www.example.com/foo?=http://www.example.com/bar</a> -</p> -!! end - -!! test -BUG 289: ">"-token in URL-tail -!! input -http://www.example.com/<hello> -!! result -<p><a rel="nofollow" class="external free" href="http://www.example.com/">http://www.example.com/</a><hello> -</p> -!!end - -!! test -BUG 289: literal ">"-token in URL-tail -!! input -http://www.example.com/<b>html</b> -!! result -<p><a rel="nofollow" class="external free" href="http://www.example.com/">http://www.example.com/</a><b>html</b> -</p> -!!end - -!! test -BUG 289: ">"-token in bracketed URL -!! input -[http://www.example.com/<hello> stuff] -!! result -<p><a rel="nofollow" class="external text" href="http://www.example.com/"><hello> stuff</a> -</p> -!!end - -!! test -BUG 289: literal ">"-token in bracketed URL -!! input -[http://www.example.com/<b>html</b> stuff] -!! result -<p><a rel="nofollow" class="external text" href="http://www.example.com/"><b>html</b> stuff</a> -</p> -!!end - -!! test -BUG 289: literal double quote at end of URL -!! input -http://www.example.com/"hello" -!! result -<p><a rel="nofollow" class="external free" href="http://www.example.com/">http://www.example.com/</a>"hello" -</p> -!!end - -!! test -BUG 289: literal double quote in bracketed URL -!! input -[http://www.example.com/"hello" stuff] -!! result -<p><a rel="nofollow" class="external text" href="http://www.example.com/">"hello" stuff</a> -</p> -!!end - -!! test -External links: multiple legal whitespace is fine, Magnus. Don't break it please. (bug 5081) -!! input -[http://www.example.com test] -!! result -<p><a rel="nofollow" class="external text" href="http://www.example.com">test</a> -</p> -!! end - -!! test -External links: link text with spaces -!! input -[http://www.example.com a b c] -[http://www.example.com ''a'' ''b''] -!! result -<p><a rel="nofollow" class="external text" href="http://www.example.com">a b c</a> -<a rel="nofollow" class="external text" href="http://www.example.com"><i>a</i> <i>b</i></a> -</p> -!! end - -!! test -External links: wiki links within external link (Bug 3695) -!! input -[http://example.com [[wikilink]] embedded in ext link] -!! result -<p><a rel="nofollow" class="external text" href="http://example.com"></a><a href="/index.php?title=Wikilink&action=edit&redlink=1" class="new" title="Wikilink (page does not exist)">wikilink</a><a rel="nofollow" class="external text" href="http://example.com"> embedded in ext link</a> -</p> -!! end - -!! test -BUG 787: Links with one slash after the url protocol are invalid -!! input -http:/example.com - -[http:/example.com title] -!! result -<p>http:/example.com -</p><p>[http:/example.com title] -</p> -!! end - -!! test -Bracketed external links with template-generated invalid target -!! input -[{{echo|http:/example.com}} title] -!! result -<p>[http:/example.com title] -</p> -!! end - -!! test -Bug 2702: Mismatched <i>, <b> and <a> tags are invalid -!! input -''[http://example.com text''] -[http://example.com '''text]''' -''Something [http://example.com in italic''] -''Something [http://example.com mixed''''', even bold]''' -'''''Now [http://example.com both'''''] -!! result -<p><a rel="nofollow" class="external text" href="http://example.com"><i>text</i></a> -<a rel="nofollow" class="external text" href="http://example.com"><b>text</b></a> -<i>Something </i><a rel="nofollow" class="external text" href="http://example.com"><i>in italic</i></a> -<i>Something </i><a rel="nofollow" class="external text" href="http://example.com"><i>mixed</i><b>, even bold</b></a> -<i><b>Now </b></i><a rel="nofollow" class="external text" href="http://example.com"><i><b>both</b></i></a> -</p> -!! end - - -!! test -Bug 4781: %26 in URL -!! input -http://www.example.com/?title=AT%26T -!! result -<p><a rel="nofollow" class="external free" href="http://www.example.com/?title=AT%26T">http://www.example.com/?title=AT%26T</a> -</p> -!! end - -# According to http://dev.w3.org/html5/spec/Overview.html#parsing-urls a plain -# % is actually legal in HTML5. Any change in output would need testing though. -!! test -Bug 4781, 5267: %25 in URL -!! input -http://www.example.com/?title=100%25_Bran -!! result -<p><a rel="nofollow" class="external free" href="http://www.example.com/?title=100%25_Bran">http://www.example.com/?title=100%25_Bran</a> -</p> -!! end - -!! test -Bug 4781, 5267: %28, %29 in URL -!! input -http://www.example.com/?title=Ben-Hur_%281959_film%29 -!! result -<p><a rel="nofollow" class="external free" href="http://www.example.com/?title=Ben-Hur_%281959_film%29">http://www.example.com/?title=Ben-Hur_%281959_film%29</a> -</p> -!! end - - -!! test -Bug 4781: %26 in autonumber URL -!! input -[http://www.example.com/?title=AT%26T] -!! result -<p><a rel="nofollow" class="external autonumber" href="http://www.example.com/?title=AT%26T">[1]</a> -</p> -!! end - -!! test -Bug 4781, 5267: %26 in autonumber URL -!! input -[http://www.example.com/?title=100%25_Bran] -!! result -<p><a rel="nofollow" class="external autonumber" href="http://www.example.com/?title=100%25_Bran">[1]</a> -</p> -!! end - -!! test -Bug 4781, 5267: %28, %29 in autonumber URL -!! input -[http://www.example.com/?title=Ben-Hur_%281959_film%29] -!! result -<p><a rel="nofollow" class="external autonumber" href="http://www.example.com/?title=Ben-Hur_%281959_film%29">[1]</a> -</p> -!! end - - -!! test -Bug 4781: %26 in bracketed URL -!! input -[http://www.example.com/?title=AT%26T link] -!! result -<p><a rel="nofollow" class="external text" href="http://www.example.com/?title=AT%26T">link</a> -</p> -!! end - -!! test -Bug 4781, 5267: %26 in bracketed URL -!! input -[http://www.example.com/?title=100%25_Bran link] -!! result -<p><a rel="nofollow" class="external text" href="http://www.example.com/?title=100%25_Bran">link</a> -</p> -!! end - -!! test -Bug 4781, 5267: %28, %29 in bracketed URL -!! input -[http://www.example.com/?title=Ben-Hur_%281959_film%29 link] -!! result -<p><a rel="nofollow" class="external text" href="http://www.example.com/?title=Ben-Hur_%281959_film%29">link</a> -</p> -!! end - -!! test -External link containing double-single-quotes in text '' (bug 4598 sanity check) -!! input -Some [http://example.com/ pretty ''italics'' and stuff]! -!! result -<p>Some <a rel="nofollow" class="external text" href="http://example.com/">pretty <i>italics</i> and stuff</a>! -</p> -!! end - -!! test -External link containing double-single-quotes in text embedded in italics (bug 4598 sanity check) -!! input -''Some [http://example.com/ pretty ''italics'' and stuff]!'' -!! result -<p><i>Some </i><a rel="nofollow" class="external text" href="http://example.com/"><i>pretty </i>italics<i> and stuff</i></a><i>!</i> -</p> -!! end - -!! test -External link containing double-single-quotes with no space separating the url from text in italics -!! input -[http://www.musee-picasso.fr/pages/page_id18528_u1l2.htm''La muerte de Casagemas'' (1901) en el sitio de [[Museo Picasso (París)|Museo Picasso]].] -!! result -<p><a rel="nofollow" class="external text" href="http://www.musee-picasso.fr/pages/page_id18528_u1l2.htm"><i>La muerte de Casagemas</i> (1901) en el sitio de <a href="/index.php?title=Museo_Picasso_(Par%C3%ADs)&action=edit&redlink=1" class="new" title="Museo Picasso (París) (page does not exist)">Museo Picasso</a>.</a> -</p> -!! end - -!! test -External link with comments in link text -!! input -[http://www.google.com Google <!-- comment -->] -!! result -<p><a rel="nofollow" class="external text" href="http://www.google.com">Google </a> -</p> -!! end - -!! test -URL-encoding in URL functions (single parameter) -!! input -{{localurl:Some page|amp=&}} -!! result -<p>/index.php?title=Some_page&amp=& -</p> -!! end - -!! test -URL-encoding in URL functions (multiple parameters) -!! input -{{localurl:Some page|q=?&=&}} -!! result -<p>/index.php?title=Some_page&q=?&amp=& -</p> -!! end - -!! test -Brackets in urls -!! input -http://example.com/index.php?foozoid%5B%5D=bar - -http://example.com/index.php?foozoid[]=bar -!! result -<p><a rel="nofollow" class="external free" href="http://example.com/index.php?foozoid%5B%5D=bar">http://example.com/index.php?foozoid%5B%5D=bar</a> -</p><p><a rel="nofollow" class="external free" href="http://example.com/index.php?foozoid%5B%5D=bar">http://example.com/index.php?foozoid%5B%5D=bar</a> -</p> -!! end - -!! test -IPv6 urls (bug 21261) -!! options -disabled -!! input -http://[2404:130:0:1000::187:2]/index.php -!! result -<p><a rel="nofollow" class="external free" href="http://[2404:130:0:1000::187:2]/index.php">http://[2404:130:0:1000::187:2]/index.php</a> -</p> -!! end - -!! test -Non-extlinks in brackets -!! input -[foo] -[foo bar] -[foo ''bar''] -[fool's] errand -[fool's errand] -[{{echo|foo}}] -[{{echo|foo}} bar] -[{{echo|foo}} ''bar''] -[{{echo|foo}}l's] errand -[{{echo|foo}}l's errand] -[url={{echo|foo}}] -[url=http://example.com] -!! result -<p>[foo] -[foo bar] -[foo <i>bar</i>] -[fool's] errand -[fool's errand] -[foo] -[foo bar] -[foo <i>bar</i>] -[fool's] errand -[fool's errand] -[url=foo] -[url=<a rel="nofollow" class="external free" href="http://example.com">http://example.com</a>] -</p> -!! end - -!! test -Parsoid: Percent encoding in external links -!! options -parsoid -!! input -[https://github.com/search?l=&q=ResourceLoader+%40wikimedia Search] -!! result -<p><a rel="mw:ExtLink" -href="https://github.com/search?l=&q=ResourceLoader+%40wikimedia">Search</a></p> -!! end - -!! test -Parsoid: use url link syntax for links where the content is equal the link -target -!! options -parsoid -!! input -http://example.com -!! result -<p><a rel="mw:ExtLink" href="http://example.com">http://example.com</a></p> -!! end - -### -### Quotes -### - -!! test -Quotes -!! input -Normal text. '''Bold text.''' Normal text. ''Italic text.'' - -Normal text. '''''Bold italic text.''''' Normal text. -!!result -<p>Normal text. <b>Bold text.</b> Normal text. <i>Italic text.</i> -</p><p>Normal text. <i><b>Bold italic text.</b></i> Normal text. -</p> -!! end - - -!! test -Unclosed and unmatched quotes (php) -!! options -php -!! input -'''''Bold italic text '''with bold deactivated''' in between.''''' - -'''''Bold italic text ''with italic deactivated'' in between.''''' - -'''Bold text.. - -..spanning two paragraphs (should not work).''' - -'''Bold tag left open - -''Italic tag left open - -Normal text. - -<!-- Unmatching number of opening, closing tags: --> -'''This year''''s election ''should'' beat '''last year''''s. - -''Tom'''s car is bigger than ''Susan'''s. - -Plain ''italic'''s plain -!! result -<p><i><b>Bold italic text </b>with bold deactivated<b> in between.</b></i> -</p><p><b><i>Bold italic text </i>with italic deactivated<i> in between.</i></b> -</p><p><b>Bold text..</b> -</p><p>..spanning two paragraphs (should not work). -</p><p><b>Bold tag left open</b> -</p><p><i>Italic tag left open</i> -</p><p>Normal text. -</p><p><b>This year'</b>s election <i>should</i> beat <b>last year'</b>s. -</p><p><i>Tom<b>s car is bigger than </b></i><b>Susan</b>s. -</p><p>Plain <i>italic'</i>s plain -</p> -!! end -# Parsoid inserts an empty bold tag pair at the end of the line, that the PHP -# parser strips. The wikitext contains just the first half of the bold -# quote pair. -!! test -Unclosed and unmatched quotes (parsoid) -!! options -parsoid -!! input -'''''Bold italic text '''with bold deactivated''' in between.''''' - -'''''Bold italic text ''with italic deactivated'' in between.''''' - -'''Bold text.. - -..spanning two paragraphs (should not work).''' - -'''Bold tag left open - -''Italic tag left open - -Normal text. - -<!-- Unmatching number of opening, closing tags: --> -'''This year''''s election ''should'' beat '''last year''''s. - -''Tom'''s car is bigger than ''Susan'''s. - -Plain ''italic'''s plain -!! result -<p><i><b>Bold italic text </b>with bold deactivated<b> in between.</b></i> -</p><p><b><i>Bold italic text </i>with italic deactivated<i> in between.</i></b> -</p><p><b>Bold text..</b> -</p><p>..spanning two paragraphs (should not work).<b></b> -</p><p><b>Bold tag left open</b> -</p><p><i>Italic tag left open</i> -</p><p>Normal text. -</p><p><b>This year'</b>s election <i>should</i> beat <b>last year'</b>s. -</p><p><i>Tom<b>s car is bigger than </b></i><b>Susan</b>s. -</p><p>Plain <i>italic'</i>s plain -</p> -!! end - -### -### Tables -### -### some content taken from http://meta.wikimedia.org/wiki/MediaWiki_User%27s_Guide:_Using_tables -### - -# This should not produce <table></table> as <table><tr><td></td></tr></table> -# is the bare minimum required by the spec, see: -# http://www.w3.org/TR/xhtml-modularization/dtd_module_defs.html#a_module_Basic_Tables -!! test -A table with no data. (php) -!! options -php -!! input -{||} -!! result -!! end -# Parsoid team replies: empty table tags are legal in HTML5 -!! test -A table with no data. (parsoid) -!! options -parsoid -!! input -{||} -!! result -<table></table> -!! end - -# A table with nothing but a caption is invalid XHTML, we might want to render -# this as <p>caption</p> -!! test -A table with nothing but a caption (php) -!! options -php -!! input -{| -|+ caption -|} -!! result -<table> -<caption> caption -</caption><tr><td></td></tr></table> - -!! end -# Parsoid team replies: table with only a caption is legal in HTML5 -!! test -A table with nothing but a caption (parsoid) -!! options -parsoid -!! input -{| -|+ caption -|} -!! result -<table><caption> caption</caption></table> -!! end - -!! test -A table with caption with default-spaced attributes and a table row -!! input -{| -|+ style="color: red;" | caption1 -|- -| foo -|} -!! result -<table> -<caption style="color: red;"> caption1 -</caption> -<tr> -<td> foo -</td></tr></table> - -!! end - -!! test -A table with captions with non-default spaced attributes and a table row -!! input -{| -|+style="color: red;"|caption2 -|+ style="color: red;"| caption3 -|- -| foo -|} -!! result -<table> -<caption style="color: red;">caption2 -</caption> -<caption style="color: red;"> caption3 -</caption> -<tr> -<td> foo -</td></tr></table> - -!! end - -!! test -Table td-cell syntax variations -!! input -{| -| foo bar foo | baz -| foo bar foo || baz -| style='color:red;' | baz -| style='color:red;' || baz -|} -!! result -<table> -<tr> -<td> baz -</td> -<td> foo bar foo </td> -<td> baz -</td> -<td style="color:red;"> baz -</td> -<td> style='color:red;' </td> -<td> baz -</td></tr></table> - -!! end - -!! test -Simple table -!! input -{| -| 1 || 2 -|- -| 3 || 4 -|} -!! result -<table> -<tr> -<td> 1 </td> -<td> 2 -</td></tr> -<tr> -<td> 3 </td> -<td> 4 -</td></tr></table> - -!! end - -!! test -Simple table but with multiple dashes for row wikitext -!! input -{| -| foo -|----- -| bar -|} -!! result -<table> -<tr> -<td> foo -</td></tr> -<tr> -<td> bar -</td></tr></table> - -!! end -!! test -Multiplication table -!! input -{| border="1" cellpadding="2" -|+Multiplication table -|- -! × !! 1 !! 2 !! 3 -|- -! 1 -| 1 || 2 || 3 -|- -! 2 -| 2 || 4 || 6 -|- -! 3 -| 3 || 6 || 9 -|- -! 4 -| 4 || 8 || 12 -|- -! 5 -| 5 || 10 || 15 -|} -!! result -<table border="1" cellpadding="2"> -<caption>Multiplication table -</caption> -<tr> -<th> × </th> -<th> 1 </th> -<th> 2 </th> -<th> 3 -</th></tr> -<tr> -<th> 1 -</th> -<td> 1 </td> -<td> 2 </td> -<td> 3 -</td></tr> -<tr> -<th> 2 -</th> -<td> 2 </td> -<td> 4 </td> -<td> 6 -</td></tr> -<tr> -<th> 3 -</th> -<td> 3 </td> -<td> 6 </td> -<td> 9 -</td></tr> -<tr> -<th> 4 -</th> -<td> 4 </td> -<td> 8 </td> -<td> 12 -</td></tr> -<tr> -<th> 5 -</th> -<td> 5 </td> -<td> 10 </td> -<td> 15 -</td></tr></table> - -!! end - -!! test -Accept "||" in table headings -!! input -{| -!h1 || h2 -|} -!! result -<table> -<tr> -<th>h1 </th> -<th> h2 -</th></tr></table> - -!! end - -!! test -Accept "||" in indented table headings -!! input -:{| -!h1 || h2 -|} -!! result -<dl><dd><table> -<tr> -<th>h1 </th> -<th> h2 -</th></tr></table></dd></dl> - -!! end - -!! test -Accept empty attributes in td/th cells (td/th cells starting with leading ||) -!! input -{| -!| h1 -|| a -|} -!! result -<table> -<tr> -<th> h1 -</th> -<td> a -</td></tr></table> - -!! end - -!!test -Accept "| !" at start of line in tables (ignore !-attribute) -!!input -{| -|- -| !style="color:red" | bar -|} -!!result -<table> - -<tr> -<td> bar -</td></tr></table> - -!!end - -!!test -Allow +/- in 2nd and later cells in a row, in 1st cell when td-attrs are present, or in 1st cell when there is a space between "|" and +/- -!!input -{| -|- -|style='color:red;'|+1 -|style='color:blue;'|-1 -|- -| 1 || 2 || 3 -| 1 ||+2 ||-3 -|- -| +1 -| -1 -|} -!!result -<table> - -<tr> -<td style="color:red;">+1 -</td> -<td style="color:blue;">-1 -</td></tr> -<tr> -<td> 1 </td> -<td> 2 </td> -<td> 3 -</td> -<td> 1 </td> -<td>+2 </td> -<td>-3 -</td></tr> -<tr> -<td> +1 -</td> -<td> -1 -</td></tr></table> - -!!end - -!! test -Table rowspan -!! input -{| border=1 -| Cell 1, row 1 -|rowspan=2| Cell 2, row 1 (and 2) -| Cell 3, row 1 -|- -| Cell 1, row 2 -| Cell 3, row 2 -|} -!! result -<table border="1"> -<tr> -<td> Cell 1, row 1 -</td> -<td rowspan="2"> Cell 2, row 1 (and 2) -</td> -<td> Cell 3, row 1 -</td></tr> -<tr> -<td> Cell 1, row 2 -</td> -<td> Cell 3, row 2 -</td></tr></table> - -!! end - -!! test -Nested table -!! input -{| border=1 -| α -| -{| bgcolor=#ABCDEF border=2 -|nested -|- -|table -|} -|the original table again -|} -!! result -<table border="1"> -<tr> -<td> α -</td> -<td> -<table bgcolor="#ABCDEF" border="2"> -<tr> -<td>nested -</td></tr> -<tr> -<td>table -</td></tr></table> -</td> -<td>the original table again -</td></tr></table> - -!! end - -!! test -Invalid attributes in table cell (bug 1830) -!! input -{| -|Cell:|broken -|} -!! result -<table> -<tr> -<td>broken -</td></tr></table> - -!! end - - -!! test -Table security: embedded pipes (http://lists.wikimedia.org/mailman/htdig/wikitech-l/2006-April/022293.html) -!! input -{| -| |[ftp://|x||]" onmouseover="alert(document.cookie)">test -!! result -<table> -<tr> -<td>[<a rel="nofollow" class="external free" href="ftp://%7Cx">ftp://%7Cx</a></td> -<td>]" onmouseover="alert(document.cookie)">test -</td> -</tr> -</table> - -!! end - - -!! test -Indented table markup mixed with indented pre content (proposed in bug 6200) -!! input - <table> - <tr> - <td> - Text that should be rendered preformatted - </td> - </tr> - </table> -!! result - <table> - <tr> - <td> -<pre>Text that should be rendered preformatted -</pre> - </td> - </tr> - </table> - -!! end - -!! test -Template-generated table cell attributes and cell content -!! input -{| -|{{table_attribs}} -| {{table_attribs}} -|} -!! result -<table> -<tr> -<td style="color: red"> Foo -</td> -<td style="color: red"> Foo -</td></tr></table> - -!! end - -!! test -Template-generated table cell attributes and cell content (2) -!! input -{| -|align=center {{table_attribs}} -|} -!! result -<table> -<tr> -<td align="center" style="color: red"> Foo -</td></tr></table> - -!! end - -!! test -Template-generated table cell attributes and cell content (3) -!! input -{| -|align=center {{table_cells}} -|} -!! result -<table> -<tr> -<td align="center" style="color: red"> Foo </td> -<td> Bar </td> -<td> Baz -</td></tr></table> - -!! end - -!! test -Table with row followed by newlines and table heading -!! input -{| -|- - -! foo -|} -!! result -<table> - - -<tr> -<th> foo -</th></tr></table> - -!! end - -!! test -Table with empty line following the start tag -!! input -{| - -|- -| foo -|} -!! result -<table> - - -<tr> -<td> foo -</td></tr></table> - -!! end - -# FIXME: Preserve the attribute properly (with an empty string as value) in -# the PHP parser. Parsoid implements the behavior below. -!! test -Table attributes with empty value -!! options -parsoid -!! input -{| -| style=| hello -|} -!! result -<table> -<tbody> -<tr> -<td style=""> hello -</td></tr></tbody></table> - -!! end - -!! test -Wikitext table with a lot of comments -!! input -{| -<!-- c0 --> -| foo -<!-- c1 --> -|- <!-- c2 --> -<!-- c3 --> -|<!-- c4 --> -<!-- c5 --> -|} -!! result -<table> -<tr> -<td> foo -</td></tr> -<tr> -<td> -</td></tr></table> - -!! end - -!! test -Wikitext table with double-line table cell -!! input -{| -|a -b -|} -!! result -<table> -<tr> -<td>a -<p>b -</p> -</td></tr></table> - -!! end - -!! test -Table cell with a single comment -!! input -{| -| <!-- c1 --> -| a -|} -!! result -<table> -<tr> -<td> -</td> -<td> a -</td></tr></table> - -!! end - -# The expected HTML structure in this test is debatable. The PHP parser does -# not parse this kind of table at all. The main focus for Parsoid is on -# round-tripping, so this output is ok for now. TODO: revisit! -!! test -Wikitext table with html-syntax row (Parsoid) -!! options -parsoid -!! input -{| -|- -<td>foo</td> -|} -!! result -<table> -<tbody> -<tr> -<td>foo</td></tr></tbody></table> -!! end - -!! test -Implicit <td> after a |- -(PHP parser relies on Tidy to add the missing <td> tags) -!! options -parsoid=wt2html,wt2wt -!! input -{| -|- -a -|} -!! result -<table> -<tr><td>a</td></tr> -</table> -!! end - -!! test -Pres should be recognized in an explicit <td> context, but not in an implicit <td> context -(PHP parser relies on Tidy to add the missing <td> tags) -!! options -parsoid=wt2html,wt2wt -!! input -{| -|- -| - a -|- - b -|} -!! result -<table> -<tbody> -<tr><td><pre>a</pre></td></tr> -<tr><td> b</td></tr> -</tbody> -</table> -!! end - -!! test -Lists should be recognized in an implicit <td> context -(PHP parser relies on Tidy to add the missing <td> tags) -!! options -parsoid=wt2html,wt2wt -!! input -{| -|- -*a -|} -!! result -<table> -<tr> -<td><ul> -<li>a</li> -</ul></td> -</tr> -</table> -!! end - -!! test -Parsoid: Round-trip tables directly followed by content (bug 51219) -!! options -parsoid=wt2html,wt2wt -!! input -{| -|foo -|} bar - -{| -|baz -|}<b>quux</b> -!! result -<table><tbody> -<tr> -<td>foo</td></tr></tbody></table> bar -<table> -<tbody> -<tr> -<td>baz</td></tr></tbody></table><b>quux</b> -!! end - -!! test -Parsoid: Default to a newline after tables in new content (bug 51219) -!! options -parsoid=html2wt -!! input -{| -|foo -|} -<nowiki> </nowiki>bar -{| -|baz -|} -'''quux''' -!! result -<table><tbody> -<tr><td>foo</td></tr></tbody></table> bar -<table><tbody> -<tr><td>baz</td></tr></tbody></table><b>quux</b> -!! end - -### -### Internal links -### -!! test -Plain link, capitalized -!! input -[[Main Page]] -!! result -<p><a href="/wiki/Main_Page" title="Main Page">Main Page</a> -</p> -!! end - -!! test -Plain link, uncapitalized -!! input -[[main Page]] -!! result -<p><a href="/wiki/Main_Page" title="Main Page">main Page</a> -</p> -!! end - -!! test -Piped link -!! input -[[Main Page|The Main Page]] -!! result -<p><a href="/wiki/Main_Page" title="Main Page">The Main Page</a> -</p> -!! end - -!! test -Piped link with comment in link text -!! input -[[Main Page|The Main<!--front--> Page]] -!! result -<p><a href="/wiki/Main_Page" title="Main Page">The Main Page</a> -</p> -!! end - -!! test -Broken link -!! input -[[Zigzagzogzagzig]] -!! result -<p><a href="/index.php?title=Zigzagzogzagzig&action=edit&redlink=1" class="new" title="Zigzagzogzagzig (page does not exist)">Zigzagzogzagzig</a> -</p> -!! end - -!! test -Broken link with fragment -!! input -[[Zigzagzogzagzig#zug]] -!! result -<p><a href="/index.php?title=Zigzagzogzagzig&action=edit&redlink=1" class="new" title="Zigzagzogzagzig (page does not exist)">Zigzagzogzagzig#zug</a> -</p> -!! end - -!! test -Special page link with fragment -!! input -[[Special:Version#anchor]] -!! result -<p><a href="/wiki/Special:Version#anchor" title="Special:Version">Special:Version#anchor</a> -</p> -!! end - -!! test -Nonexistent special page link with fragment -!! input -[[Special:ThisNameWillHopefullyNeverBeUsed#anchor]] -!! result -<p><a href="/wiki/Special:ThisNameWillHopefullyNeverBeUsed" class="new" title="Special:ThisNameWillHopefullyNeverBeUsed (page does not exist)">Special:ThisNameWillHopefullyNeverBeUsed#anchor</a> -</p> -!! end - -!! test -Link with prefix -!! input -xxx[[main Page]], xxx[[Main Page]], Xxx[[main Page]] XXX[[main Page]], XXX[[Main Page]] -!! result -<p>xxx<a href="/wiki/Main_Page" title="Main Page">main Page</a>, xxx<a href="/wiki/Main_Page" title="Main Page">Main Page</a>, Xxx<a href="/wiki/Main_Page" title="Main Page">main Page</a> XXX<a href="/wiki/Main_Page" title="Main Page">main Page</a>, XXX<a href="/wiki/Main_Page" title="Main Page">Main Page</a> -</p> -!! end - -!! test -Link with suffix -!! input -[[Main Page]]xxx, [[Main Page]]XXX, [[Main Page]]!!! -!! result -<p><a href="/wiki/Main_Page" title="Main Page">Main Pagexxx</a>, <a href="/wiki/Main_Page" title="Main Page">Main Page</a>XXX, <a href="/wiki/Main_Page" title="Main Page">Main Page</a>!!! -</p> -!! end - -!! article -prefixed article -!! text -Some text -!! endarticle - -!! test -Bug 43661: Piped links with identical prefixes -!! input -[[prefixed article|prefixed articles with spaces]] - -[[prefixed article|prefixed articlesaoeu]] - -[[Main Page|Main Page test]] -!! result -<p><a href="/wiki/Prefixed_article" title="Prefixed article">prefixed articles with spaces</a> -</p><p><a href="/wiki/Prefixed_article" title="Prefixed article">prefixed articlesaoeu</a> -</p><p><a href="/wiki/Main_Page" title="Main Page">Main Page test</a> -</p> -!! end - - -!! test -Link with HTML entity in suffix / tail -!! input -[[Main Page]]", [[Main Page]]a -!! result -<p><a href="/wiki/Main_Page" title="Main Page">Main Page</a>", <a href="/wiki/Main_Page" title="Main Page">Main Page</a>a -</p> -!! end - -!! test -Link with 3 brackets -!! input -[[[main page]]] -!! result -<p>[[[main page]]] -</p> -!! end - -!! test -Piped link with 3 brackets -!! input -[[[main page|the main page]]] -!! result -<p>[[[main page|the main page]]] -</p> -!! end - -!! test -Link with multiple pipes -!! input -[[Main Page|The|Main|Page]] -!! result -<p><a href="/wiki/Main_Page" title="Main Page">The|Main|Page</a> -</p> -!! end - -!! test -Link to namespaces -!! input -[[Talk:Parser testing]], [[Meta:Disclaimers]] -!! result -<p><a href="/index.php?title=Talk:Parser_testing&action=edit&redlink=1" class="new" title="Talk:Parser testing (page does not exist)">Talk:Parser testing</a>, <a href="/index.php?title=Meta:Disclaimers&action=edit&redlink=1" class="new" title="Meta:Disclaimers (page does not exist)">Meta:Disclaimers</a> -</p> -!! end - -!! article -MemoryAlpha:AlphaTest -!! text -This is an article in the MemoryAlpha namespace -(which shadows the memoryalpha interwiki link). -!! endarticle - -!! test -Namespace takes precedence over interwiki link (bug 51680) -!! input -[[MemoryAlpha:AlphaTest]] -!! result -<p><a href="/wiki/MemoryAlpha:AlphaTest" title="MemoryAlpha:AlphaTest">MemoryAlpha:AlphaTest</a> -</p> -!! end - -!! test -Piped link to namespace -!! input -[[Meta:Disclaimers|The disclaimers]] -!! result -<p><a href="/index.php?title=Meta:Disclaimers&action=edit&redlink=1" class="new" title="Meta:Disclaimers (page does not exist)">The disclaimers</a> -</p> -!! end - -!! test -Link containing } -!! input -[[Usually caused by a typo (oops}]] -!! result -<p>[[Usually caused by a typo (oops}]] -</p> -!! end - -!! test -Link containing % (not as a hex sequence) -!! input -[[7% Solution]] -!! result -<p><a href="/index.php?title=7%25_Solution&action=edit&redlink=1" class="new" title="7% Solution (page does not exist)">7% Solution</a> -</p> -!! end - -!! test -Link containing % as a single hex sequence interpreted to char -!! input -[[7%25 Solution]] -!! result -<p><a href="/index.php?title=7%25_Solution&action=edit&redlink=1" class="new" title="7% Solution (page does not exist)">7% Solution</a> -</p> -!!end - -!! test -Link containing % as a double hex sequence interpreted to hex sequence -!! input -[[7%2525 Solution]] -!! result -<p>[[7%2525 Solution]] -</p> -!!end - -!! test -Link containing "#<" and "#>" % as a hex sequences- these are valid section anchors -Example for such a section: == < == -!! input -[[%23%3c]][[%23%3e]] -!! result -<p><a href="#.3C">#<</a><a href="#.3E">#></a> -</p> -!! end - -!! test -Link containing "<#" and ">#" as a hex sequences -!! input -[[%3c%23]][[%3e%23]] -!! result -<p>[[%3c%23]][[%3e%23]] -</p> -!! end - -!! test -Link containing an equals sign -!! input -[[Special:BookSources/isbn=4-00-026157-6]] -!! result -<p><a href="/wiki/Special:BookSources/isbn%3D4-00-026157-6" title="Special:BookSources/isbn=4-00-026157-6">Special:BookSources/isbn=4-00-026157-6</a> -</p> -!! end - -!! article -Foo~bar -!! text -Just a test of an article title containing a tilde. -!! endarticle - -# note that links containing signatures, like [[Foo~~~~]], are -# massaged by the pre-save transform (PST) and so the tildes are never -# seen by the parser. -!! test -Link containing a tilde -!! input -[[Foo~bar]] -!! result -<p><a href="/wiki/Foo%7Ebar" title="Foo~bar">Foo~bar</a> -</p> -!! end - -!! test -Link containing double-single-quotes '' (bug 4598) -!! input -[[Lista d''e paise d''o munno]] -!! result -<p><a href="/index.php?title=Lista_d%27%27e_paise_d%27%27o_munno&action=edit&redlink=1" class="new" title="Lista d''e paise d''o munno (page does not exist)">Lista d''e paise d''o munno</a> -</p> -!! end - -!! test -Link containing double-single-quotes '' in text (bug 4598 sanity check) -!! input -Some [[Link|pretty ''italics'' and stuff]]! -!! result -<p>Some <a href="/index.php?title=Link&action=edit&redlink=1" class="new" title="Link (page does not exist)">pretty <i>italics</i> and stuff</a>! -</p> -!! end - -!! test -Link containing double-single-quotes '' in text embedded in italics (bug 4598 sanity check) -!! input -''Some [[Link|pretty ''italics'' and stuff]]! -!! result -<p><i>Some <a href="/index.php?title=Link&action=edit&redlink=1" class="new" title="Link (page does not exist)">pretty <i>italics</i> and stuff</a>!</i> -</p> -!! end - -!! test -Link with double quotes in title part (literal) and alternate part (interpreted) -!! input -[[File:Denys Savchenko ''Pentecoste''.jpg]] - -[[''Pentecoste'']] - -[[''Pentecoste''|Pentecoste]] - -[[''Pentecoste''|''Pentecoste'']] -!! result -<p><a href="/index.php?title=Special:Upload&wpDestFile=Denys_Savchenko_%27%27Pentecoste%27%27.jpg" class="new" title="File:Denys Savchenko ''Pentecoste''.jpg">File:Denys Savchenko <i>Pentecoste</i>.jpg</a> -</p><p><a href="/index.php?title=%27%27Pentecoste%27%27&action=edit&redlink=1" class="new" title="''Pentecoste'' (page does not exist)">''Pentecoste''</a> -</p><p><a href="/index.php?title=%27%27Pentecoste%27%27&action=edit&redlink=1" class="new" title="''Pentecoste'' (page does not exist)">Pentecoste</a> -</p><p><a href="/index.php?title=%27%27Pentecoste%27%27&action=edit&redlink=1" class="new" title="''Pentecoste'' (page does not exist)"><i>Pentecoste</i></a> -</p> -!! end - -!! test -Broken image links with HTML captions (bug 39700) -!! input -[[File:Nonexistent|<script></script>]] -[[File:Nonexistent|100px|<script></script>]] -[[File:Nonexistent|<]] -[[File:Nonexistent|a<i>b</i>c]] -!! result -<p><a href="/index.php?title=Special:Upload&wpDestFile=Nonexistent" class="new" title="File:Nonexistent"><script></script></a> -<a href="/index.php?title=Special:Upload&wpDestFile=Nonexistent" class="new" title="File:Nonexistent"><script></script></a> -<a href="/index.php?title=Special:Upload&wpDestFile=Nonexistent" class="new" title="File:Nonexistent"><</a> -<a href="/index.php?title=Special:Upload&wpDestFile=Nonexistent" class="new" title="File:Nonexistent">abc</a> -</p> -!! end - -!! test -Plain link to URL -!! input -[[http://www.example.com]] -!! result -<p>[<a rel="nofollow" class="external autonumber" href="http://www.example.com">[1]</a>] -</p> -!! end - -!! test -Plain link to URL with link text -!! input -[[http://www.example.com Link text]] -!! result -<p>[<a rel="nofollow" class="external text" href="http://www.example.com">Link text</a>] -</p> -!! end - -!! test -Plain link to protocol-relative URL -!! input -[[//www.example.com]] -!! result -<p>[<a rel="nofollow" class="external autonumber" href="//www.example.com">[1]</a>] -</p> -!! end - -!! test -Plain link to protocol-relative URL with link text -!! input -[[//www.example.com Link text]] -!! result -<p>[<a rel="nofollow" class="external text" href="//www.example.com">Link text</a>] -</p> -!! end - -!! test -Plain link to page with question mark in title -!! input -[[A?b]] - -[[A?b|Baz]] -!! result -<p><a href="/wiki/A%3Fb" title="A?b">A?b</a> -</p><p><a href="/wiki/A%3Fb" title="A?b">Baz</a> -</p> -!! end - - -# I'm fairly sure the expected result here is wrong. -# We want these to be URL links, not pseudo-pages with URLs for titles.... -# However the current output is also pretty screwy. -# -# ---- -# I'm changing it to match the current output--it arguably makes more -# sense in the light of the test above. Old expected result was: -#<p>Piped link to URL: <a href="/index.php?title=Http://www.example.com&action=edit" class="new">an example URL</a> -#</p> -# But I think this test is bordering on "garbage in, garbage out" anyway. -# -- wtm -!! test -Piped link to URL -!! input -Piped link to URL: [[http://www.example.com|an example URL]] -!! result -<p>Piped link to URL: [<a rel="nofollow" class="external text" href="http://www.example.com%7Can">example URL</a>] -</p> -!! end - -!! test -BUG 2: [[page|http://url/]] should link to page, not http://url/ -!! input -[[Main Page|http://url/]] -!! result -<p><a href="/wiki/Main_Page" title="Main Page">http://url/</a> -</p> -!! end - -!! test -BUG 337: Escaped self-links should be bold -!! options -title=[[Bug462]] -!! input -[[Bug462]] [[Bug462]] -!! result -<p><strong class="selflink">Bug462</strong> <strong class="selflink">Bug462</strong> -</p> -!! end - -!! test -Self-link to section should not be bold -!! options -title=[[Main Page]] -!! input -[[Main Page#section]] -!! result -<p><a href="/wiki/Main_Page#section" title="Main Page">Main Page#section</a> -</p> -!! end - -!! article -00 -!! text -This is 00. -!! endarticle - -!!test -Self-link to numeric title -!!options -title=[[0]] -!!input -[[0]] -!!result -<p><strong class="selflink">0</strong> -</p> -!!end - -!!test -Link to numeric-equivalent title -!!options -title=[[0]] -!!input -[[00]] -!!result -<p><a href="/wiki/00" title="00">00</a> -</p> -!!end - -!! test -<nowiki> inside a link -!! input -[[Main<nowiki> Page</nowiki>]] [[Main Page|the main page <nowiki>[it's not very good]</nowiki>]] -!! result -<p>[[Main Page]] <a href="/wiki/Main_Page" title="Main Page">the main page [it's not very good]</a> -</p> -!! end - -!! test -Non-breaking spaces in title -!! input -[[ Main Page ]] -!! result -<p><a href="/wiki/Main_Page" title="Main Page">  Main   Page  </a> -</p> -!!end - -!! test -Internal link with ca linktrail, surrounded by bold apostrophes (bug 27473 primary issue) -!! options -language=ca -!! input -'''[[Main Page]]''' -!! result -<p><b><a href="/wiki/Main_Page" title="Main Page">Main Page</a></b> -</p> -!! end - -!! test -Internal link with ca linktrail, surrounded by italic apostrophes (bug 27473 primary issue) -!! options -language=ca -!! input -''[[Main Page]]'' -!! result -<p><i><a href="/wiki/Main_Page" title="Main Page">Main Page</a></i> -</p> -!! end - -!! test -Internal link with en linktrail: no apostrophes (bug 27473) -!! options -language=en -!! input -[[Something]]'nice -!! result -<p><a href="/index.php?title=Something&action=edit&redlink=1" class="new" title="Something (page does not exist)">Something</a>'nice -</p> -!! end - -!! test -Internal link with ca linktrail with apostrophes (bug 27473) -!! options -language=ca -!! input -[[Something]]'nice -!! result -<p><a href="/index.php?title=Something&action=edit&redlink=1" class="new" title="Something (encara no existeix)">Something'nice</a> -</p> -!! end - -!! test -Internal link with kaa linktrail with apostrophes (bug 27473) -!! options -language=kaa -!! input -[[Something]]'nice -!! result -<p><a href="/index.php?title=Something&action=edit&redlink=1" class="new" title="Something (bet ele jaratılmag'an)">Something'nice</a> -</p> -!! end - -!! article -Söfnuður -!! text -Test. -!! endarticle - -!! test -Internal link with is link prefix -!! options -language=is -!! input -Aðrir mótmælenda[[söfnuður|söfnuðir]] og -!! result -<p>Aðrir <a href="/wiki/S%C3%B6fnu%C3%B0ur" title="Söfnuður">mótmælendasöfnuðir</a> og -</p> -!! end - -!! article -Mótmælendatrú -!! text -Test. -!! endarticle - -!! test -Internal link with is link trail and link prefix -!! options -language=is -!! input -[[mótmælendatrú|xxx]]ar -[[mótmælendatrú]]ar -mótmælenda[[söfnuður]] -mótmælenda[[söfnuður|söfnuðir]] -mótmælenda[[söfnuður|söfnuðir]]xxx -!! result -<p><a href="/wiki/M%C3%B3tm%C3%A6lendatr%C3%BA" title="Mótmælendatrú">xxxar</a> -<a href="/wiki/M%C3%B3tm%C3%A6lendatr%C3%BA" title="Mótmælendatrú">mótmælendatrúar</a> -<a href="/wiki/S%C3%B6fnu%C3%B0ur" title="Söfnuður">mótmælendasöfnuður</a> -<a href="/wiki/S%C3%B6fnu%C3%B0ur" title="Söfnuður">mótmælendasöfnuðir</a> -<a href="/wiki/S%C3%B6fnu%C3%B0ur" title="Söfnuður">mótmælendasöfnuðirxxx</a> -</p> -!! end - -!! test -Parsoid link trail escaping -!! options -parsoid=html2wt,html2html -!! input -[[apple]]<nowiki/>s -!! result -<p><a rel="mw:WikiLink" href="Apple">apple</a>s</p> -!! end - -!! test -Parsoid link prefix escaping -!! options -language=is -parsoid=html2wt,html2html -!! input -Aðrir mótmælenda<nowiki/>[[söfnuður]] -!! result -<p>Aðrir mótmælenda<a rel="mw:WikiLink" href="Söfnuður">söfnuður</a></p> -!! end - -!! test -Parsoid-centric test: Whitespace in ext- and wiki-links should be preserved -!! input -[[Foo| bar]] - -[[Foo| ''bar'']] - -[http://wp.org foo] - -[http://wp.org ''foo''] -!! result -<p><a href="/index.php?title=Foo&action=edit&redlink=1" class="new" title="Foo (page does not exist)"> bar</a> -</p><p><a href="/index.php?title=Foo&action=edit&redlink=1" class="new" title="Foo (page does not exist)"> <i>bar</i></a> -</p><p><a rel="nofollow" class="external text" href="http://wp.org">foo</a> -</p><p><a rel="nofollow" class="external text" href="http://wp.org"><i>foo</i></a> -</p> -!! end - -### -### Interwiki links (see maintenance/interwiki.sql) -### - -!! test -Inline interwiki link -!! input -[[MeatBall:SoftSecurity]] -!! result -<p><a href="http://www.usemod.com/cgi-bin/mb.pl?SoftSecurity" class="extiw" title="meatball:SoftSecurity">MeatBall:SoftSecurity</a> -</p> -!! end - -!! test -Inline interwiki link with empty title (bug 2372) -!! input -[[MeatBall:]] -!! result -<p><a href="http://www.usemod.com/cgi-bin/mb.pl" class="extiw" title="meatball:">MeatBall:</a> -</p> -!! end - -!! test -Interwiki link encoding conversion (bug 1636) -!! input -*[[Wikipedia:ro:Olteniţa]] -*[[Wikipedia:ro:Olteniţa]] -!! result -<ul> -<li><a href="http://en.wikipedia.org/wiki/ro:Olteni%C5%A3a" class="extiw" title="wikipedia:ro:Olteniţa">Wikipedia:ro:Olteniţa</a> -</li> -<li><a href="http://en.wikipedia.org/wiki/ro:Olteni%C5%A3a" class="extiw" title="wikipedia:ro:Olteniţa">Wikipedia:ro:Olteniţa</a> -</li> -</ul> - -!! end - -!! test -Interwiki link with fragment (bug 2130) -!! input -[[MeatBall:SoftSecurity#foo]] -!! result -<p><a href="http://www.usemod.com/cgi-bin/mb.pl?SoftSecurity#foo" class="extiw" title="meatball:SoftSecurity">MeatBall:SoftSecurity#foo</a> -</p> -!! end - - -### -### Interlanguage links -### Language links (so that searching for '### language' matches..) -### - -!! test -Interlanguage link -!! input -Blah blah blah -[[zh:Chinese]] -!!result -<p>Blah blah blah -</p> -!! end - -!! test -Double interlanguage link -!! input -Blah blah blah -[[es:Spanish]] -[[zh:Chinese]] -!!result -<p>Blah blah blah -</p> -!! end - -!! test -Interlanguage link, with prefix links -!! options -language=ln -!! input -Blah blah blah -[[zh:Chinese]] -!!result -<p>Blah blah blah -</p> -!! end - -!! test -Double interlanguage link, with prefix links (bug 8897) -!! options -language=ln -!! input -Blah blah blah -[[es:Spanish]] -[[zh:Chinese]] -!!result -<p>Blah blah blah -</p> -!! end - -!! test -Parsoid-specific test: Wikilinks with should RT properly -!! options -language=ln -!! input -[[WW II]] -!!result -<p><a href="/index.php?title=WW_II&action=edit&redlink=1" class="new" title="WW II (lonkásá ezalí tɛ̂)">WW II</a> -</p> -!! end - -!! test -Parsoid bug 53221: Wikilinks should be properly entity-escaped -!! options -parsoid=html2wt -!! input -He&nbsp;llo [[Foo|He&nbsp;llo]] - -He&nbsp;llo [[He&nbsp;llo]] -!!result -<p>He&nbsp;llo <a href="Foo" rel="mw:WikiLink">He&nbsp;llo</a></p> -<p>He&nbsp;llo <a href="He&nbsp;llo" rel="mw:WikiLink">He&nbsp;llo</a></p> -!! end - -!! test -Parsoid: handle constructor well -!! options -parsoid -!! input -[[constructor]] - -[[constructor:foo]] -!! result -<p data-parsoid="{"dsr":[0,15,0,0]}"><a rel="mw:WikiLink" href="./Constructor" data-parsoid="{"stx":"simple","a":{"href":"./Constructor"},"sa":{"href":"constructor"},"dsr":[0,15,2,2]}">constructor</a></p> - - -<p data-parsoid="{"dsr":[17,36,0,0]}"><a rel="mw:WikiLink" href="./Foo" data-parsoid="{"stx":"simple","a":{"href":"./Foo"},"sa":{"href":"constructor:foo"},"dsr":[17,36,2,2]}">constructor:foo</a></p> -!! end - -!! test -Parsoid: recognize interlanguage links without a target page -!! options -parsoid -!! input -[[ko:]] -!! result -<p> -<link rel="mw:WikiLink/Language" href="http://ko.wikipedia.org/wiki/"></p> -!! end - -!! test -Parsoid: recognize interwiki links without a target page -!! options -parsoid -!! input -[[:ko:]] -!! result -<p><a rel="mw:WikiLink/Interwiki" href="http://ko.wikipedia.org/wiki/">ko:</a></p> -!! end - -### -### Redirects, Parsoid-only -### -!! test -Simple redirect to page -!! options -parsoid -!! input -#REDIRECT [[Main Page]] -!! result -<link rel="mw:PageProp/redirect" href="./Main_Page"> -!! end - -!! test -Optional colon in #REDIRECT -!! options -# the colon is archaic syntax. we support it for wt2html, but we -# don't care that it roundtrips back to the modern syntax. -parsoid=wt2html,html2html -!! input -#REDIRECT:[[Main Page]] -!! result -<link rel="mw:PageProp/redirect" href="./Main_Page"> -!! end - -!! test -Whitespace in #REDIRECT with optional colon -!! options -# the colon and gratuitous whitespace is archaic syntax. we support -# it for wt2html, but we don't care that it roundtrips back to the -# modern syntax (without extra whitespace) -parsoid=wt2html,html2html -!! input - - #REDIRECT -: -[[Main Page]] -!! result -<link rel="mw:PageProp/redirect" href="./Main_Page"> -!! end - -!! test -Piped link in #REDIRECT -!! options -# content after piped link is ignored. we support this syntax, -# but don't care that the piped link is lost when we roundtrip this. -parsoid=wt2html -!! input -#REDIRECT [[Main Page|bar]] -!! result -<link rel="mw:PageProp/redirect" href="./Main_Page"> -!! end - -!! test -Redirect to category -!! options -parsoid=wt2html -!! input -#REDIRECT [[Category:Foo]] -!! result -<link rel="mw:PageProp/redirect" href="./Category:Foo"><link rel="mw:WikiLink/Category" href="./Category:Foo"> -!! end - -!! test -Redirect to category with URL encoding -!! options -parsoid=wt2html -!! input -#REDIRECT [[Category%3AFoo]] -!! result -<link rel="mw:PageProp/redirect" href="./Category:Foo"><link rel="mw:WikiLink/Category" href="./Category:Foo"> -!! end - -!! test -Redirect to category page -!! options -parsoid=wt2html,html2html -!! input -#REDIRECT [[:Category:Foo]] -!! result -<p><a rel="mw:WikiLink" href="Category:Foo">Category:Foo</a></p> -!! end - -!! test -Redirect to image page (1) -!! options -parsoid -!! input -#REDIRECT [[File:Wiki.png]] -!! result -<link rel="mw:PageProp/redirect" href="./File:Wiki.png"> -!! end - -!! test -Redirect to image page (2) -!! options -parsoid -!! input -#REDIRECT [[Image:Wiki.png]] -!! result -<link rel="mw:PageProp/redirect" href="./File:Wiki.png"> -!! end - -!! test -Redirect to language -!! options -parsoid -!! input -#REDIRECT [[en:File:Wiki.png]] -!! result -<link rel="mw:PageProp/redirect" href="File:Wiki.png"> -!! end - -!! test -Redirect to interwiki -!! options -parsoid -!! input -#REDIRECT [[meatball:File:Wiki.png]] -!! result -<link rel="mw:PageProp/redirect" href="File:Wiki.png"> -!! end - -!! test -Non-English #REDIRECT -!! options -parsoid -language=is -!! input -#TILVÍSUN [[Main Page]] -!! result -<link rel="mw:PageProp/redirect" href="./Main_Page"> -!! end - -## -## XHTML tidiness -### - -!! test -<br> to <br /> -!! input -1<br>2<br />3 -!! result -<p>1<br />2<br />3 -</p> -!! end - -!! test -Broken br tag sanitization -!! options -php -!! input -</br> -!! result -<p></br> -</p> -!! end - -# TODO: Fix html2html mode (bug 51055)! -!! test -Parsoid: Broken br tag recognition -!! options -parsoid=wt2html -!! input -</br> -!! result -<p><br></p> -!! end - -!! test -Incorrecly removing closing slashes from correctly formed XHTML -!! input -<br style="clear:both;" /> -!! result -<p><br style="clear:both;" /> -</p> -!! end - -!! test -Failing to transform badly formed HTML into correct XHTML -!! input -<br style="clear: left;"> -<br style="clear: right;"> -<br style="clear: both;"> -!! result -<p><br style="clear: left;" /> -<br style="clear: right;" /> -<br style="clear: both;" /> -</p> -!!end - -!! test -Handling html with a div self-closing tag -!! input -<div title /> -<div title/> -<div title/ > -<div title=bar /> -<div title=bar/> -<div title=bar/ > -!! result -<p><div title /> -<div title/> -</p> -<div> -<p><div title=bar /> -<div title=bar/> -</p> -<div title="bar/"></div> -</div> - -!! end - -!! test -Handling html with a br self-closing tag -!! input -<br title /> -<br title/> -<br title/ > -<br title=bar /> -<br title=bar/> -<br title=bar/ > -!! result -<p><br title="title" /> -<br title="title" /> -<br /> -<br title="bar" /> -<br title="bar" /> -<br title="bar/" /> -</p> -!! end - -!! test -Horizontal ruler (should it add that extra space?) -!! input -<hr> -<hr > -foo <hr -> bar -!! result -<hr /> -<hr /> -foo <hr /> bar - -!! end - -!! test -Horizontal ruler -- 4+ dashes render hr -!! input ----- -!! result -<hr /> - -!! end - -!! test -Horizontal ruler -- eats additional dashes on the same line -!! input ---------- -!! result -<hr /> - -!! end - -!! test -Horizontal ruler -- does not collapse dashes on consecutive lines -!! input ----- ----- -!! result -<hr /> -<hr /> - -!! end - -!! test -Horizontal ruler -- <4 dashes render as plain text -!! input ---- -!! result -<p>--- -</p> -!! end - -!! test -Horizontal ruler -- Supports content following dashes on same line -!! input ----- Foo -!! result -<hr /> Foo - -!! end - -### -### Block-level elements -### -!! test -Common list -!! input -*Common list -* item 2 -*item 3 -!! result -<ul> -<li>Common list -</li> -<li> item 2 -</li> -<li>item 3 -</li> -</ul> - -!! end - -!! test -Numbered list -!! input -#Numbered list -#item 2 -# item 3 -!! result -<ol> -<li>Numbered list -</li> -<li>item 2 -</li> -<li> item 3 -</li> -</ol> - -!! end - -!! test -Mixed list -!! input -*Mixed list -*# with numbers -** and bullets -*# and numbers -*bullets again -**bullet level 2 -***bullet level 3 -***#Number on level 4 -**bullet level 2 -**#Number on level 3 -**#Number on level 3 -*#number level 2 -*Level 1 -*** Level 3 -#** Level 3, but ordered -!! result -<ul> -<li>Mixed list -<ol> -<li> with numbers -</li> -</ol> -<ul> -<li> and bullets -</li> -</ul> -<ol> -<li> and numbers -</li> -</ol> -</li> -<li>bullets again -<ul> -<li>bullet level 2 -<ul> -<li>bullet level 3 -<ol> -<li>Number on level 4 -</li> -</ol> -</li> -</ul> -</li> -<li>bullet level 2 -<ol> -<li>Number on level 3 -</li> -<li>Number on level 3 -</li> -</ol> -</li> -</ul> -<ol> -<li>number level 2 -</li> -</ol> -</li> -<li>Level 1 -<ul> -<li><ul> -<li> Level 3 -</li> -</ul> -</li> -</ul> -</li> -</ul> -<ol> -<li><ul> -<li><ul> -<li> Level 3, but ordered -</li> -</ul> -</li> -</ul> -</li> -</ol> - -!! end - -!! test -Nested lists 1 -!! input -*foo -**bar -!! result -<ul> -<li>foo -<ul> -<li>bar -</li> -</ul> -</li> -</ul> - -!! end - -!! test -Nested lists 2 -!! input -**foo -*bar -!! result -<ul> -<li><ul> -<li>foo -</li> -</ul> -</li> -<li>bar -</li> -</ul> - -!! end - -!! test -Nested lists 3 (first element empty) -!! input -* -**bar -!! result -<ul> -<li> -<ul> -<li>bar -</li> -</ul> -</li> -</ul> - -!! end - -!! test -Nested lists 4 (first element empty) -!! input -** -*bar -!! result -<ul> -<li><ul> -<li> -</li> -</ul> -</li> -<li>bar -</li> -</ul> - -!! end - -!! test -Nested lists 5 (both elements empty) -!! input -** -* -!! result -<ul> -<li><ul> -<li> -</li> -</ul> -</li> -<li> -</li> -</ul> - -!! end - -!! test -Nested lists 6 (both elements empty) -!! input -* -** -!! result -<ul> -<li> -<ul> -<li> -</li> -</ul> -</li> -</ul> - -!! end - -!! test -Nested lists 7 (skip initial nesting levels) -!! input -*** foo -!! result -<ul> -<li><ul> -<li><ul> -<li> foo -</li> -</ul> -</li> -</ul> -</li> -</ul> - -!! end - -!! test -Nested lists 8 (multiple nesting transitions) -!! input -* foo -*** bar -** baz -* boo -!! result -<ul> -<li> foo -<ul> -<li><ul> -<li> bar -</li> -</ul> -</li> -<li> baz -</li> -</ul> -</li> -<li> boo -</li> -</ul> - -!! end - -!! test -1. Lists with start-of-line-transparent tokens before bullets: Comments -!! input -*foo -*<!--cmt-->bar -<!--cmt-->*baz -!! result -<ul> -<li>foo -</li> -<li>bar -</li> -<li>baz -</li> -</ul> - -!! end - -!! test -2. Lists with start-of-line-transparent tokens before bullets: Template close -!! input -*foo {{echo|bar -}}*baz -!! result -<ul> -<li>foo bar -</li> -<li>baz -</li> -</ul> - -!! end - -!! test -List items are not parsed correctly following a <pre> block (bug 785) -!! input -* <pre>foo</pre> -* <pre>bar</pre> -* zar -!! result -<ul> -<li> <pre>foo</pre> -</li> -<li> <pre>bar</pre> -</li> -<li> zar -</li> -</ul> - -!! end - -!! test -List items from template -!! input - -{{inner list}} -* item 2 - -* item 0 -{{inner list}} -* item 2 - -* item 0 -* notSOL{{inner list}} -* item 2 -!! result -<ul> -<li> item 1 -</li> -<li> item 2 -</li> -</ul> -<ul> -<li> item 0 -</li> -<li> item 1 -</li> -<li> item 2 -</li> -</ul> -<ul> -<li> item 0 -</li> -<li> notSOL -</li> -<li> item 1 -</li> -<li> item 2 -</li> -</ul> - -!! end - -!! test -List interrupted by empty line or heading -!! input -* foo - -** bar -== A heading == -* Another list item -!! result -<ul> -<li> foo -</li> -</ul> -<ul> -<li><ul> -<li> bar -</li> -</ul> -</li> -</ul> -<h2><span class="mw-headline" id="A_heading">A heading</span><span class="mw-editsection"><span class="mw-editsection-bracket">[</span><a href="/index.php?title=Parser_test&action=edit&section=1" title="Edit section: A heading">edit</a><span class="mw-editsection-bracket">]</span></span></h2> -<ul> -<li> Another list item -</li> -</ul> - -!!end - -!!test -Multiple list tags generated by templates -!!input -{{echo|<li>}}a -{{echo|<li>}}b -{{echo|<li>}}c -!!result -<li>a -<li>b -<li>c</li> -</li> -</li> - -!!end - -!!test -Single-comment whitespace lines dont break lists, and neither do multi-comment whitespace lines -!!input -*a -<!--This line will NOT split the list--> -*b - <!--This line will NOT split the list either--> -*c - <!--foo--> <!----> <!--This line NOT split the list either--> -*d -!!result -<ul> -<li>a -</li> -<li>b -</li> -<li>c -</li> -<li>d -</li> -</ul> - -!!end - -!!test -Replacing whitespace with tabs still doesn't break the list (gerrit 78327) -!!input -*a -<!--This line will NOT split the list--> -*b - <!--This line will NOT split the list either--> -*c - <!--foo--> <!----> <!--This line NOT split the list - either--> -*d -!!result -<ul> -<li>a -</li> -<li>b -</li> -<li>c -</li> -<li>d -</li> -</ul> - -!!end - -!!test -Test the li-hack -(Cannot test this with PHP parser since it relies on Tidy for the hack) -!!options -parsoid=wt2html,wt2wt -!!input -* foo -* <li>li-hack -* {{echo|<li>templated li-hack}} -* <!--foo--> <li> unsupported li-hack with preceding comments - -<ul> -<li><li>not a li-hack -</li> -</ul> -!!result -<ul> -<li> foo</li> -<li>li-hack</li> -<li about="#mwt1" typeof="mw:Transclusion" data-mw='{"parts":[{"template":{"target":{"wt":"echo","href":"./Template:Echo"},"params":{"1":{"wt":"<li>templated li-hack"}}}}]}'>templated li-hack</li> -<li> <!--foo--> </li> -<li> li-hack with preceding comments</li> -</ul> - -<ul> -<li></li> -<li>not a li-hack -</li> -</ul> -!!end - -!! test -Parsoid: Make sure nested lists are serialized on their own line even if HTML contains no newlines -!! options -parsoid -!! input -# foo -## bar -* foo -** bar -: foo -:: bar -!! result -<ol> -<li> foo<ol> -<li> bar</li> -</ol></li> -</ol><ul> -<li> foo<ul> -<li> bar</li> -</ul></li> -</ul><dl> -<dd> foo<dl> -<dd> bar</dd> -</dl></dd> -</dl> -!! end - -!! test -Parsoid: Test of whitespace serialization with Templated bullets -!! options -parsoid -!! input -* {{bullet}} -!! result -<ul> -<li> </li><li about="#mwt1" typeof="mw:Transclusion" data-mw='{"parts":[{"template":{"target":{"wt":"bullet","href":"./Template:Bullet"},"params":{},"i":0}}]}'> Bar</li> -</ul> -!! end - -# ------------------------------------------------------------------------ -# The next set of tests are about Parsoid's ability to handle badly nested -# tags (parse, minimize scope of fixup, and roundtrip back) -# ------------------------------------------------------------------------ - -!! test -Unbalanced closing block tags break a list -(Parsoid-only since php parser generates broken html -- relies on Tidy to fix up) -!! options -parsoid -!! input -<div> -*a</div><div> -*b</div> -!! result -<div> -<ul> -<li>a -</li> -</ul></div><div> -<ul> -<li>b -</li> -</ul></div> -!! end - -!! test -Unbalanced closing non-block tags don't break a list -(Parsoid-only since php parser generates broken html -- relies on Tidy to fix up) -!! options -parsoid -!! input -<span> -*a</span><span> -*b</span> -!! result -<p><span></span> -</p> -<ul> -<li>a<span></span> -</li> -<li>b -</li> -</ul> -!! end - -!! test -Unclosed formatting tags that straddle lists are closed and reopened -(Parsoid-only since php parser generates broken html -- relies on Tidy to fix up) -!! options -parsoid -!! input -# <s> a -# b </s> -!! result -<ol> -<li> <s> a </s> -</li> -<li> <s> b </s> -</li> -</ol> -!! end - -!!test -List embedded in a non-block tag -(Ugly Parsoid output -- worth fixing; Disabled for PHP parser since it relies on Tidy) -!! options -parsoid -!!input -<small> -* foo -</small> -!!result -<p><small></small></p> -<small> -<ul> -<li> foo</li> -</ul> -</small> -<p><small></small></p> -!!end - -!! test -Table with missing opening <tr> tag -!! options -parsoid=wt2html,wt2wt -!! input -<table> -<td>foo</td> -</tr> -</table> -!! result -<table> -<tr> -<td>foo</td> -</tr> -</table> -!! end - -### -### Magic Words -### - -# Note that the current date is hard-coded as -# 1970-01-01T00:02:03Z (a Thursday) -# when running parser tests. The timezone is also fixed to GMT, so -# local date will be identical to current date. - -!! test -Magic Word: {{CURRENTDAY}} -!! input -{{CURRENTDAY}} -!! result -<p>1 -</p> -!! end - -!! test -Magic Word: {{CURRENTDAY2}} -!! input -{{CURRENTDAY2}} -!! result -<p>01 -</p> -!! end - -!! test -Magic Word: {{CURRENTDAYNAME}} -!! input -{{CURRENTDAYNAME}} -!! result -<p>Thursday -</p> -!! end - -!! test -Magic Word: {{CURRENTDOW}} -!! input -{{CURRENTDOW}} -!! result -<p>4 -</p> -!! end - -!! test -Magic Word: {{CURRENTMONTH}} -!! input -{{CURRENTMONTH}} -!! result -<p>01 -</p> -!! end - -!! test -Magic Word: {{CURRENTMONTH1}} -!! input -{{CURRENTMONTH1}} -!! result -<p>1 -</p> -!! end - -!! test -Magic Word: {{CURRENTMONTHABBREV}} -!! input -{{CURRENTMONTHABBREV}} -!! result -<p>Jan -</p> -!! end - -!! test -Magic Word: {{CURRENTMONTHNAME}} -!! input -{{CURRENTMONTHNAME}} -!! result -<p>January -</p> -!! end - -!! test -Magic Word: {{CURRENTMONTHNAMEGEN}} -!! input -{{CURRENTMONTHNAMEGEN}} -!! result -<p>January -</p> -!! end - -!! test -Magic Word: {{CURRENTTIME}} -!! input -{{CURRENTTIME}} -!! result -<p>00:02 -</p> -!! end - -!! test -Magic Word: {{CURRENTHOUR}} -!! input -{{CURRENTHOUR}} -!! result -<p>00 -</p> -!! end - -!! test -Magic Word: {{CURRENTWEEK}} (@bug 4594) -!! input -{{CURRENTWEEK}} -!! result -<p>1 -</p> -!! end - -!! test -Magic Word: {{CURRENTYEAR}} -!! input -{{CURRENTYEAR}} -!! result -<p>1970 -</p> -!! end - -!! test -Magic Word: {{CURRENTTIMESTAMP}} -!! input -{{CURRENTTIMESTAMP}} -!! result -<p>19700101000203 -</p> -!! end - -!! test -Magic Words LOCAL (UTC) -!! input -* {{LOCALMONTH}} -* {{LOCALMONTH1}} -* {{LOCALMONTHNAME}} -* {{LOCALMONTHNAMEGEN}} -* {{LOCALMONTHABBREV}} -* {{LOCALDAY}} -* {{LOCALDAY2}} -* {{LOCALDAYNAME}} -* {{LOCALYEAR}} -* {{LOCALTIME}} -* {{LOCALHOUR}} -* {{LOCALWEEK}} -* {{LOCALDOW}} -* {{LOCALTIMESTAMP}} -!! result -<ul> -<li> 01 -</li> -<li> 1 -</li> -<li> January -</li> -<li> January -</li> -<li> Jan -</li> -<li> 1 -</li> -<li> 01 -</li> -<li> Thursday -</li> -<li> 1970 -</li> -<li> 00:02 -</li> -<li> 00 -</li> -<li> 1 -</li> -<li> 4 -</li> -<li> 19700101000203 -</li> -</ul> - -!! end - -!! test -Magic Word: {{FULLPAGENAME}} -!! options -title=[[User:Ævar Arnfjörð Bjarmason]] -!! input -{{FULLPAGENAME}} -!! result -<p>User:Ævar Arnfjörð Bjarmason -</p> -!! end - -!! test -Magic Word: {{FULLPAGENAMEE}} -!! options -title=[[User:Ævar Arnfjörð Bjarmason]] -!! input -{{FULLPAGENAMEE}} -!! result -<p>User:%C3%86var_Arnfj%C3%B6r%C3%B0_Bjarmason -</p> -!! end - -!! test -Magic Word: {{TALKSPACE}} -!! options -title=[[User:Ævar Arnfjörð Bjarmason]] -!! input -{{TALKSPACE}} -!! result -<p>User talk -</p> -!! end - -!! test -Magic Word: {{TALKSPACE}}, same namespace -!! options -title=[[User talk:Ævar Arnfjörð Bjarmason]] -!! input -{{TALKSPACE}} -!! result -<p>User talk -</p> -!! end - -!! test -Magic Word: {{TALKSPACE}}, main namespace -!! options -title=[[Parser Test]] -!! input -{{TALKSPACE}} -!! result -<p>Talk -</p> -!! end - -!! test -Magic Word: {{TALKSPACEE}} -!! options -title=[[User:Ævar Arnfjörð Bjarmason]] -!! input -{{TALKSPACEE}} -!! result -<p>User_talk -</p> -!! end - -!! test -Magic Word: {{SUBJECTSPACE}} -!! options -title=[[User talk:Ævar Arnfjörð Bjarmason]] -!! input -{{SUBJECTSPACE}} -!! result -<p>User -</p> -!! end - -!! test -Magic Word: {{SUBJECTSPACE}}, same namespace -!! options -title=[[User:Ævar Arnfjörð Bjarmason]] -!! input -{{SUBJECTSPACE}} -!! result -<p>User -</p> -!! end - -!! test -Magic Word: {{SUBJECTSPACE}}, main namespace -!! options -title=[[Parser Test]] -!! input -{{SUBJECTSPACE}} -!! result - -!! end - -!! test -Magic Word: {{SUBJECTSPACEE}} -!! options -title=[[User talk:Ævar Arnfjörð Bjarmason]] -!! input -{{SUBJECTSPACEE}} -!! result -<p>User -</p> -!! end - -!! test -Magic Word: {{NAMESPACE}} -!! options -title=[[User:Ævar Arnfjörð Bjarmason]] -!! input -{{NAMESPACE}} -!! result -<p>User -</p> -!! end - -!! test -Magic Word: {{NAMESPACEE}} -!! options -title=[[User:Ævar Arnfjörð Bjarmason]] -!! input -{{NAMESPACEE}} -!! result -<p>User -</p> -!! end - -!! test -Magic Word: {{NAMESPACENUMBER}} -!! options -title=[[User:Ævar Arnfjörð Bjarmason]] -!! input -{{NAMESPACENUMBER}} -!! result -<p>2 -</p> -!! end - -!! test -Magic Word: {{SUBPAGENAME}} -!! options -title=[[Ævar Arnfjörð Bjarmason/sub ö]] subpage -!! input -{{SUBPAGENAME}} -!! result -<p>sub ö -</p> -!! end - -!! test -Magic Word: {{SUBPAGENAMEE}} -!! options -title=[[Ævar Arnfjörð Bjarmason/sub ö]] subpage -!! input -{{SUBPAGENAMEE}} -!! result -<p>sub_%C3%B6 -</p> -!! end - -!! test -Magic Word: {{ROOTPAGENAME}} -!! options -title=[[Ævar Arnfjörð Bjarmason/sub/sub2]] subpage -!! input -{{ROOTPAGENAME}} -!! result -<p>Ævar Arnfjörð Bjarmason -</p> -!! end - -!! test -Magic Word: {{ROOTPAGENAMEE}} -!! options -title=[[Ævar Arnfjörð Bjarmason/sub/sub2]] subpage -!! input -{{ROOTPAGENAMEE}} -!! result -<p>%C3%86var_Arnfj%C3%B6r%C3%B0_Bjarmason -</p> -!! end - -!! test -Magic Word: {{BASEPAGENAME}} -!! options -title=[[Ævar Arnfjörð Bjarmason/sub]] subpage -!! input -{{BASEPAGENAME}} -!! result -<p>Ævar Arnfjörð Bjarmason -</p> -!! end - -!! test -Magic Word: {{BASEPAGENAMEE}} -!! options -title=[[Ævar Arnfjörð Bjarmason/sub]] subpage -!! input -{{BASEPAGENAMEE}} -!! result -<p>%C3%86var_Arnfj%C3%B6r%C3%B0_Bjarmason -</p> -!! end - -!! test -Magic Word: {{TALKPAGENAME}} -!! options -title=[[User:Ævar Arnfjörð Bjarmason]] -!! input -{{TALKPAGENAME}} -!! result -<p>User talk:Ævar Arnfjörð Bjarmason -</p> -!! end - -!! test -Magic Word: {{TALKPAGENAMEE}} -!! options -title=[[User:Ævar Arnfjörð Bjarmason]] -!! input -{{TALKPAGENAMEE}} -!! result -<p>User_talk:%C3%86var_Arnfj%C3%B6r%C3%B0_Bjarmason -</p> -!! end - -!! test -Magic Word: {{SUBJECTPAGENAME}} -!! options -title=[[User talk:Ævar Arnfjörð Bjarmason]] -!! input -{{SUBJECTPAGENAME}} -!! result -<p>User:Ævar Arnfjörð Bjarmason -</p> -!! end - -!! test -Magic Word: {{SUBJECTPAGENAMEE}} -!! options -title=[[User talk:Ævar Arnfjörð Bjarmason]] -!! input -{{SUBJECTPAGENAMEE}} -!! result -<p>User:%C3%86var_Arnfj%C3%B6r%C3%B0_Bjarmason -</p> -!! end - -!! test -Magic Word: {{NUMBEROFFILES}} -!! input -{{NUMBEROFFILES}} -!! result -<p>4 -</p> -!! end - -!! test -Magic Word: {{PAGENAME}} -!! options -title=[[User:Ævar Arnfjörð Bjarmason]] -!! input -{{PAGENAME}} -!! result -<p>Ævar Arnfjörð Bjarmason -</p> -!! end - -!! test -Magic Word: {{PAGENAME}} with metacharacters -!! options -title=[['foo & bar = baz']] -!! input -''{{PAGENAME}}'' -!! result -<p><i>'foo & bar = baz'</i> -</p> -!! end - -!! test -Magic Word: {{PAGENAME}} with metacharacters (bug 26781) -!! options -title=[[*RFC 1234 http://example.com/]] -!! input -{{PAGENAME}} -!! result -<p>*RFC 1234 http://example.com/ -</p> -!! end - -!! test -Magic Word: {{PAGENAMEE}} -!! options -title=[[User:Ævar Arnfjörð Bjarmason]] -!! input -{{PAGENAMEE}} -!! result -<p>%C3%86var_Arnfj%C3%B6r%C3%B0_Bjarmason -</p> -!! end - -!! test -Magic Word: {{PAGENAMEE}} with metacharacters (bug 26781) -!! options -title=[[*RFC 1234 http://example.com/]] -!! input -{{PAGENAMEE}} -!! result -<p>*RFC_1234_http://example.com/ -</p> -!! end - -!! test -Magic Word: {{REVISIONID}} -!! input -{{REVISIONID}} -!! result -<p>1337 -</p> -!! end - -!! test -Magic Word: {{SCRIPTPATH}} -!! input -{{SCRIPTPATH}} -!! result -<p>/ -</p> -!! end - -!! test -Magic Word: {{STYLEPATH}} -!! input -{{STYLEPATH}} -!! result -<p>/skins -</p> -!! end - -!! test -Magic Word: {{SERVER}} -!! input -{{SERVER}} -!! result -<p><a rel="nofollow" class="external free" href="http://example.org">http://example.org</a> -</p> -!! end - -!! test -Magic Word: {{SERVERNAME}} -!! input -{{SERVERNAME}} -!! result -<p>example.org -</p> -!! end - -!! test -Magic Word: {{SITENAME}} -!! input -{{SITENAME}} -!! result -<p>MediaWiki -</p> -!! end - -!! test -Case-sensitive magic words, when cased differently, should just be template transclusions -!! input -{{CurrentMonth}} -{{currentday}} -{{cURreNTweEK}} -{{currentHour}} -!! result -<p><a href="/index.php?title=Template:CurrentMonth&action=edit&redlink=1" class="new" title="Template:CurrentMonth (page does not exist)">Template:CurrentMonth</a> -<a href="/index.php?title=Template:Currentday&action=edit&redlink=1" class="new" title="Template:Currentday (page does not exist)">Template:Currentday</a> -<a href="/index.php?title=Template:CURreNTweEK&action=edit&redlink=1" class="new" title="Template:CURreNTweEK (page does not exist)">Template:CURreNTweEK</a> -<a href="/index.php?title=Template:CurrentHour&action=edit&redlink=1" class="new" title="Template:CurrentHour (page does not exist)">Template:CurrentHour</a> -</p> -!! end - -!! test -Case-insensitive magic words should still work with weird casing. -!! input -{{sErVeRNaMe}} -{{LCFirst:AOEU}} -{{ucFIRST:aoeu}} -{{SERver}} -!! result -<p>example.org -aOEU -Aoeu -<a rel="nofollow" class="external free" href="http://example.org">http://example.org</a> -</p> -!! end - -!! test -Namespace 1 {{ns:1}} -!! input -{{ns:1}} -!! result -<p>Talk -</p> -!! end - -!! test -Namespace 1 {{ns:01}} -!! input -{{ns:01}} -!! result -<p>Talk -</p> -!! end - -!! test -Namespace 0 {{ns:0}} (bug 4783) -!! input -{{ns:0}} -!! result - -!! end - -!! test -Namespace 0 {{ns:00}} (bug 4783) -!! input -{{ns:00}} -!! result - -!! end - -!! test -Namespace -1 {{ns:-1}} -!! input -{{ns:-1}} -!! result -<p>Special -</p> -!! end - -!! test -Namespace User {{ns:User}} -!! input -{{ns:User}} -!! result -<p>User -</p> -!! end - -!! test -Namespace User talk {{ns:User_talk}} -!! input -{{ns:User_talk}} -!! result -<p>User talk -</p> -!! end - -!! test -Namespace User talk {{ns:uSeR tAlK}} -!! input -{{ns:uSeR tAlK}} -!! result -<p>User talk -</p> -!! end - -!! test -Namespace File {{ns:File}} -!! input -{{ns:File}} -!! result -<p>File -</p> -!! end - -!! test -Namespace File {{ns:Image}} -!! input -{{ns:Image}} -!! result -<p>File -</p> -!! end - -!! test -Namespace (lang=de) Benutzer {{ns:User}} -!! options -language=de -!! input -{{ns:User}} -!! result -<p>Benutzer -</p> -!! end - -!! test -Namespace (lang=de) Benutzer Diskussion {{ns:3}} -!! options -language=de -!! input -{{ns:3}} -!! result -<p>Benutzer Diskussion -</p> -!! end - - -!! test -Urlencode -!! input -{{urlencode:hi world?!}} -{{urlencode:hi world?!|WIKI}} -{{urlencode:hi world?!|PATH}} -{{urlencode:hi world?!|QUERY}} -!! result -<p>hi+world%3F%21 -hi_world%3F! -hi%20world%3F%21 -hi+world%3F%21 -</p> -!! end - -### -### Magic links -### -!! test -Magic links: internal link to RFC (bug 479) -!! input -[[RFC 123]] -!! result -<p><a href="/index.php?title=RFC_123&action=edit&redlink=1" class="new" title="RFC 123 (page does not exist)">RFC 123</a> -</p> -!! end - -!! test -Magic links: RFC (bug 479) -!! input -RFC 822 -!! result -<p><a class="external mw-magiclink-rfc" rel="nofollow" href="//tools.ietf.org/html/rfc822">RFC 822</a> -</p> -!! end - -!! test -Magic links: ISBN (bug 1937) -!! input -ISBN 0-306-40615-2 -!! result -<p><a href="/wiki/Special:BookSources/0306406152" class="internal mw-magiclink-isbn">ISBN 0-306-40615-2</a> -</p> -!! end - -!! test -Magic links: PMID incorrectly converts space to underscore -!! input -PMID 1234 -!! result -<p><a class="external mw-magiclink-pmid" rel="nofollow" href="//www.ncbi.nlm.nih.gov/pubmed/1234?dopt=Abstract">PMID 1234</a> -</p> -!! end - -### -### Templates -#### - -!! test -Nonexistent template -!! input -{{thistemplatedoesnotexist}} -!! result -<p><a href="/index.php?title=Template:Thistemplatedoesnotexist&action=edit&redlink=1" class="new" title="Template:Thistemplatedoesnotexist (page does not exist)">Template:Thistemplatedoesnotexist</a> -</p> -!! end - -!! test -Template with invalid target containing tags -!! input -{{a<b>b</b>|{{echo|foo}}|{{echo|a}}={{echo|b}}|a = b}} -!! result -<p>{{a<b>b</b>|foo|a=b|a = b}} -</p> -!! end - -!! test -Template with invalid target containing unclosed tag -!! input -{{a<b>|{{echo|foo}}|{{echo|a}}={{echo|b}}|a = b}} -!! result -<p>{{a<b>|foo|a=b|a = b}}</b> -</p> -!! end - -!! article -Template:test -!! text -This is a test template -!! endarticle - -!! test -Simple template -!! input -{{test}} -!! result -<p>This is a test template -</p> -!! end - -!! test -Template with explicit namespace -!! input -{{Template:test}} -!! result -<p>This is a test template -</p> -!! end - - -!! article -Template:paramtest -!! text -This is a test template with parameter {{{param}}} -!! endarticle - -!! test -Template parameter -!! input -{{paramtest|param=foo}} -!! result -<p>This is a test template with parameter foo -</p> -!! end - -!! article -Template:paramtestnum -!! text -[[{{{1}}}|{{{2}}}]] -!! endarticle - -!! test -Template unnamed parameter -!! input -{{paramtestnum|Main Page|the main page}} -!! result -<p><a href="/wiki/Main_Page" title="Main Page">the main page</a> -</p> -!! end - -!! article -Template:templatesimple -!! text -(test) -!! endarticle - -!! article -Template:templateredirect -!! text -#redirect [[Template:templatesimple]] -!! endarticle - -!! article -Template:templateasargtestnum -!! text -{{{{{1}}}}} -!! endarticle - -!! article -Template:templateasargtest -!! text -{{template{{{templ}}}}} -!! endarticle - -!! article -Template:templateasargtest2 -!! text -{{{{{templ}}}}} -!! endarticle - -!! test -Template with template name as unnamed argument -!! input -{{templateasargtestnum|templatesimple}} -!! result -<p>(test) -</p> -!! end - -!! test -Template with template name as argument -!! input -{{templateasargtest|templ=simple}} -!! result -<p>(test) -</p> -!! end - -!! test -Template with template name as argument (2) -!! input -{{templateasargtest2|templ=templatesimple}} -!! result -<p>(test) -</p> -!! end - -!! article -Template:templateasargtestdefault -!! text -{{{{{templ|templatesimple}}}}} -!! endarticle - -!! article -Template:templa -!! text -'''templ''' -!! endarticle - -!! test -Template with default value -!! input -{{templateasargtestdefault}} -!! result -<p>(test) -</p> -!! end - -!! test -Template with default value (value set) -!! input -{{templateasargtestdefault|templ=templa}} -!! result -<p><b>templ</b> -</p> -!! end - -!! test -Template redirect -!! input -{{templateredirect}} -!! result -<p>(test) -</p> -!! end - -!! test -Template with argument in separate line -!! input -{{ templateasargtest | - templ = simple }} -!! result -<p>(test) -</p> -!! end - -!! test -Template with complex template as argument -!! input -{{paramtest| - param ={{ templateasargtest | - templ = simple }}}} -!! result -<p>This is a test template with parameter (test) -</p> -!! end - -!! test -Template with thumb image (with link in description) -!! input -{{paramtest| - param =[[Image:noimage.png|thumb|[[no link|link]] [[no link|caption]]]]}} -!! result -This is a test template with parameter <div class="thumb tright"><div class="thumbinner" style="width:182px;"><a href="/index.php?title=Special:Upload&wpDestFile=Noimage.png" class="new" title="File:Noimage.png">File:Noimage.png</a> <div class="thumbcaption"><a href="/index.php?title=No_link&action=edit&redlink=1" class="new" title="No link (page does not exist)">link</a> <a href="/index.php?title=No_link&action=edit&redlink=1" class="new" title="No link (page does not exist)">caption</a></div></div></div> - -!! end - -!! article -Template:complextemplate -!! text -{{{1}}} {{paramtest| - param ={{{param}}}}} -!! endarticle - -!! test -Template with complex arguments -!! input -{{complextemplate| - param ={{ templateasargtest | - templ = simple }}|[[Template:complextemplate|link]]}} -!! result -<p><a href="/wiki/Template:Complextemplate" title="Template:Complextemplate">link</a> This is a test template with parameter (test) -</p> -!! end - -!! test -BUG 553: link with two variables in a piped link -!! input -{| -|[[{{{1}}}|{{{2}}}]] -|} -!! result -<table> -<tr> -<td>[[{{{1}}}|{{{2}}}]] -</td></tr></table> - -!! end - -!! test -Magic variable as template parameter -!! input -{{paramtest|param={{SITENAME}}}} -!! result -<p>This is a test template with parameter MediaWiki -</p> -!! end - -!! article -Template:linktest -!! text -[[{{{param}}}|link]] -!! endarticle - -!! test -Template parameter as link source -!! input -{{linktest|param=Main Page}} -!! result -<p><a href="/wiki/Main_Page" title="Main Page">link</a> -</p> -!! end - -!!test -Template-generated attribute string (k='v') -!!input -<span {{attr_str|id|v1}}>bar</span> -!!result -<p><span id="v1">bar</span> -</p> -!!end - -!!article -Template:paramtest2 -!! text -including another template, {{paramtest|param={{{arg}}}}} -!! endarticle - -!! test -Template passing argument to another template -!! input -{{paramtest2|arg='hmm'}} -!! result -<p>including another template, This is a test template with parameter 'hmm' -</p> -!! end - -!! article -Template:Linktest2 -!! text -Main Page -!! endarticle - -!! test -Template as link source -!! input -[[{{linktest2}}]] - -[[{{linktest2}}|Main Page]] - -[[{{linktest2}}]]Page -!! result -<p><a href="/wiki/Main_Page" title="Main Page">Main Page</a> -</p><p><a href="/wiki/Main_Page" title="Main Page">Main Page</a> -</p><p><a href="/wiki/Main_Page" title="Main Page">Main Page</a>Page -</p> -!! end - - -!! article -Template:loop1 -!! text -{{loop2}} -!! endarticle - -!! article -Template:loop2 -!! text -{{loop1}} -!! endarticle - -!! test -Template infinite loop -!! input -{{loop1}} -!! result -<p><span class="error">Template loop detected: <a href="/wiki/Template:Loop1" title="Template:Loop1">Template:Loop1</a></span> -</p> -!! end - -!! test -Template from main namespace -!! input -{{:Main Page}} -!! result -<p>blah blah -</p> -!! end - -!! article -Template:table -!! text -{| -| 1 || 2 -|- -| 3 || 4 -|} -!! endarticle - -!! test -BUG 529: Template with table, not included at beginning of line -!! input -foo {{table}} -!! result -<p>foo -</p> -<table> -<tr> -<td> 1 </td> -<td> 2 -</td></tr> -<tr> -<td> 3 </td> -<td> 4 -</td></tr></table> - -!! end - -!! test -BUG 523: Template shouldn't eat newline (or add an extra one before table) -!! input -foo -{{table}} -!! result -<p>foo -</p> -<table> -<tr> -<td> 1 </td> -<td> 2 -</td></tr> -<tr> -<td> 3 </td> -<td> 4 -</td></tr></table> - -!! end - -!! test -BUG 41: Template parameters shown as broken links -!! input -{{{parameter}}} -!! result -<p>{{{parameter}}} -</p> -!! end - -!! test -Template with targets containing wikilinks -!! input -{{[[foo]]}} - -{{[[{{echo|foo}}]]}} - -{{{{echo|[[foo}}]]}} -!! result -<p>{{<a href="/index.php?title=Foo&action=edit&redlink=1" class="new" title="Foo (page does not exist)">foo</a>}} -</p><p>{{<a href="/index.php?title=Foo&action=edit&redlink=1" class="new" title="Foo (page does not exist)">foo</a>}} -</p><p>{{[[foo}}]] -</p> -!! end - -!! article -Template:MSGNW test -!! text -''None'' of '''this''' should be -* interpreted - but rather passed unmodified -{{test}} -!! endarticle - -# hmm, fix this or just deprecate msgnw and document its behavior? -!! test -msgnw keyword -!! options -disabled -!! input -{{msgnw:MSGNW test}} -!! result -<p>''None'' of '''this''' should be -* interpreted - but rather passed unmodified -{{test}} -</p> -!! end - -!! test -int keyword -!! input -{{int:youhavenewmessages|lots of money|not!}} -!! result -<p>You have lots of money (not!). -</p> -!! end - -!! article -Template:Includes -!! text -Foo<noinclude>zar</noinclude><includeonly>bar</includeonly> -!! endarticle - -!! test -<includeonly> and <noinclude> being included -!! input -{{Includes}} -!! result -<p>Foobar -</p> -!! end - -!! article -Template:Includes2 -!! text -<onlyinclude>Foo</onlyinclude>bar -!! endarticle - -!! test -<onlyinclude> being included -!! input -{{Includes2}} -!! result -<p>Foo -</p> -!! end - - -!! article -Template:Includes3 -!! text -<onlyinclude>Foo</onlyinclude>bar<includeonly>zar</includeonly> -!! endarticle - -!! test -<onlyinclude> and <includeonly> being included -!! input -{{Includes3}} -!! result -<p>Foo -</p> -!! end - -!! test -<includeonly> and <noinclude> on a page -!! input -Foo<noinclude>zar</noinclude><includeonly>bar</includeonly> -!! result -<p>Foozar -</p> -!! end - -!! test -Un-closed <noinclude> -!! input -<noinclude> -!! result -!! end - -!! test -<onlyinclude> on a page -!! input -<onlyinclude>Foo</onlyinclude>bar -!! result -<p>Foobar -</p> -!! end - -!! test -Un-closed <onlyinclude> -!! input -<onlyinclude> -!! result -!! end - -!!test -Self-closed noinclude, includeonly, onlyinclude tags -!!input -<noinclude /> -<includeonly /> -<onlyinclude /> -!!result -<p><br /> -</p> -!!end - -!!test -Unbalanced includeonly and noinclude tags -!!input -{| -|a</noinclude> -|b</noinclude></noinclude> -|c</noinclude></includeonly> -|d</includeonly></includeonly> -|} -!!result -<table> -<tr> -<td>a -</td> -<td>b -</td> -<td>c</includeonly> -</td> -<td>d</includeonly></includeonly> -</td></tr></table> - -!!end - -!! article -Template:Includeonly section -!! text -<includeonly> -==Includeonly section== -</includeonly> -==Section T-1== -!!endarticle - -!! test -Bug 6563: Edit link generation for section shown by <includeonly> -!! input -{{includeonly section}} -!! result -<h2><span class="mw-headline" id="Includeonly_section">Includeonly section</span><span class="mw-editsection"><span class="mw-editsection-bracket">[</span><a href="/index.php?title=Template:Includeonly_section&action=edit&section=T-1" title="Template:Includeonly section">edit</a><span class="mw-editsection-bracket">]</span></span></h2> -<h2><span class="mw-headline" id="Section_T-1">Section T-1</span><span class="mw-editsection"><span class="mw-editsection-bracket">[</span><a href="/index.php?title=Template:Includeonly_section&action=edit&section=T-2" title="Template:Includeonly section">edit</a><span class="mw-editsection-bracket">]</span></span></h2> - -!! end - -# Uses same input as the contents of [[Template:Includeonly section]] -!! test -Bug 6563: Section extraction for section shown by <includeonly> -!! options -section=T-2 -!! input -<includeonly> -==Includeonly section== -</includeonly> -==Section T-2== -!! result -==Section T-2== -!! end - -!! test -Bug 6563: Edit link generation for section suppressed by <includeonly> -!! input -<includeonly> -==Includeonly section== -</includeonly> -==Section 1== -!! result -<h2><span class="mw-headline" id="Section_1">Section 1</span><span class="mw-editsection"><span class="mw-editsection-bracket">[</span><a href="/index.php?title=Parser_test&action=edit&section=1" title="Edit section: Section 1">edit</a><span class="mw-editsection-bracket">]</span></span></h2> - -!! end - -!! test -Bug 6563: Section extraction for section suppressed by <includeonly> -!! options -section=1 -!! input -<includeonly> -==Includeonly section== -</includeonly> -==Section 1== -!! result -==Section 1== -!! end - -!! test -Un-closed <includeonly> -!! input -<includeonly> -!! result -!! end - -# TODO: test with DOM fragment reuse! -!! test -Parsoid: DOM fragment reuse -!! options -parsoid=wt2wt,wt2html -!! input -a{{echo|b<table></table>c}}d - -a{{echo|b -<table></table> -c}}d - -{{echo|a - -<table></table> - -b}} -!! result -a<span about="#mwt1" typeof="mw:Transclusion" data-mw='{"parts":[{"template":{"target":{"wt":"echo","href":"./Template:Echo"},"params":{"1":{"wt":"b -<table></table>c"}},"i":0}}]}'>b</span> -<table about="#mwt1"></table><span about="#mwt1">c</span>d - - -<p about="#mwt2" typeof="mw:Transclusion" data-mw='{"parts":["a",{"template":{"target":{"wt":"echo","href":"./Template:Echo"},"params":{"1":{"wt":"b\n<table></table>\nc"}},"i":0}},"d"]}'>ab</p><span about="#mwt2"> -</span> -<table about="#mwt2"></table><span about="#mwt2"> -</span> -<p about="#mwt2">cd</p> - - -<p about="#mwt3" typeof="mw:Transclusion" data-mw='{"parts":[{"template":{"target":{"wt":"echo","href":"./Template:Echo"},"params":{"1":{"wt":"a\n\n<table></table>\n\nb"}},"i":0}}]}'>a</p><span about="#mwt3"> - -</span> -<table about="#mwt3"></table><span about="#mwt3"> - -</span> -<p about="#mwt3">b</p> -!! end - -!! test -Parsoid: Merge double tds (bug 50603) -!! options -parsoid -!! input -{| -|{{echo|{{!}} foo}} -|} -!! result -<table><tbody> -<tr><td about="#mwt1" typeof="mw:Transclusion" data-mw='{"parts":["|",{"template":{"target":{"wt":"echo","href":"./Template:Echo"},"params":{"1":{"wt":"{{!}} foo"}},"i":0}}]}'> foo</td></tr> -</tbody></table> -!! end - -!! test -Parsoid: Merge double tds in nested transclusion content (bug 50603) -!! options -parsoid -!! input -{{echo|<div>}} -{| -|{{echo|{{!}} foo}} -|} -{{echo|</div>}} -!! result -<div about="#mwt1" typeof="mw:Transclusion" data-mw='{"parts":[{"template":{"target":{"wt":"echo","href":"./Template:Echo"},"params":{"1":{"wt":"<div>"}},"i":0}},"\n{|\n|",{"template":{"target":{"wt":"echo","href":"./Template:Echo"},"params":{"1":{"wt":"{{!}} foo"}},"i":1}},"\n|}\n",{"template":{"target":{"wt":"echo","href":"./Template:Echo"},"params":{"1":{"wt":"</div>"}},"i":2}}]}'> -<table><tbody> -<tr><td data-mw='{"parts":["|"]}'> foo</td></tr> -</tbody></table> -</div> -!! end - -### -### <includeonly> and <noinclude> in attributes -### -!!test -0. includeonly around the entire attribute -!!input -<span <includeonly>id="v1"</includeonly><noinclude>id="v2"</noinclude>>bar</span> -!!result -<p><span id="v2">bar</span> -</p> -!!end - -!!test -1. includeonly in html attr key -!!input -<span <noinclude>id</noinclude><includeonly>about</includeonly>="foo">bar</span> -!!result -<p><span id="foo">bar</span> -</p> -!!end - -!!test -2. includeonly in html attr value -!!input -<span id="<noinclude>v1</noinclude><includeonly>v2</includeonly>">bar</span> -<span id=<noinclude>"v1"</noinclude><includeonly>"v2"</includeonly>>bar</span> -!!result -<p><span id="v1">bar</span> -<span id="v1">bar</span> -</p> -!!end - -!!test -3. includeonly in part of an attr value -!!input -<span style="color:<noinclude>red</noinclude><includeonly>blue</includeonly>;">bar</span> -!!result -<p><span style="color:red;">bar</span> -</p> -!!end - -### -### Testing parsing of templates where a template arg -### has the same name as the template itself. -### - -!! article -Template:quote -!! text -{{{quote|{{{1}}}}}} -!! endarticle - -!!test -Templates: Template Name/Arg clash: 1. Use of positional param -!!input -{{quote|foo}} -!!result -<p>foo -</p> -!!end - -!!test -Templates: Template Name/Arg clash: 2. Use of named param -!!input -{{quote|quote=foo}} -!!result -<p>foo -</p> -!!end - -!!test -Templates: Template Name/Arg clash: 3. Use of named param with empty input -!!input -{{quote|quote}} -!!result -<p>quote -</p> -!!end - -### -### Parsoid-centric tests to stress Parsoid's ability to RT them unchanged -### - -!!test -Templates: 1. Simple use -!!input -{{echo|Foo}} -!!result -<p>Foo -</p> -!!end - -!!test -Templates: 2. Inside a block tag -!!input -<div>{{echo|Foo}}</div> -<blockquote>{{echo|Foo}}</blockquote> -!!result -<div>Foo</div> -<blockquote>Foo</blockquote> - -!!end - -!!test -Templates: P-wrapping: 1a. Templates on consecutive lines -!!input -{{echo|Foo}} -{{echo|bar}} -!!result -<p>Foo -bar -</p> -!!end - -!!test -Templates: P-wrapping: 1b. Templates on consecutive lines -!!input -Foo - -{{echo|bar}} -{{echo|baz}} -!!result -<p>Foo -</p><p>bar -baz -</p> -!!end - -!!test -Templates: P-wrapping: 1c. Templates on consecutive lines -!!input -{{echo|Foo}} -{{echo|bar}} <div>baz</div> -!!result -<p>Foo -</p> -bar <div>baz</div> - -!!end - -!!test -Templates: P-wrapping: 1d. Template preceded by comment-only line -!!options -parsoid -!!input -<!-- foo --> -{{echo|Bar}} -!!result -<!-- foo --> - -<p about="#mwt223" typeof="mw:Transclusion" data-mw='{"parts":[{"template":{"target":{"wt":"echo","href":"./Template:Echo"},"params":{"1":{"wt":"Bar"}},"i":0}}]}'>Bar</p> -!!end - -!!test -Templates: Inline Text: 1. Multiple tmeplate uses -!!input -{{echo|Foo}}bar{{echo|baz}} -!!result -<p>Foobarbaz -</p> -!!end - -!!test -Templates: Inline Text: 2. Back-to-back template uses -!!input -{{echo|Foo}}{{echo|bar}} -!!result -<p>Foobar -</p> -!!end - -!!test -Templates: Block Tags: 1. Multiple template uses -!!input -{{echo|<div>Foo</div>}}<div>bar</div>{{echo|<div>baz</div>}} -!!result -<div>Foo</div><div>bar</div><div>baz</div> - -!!end - -!!test -Templates: Block Tags: 2. Back-to-back template uses -!!input -{{echo|<div>Foo</div>}}{{echo|<div>bar</div>}} -!!result -<div>Foo</div><div>bar</div> - -!!end - -!!test -Templates: Links: 1. Simple example -!!input -{{echo|[[Foo|bar]]}} -!!result -<p><a href="/index.php?title=Foo&action=edit&redlink=1" class="new" title="Foo (page does not exist)">bar</a> -</p> -!!end - -!!test -Templates: Links: 2. Generation of link href -!!input -[[{{echo|Foo}}|bar]] -!!result -<p><a href="/index.php?title=Foo&action=edit&redlink=1" class="new" title="Foo (page does not exist)">bar</a> -</p> -!!end - -!!test -Templates: Links: 3. Generation of part of a link href -!!input -[[Fo{{echo|o}}|bar]] - -[[Foo{{echo|bar}}]] - -[[Foo{{echo|bar}}baz]] - -[[Foo{{echo|bar}}|bar]] - -[[:Foo{{echo|bar}}]] - -[[:Foo{{echo|bar}}|bar]] -!!result -<p><a href="/index.php?title=Foo&action=edit&redlink=1" class="new" title="Foo (page does not exist)">bar</a> -</p><p><a href="/index.php?title=Foobar&action=edit&redlink=1" class="new" title="Foobar (page does not exist)">Foobar</a> -</p><p><a href="/index.php?title=Foobarbaz&action=edit&redlink=1" class="new" title="Foobarbaz (page does not exist)">Foobarbaz</a> -</p><p><a href="/index.php?title=Foobar&action=edit&redlink=1" class="new" title="Foobar (page does not exist)">bar</a> -</p><p><a href="/index.php?title=Foobar&action=edit&redlink=1" class="new" title="Foobar (page does not exist)">Foobar</a> -</p><p><a href="/index.php?title=Foobar&action=edit&redlink=1" class="new" title="Foobar (page does not exist)">bar</a> -</p> -!!end - -!!test -Templates: Links: 4. Multiple templates generating link href -!!input -[[{{echo|F}}{{echo|o}}ob{{echo|ar}}]] -!!result -<p><a href="/index.php?title=Foobar&action=edit&redlink=1" class="new" title="Foobar (page does not exist)">Foobar</a> -</p> -!!end - -!!test -Templates: Links: 5. Generation of link text -!!input -[[Foo|{{echo|bar}}]] -!!result -<p><a href="/index.php?title=Foo&action=edit&redlink=1" class="new" title="Foo (page does not exist)">bar</a> -</p> -!!end - -!!test -Templates: Links: 5. Nested templates (only outermost template should be marked) -!!input -{{echo|[[{{echo|Foo}}|bar]]}} -!!result -<p><a href="/index.php?title=Foo&action=edit&redlink=1" class="new" title="Foo (page does not exist)">bar</a> -</p> -!!end - -!!test -Templates: HTML Tag: 1. Generation of HTML attr. key -!!input -<div {{echo|style}}="color:red;">foo</div> -!!result -<div style="color:red;">foo</div> - -!!end - -!!test -Templates: HTML Tag: 2. Generation of HTML attr. value -!!input -<div style={{echo|'color:red;'}}>foo</div> -!!result -<div style="color:red;">foo</div> - -!!end - -!!test -Templates: HTML Tag: 3. Generation of HTML attr key and value -!!input -<div {{echo|style}}={{echo|'color:red;'}}>foo</div> -!!result -<div style="color:red;">foo</div> - -!!end - -!!test -Templates: HTML Tag: 4. Generation of starting piece of HTML attr value -!!input -<div title="{{echo|This is a long title}} with just one piece templated">foo</div> -!!result -<div title="This is a long title with just one piece templated">foo</div> - -!!end - -!!test -Templates: HTML Tag: 5. Generation of middle piece of HTML attr value -!!input -<div title="This is a long title with just {{echo|one piece}} templated">foo</div> -!!result -<div title="This is a long title with just one piece templated">foo</div> - -!!end - -!!test -Templates: HTML Tag: 6. Generation of end piece of HTML attr value -!!input -<div title="This is a long title with just one piece {{echo|templated}}">foo</div> -!!result -<div title="This is a long title with just one piece templated">foo</div> - -!!end - -!!test -Templates: HTML Tag: 7. Generation of partial attribute key string -!!input -<div st{{echo|yle}}="color:red;">foo</div> -!!result -<div style="color:red;">foo</div> - -!!end - -!!test -Templates: HTML Tables: 1. Generating start of a HTML table -!!input -{{echo|<table><tr><td>foo</td>}}</tr></table> -!!result -<table><tr><td>foo</td></tr></table> - -!!end - -!!test -Templates: HTML Tables: 2a. Generating middle of a HTML table -!!input -<table><tr>{{echo|<td>foo</td>}}</tr></table> -!!result -<table><tr><td>foo</td></tr></table> - -!!end - -!!test -Templates: HTML Tables: 2b. Generating middle of a HTML table -!!input -<table>{{echo|<tr><td>foo</td></tr>}}</table> -!!result -<table><tr><td>foo</td></tr></table> - -!!end - -!!test -Templates: HTML Tables: 3. Generating end of a HTML table -!!input -<table><tr>{{echo|<td>foo</td></tr></table>}} -!!result -<table><tr><td>foo</td></tr></table> - -!!end - -!!test -Templates: HTML Tables: 4a. Generating a single tag of a HTML table -!!input -{{echo|<table>}}<tr><td>foo</td></tr></table> -!!result -<table><tr><td>foo</td></tr></table> - -!!end - -!!test -Templates: HTML Tables: 4b. Generating a single tag of a HTML table -!!input -<table>{{echo|<tr>}}<td>foo</td></tr></table> -!!result -<table><tr><td>foo</td></tr></table> - -!!end - -!!test -Templates: HTML Tables: 4c. Generating a single tag of a HTML table -!!input -<table><tr>{{echo|<td>}}foo</td></tr></table> -!!result -<table><tr><td>foo</td></tr></table> - -!!end - -!!test -Templates: HTML Tables: 4d. Generating a single tag of a HTML table -!!input -<table><tr><td>foo{{echo|</td>}}</tr></table> -!!result -<table><tr><td>foo</td></tr></table> - -!!end - -!!test -Templates: HTML Tables: 4e. Generating a single tag of a HTML table -!!input -<table><tr><td>foo</td>{{echo|</tr>}}</table> -!!result -<table><tr><td>foo</td></tr></table> - -!!end - -!!test -Templates: HTML Tables: 4f. Generating a single tag of a HTML table -!!input -<table><tr><td>foo</td></tr>{{echo|</table>}} -!!result -<table><tr><td>foo</td></tr></table> - -!!end - -!!test -Templates: HTML Tables: 5. Proper fostering of categories from inside -!!options -parsoid=wt2html,wt2wt -!!input -<table>[[Category:foo1]]<tr><td>foo</td></tr></table> -<!--Two categories (Bug 50330)--> -<table>[[Category:bar1]][[Category:bar2]]<tr><td>foo</td></tr></table> -!!result -<link rel="mw:WikiLink/Category" href="./Category:Foo1"><table><tbody><tr><td>foo</td></tr></tbody></table> -<!--Two categories (Bug 50330)--> -<link rel="mw:WikiLink/Category" href="./Category:Bar1"><link rel="mw:WikiLink/Category" href="./Category:Bar2"><table><tbody><tr><td>foo</td></tr></tbody></table> -!!end - -!!test -Templates: Wiki Tables: 1a. Fostering of entire template content -!!input -{| -{{echo|a}} -|} -!!result -<table> -a -<tr><td></td></tr></table> - -!!end - -!!test -Templates: Wiki Tables: 1b. Fostering of entire template content -!!input -{| -{{echo|<div>}} -foo -{{echo|</div>}} -|} -!!result -<table> -<div> -<p>foo -</p> -</div> -<tr><td></td></tr></table> - -!!end - -!!test -Templates: Wiki Tables: 2. Fostering of partial template content -!!input -{| -{{echo|a -<div>b</div>}} -|} -!!result -<table> -a -<div>b</div> -<tr><td></td></tr></table> - -!!end - -!!test -Templates: Wiki Tables: 3. td-content via multiple templates -!!input -{| -{{echo|{{pipe}}a}}{{echo|b}} -|} -!!result -<table> -<tr> -<td>ab -</td></tr></table> - -!!end - -!!test -Templates: Wiki Tables: 4. Templated tags, no content -!!input -{{tbl-start}} -{{tbl-end}} -!!result -<table> -<tr><td></td></tr></table> - -!!end - -!!test -Templates: Wiki Tables: 5. Templated tags, regular td-tags -!!input -{{tbl-start}} -|foo -{{tbl-end}} -!!result -<table> -<tr> -<td>foo -</td></tr></table> - -!!end - -!!test -Templates: Wiki Tables: 6. Templated tags, templated td-tags -!!input -{{tbl-start}} -{{!}}foo -{{tbl-end}} -!!result -<table> -<tr> -<td>foo -</td></tr></table> - -!!end - -!!test -Templates: Lists: Multi-line list-items via templates -!!input -*{{echo|a {{nonexistent| -unused}}}} -*{{echo|b {{nonexistent| -unused}}}} -!!result -<ul> -<li>a <a href="/index.php?title=Template:Nonexistent&action=edit&redlink=1" class="new" title="Template:Nonexistent (page does not exist)">Template:Nonexistent</a> -</li> -<li>b <a href="/index.php?title=Template:Nonexistent&action=edit&redlink=1" class="new" title="Template:Nonexistent (page does not exist)">Template:Nonexistent</a> -</li> -</ul> - -!!end - -!!test -Templates: Ugly nesting: 1. Quotes opened/closed across templates (echo) -!!input -{{echo|''a}}{{echo|b''c''d}}{{echo|''e}} -!!result -<p><i>ab</i>c<i>d</i>e -</p> -!!end - -!!test -Templates: Ugly nesting: 2. Quotes opened/closed across templates (echo_with_span) -(PHP parser generates misnested html) -!! options -parsoid -!!input -{{echo_with_span|''a}}{{echo_with_span|b''c''d}}{{echo_with_span|''e}} -!!result -<p><span about="#mwt1" typeof="mw:Transclusion" data-mw="{"parts":[{"template":{"target":{"wt":"echo_with_span","href":"./Template:Echo_with_span"},"params":{"1":{"wt":"''a"}},"i":0}}]}"><i>a</i></span><i about="#mwt2" typeof="mw:Transclusion" data-mw="{"parts":[{"template":{"target":{"wt":"echo_with_span","href":"./Template:Echo_with_span"},"params":{"1":{"wt":"b''c''d"}},"i":0}},{"template":{"target":{"wt":"echo_with_span","href":"./Template:Echo_with_span"},"params":{"1":{"wt":"''e"}},"i":1}}]}"><span>b</span></i><span about="#mwt2">c</span><i about="#mwt2">d<span></span></i><span about="#mwt2">e</span></p> -!!end - -!!test -Templates: Ugly nesting: 3. Quotes opened/closed across templates (echo_with_div) -(PHP parser generates misnested html; Parsoid html2wt mode adds newlines between {{echo}}s) -!! options -parsoid=wt2html,wt2wt -!!input -{{echo_with_div|''a}}{{echo_with_div|b''c''d}}{{echo_with_div|''e}} -!!result -<div about="#mwt1" typeof="mw:Transclusion" data-mw="{"parts":[{"template":{"target":{"wt":"echo_with_div","href":"./Template:Echo_with_div"},"params":{"1":{"wt":"''a"}},"i":0}}]}"><i>a</i></div> -<div about="#mwt2" typeof="mw:Transclusion" data-mw="{"parts":[{"template":{"target":{"wt":"echo_with_div","href":"./Template:Echo_with_div"},"params":{"1":{"wt":"b''c''d"}},"i":0}}]}"><i>b</i>c<i>d</i></div> -<div about="#mwt3" typeof="mw:Transclusion" data-mw="{"parts":[{"template":{"target":{"wt":"echo_with_div","href":"./Template:Echo_with_div"},"params":{"1":{"wt":"''e"}},"i":0}}]}">e</div> -!!end - -!!test -Templates: Ugly nesting: 4. Divs opened/closed across templates -!!input -a<div>b{{echo|c</div>d}}e -!!result -a<div>bc</div>de - -!!end - -!!test -Templates: Ugly templates: 1. Navbox template parses badly leading to table misnesting -(Parsoid-centric) -!! options -parsoid -!!input -{| -|{{echo|foo</table>}} -|bar -|} -!!result -<table about="#mwt1" typeof="mw:Transclusion" data-mw='{"parts":["{|\n|",{"template":{"target":{"wt":"echo","href":"./Template:Echo"},"params":{"1":{"wt":"foo</table>"}},"i":0}},"\n|bar\n|}"]}'> - -<tbody> -<tr> -<td>foo</td></tr></tbody></table><span about="#mwt1"> -</span><span about="#mwt1">bar</span><span about="#mwt1"> -</span> -!!end - -!!test -Templates: Ugly templates: 2. Navbox template parses badly leading to table misnesting -(Parsoid-centric) -!! options -parsoid -!!input -<table> - <tr> - <td> - <table> - <tr> - <td>1. {{echo|foo </table>}}</td> - <td> bar </td> - <td>2. {{echo|baz </table>}}</td> - </tr> - <tr> - <td>abc</td> - </tr> - </table> - </td> - </tr> - <tr> - <td>xyz</td> - </tr> -</table> -!!result -<table about="#mwt2" typeof="mw:Transclusion" data-mw='{"parts":["<table>\n <tr>\n <td>\n <table>\n <tr>\n <td>1. ",{"template":{"target":{"wt":"echo","href":"./Template:Echo"},"params":{"1":{"wt":"foo </table>"}},"i":0}},"</td>\n <td> bar </td>\n <td>2. ",{"template":{"target":{"wt":"echo","href":"./Template:Echo"},"params":{"1":{"wt":"baz </table>"}},"i":1}},"</td>\n </tr>\n <tr>\n <td>abc</td>\n </tr>\n </table>\n </td>\n </tr>\n <tr>\n <td>xyz</td>\n </tr>\n</table>"]}'> - <tbody><tr> - <td> - <table> - <tbody><tr> - <td>1. foo </td></tr></tbody></table></td> - <td> bar </td> - <td>2. baz </td></tr></tbody></table><span about="#mwt2"> - </span><span about="#mwt2"> - </span><span about="#mwt2"> - </span><span about="#mwt2">abc</span><span about="#mwt2"> - </span><span about="#mwt2"> - </span><span about="#mwt2"> - </span><span about="#mwt2"> - </span><span about="#mwt2"> - </span><span about="#mwt2"> - </span><span about="#mwt2">xyz</span><span about="#mwt2"> - </span><span about="#mwt2"> -</span> -!!end - -!! test -Templates: Ugly templates: 3. newline-only template parameter -!! input -foo {{echo| -}} -!! result -<p>foo -</p> -!! end - -# This looks like a bug: a single newline triggers p/br for some reason. -!! test -Templates: Ugly templates: 4. newline-only template parameter inconsistency -!! input -{{echo| -}} -!! result -<p><br /> -</p> -!! end - - -!!test -Parser Functions: 1. Simple example -!!input -{{uc:foo}} -!!result -<p>FOO -</p> -!!end - -!!test -Parser Functions: 2. Nested use (only outermost should be marked up) -!!input -{{uc:{{lc:FOO}}}} -!!result -<p>FOO -</p> -!!end - -### -### Pre-save transform tests -### -!! test -pre-save transform: subst: -!! options -PST -!! input -{{subst:test}} -!! result -This is a test template -!! end - -!! test -pre-save transform: normal template -!! options -PST -!! input -{{test}} -!! result -{{test}} -!! end - -!! test -pre-save transform: nonexistent template -!! options -PST -!! input -{{thistemplatedoesnotexist}} -!! result -{{thistemplatedoesnotexist}} -!! end - - -!! test -pre-save transform: subst magic variables -!! options -PST -!! input -{{subst:SITENAME}} -!! result -MediaWiki -!! end - -# This is bug 89, which I fixed. -- wtm -!! test -pre-save transform: subst: templates with parameters -!! options -pst -!! input -{{subst:paramtest|param="something else"}} -!! result -This is a test template with parameter "something else" -!! end - -!! article -Template:nowikitest -!! text -<nowiki>'''not wiki'''</nowiki> -!! endarticle - -!! test -pre-save transform: nowiki in subst (bug 1188) -!! options -pst -!! input -{{subst:nowikitest}} -!! result -<nowiki>'''not wiki'''</nowiki> -!! end - - -!! article -Template:commenttest -!! text -This template has <!-- a comment --> in it. -!! endarticle - -!! test -pre-save transform: comment in subst (bug 1936) -!! options -pst -!! input -{{subst:commenttest}} -!! result -This template has <!-- a comment --> in it. -!! end - -!! test -pre-save transform: unclosed tag -!! options -pst noxml -!! input -<nowiki>'''not wiki''' -!! result -<nowiki>'''not wiki''' -!! end - -!! test -pre-save transform: mixed tag case -!! options -pst noxml -!! input -<NOwiki>'''not wiki'''</noWIKI> -!! result -<NOwiki>'''not wiki'''</noWIKI> -!! end - -!! test -pre-save transform: unclosed comment in <nowiki> -!! options -pst noxml -!! input -wiki<nowiki>nowiki<!--nowiki</nowiki>wiki -!! result -wiki<nowiki>nowiki<!--nowiki</nowiki>wiki -!!end - -# Leading @ in this template definition works around a limitation -# in parsoid's parserTests which otherwise strips the <span> from the -# result (confusing it for a template wrapper) -!! article -Template:dangerous -!!text -@<span onmouseover="alert('crap')">Oh no</span> -!!endarticle - -!!test -(confirming safety of fix for subst bug 1936) -!! input -{{Template:dangerous}} -!! result -<p>@<span>Oh no</span> -</p> -!! end - -!! test -pre-save transform: comment containing gallery (bug 5024) -!! options -pst -!! input -<!-- <gallery>data</gallery> --> -!!result -<!-- <gallery>data</gallery> --> -!!end - -!! test -pre-save transform: comment containing extension -!! options -pst -!! input -<!-- <tag>data</tag> --> -!!result -<!-- <tag>data</tag> --> -!!end - -!! test -pre-save transform: comment containing nowiki -!! options -pst -!! input -<!-- <nowiki>data</nowiki> --> -!!result -<!-- <nowiki>data</nowiki> --> -!!end - -!! test -pre-save transform: <noinclude> in subst (bug 3298) -!! options -pst -!! input -{{subst:Includes}} -!! result -Foobar -!! end - -!! test -pre-save transform: <onlyinclude> in subst (bug 3298) -!! options -pst -!! input -{{subst:Includes2}} -!! result -Foo -!! end - -!! article -Template:SubstTest -!!text -{{<includeonly>subst:</includeonly>Includes}} -!! endarticle - -!! article -Template:SafeSubstTest -!! text -{{<includeonly>safesubst:</includeonly>Includes}} -!! endarticle - -!! test -bug 22297: safesubst: works during PST -!! options -pst -!! input -{{subst:SafeSubstTest}}{{safesubst:SubstTest}} -!! result -FoobarFoobar -!! end - -!! test -bug 22297: safesubst: works during normal parse -!! input -{{SafeSubstTest}} -!! result -<p>Foobar -</p> -!! end - -!! test: -subst: does not work during normal parse -!! input -{{SubstTest}} -!! result -<p>{{subst:Includes}} -</p> -!! end - -!! test -pre-save transform: context links ("pipe trick") -!! options -pst -!! input -[[Article (context)|]] -[[Bar:Article|]] -[[:Bar:Article|]] -[[Bar:Article (context)|]] -[[:Bar:Article (context)|]] -[[|Article]] -[[|Article (context)]] -[[Bar:X (Y) Z|]] -[[:Bar:X (Y) Z|]] -!! result -[[Article (context)|Article]] -[[Bar:Article|Article]] -[[:Bar:Article|Article]] -[[Bar:Article (context)|Article]] -[[:Bar:Article (context)|Article]] -[[Article]] -[[Article (context)]] -[[Bar:X (Y) Z|X (Y) Z]] -[[:Bar:X (Y) Z|X (Y) Z]] -!! end - -!! test -pre-save transform: context links ("pipe trick") with interwiki prefix -!! options -pst -!! input -[[interwiki:Article|]] -[[:interwiki:Article|]] -[[interwiki:Bar:Article|]] -[[:interwiki:Bar:Article|]] -!! result -[[interwiki:Article|Article]] -[[:interwiki:Article|Article]] -[[interwiki:Bar:Article|Bar:Article]] -[[:interwiki:Bar:Article|Bar:Article]] -!! end - -!! test -pre-save transform: context links ("pipe trick") with parens in title -!! options -pst title=[[Somearticle (context)]] -!! input -[[|Article]] -!! result -[[Article (context)|Article]] -!! end - -!! test -pre-save transform: context links ("pipe trick") with comma in title -!! options -pst title=[[Someplace, Somewhere]] -!! input -[[|Otherplace]] -[[Otherplace, Elsewhere|]] -[[Otherplace, Elsewhere, Anywhere|]] -!! result -[[Otherplace, Somewhere|Otherplace]] -[[Otherplace, Elsewhere|Otherplace]] -[[Otherplace, Elsewhere, Anywhere|Otherplace]] -!! end - -!! test -pre-save transform: context links ("pipe trick") with parens and comma -!! options -pst title=[[Someplace (IGNORED), Somewhere]] -!! input -[[|Otherplace]] -[[Otherplace (place), Elsewhere|]] -!! result -[[Otherplace, Somewhere|Otherplace]] -[[Otherplace (place), Elsewhere|Otherplace]] -!! end - -!! test -pre-save transform: context links ("pipe trick") with comma and parens -!! options -pst title=[[Who, me? (context)]] -!! input -[[|Yes, you.]] -[[Me, Myself, and I (1937 song)|]] -!! result -[[Yes, you. (context)|Yes, you.]] -[[Me, Myself, and I (1937 song)|Me, Myself, and I]] -!! end - -!! test -pre-save transform: context links ("pipe trick") with namespace -!! options -pst title=[[Ns:Somearticle]] -!! input -[[|Article]] -!! result -[[Ns:Article|Article]] -!! end - -!! test -pre-save transform: context links ("pipe trick") with namespace and parens -!! options -pst title=[[Ns:Somearticle (context)]] -!! input -[[|Article]] -!! result -[[Ns:Article (context)|Article]] -!! end - -!! test -pre-save transform: context links ("pipe trick") with namespace and comma -!! options -pst title=[[Ns:Somearticle, Context, Whatever]] -!! input -[[|Article]] -!! result -[[Ns:Article, Context, Whatever|Article]] -!! end - -!! test -pre-save transform: context links ("pipe trick") with namespace, comma and parens -!! options -pst title=[[Ns:Somearticle, Context (context)]] -!! input -[[|Article]] -!! result -[[Ns:Article (context)|Article]] -!! end - -!! test -pre-save transform: context links ("pipe trick") with namespace, parens and comma -!! options -pst title=[[Ns:Somearticle (IGNORED), Context]] -!! input -[[|Article]] -!! result -[[Ns:Article, Context|Article]] -!! end - -!! test -pre-save transform: context links ("pipe trick") with full-width parens and no space (Japanese and Chinese style, bug 30149) -!! options -pst -!! input -[[Article(context)|]] -[[Bar:Article(context)|]] -[[:Bar:Article(context)|]] -[[|Article(context)]] -[[Bar:X(Y)Z|]] -[[:Bar:X(Y)Z|]] -!! result -[[Article(context)|Article]] -[[Bar:Article(context)|Article]] -[[:Bar:Article(context)|Article]] -[[Article(context)]] -[[Bar:X(Y)Z|X(Y)Z]] -[[:Bar:X(Y)Z|X(Y)Z]] -!! end - -!! test -pre-save transform: context links ("pipe trick") with full-width parens and space (Japanese and Chinese style, bug 30149) -!! options -pst -!! input -[[Article (context)|]] -[[Bar:Article (context)|]] -[[:Bar:Article (context)|]] -[[|Article (context)]] -[[Bar:X (Y) Z|]] -[[:Bar:X (Y) Z|]] -!! result -[[Article (context)|Article]] -[[Bar:Article (context)|Article]] -[[:Bar:Article (context)|Article]] -[[Article (context)]] -[[Bar:X (Y) Z|X (Y) Z]] -[[:Bar:X (Y) Z|X (Y) Z]] -!! end - -!! test -pre-save transform: context links ("pipe trick") with parens and no space (Korean style, bug 30149) -!! options -pst -!! input -[[Article(context)|]] -[[Bar:Article(context)|]] -[[:Bar:Article(context)|]] -[[|Article(context)]] -[[Bar:X(Y)Z|]] -[[:Bar:X(Y)Z|]] -!! result -[[Article(context)|Article]] -[[Bar:Article(context)|Article]] -[[:Bar:Article(context)|Article]] -[[Article(context)]] -[[Bar:X(Y)Z|X(Y)Z]] -[[:Bar:X(Y)Z|X(Y)Z]] -!! end - -!! test -pre-save transform: context links ("pipe trick") with commas (bug 21660) -!! options -pst -!! input -[[Article (context), context|]] -[[Article (context),context|]] -[[Bar:Article (context), context|]] -[[Bar:Article (context),context|]] -[[:Bar:Article (context), context|]] -[[:Bar:Article (context),context|]] -!! result -[[Article (context), context|Article]] -[[Article (context),context|Article]] -[[Bar:Article (context), context|Article]] -[[Bar:Article (context),context|Article]] -[[:Bar:Article (context), context|Article]] -[[:Bar:Article (context),context|Article]] -!! end - -!! test -pre-save transform: trim trailing empty lines -!! options -pst -!! input -Empty lines are trimmed - - - - -!! result -Empty lines are trimmed -!! end - -!! test -pre-save transform: Signature expansion -!! options -pst -!! input -* ~~~ -* <noinclude>~~~</noinclude> -* <includeonly>~~~</includeonly> -* <onlyinclude>~~~</onlyinclude> -!! result -* [[Special:Contributions/127.0.0.1|127.0.0.1]] -* <noinclude>[[Special:Contributions/127.0.0.1|127.0.0.1]]</noinclude> -* <includeonly>[[Special:Contributions/127.0.0.1|127.0.0.1]]</includeonly> -* <onlyinclude>[[Special:Contributions/127.0.0.1|127.0.0.1]]</onlyinclude> -!! end - - -!! test -pre-save transform: Signature expansion in nowiki tags (bug 93) -!! options -pst disabled -!! input -Shall not expand: - -<nowiki>~~~~</nowiki> - -<includeonly><nowiki>~~~~</nowiki></includeonly> - -<noinclude><nowiki>~~~~</nowiki></noinclude> - -<onlyinclude><nowiki>~~~~</nowiki></onlyinclude> - -{{subst:Foo}} shall be converted to FOO - -As well as inside noinclude/onlyinclude -<noinclude>{{subst:Foo}}</noinclude> -<onlyinclude>{{subst:Foo}}</onlyinclude> - -But not inside includeonly -<includeonly>{{subst:Foo}}</includeonly> -!! result -Shall not expand: - -<nowiki>~~~~</nowiki> - -<includeonly><nowiki>~~~~</nowiki></includeonly> - -<noinclude><nowiki>~~~~</nowiki></noinclude> - -<onlyinclude><nowiki>~~~~</nowiki></onlyinclude> - -FOO shall be converted to FOO - -As well as inside noinclude/onlyinclude -<noinclude>FOO</noinclude> -<onlyinclude>FOO</onlyinclude> - -But not inside includeonly -<includeonly>{{subst:Foo}}</includeonly> -!! end - -!! test -Parsoid: Recognize nowiki with trailing space in tags -!! options -parsoid=wt2html -!! input -<nowiki ><div>[[foo]]</nowiki > - -a<nowiki / >b - -c<nowiki />d - -e<nowiki/ >f -!! result -<p><span typeof="mw:Nowiki"><div>[[foo]]</span></p> -<p>ab</p> -<p>cd</p> -<p>ef</p> -!! end - -!! test -Parsoid: Recognize nowiki with odd capitalization -!! options -parsoid=wt2html -!! input -<noWikI ><div>[[foo]]</Nowiki > -!! result -<p><span typeof="mw:Nowiki"><div>[[foo]]</span></p> -!! end - - -!! test -Parsoid: Escape nowiki with trailing space in tags -!! options -parsoid=html2wt -!! input -<nowiki > foo </nowiki > - -a<nowiki />b - -c<nowiki/ >d -!! result -<p><nowiki > foo </nowiki ></p> -<p>a<nowiki />b</p> -<p>c<nowiki/ >d</p> -!! end - -!! test -Parsoid: Escape weird noWikI capitalizations -!! options -parsoid=html2wt -!! input -<noWikI > foo </NoWikI > -!! result -<p><noWikI > foo </NoWikI ></p> -!! end - -### -### Message transform tests -### -!! test -message transform: magic variables -!! options -msg -!! input -{{SITENAME}} -!! result -MediaWiki -!! end - -!! test -message transform: should not transform wiki markup -!! options -msg -!! input -''test'' -!! result -''test'' -!! end - -!! test -message transform: <noinclude> in transcluded template (bug 4926) -!! options -msg -!! input -{{Includes}} -!! result -Foobar -!! end - -!! test -message transform: <onlyinclude> in transcluded template (bug 4926) -!! options -msg -!! input -{{Includes2}} -!! result -Foo -!! end - -!! test -{{#special:}} page name, known -!! options -msg -!! input -{{#special:Recentchanges}} -!! result -Special:RecentChanges -!! end - -!! test -{{#special:}} page name with subpage, known -!! options -msg -!! input -{{#special:Recentchanges/param}} -!! result -Special:RecentChanges/param -!! end - -!! test -{{#special:}} page name, unknown -!! options -msg -!! input -{{#special:foobar nonexistent}} -!! result -Special:Foobar nonexistent -!! end - -!! test -{{#speciale:}} page name, known -!! options -msg -!! input -{{#speciale:Recentchanges}} -!! result -Special:RecentChanges -!! end - -!! test -{{#speciale:}} page name with subpage, known -!! options -msg -!! input -{{#speciale:Recentchanges/param}} -!! result -Special:RecentChanges/param -!! end - -!! test -{{#speciale:}} page name, unknown -!! options -msg -!! input -{{#speciale:foobar nonexistent}} -!! result -Special:Foobar_nonexistent -!! end - -### -### Images -### -### For Parsoid-specific tests, see -#### http://www.mediawiki.org/wiki/Parsoid/MediaWiki_DOM_spec#Images - -!! test -Simple image (php) -!! options -php -!! input -[[Image:foobar.jpg]] -!! result -<p><a href="/wiki/File:Foobar.jpg" class="image"><img alt="Foobar.jpg" src="http://example.com/images/3/3a/Foobar.jpg" width="1941" height="220" /></a> -</p> -!! end - -!! test -Simple image (parsoid) -!! options -parsoid=wt2html -!! input -[[Image:foobar.jpg]] -!! result -<p><span class="mw-default-size" typeof="mw:Image"><a href="File:Foobar.jpg"><img resource="./File:Foobar.jpg" src="//example.com/images/3/3a/Foobar.jpg" height="220" width="1941"></a></span> -</p> -!! end - -!! test -Simple image (using File: namespace, now canonical) (php) -!! options -php -!! input -[[File:foobar.jpg]] -!! result -<p><a href="/wiki/File:Foobar.jpg" class="image"><img alt="Foobar.jpg" src="http://example.com/images/3/3a/Foobar.jpg" width="1941" height="220" /></a> -</p> -!! end - -!! test -Simple image (using File: namespace, now canonical) (parsoid) -!! options -parsoid -!! input -[[File:Foobar.jpg]] -!! result -<p><span class="mw-default-size" typeof="mw:Image"><a href="File:Foobar.jpg"><img resource="./File:Foobar.jpg" src="//example.com/images/3/3a/Foobar.jpg" height="220" width="1941"></a></span> -</p> -!! end - -!! test -Right-aligned image (php) -!! options -php -!! input -[[Image:foobar.jpg|right]] -!! result -<div class="floatright"><a href="/wiki/File:Foobar.jpg" class="image"><img alt="Foobar.jpg" src="http://example.com/images/3/3a/Foobar.jpg" width="1941" height="220" /></a></div> - -!! end - -!! test -Right-aligned image (parsoid) -!! options -parsoid -!! input -[[File:Foobar.jpg|right]] -!! result -<figure class="mw-default-size mw-halign-right" typeof="mw:Image"><a href="File:Foobar.jpg"><img resource="./File:Foobar.jpg" src="//example.com/images/3/3a/Foobar.jpg" height="220" width="1941"></a></figure> -!! end - -!! test -Image with caption (php) -!! options -php -!! input -[[File:Foobar.jpg|right|Caption text]] -!! result -<div class="floatright"><a href="/wiki/File:Foobar.jpg" class="image" title="Caption text"><img alt="Caption text" src="http://example.com/images/3/3a/Foobar.jpg" width="1941" height="220" /></a></div> - -!! end - -!! test -Image with caption (parsoid) -!! options -parsoid -!! input -[[File:Foobar.jpg|right|Caption text]] -!! result -<figure class="mw-default-size mw-halign-right" typeof="mw:Image"><a href="File:Foobar.jpg"><img resource="./File:Foobar.jpg" src="//example.com/images/3/3a/Foobar.jpg" height="220" width="1941"></a><figcaption>Caption text</figcaption></figure> -!! end - -!! test -Image with empty attribute (php) -!! options -php -!! input -[[File:Foobar.jpg|right||Caption text]] -!! result -<div class="floatright"><a href="/wiki/File:Foobar.jpg" class="image" title="Caption text"><img alt="Caption text" src="http://example.com/images/3/3a/Foobar.jpg" width="1941" height="220" /></a></div> - -!! end - -!! test -Image with empty attribute (parsoid) -!! options -parsoid=wt2html -!! input -[[File:Foobar.jpg|right||Caption text]] -!! result -<figure class="mw-default-size mw-halign-right" typeof="mw:Image"><a href="File:Foobar.jpg"><img resource="./File:Foobar.jpg" src="//example.com/images/3/3a/Foobar.jpg" height="220" width="1941"></a><figcaption>Caption text</figcaption></figure> -!! end - -!! test -Image with attributes from template (php) -!! options -php -!! input -[[File:Foobar.jpg|{{image_attribs}}]] -!! result -<div class="floatright"><a href="/wiki/File:Foobar.jpg" class="image" title="Caption text"><img alt="Caption text" src="http://example.com/images/3/3a/Foobar.jpg" width="1941" height="220" /></a></div> - -!! end - -!! test -Image with attributes from template (parsoid) -!! options -parsoid -!! input -[[File:Foobar.jpg|{{image_attribs}}]] -!! result -<figure class="mw-default-size mw-halign-right" typeof="mw:Image"><a href="File:Foobar.jpg"><img resource="./File:Foobar.jpg" src="//example.com/images/3/3a/Foobar.jpg" height="220" width="1941"></a><figcaption>Caption text</figcaption></figure> -!! end - -!! test -Image with link tails (php) -!! options -php -!! input -123[[File:Foobar.jpg]]456 -123[[File:Foobar.jpg|right]]456 -123[[File:Foobar.jpg|thumb]]456 -!! result -<p>123<a href="/wiki/File:Foobar.jpg" class="image"><img alt="Foobar.jpg" src="http://example.com/images/3/3a/Foobar.jpg" width="1941" height="220" /></a>456 -</p> -123<div class="floatright"><a href="/wiki/File:Foobar.jpg" class="image"><img alt="Foobar.jpg" src="http://example.com/images/3/3a/Foobar.jpg" width="1941" height="220" /></a></div>456 -123<div class="thumb tright"><div class="thumbinner" style="width:182px;"><a href="/wiki/File:Foobar.jpg" class="image"><img alt="Foobar.jpg" src="http://example.com/images/thumb/3/3a/Foobar.jpg/180px-Foobar.jpg" width="180" height="20" class="thumbimage" srcset="http://example.com/images/thumb/3/3a/Foobar.jpg/270px-Foobar.jpg 1.5x, http://example.com/images/thumb/3/3a/Foobar.jpg/360px-Foobar.jpg 2x" /></a> <div class="thumbcaption"><div class="magnify"><a href="/wiki/File:Foobar.jpg" class="internal" title="Enlarge"><img src="/skins/common/images/magnify-clip.png" width="15" height="11" alt="" /></a></div></div></div></div>456 - -!! end - -!! test -Image with link tails (parsoid) -!! options -parsoid -!! input -123[[File:Foobar.jpg]]456 -123[[File:Foobar.jpg|right]]456 -123[[File:Foobar.jpg|thumb]]456 -!! result -<p>123<span class="mw-default-size" typeof="mw:Image"><a href="File:Foobar.jpg"><img resource="./File:Foobar.jpg" src="//example.com/images/3/3a/Foobar.jpg" height="220" width="1941"></a></span>456</p> -123<figure class="mw-default-size mw-halign-right" typeof="mw:Image"><a href="File:Foobar.jpg"><img resource="./File:Foobar.jpg" src="//example.com/images/3/3a/Foobar.jpg" height="220" width="1941"></a></figure>456 -123<figure class="mw-default-size" typeof="mw:Image/Thumb"><a href="File:Foobar.jpg"><img resource="./File:Foobar.jpg" src="//example.com/images/thumb/3/3a/Foobar.jpg/180px-Foobar.jpg" height="20" width="180"></a></figure>456 -!! end - -!! test -Image with multiple captions -- only last one is accepted (php) -!! options -php -!! input -[[File:Foobar.jpg|right|Caption1 - ignored|[[Caption2]] - ignored|Caption3 - accepted]] -!! result -<div class="floatright"><a href="/wiki/File:Foobar.jpg" class="image" title="Caption3 - accepted"><img alt="Caption3 - accepted" src="http://example.com/images/3/3a/Foobar.jpg" width="1941" height="220" /></a></div> - -!! end - -!! test -Image with multiple captions -- only last one is accepted (parsoid) -!! options -parsoid -!! input -[[File:Foobar.jpg|right|Caption1 - ignored|[[Caption2]] - ignored|Caption3 - accepted]] -!! result -<figure class="mw-default-size mw-halign-right" typeof="mw:Image"><a href="File:Foobar.jpg"><img resource="./File:Foobar.jpg" src="//example.com/images/3/3a/Foobar.jpg" height="220" width="1941"></a><figcaption>Caption3 - accepted</figcaption></figure> -!! end - -!! test -Image with width attribute at different positions (php) -!! options -php -!! input -[[File:Foobar.jpg|200px|right|Caption]] -[[File:Foobar.jpg|right|200px|Caption]] -[[File:Foobar.jpg|right|Caption|200px]] -!! result -<div class="floatright"><a href="/wiki/File:Foobar.jpg" class="image" title="Caption"><img alt="Caption" src="http://example.com/images/thumb/3/3a/Foobar.jpg/200px-Foobar.jpg" width="200" height="23" srcset="http://example.com/images/thumb/3/3a/Foobar.jpg/300px-Foobar.jpg 1.5x, http://example.com/images/thumb/3/3a/Foobar.jpg/400px-Foobar.jpg 2x" /></a></div> -<div class="floatright"><a href="/wiki/File:Foobar.jpg" class="image" title="Caption"><img alt="Caption" src="http://example.com/images/thumb/3/3a/Foobar.jpg/200px-Foobar.jpg" width="200" height="23" srcset="http://example.com/images/thumb/3/3a/Foobar.jpg/300px-Foobar.jpg 1.5x, http://example.com/images/thumb/3/3a/Foobar.jpg/400px-Foobar.jpg 2x" /></a></div> -<div class="floatright"><a href="/wiki/File:Foobar.jpg" class="image" title="Caption"><img alt="Caption" src="http://example.com/images/thumb/3/3a/Foobar.jpg/200px-Foobar.jpg" width="200" height="23" srcset="http://example.com/images/thumb/3/3a/Foobar.jpg/300px-Foobar.jpg 1.5x, http://example.com/images/thumb/3/3a/Foobar.jpg/400px-Foobar.jpg 2x" /></a></div> - -!! end - -!! test -Image with width attribute at different positions (parsoid) -!! options -parsoid -!! input -[[File:Foobar.jpg|200px|right|Caption]] -[[File:Foobar.jpg|right|200px|Caption]] -[[File:Foobar.jpg|right|Caption|200px]] -!! result -<figure class="mw-halign-right" typeof="mw:Image"><a href="File:Foobar.jpg"><img resource="./File:Foobar.jpg" src="//example.com/images/thumb/3/3a/Foobar.jpg/200px-Foobar.jpg" height="23" width="200"></a><figcaption>Caption</figcaption></figure> -<figure class="mw-halign-right" typeof="mw:Image"><a href="File:Foobar.jpg"><img resource="./File:Foobar.jpg" src="//example.com/images/thumb/3/3a/Foobar.jpg/200px-Foobar.jpg" height="23" width="200"></a><figcaption>Caption</figcaption></figure> -<figure class="mw-halign-right" typeof="mw:Image"><a href="File:Foobar.jpg"><img resource="./File:Foobar.jpg" src="//example.com/images/thumb/3/3a/Foobar.jpg/200px-Foobar.jpg" height="23" width="200"></a><figcaption>Caption</figcaption></figure> -!! end - -!! test -Image with link parameter, wiki target (php) -!! options -php -!! input -[[File:Foobar.jpg|link=Main Page]] -!! result -<p><a href="/wiki/Main_Page" title="Main Page"><img alt="Foobar.jpg" src="http://example.com/images/3/3a/Foobar.jpg" width="1941" height="220" /></a> -</p> -!! end - -!! test -Image with link parameter, wiki target (parsoid) -!! options -parsoid -!! input -[[File:Foobar.jpg|link=Main Page]] -!! result -<p><span class="mw-default-size" typeof="mw:Image"><a href="Main_Page"><img resource="./File:Foobar.jpg" src="//example.com/images/3/3a/Foobar.jpg" height="220" width="1941"></a></span></p> -!! end - -!! test -Image with link parameter, URL target (php) -!! options -php -!! input -[[File:Foobar.jpg|link=http://example.com/]] -!! result -<p><a href="http://example.com/" rel="nofollow"><img alt="Foobar.jpg" src="http://example.com/images/3/3a/Foobar.jpg" width="1941" height="220" /></a> -</p> -!! end - -# parsoid bug 49293 (part 1) -!! test -Image with link parameter, URL target (parsoid) -!! options -parsoid -!! input -[[File:Foobar.jpg|link=http://example.com/]] -!! result -<p><span class="mw-default-size" typeof="mw:Image"><a href="http://example.com/"><img resource="./File:Foobar.jpg" src="//example.com/images/3/3a/Foobar.jpg" height="220" width="1941"></a></span></p> -!! end - -!! test -Image with link parameter, protocol-less URL target (php) -!! options -php -!! input -[[File:Foobar.jpg|link=//example.com/]] -!! result -<p><a href="//example.com/" rel="nofollow"><img alt="Foobar.jpg" src="http://example.com/images/3/3a/Foobar.jpg" width="1941" height="220" /></a> -</p> -!! end - -# parsoid bug 49293 (part 2) -!! test -Image with link parameter, protocol-less URL target (parsoid) -!! options -parsoid -!! input -[[File:Foobar.jpg|link=//example.com/]] -!! result -<p><span class="mw-default-size" typeof="mw:Image"><a href="//example.com/"><img resource="./File:Foobar.jpg" src="//example.com/images/3/3a/Foobar.jpg" height="220" width="1941"></a></span></p> -!! end - -!! test -Image with link parameter, wgExternalLinkTarget -!! input -[[Image:foobar.jpg|link=http://example.com/]] -!! config -wgExternalLinkTarget='foobar' -!! result -<p><a href="http://example.com/" target="foobar" rel="nofollow"><img alt="Foobar.jpg" src="http://example.com/images/3/3a/Foobar.jpg" width="1941" height="220" /></a> -</p> -!! end - -!! test -Image with link parameter, wgNoFollowLinks set to false -!! input -[[Image:foobar.jpg|link=http://example.com/]] -!! config -wgNoFollowLinks=false -!! result -<p><a href="http://example.com/"><img alt="Foobar.jpg" src="http://example.com/images/3/3a/Foobar.jpg" width="1941" height="220" /></a> -</p> -!! end - -!! test -Image with link parameter, wgNoFollowDomainExceptions -!! input -[[Image:foobar.jpg|link=http://example.com/]] -!! config -wgNoFollowDomainExceptions='example.com' -!! result -<p><a href="http://example.com/"><img alt="Foobar.jpg" src="http://example.com/images/3/3a/Foobar.jpg" width="1941" height="220" /></a> -</p> -!! end - -!! test -Image with link parameter, wgExternalLinkTarget, unnamed parameter -!! input -[[Image:foobar.jpg|link=http://example.com/|Title]] -!! config -wgExternalLinkTarget='foobar' -!! result -<p><a href="http://example.com/" title="Title" target="foobar" rel="nofollow"><img alt="Title" src="http://example.com/images/3/3a/Foobar.jpg" width="1941" height="220" /></a> -</p> -!! end - -!! test -Image with empty link parameter (php) -!! options -php -!! input -[[File:Foobar.jpg|link=]] -!! result -<p><img alt="Foobar.jpg" src="http://example.com/images/3/3a/Foobar.jpg" width="1941" height="220" /> -</p> -!! end - -!! test -Image with empty link parameter (parsoid) -!! options -parsoid -!! input -[[File:Foobar.jpg|link=]] -!! result -<p><span class="mw-default-size" typeof="mw:Image"><span><img resource="./File:Foobar.jpg" src="//example.com/images/3/3a/Foobar.jpg" height="220" width="1941"></span></span></p> -!! end - -!! test -Image with link parameter (wiki target) and unnamed parameter (php) -!! options -php -!! input -[[File:Foobar.jpg|link=Main Page|Title]] -!! result -<p><a href="/wiki/Main_Page" title="Title"><img alt="Title" src="http://example.com/images/3/3a/Foobar.jpg" width="1941" height="220" /></a> -</p> -!! end - -!! test -Image with link parameter (wiki target) and unnamed parameter (parsoid) -!! options -parsoid -!! input -[[File:Foobar.jpg|link=Main Page|Title]] -!! result -<p><span class="mw-default-size" typeof="mw:Image" data-mw='{"caption":"Title"}'><a href="Main_Page"><img resource="./File:Foobar.jpg" src="//example.com/images/3/3a/Foobar.jpg" height="220" width="1941"></a></span></p> -!! end - -!! test -Image with link parameter (URL target) and unnamed parameter (php) -!! options -php -!! input -[[File:Foobar.jpg|link=http://example.com/|Title]] -!! result -<p><a href="http://example.com/" title="Title" rel="nofollow"><img alt="Title" src="http://example.com/images/3/3a/Foobar.jpg" width="1941" height="220" /></a> -</p> -!! end - -!! test -Image with link parameter (URL target) and unnamed parameter (parsoid) -!! options -parsoid -!! input -[[File:Foobar.jpg|link=http://example.com/|Title]] -!! result -<p><span class="mw-default-size" typeof="mw:Image" data-mw='{"caption":"Title"}'><a href="http://example.com/"><img resource="./File:Foobar.jpg" src="//example.com/images/3/3a/Foobar.jpg" height="220" width="1941"></a></span></p> -!! end - -!! test -Thumbnail image with link parameter -!! options -php -!! input -[[Image:foobar.jpg|thumb|link=http://example.com/|Title]] -!! result -<div class="thumb tright"><div class="thumbinner" style="width:182px;"><a href="http://example.com/"><img alt="" src="http://example.com/images/thumb/3/3a/Foobar.jpg/180px-Foobar.jpg" width="180" height="20" class="thumbimage" srcset="http://example.com/images/thumb/3/3a/Foobar.jpg/270px-Foobar.jpg 1.5x, http://example.com/images/thumb/3/3a/Foobar.jpg/360px-Foobar.jpg 2x" /></a> <div class="thumbcaption"><div class="magnify"><a href="/wiki/File:Foobar.jpg" class="internal" title="Enlarge"><img src="/skins/common/images/magnify-clip.png" width="15" height="11" alt="" /></a></div>Title</div></div></div> - -!! end - -!! test -Manually-specified thumbnail image -!! options -php -!! input -[[Image:Foobar.jpg|thumb=Thumb.png|Title]] -!! result -<div class="thumb tright"><div class="thumbinner" style="width:137px;"><a href="/wiki/File:Foobar.jpg"><img alt="" src="http://example.com/images/e/ea/Thumb.png" width="135" height="135" class="thumbimage" /></a> <div class="thumbcaption"><div class="magnify"><a href="/wiki/File:Foobar.jpg" class="internal" title="Enlarge"><img src="/skins/common/images/magnify-clip.png" width="15" height="11" alt="" /></a></div>Title</div></div></div> - -!! end - -!! test -Manually-specified thumbnail image with explicit link to wiki page -!! options -php -!! input -[[Image:Foobar.jpg|thumb=Thumb.png|link=Main Page|Title]] -!! result -<div class="thumb tright"><div class="thumbinner" style="width:137px;"><a href="/wiki/Main_Page" title="Main Page"><img alt="" src="http://example.com/images/e/ea/Thumb.png" width="135" height="135" class="thumbimage" /></a> <div class="thumbcaption"><div class="magnify"><a href="/wiki/File:Foobar.jpg" class="internal" title="Enlarge"><img src="/skins/common/images/magnify-clip.png" width="15" height="11" alt="" /></a></div>Title</div></div></div> - -!! end - -!! test -Manually-specified thumbnail image with explicit link to url -!! options -php -!! input -[[Image:Foobar.jpg|thumb=Thumb.png|link=http://example.com|Title]] -!! result -<div class="thumb tright"><div class="thumbinner" style="width:137px;"><a href="http://example.com"><img alt="" src="http://example.com/images/e/ea/Thumb.png" width="135" height="135" class="thumbimage" /></a> <div class="thumbcaption"><div class="magnify"><a href="/wiki/File:Foobar.jpg" class="internal" title="Enlarge"><img src="/skins/common/images/magnify-clip.png" width="15" height="11" alt="" /></a></div>Title</div></div></div> - -!! end - -!! test -Manually-specified thumbnail image with explicit no link -!! options -php -!! input -[[Image:Foobar.jpg|thumb=Thumb.png|link=|Title]] -!! result -<div class="thumb tright"><div class="thumbinner" style="width:137px;"><img alt="" src="http://example.com/images/e/ea/Thumb.png" width="135" height="135" class="thumbimage" /> <div class="thumbcaption"><div class="magnify"><a href="/wiki/File:Foobar.jpg" class="internal" title="Enlarge"><img src="/skins/common/images/magnify-clip.png" width="15" height="11" alt="" /></a></div>Title</div></div></div> - -!! end - -!! test -Manually-specified thumbnail image with explicit link and alt text -!! options -php -!! input -[[Image:Foobar.jpg|thumb=Thumb.png|link=Main Page|alt=alttext|Title]] -!! result -<div class="thumb tright"><div class="thumbinner" style="width:137px;"><a href="/wiki/Main_Page" title="Main Page"><img alt="alttext" src="http://example.com/images/e/ea/Thumb.png" width="135" height="135" class="thumbimage" /></a> <div class="thumbcaption"><div class="magnify"><a href="/wiki/File:Foobar.jpg" class="internal" title="Enlarge"><img src="/skins/common/images/magnify-clip.png" width="15" height="11" alt="" /></a></div>Title</div></div></div> - -!! end - -!! test -Image with frame and link -!! input -[[Image:Foobar.jpg|frame|left|This is a test image [[Main Page]]]] -!! result -<div class="thumb tleft"><div class="thumbinner" style="width:1943px;"><a href="/wiki/File:Foobar.jpg" class="image"><img alt="" src="http://example.com/images/3/3a/Foobar.jpg" width="1941" height="220" class="thumbimage" /></a> <div class="thumbcaption">This is a test image <a href="/wiki/Main_Page" title="Main Page">Main Page</a></div></div></div> - -!! end - -!! test -Image with frame and link and explicit alt -!! input -[[Image:Foobar.jpg|frame|left|This is a test image [[Main Page]]|alt=Altitude]] -!! result -<div class="thumb tleft"><div class="thumbinner" style="width:1943px;"><a href="/wiki/File:Foobar.jpg" class="image"><img alt="Altitude" src="http://example.com/images/3/3a/Foobar.jpg" width="1941" height="220" class="thumbimage" /></a> <div class="thumbcaption">This is a test image <a href="/wiki/Main_Page" title="Main Page">Main Page</a></div></div></div> - -!! end - -!! test -Image with wiki markup in implicit alt -!! input -[[Image:Foobar.jpg|testing '''bold''' in alt]] -!! result -<p><a href="/wiki/File:Foobar.jpg" class="image" title="testing bold in alt"><img alt="testing bold in alt" src="http://example.com/images/3/3a/Foobar.jpg" width="1941" height="220" /></a> -</p> -!! end - -!! test -Image with wiki markup in explicit alt -!! input -[[Image:Foobar.jpg|alt=testing '''bold''' in alt]] -!! result -<p><a href="/wiki/File:Foobar.jpg" class="image"><img alt="testing bold in alt" src="http://example.com/images/3/3a/Foobar.jpg" width="1941" height="220" /></a> -</p> -!! end - -!! test -Link to image page- image page normally doesn't exists, hence edit link -Add test with existing image page -#<p><a href="/wiki/File:Test" title="Image:Test">Image:test</a> -!! input -[[:Image:test]] -!! result -<p><a href="/index.php?title=File:Test&action=edit&redlink=1" class="new" title="File:Test (page does not exist)">Image:test</a> -</p> -!! end - -!! test -bug 18784 Link to non-existent image page with caption should use caption as link text -!! input -[[:Image:test|caption]] -!! result -<p><a href="/index.php?title=File:Test&action=edit&redlink=1" class="new" title="File:Test (page does not exist)">caption</a> -</p> -!! end - -!! test -Frameless image caption with a free URL -!! input -[[Image:foobar.jpg|http://example.com]] -!! result -<p><a href="/wiki/File:Foobar.jpg" class="image" title="http://example.com"><img alt="http://example.com" src="http://example.com/images/3/3a/Foobar.jpg" width="1941" height="220" /></a> -</p> -!! end - -!! test -Thumbnail image caption with a free URL -!! input -[[Image:foobar.jpg|thumb|http://example.com]] -!! result -<div class="thumb tright"><div class="thumbinner" style="width:182px;"><a href="/wiki/File:Foobar.jpg" class="image"><img alt="" src="http://example.com/images/thumb/3/3a/Foobar.jpg/180px-Foobar.jpg" width="180" height="20" class="thumbimage" srcset="http://example.com/images/thumb/3/3a/Foobar.jpg/270px-Foobar.jpg 1.5x, http://example.com/images/thumb/3/3a/Foobar.jpg/360px-Foobar.jpg 2x" /></a> <div class="thumbcaption"><div class="magnify"><a href="/wiki/File:Foobar.jpg" class="internal" title="Enlarge"><img src="/skins/common/images/magnify-clip.png" width="15" height="11" alt="" /></a></div><a rel="nofollow" class="external free" href="http://example.com">http://example.com</a></div></div></div> - -!! end - -!! test -Thumbnail image caption with a free URL and explicit alt -!! input -[[Image:foobar.jpg|thumb|http://example.com|alt=Alteration]] -!! result -<div class="thumb tright"><div class="thumbinner" style="width:182px;"><a href="/wiki/File:Foobar.jpg" class="image"><img alt="Alteration" src="http://example.com/images/thumb/3/3a/Foobar.jpg/180px-Foobar.jpg" width="180" height="20" class="thumbimage" srcset="http://example.com/images/thumb/3/3a/Foobar.jpg/270px-Foobar.jpg 1.5x, http://example.com/images/thumb/3/3a/Foobar.jpg/360px-Foobar.jpg 2x" /></a> <div class="thumbcaption"><div class="magnify"><a href="/wiki/File:Foobar.jpg" class="internal" title="Enlarge"><img src="/skins/common/images/magnify-clip.png" width="15" height="11" alt="" /></a></div><a rel="nofollow" class="external free" href="http://example.com">http://example.com</a></div></div></div> - -!! end - -!! test -SVG thumbnails with no language set -!! options -!! input -[[File:Foobar.svg|thumb|width=200]] -!! result -<div class="thumb tright"><div class="thumbinner" style="width:182px;"><a href="/wiki/File:Foobar.svg" class="image"><img alt="" src="http://example.com/images/thumb/f/ff/Foobar.svg/180px-Foobar.svg.png" width="180" height="180" class="thumbimage" srcset="http://example.com/images/thumb/f/ff/Foobar.svg/270px-Foobar.svg.png 1.5x, http://example.com/images/thumb/f/ff/Foobar.svg/360px-Foobar.svg.png 2x" /></a> <div class="thumbcaption"><div class="magnify"><a href="/wiki/File:Foobar.svg" class="internal" title="Enlarge"><img src="/skins/common/images/magnify-clip.png" width="15" height="11" alt="" /></a></div>width=200</div></div></div> - -!! end - -!! test -SVG thumbnails with language de -!! options -!! input -[[File:Foobar.svg|thumb|width=200|lang=de]] -!! result -<div class="thumb tright"><div class="thumbinner" style="width:182px;"><a href="/index.php?title=File:Foobar.svg&lang=de" class="image"><img alt="" src="http://example.com/images/thumb/f/ff/Foobar.svg/langde-180px-Foobar.svg.png" width="180" height="180" class="thumbimage" srcset="http://example.com/images/thumb/f/ff/Foobar.svg/langde-270px-Foobar.svg.png 1.5x, http://example.com/images/thumb/f/ff/Foobar.svg/langde-360px-Foobar.svg.png 2x" /></a> <div class="thumbcaption"><div class="magnify"><a href="/wiki/File:Foobar.svg" class="internal" title="Enlarge"><img src="/skins/common/images/magnify-clip.png" width="15" height="11" alt="" /></a></div>width=200</div></div></div> - -!! end - -!! test -SVG thumbnails with invalid language code -!! options -!! input -[[File:Foobar.svg|thumb|width=200|lang=invalid.language.code]] -!! result -<div class="thumb tright"><div class="thumbinner" style="width:182px;"><a href="/wiki/File:Foobar.svg" class="image"><img alt="" src="http://example.com/images/thumb/f/ff/Foobar.svg/180px-Foobar.svg.png" width="180" height="180" class="thumbimage" srcset="http://example.com/images/thumb/f/ff/Foobar.svg/270px-Foobar.svg.png 1.5x, http://example.com/images/thumb/f/ff/Foobar.svg/360px-Foobar.svg.png 2x" /></a> <div class="thumbcaption"><div class="magnify"><a href="/wiki/File:Foobar.svg" class="internal" title="Enlarge"><img src="/skins/common/images/magnify-clip.png" width="15" height="11" alt="" /></a></div>lang=invalid.language.code</div></div></div> - -!! end - -!! test -BUG 1887: A ISBN with a thumbnail -!! input -[[Image:foobar.jpg|thumb|ISBN 1235467890]] -!! result -<div class="thumb tright"><div class="thumbinner" style="width:182px;"><a href="/wiki/File:Foobar.jpg" class="image"><img alt="" src="http://example.com/images/thumb/3/3a/Foobar.jpg/180px-Foobar.jpg" width="180" height="20" class="thumbimage" srcset="http://example.com/images/thumb/3/3a/Foobar.jpg/270px-Foobar.jpg 1.5x, http://example.com/images/thumb/3/3a/Foobar.jpg/360px-Foobar.jpg 2x" /></a> <div class="thumbcaption"><div class="magnify"><a href="/wiki/File:Foobar.jpg" class="internal" title="Enlarge"><img src="/skins/common/images/magnify-clip.png" width="15" height="11" alt="" /></a></div><a href="/wiki/Special:BookSources/1235467890" class="internal mw-magiclink-isbn">ISBN 1235467890</a></div></div></div> - -!! end - -!! test -BUG 1887: A RFC with a thumbnail -!! input -[[Image:foobar.jpg|thumb|This is RFC 12354]] -!! result -<div class="thumb tright"><div class="thumbinner" style="width:182px;"><a href="/wiki/File:Foobar.jpg" class="image"><img alt="" src="http://example.com/images/thumb/3/3a/Foobar.jpg/180px-Foobar.jpg" width="180" height="20" class="thumbimage" srcset="http://example.com/images/thumb/3/3a/Foobar.jpg/270px-Foobar.jpg 1.5x, http://example.com/images/thumb/3/3a/Foobar.jpg/360px-Foobar.jpg 2x" /></a> <div class="thumbcaption"><div class="magnify"><a href="/wiki/File:Foobar.jpg" class="internal" title="Enlarge"><img src="/skins/common/images/magnify-clip.png" width="15" height="11" alt="" /></a></div>This is <a class="external mw-magiclink-rfc" rel="nofollow" href="//tools.ietf.org/html/rfc12354">RFC 12354</a></div></div></div> - -!! end - -!! test -BUG 1887: A mailto link with a thumbnail -!! input -[[Image:foobar.jpg|thumb|Please mailto:nobody@example.com]] -!! result -<div class="thumb tright"><div class="thumbinner" style="width:182px;"><a href="/wiki/File:Foobar.jpg" class="image"><img alt="" src="http://example.com/images/thumb/3/3a/Foobar.jpg/180px-Foobar.jpg" width="180" height="20" class="thumbimage" srcset="http://example.com/images/thumb/3/3a/Foobar.jpg/270px-Foobar.jpg 1.5x, http://example.com/images/thumb/3/3a/Foobar.jpg/360px-Foobar.jpg 2x" /></a> <div class="thumbcaption"><div class="magnify"><a href="/wiki/File:Foobar.jpg" class="internal" title="Enlarge"><img src="/skins/common/images/magnify-clip.png" width="15" height="11" alt="" /></a></div>Please <a rel="nofollow" class="external free" href="mailto:nobody@example.com">mailto:nobody@example.com</a></div></div></div> - -!! end - -# Pending resolution to bug 368 -!! test -BUG 648: Frameless image caption with a link -!! input -[[Image:foobar.jpg|text with a [[link]] in it]] -!! result -<p><a href="/wiki/File:Foobar.jpg" class="image" title="text with a link in it"><img alt="text with a link in it" src="http://example.com/images/3/3a/Foobar.jpg" width="1941" height="220" /></a> -</p> -!! end - -!! test -BUG 648: Frameless image caption with a link (suffix) -!! input -[[Image:foobar.jpg|text with a [[link]]foo in it]] -!! result -<p><a href="/wiki/File:Foobar.jpg" class="image" title="text with a linkfoo in it"><img alt="text with a linkfoo in it" src="http://example.com/images/3/3a/Foobar.jpg" width="1941" height="220" /></a> -</p> -!! end - -!! test -BUG 648: Frameless image caption with an interwiki link -!! input -[[Image:foobar.jpg|text with a [[MeatBall:Link]] in it]] -!! result -<p><a href="/wiki/File:Foobar.jpg" class="image" title="text with a MeatBall:Link in it"><img alt="text with a MeatBall:Link in it" src="http://example.com/images/3/3a/Foobar.jpg" width="1941" height="220" /></a> -</p> -!! end - -!! test -BUG 648: Frameless image caption with a piped interwiki link -!! input -[[Image:foobar.jpg|text with a [[MeatBall:Link|link]] in it]] -!! result -<p><a href="/wiki/File:Foobar.jpg" class="image" title="text with a link in it"><img alt="text with a link in it" src="http://example.com/images/3/3a/Foobar.jpg" width="1941" height="220" /></a> -</p> -!! end - -!! test -Escape HTML special chars in image alt text -!! input -[[Image:foobar.jpg|& < > "]] -!! result -<p><a href="/wiki/File:Foobar.jpg" class="image" title="& < > ""><img alt="& < > "" src="http://example.com/images/3/3a/Foobar.jpg" width="1941" height="220" /></a> -</p> -!! end - -!! test -BUG 499: Alt text should have Ӓ, not &1234; -!! input -[[Image:foobar.jpg|♀]] -!! result -<p><a href="/wiki/File:Foobar.jpg" class="image" title="♀"><img alt="♀" src="http://example.com/images/3/3a/Foobar.jpg" width="1941" height="220" /></a> -</p> -!! end - -!! test -Broken image caption with link -!! input -[[Image:Foobar.jpg|thumb|This is a broken caption. But [[Main Page|this]] is just an ordinary link. -!! result -<p>[[Image:Foobar.jpg|thumb|This is a broken caption. But <a href="/wiki/Main_Page" title="Main Page">this</a> is just an ordinary link. -</p> -!! end - -!! test -Image caption containing another image -!! input -[[Image:Foobar.jpg|thumb|This is a caption with another [[Image:icon.png|image]] inside it!]] -!! result -<div class="thumb tright"><div class="thumbinner" style="width:182px;"><a href="/wiki/File:Foobar.jpg" class="image"><img alt="" src="http://example.com/images/thumb/3/3a/Foobar.jpg/180px-Foobar.jpg" width="180" height="20" class="thumbimage" srcset="http://example.com/images/thumb/3/3a/Foobar.jpg/270px-Foobar.jpg 1.5x, http://example.com/images/thumb/3/3a/Foobar.jpg/360px-Foobar.jpg 2x" /></a> <div class="thumbcaption"><div class="magnify"><a href="/wiki/File:Foobar.jpg" class="internal" title="Enlarge"><img src="/skins/common/images/magnify-clip.png" width="15" height="11" alt="" /></a></div>This is a caption with another <a href="/index.php?title=Special:Upload&wpDestFile=Icon.png" class="new" title="File:Icon.png">image</a> inside it!</div></div></div> - -!! end - -!! test -Image caption containing a newline -!! input -[[Image:Foobar.jpg|This -*is some text]] -!! result -<p><a href="/wiki/File:Foobar.jpg" class="image" title="This *is some text"><img alt="This *is some text" src="http://example.com/images/3/3a/Foobar.jpg" width="1941" height="220" /></a> -</p> -!!end - -!!test -Parsoid: Image caption containing leading space -(The leading space should not trigger nowiki escaping in wt2wt mode) -!! input -[[Image:Foobar.jpg|thumb| bar]] -!! result -<div class="thumb tright"><div class="thumbinner" style="width:182px;"><a href="/wiki/File:Foobar.jpg" class="image"><img alt="" src="http://example.com/images/thumb/3/3a/Foobar.jpg/180px-Foobar.jpg" width="180" height="20" class="thumbimage" srcset="http://example.com/images/thumb/3/3a/Foobar.jpg/270px-Foobar.jpg 1.5x, http://example.com/images/thumb/3/3a/Foobar.jpg/360px-Foobar.jpg 2x" /></a> <div class="thumbcaption"><div class="magnify"><a href="/wiki/File:Foobar.jpg" class="internal" title="Enlarge"><img src="/skins/common/images/magnify-clip.png" width="15" height="11" alt="" /></a></div>bar</div></div></div> - -!!end - -!! test -Bug 3090: External links other than http: in image captions -!! input -[[Image:Foobar.jpg|thumb|200px|This caption has [irc://example.net irc] and [https://example.com Secure] ext links in it.]] -!! result -<div class="thumb tright"><div class="thumbinner" style="width:202px;"><a href="/wiki/File:Foobar.jpg" class="image"><img alt="" src="http://example.com/images/thumb/3/3a/Foobar.jpg/200px-Foobar.jpg" width="200" height="23" class="thumbimage" srcset="http://example.com/images/thumb/3/3a/Foobar.jpg/300px-Foobar.jpg 1.5x, http://example.com/images/thumb/3/3a/Foobar.jpg/400px-Foobar.jpg 2x" /></a> <div class="thumbcaption"><div class="magnify"><a href="/wiki/File:Foobar.jpg" class="internal" title="Enlarge"><img src="/skins/common/images/magnify-clip.png" width="15" height="11" alt="" /></a></div>This caption has <a rel="nofollow" class="external text" href="irc://example.net">irc</a> and <a rel="nofollow" class="external text" href="https://example.com">Secure</a> ext links in it.</div></div></div> - -!! end - -!! test -Custom class -!! input -[[Image:foobar.jpg|a|class=b]] -!! result -<p><a href="/wiki/File:Foobar.jpg" class="image" title="a"><img alt="a" src="http://example.com/images/3/3a/Foobar.jpg" width="1941" height="220" class="b" /></a> -</p> -!! end - -!! test -Localized image handling (1). -!! options -language=es -!! input -[[Archivo:Foobar.jpg|izquierda|enlace=foo|caption]] -!! result -<div class="floatleft"><a href="/wiki/Foo" title="caption"><img alt="caption" src="http://example.com/images/3/3a/Foobar.jpg" width="1941" height="220" /></a></div> - -!! end - -!! test -Localized image handling (2). -!! options -language=es -!! input -[[Archivo:Foobar.jpg|miniatura|izquierda|enlace=foo|caption]] -!! result -<div class="thumb tleft"><div class="thumbinner" style="width:182px;"><a href="/wiki/Foo" title="Foo"><img alt="" src="http://example.com/images/thumb/3/3a/Foobar.jpg/180px-Foobar.jpg" width="180" height="20" class="thumbimage" srcset="http://example.com/images/thumb/3/3a/Foobar.jpg/270px-Foobar.jpg 1.5x, http://example.com/images/thumb/3/3a/Foobar.jpg/360px-Foobar.jpg 2x" /></a> <div class="thumbcaption"><div class="magnify"><a href="/wiki/Archivo:Foobar.jpg" class="internal" title="Aumentar"><img src="/skins/common/images/magnify-clip.png" width="15" height="11" alt="" /></a></div>caption</div></div></div> - -!! end - -!! test -"border", "frameless" and "class" attributes on an image. -!! input -[[File:Foobar.jpg|frameless|border|class=extra|caption]] -!! result -<p><a href="/wiki/File:Foobar.jpg" class="image" title="caption"><img alt="caption" src="http://example.com/images/thumb/3/3a/Foobar.jpg/180px-Foobar.jpg" width="180" height="20" class="extra thumbborder" srcset="http://example.com/images/thumb/3/3a/Foobar.jpg/270px-Foobar.jpg 1.5x, http://example.com/images/thumb/3/3a/Foobar.jpg/360px-Foobar.jpg 2x" /></a> -</p> -!! end - -!! article -File:Barfoo.jpg -!! text -#REDIRECT [[File:Barfoo.jpg]] -!! endarticle - -!! test -Redirected image -!! input -[[Image:Barfoo.jpg]] -!! result -<p><a href="/wiki/File:Barfoo.jpg" title="File:Barfoo.jpg">File:Barfoo.jpg</a> -</p> -!! end - -!! test -Missing image with uploads disabled -!! options -wgEnableUploads=0 -!! input -[[Image:Foobaz.jpg]] -!! result -<p><a href="/wiki/File:Foobaz.jpg" title="File:Foobaz.jpg">File:Foobaz.jpg</a> -</p> -!! end - -# Parsoid-specific testing for images -# http://www.mediawiki.org/wiki/Parsoid/MediaWiki_DOM_spec#Images -# Currently imperfect due to a flaw in the Parsoid testrunner -# Work in progress -# THESE TESTS SHOULD BE MOVED UP and merged with the php-specific -# image tests. - -!! test -Parsoid-specific image handling - simple image with size and middle alignment -!! options -parsoid -!! input -[[Image:Foobar.jpg|50px|middle]] -!! result -<p> -<span class="mw-valign-middle" typeof="mw:Image"> -<a href="File:Foobar.jpg"> -<img resource="./File:Foobar.jpg" src="//example.com/images/thumb/3/3a/Foobar.jpg/50px-Foobar.jpg" height="6" width="50"> -</a> -</span> -</p> -!! end - -!! test -Parsoid-specific image handling - simple image with both sizes, a baseline alignment, and a caption -!! options -parsoid -!! input -[[Image:Foobar.jpg|500x10px|baseline|caption]] -!! result -<p> -<span class="mw-valign-baseline" typeof="mw:Image" data-mw="{"caption":"caption"}"> -<a href="File:Foobar.jpg"> -<img resource="./File:Foobar.jpg" src="//example.com/images/thumb/3/3a/Foobar.jpg/89px-Foobar.jpg" height="10" width="89"> -</a> -</span> -</p> -!! end - -!! test -Parsoid-specific image handling - simple image with border and size spec -!! options -parsoid -!! input -[[Image:Foobar.jpg|50px|border|caption]] -!! result -<p> -<span class="mw-image-border" typeof="mw:Image" data-mw="{"caption":"caption"}"> -<a href="File:Foobar.jpg"> -<img resource="./File:Foobar.jpg" src="//example.com/images/thumb/3/3a/Foobar.jpg/50px-Foobar.jpg" height="6" width="50"> -</a> -</span> -</p> -!! end - -!! test -Parsoid-specific image handling - thumbnail with halign, valign, and caption -!! options -parsoid -!! input -[[Image:Foobar.jpg|thumb|left|baseline|caption content]] -!! result -<figure class="mw-default-size mw-halign-left mw-valign-baseline" typeof="mw:Image/Thumb"> -<a href="File:Foobar.jpg"> -<img resource="./File:Foobar.jpg" src="//example.com/images/thumb/3/3a/Foobar.jpg/180px-Foobar.jpg" height="21" width="180" /> -</a> -<figcaption>caption content</figcaption> -</figure> -!! end - -!! test -Parsoid-specific image handling - thumbnail with specific size, halign, valign, and caption -!! options -parsoid -!! input -[[Image:Foobar.jpg|thumb|50x50px|right|middle|caption]] -!! result -<figure class="mw-halign-right mw-valign-middle" typeof="mw:Image/Thumb"> -<a href="File:Foobar.jpg"> -<img resource="./File:Foobar.jpg" src="//example.com/images/thumb/3/3a/Foobar.jpg/50px-Foobar.jpg" height="6" width="50" /> -</a> -<figcaption>caption</figcaption> -</figure> -!! end - -!! test -Parsoid-specific image handling - framed image with specific size and caption -!! options -parsoid -!! input -[[Image:Foobar.jpg|500x50px|frame|caption]] -!! result -<figure typeof="mw:Image/Frame"> -<a href="File:Foobar.jpg"> -<img resource="./File:Foobar.jpg" src="//example.com/images/thumb/3/3a/Foobar.jpg/442px-Foobar.jpg" height="50" width="442" /> -</a> -<figcaption>caption</figcaption> -</figure> -!! end - -!! test -Parsoid-specific image handling - framed image with specific size, halign, valign, and caption -!! options -parsoid -!! input -[[Image:Foobar.jpg|500x50px|frame|left|baseline|caption]] -!! result -<figure class="mw-halign-left mw-valign-baseline" typeof="mw:Image/Frame"> -<a href="File:Foobar.jpg"> -<img resource="./File:Foobar.jpg" src="//example.com/images/thumb/3/3a/Foobar.jpg/442px-Foobar.jpg" height="50" width="442" /> -</a> -<figcaption>caption</figcaption> -</figure> -!! end - -!! test -Parsoid-specific image handling - frameless image with specific size, border, and caption -!! options -parsoid -!! input -[[Image:Foobar.jpg|frameless|500x50px|border|caption]] -!! result -<p> -<span class="mw-image-border" typeof="mw:Image/Frameless" data-mw="{"caption":"caption"}"> -<a href="File:Foobar.jpg"> -<img resource="./File:Foobar.jpg" src="//example.com/images/thumb/3/3a/Foobar.jpg/442px-Foobar.jpg" height="50" width="442" /> -</a> -</p> -!! end - -#!! test -#Parsoid-specific image handling - simple image with a formatted caption -#!! options -#parsoid -#!! input -#[[Image:Foobar.jpg|<table><tr><td>a</td><td>b</td></tr><tr><td>c</td></tr></table>]] -#!! result -#<p> -#<span typeof="mw:Image"> -#<a class="mw-default-size" href="Image:Foobar.jpg"> -#<img alt="Foobar.jpg" class="mw-default-size" src="http://example.com/images/3/3a/Foobar.jpg" height="220" width="1941"> -#</a> -#<span>abc</span> -#</span> -#</p> - - -### -### Subpages -### -!! article -Subpage test/subpage -!! text -foo -!! endarticle - -!! test -Subpage link -!! options -subpage title=[[Subpage test]] -!! input -[[/subpage]] -!! result -<p><a href="/wiki/Subpage_test/subpage" title="Subpage test/subpage">/subpage</a> -</p> -!! end - -!! test -Subpage noslash link -!! options -subpage title=[[Subpage test]] -!!input -[[/subpage/]] -!! result -<p><a href="/wiki/Subpage_test/subpage" title="Subpage test/subpage">subpage</a> -</p> -!! end - -# TODO: make this PHP-parser compatible! -!! test -Relative subpage noslash link -!! options -parsoid=wt2wt,wt2html,html2html -subpage title=[[Subpage test/1/2/3/4]] -!!input -[[../../subpage/]] - -[[../../subpage]] -!! result -<p><a rel="mw:WikiLink" href="Subpage_test/1/2/subpage/">subpage</a></p> -<p><a rel="mw:WikiLink" href="Subpage_test/1/2/subpage">Subpage_test/1/2/subpage</a></p> -!! end - -# TODO: make this PHP-parser compatible! -!! test -Parsoid: dot-slash prefixed wikilinks -!! options -parsoid=wt2wt,wt2html,html2html -!!input -[[./foo]] - -[[././bar]] - -[[././baz/]] -!! result -<p><a rel="mw:WikiLink" href="./Foo">foo</a></p> -<p><a rel="mw:WikiLink" href="./Bar">bar</a></p> -<p><a rel="mw:WikiLink" href="./Baz/">baz/</a></p> -!! end - -!! test -Disabled subpages -!! input -[[/subpage]] -!! result -<p><a href="/index.php?title=/subpage&action=edit&redlink=1" class="new" title="/subpage (page does not exist)">/subpage</a> -</p> -!! end - -!! test -BUG 561: {{/Subpage}} -!! options -subpage title=[[Page]] -!! input -{{/Subpage}} -!! result -<p><a href="/index.php?title=Page/Subpage&action=edit&redlink=1" class="new" title="Page/Subpage (page does not exist)">Page/Subpage</a> -</p> -!! end - -### -### Categories -### -!! article -Category:MediaWiki User's Guide -!! text -blah -!! endarticle - -!! test -Link to category -!! input -[[:Category:MediaWiki User's Guide]] -!! result -<p><a href="/wiki/Category:MediaWiki_User%27s_Guide" title="Category:MediaWiki User's Guide">Category:MediaWiki User's Guide</a> -</p> -!! end - -!! test -Simple category -!! options -cat -!! input -[[Category:MediaWiki User's Guide]] -!! result -<a href="/wiki/Category:MediaWiki_User%27s_Guide" title="Category:MediaWiki User's Guide">MediaWiki User's Guide</a> -!! end - -!! test -PAGESINCATEGORY invalid title fatal (r33546 fix) -!! input -{{PAGESINCATEGORY:<bogus>}} -!! result -<p>0 -</p> -!! end - -!! test -Category with different sort key -!! options -cat -!! input -[[Category:MediaWiki User's Guide|Foo]] -!! result -<a href="/wiki/Category:MediaWiki_User%27s_Guide" title="Category:MediaWiki User's Guide">MediaWiki User's Guide</a> -!! end - -!! test -Category with identical sort key -!! options -cat -!! input -[[Category:MediaWiki User's Guide|MediaWiki User's Guide]] -!! result -<a href="/wiki/Category:MediaWiki_User%27s_Guide" title="Category:MediaWiki User's Guide">MediaWiki User's Guide</a> -!! end - -!! test -Category with empty sort key -!! options -cat -pst -!! input -[[Category:MediaWiki User's Guide|]] -!! result -[[Category:MediaWiki User's Guide|MediaWiki User's Guide]] -!! end - -!! test -Category with empty sort key and parentheses -!! options -cat -pst -!! input -[[Category:Foo (bar)|]] -!! result -[[Category:Foo (bar)|Foo]] -!! end - -!! test -Category with link tail -!! options -cat -pst -!! input -123[[Category:Foo]]456 -!! result -123[[Category:Foo]]456 -!! end - -!! test -Category with template -!! options -cat -pst -!! input -[[Category:{{echo|Foo}}]] -!! result -[[Category:{{echo|Foo}}]] -!! end - -!! test -Category with template in sort key -!! options -cat -pst -!! input -[[Category:Foo|{{echo|Bar}}]] -!! result -[[Category:Foo|{{echo|Bar}}]] -!! end - -!! test -Category with template in sort key and title -!! options -cat -pst -!! input -[[Category:{{echo|Foo}}|{{echo|Bar}}]] -!! result -[[Category:{{echo|Foo}}|{{echo|Bar}}]] -!! end - -!! test -Category / paragraph interactions -!! input -Foo [[Category:Baz]] Bar - -Foo [[Category:Baz]] -Bar - -Foo -[[Category:Baz]] -Bar - -Foo -[[Category:Baz]] Bar - -Foo -[[Category:Baz]] - [[Category:Baz]] -[[Category:Baz]] -Bar - -[[Category:Baz]] - [[Category:Baz]] -[[Category:Baz]] - -[[Category:Baz]] - {{echo|[[Category:Baz]]}} -[[Category:Baz]] -!! result -<p>Foo Bar -</p><p>Foo -Bar -</p><p>Foo -Bar -</p><p>Foo Bar -</p><p>Foo -Bar -</p> -!! end - -!! test -Parsoid: Serialize link to category page with colon escape -!! options -parsoid -!! input - -[[:Category:Foo]] -[[:Category:Foo|Bar]] -!! result -<p> -<a rel="mw:WikiLink" href="Category:Foo">Category:Foo</a> -<a rel="mw:WikiLink" href="Category:Foo">Bar</a> -</p> -!! end - -!! test -Parsoid: Link prefix/suffixes aren't applied to category links -!! options -parsoid=wt2html,wt2wt,html2html -language=is -!! input -x[[Category:Foo]]y -!! result -<p>x<link rel="mw:WikiLink/Category" href="Category:Foo">y</p> -!! end - -!! test -Parsoid: Serialize link to file page with colon escape -!! options -parsoid -!! input - -[[:File:Foo.png]] -[[:File:Foo.png|Bar]] -!! result -<p> -<a rel="mw:WikiLink" href="File:Foo.png">File:Foo.png</a> -<a rel="mw:WikiLink" href="File:Foo.png">Bar</a> -</p> -!! end - -!! test -Parsoid: Serialize a genuine category link without colon escape -!! options -parsoid -!! input -[[Category:Foo]] -[[Category:Foo|Bar]] -!! result -<link rel="mw:WikiLink/Category" href="Category:Foo"> -<link rel="mw:WikiLink/Category" href="Category:Foo#Bar"> -!! end - -### -### Inter-language links -### -!! test -Inter-language links -!! options -ill -!! input -[[es:Alimento]] -[[fr:Nourriture]] -[[zh:食品]] -!! result -es:Alimento fr:Nourriture zh:食品 -!! end - -!! test -Duplicate interlanguage links (bug 24502) -!! options -ill -!! input -[[es:1]] -[[es:2]] -[[fr:1]] -[[fr:2]] -!! result -es:1 fr:1 -!! end - -### -### Sections -### -!! test -Basic section headings -!! input -== Headline 1 == -Some text - -==Headline 2== -More -===Smaller headline=== -Blah blah -!! result -<h2><span class="mw-headline" id="Headline_1">Headline 1</span><span class="mw-editsection"><span class="mw-editsection-bracket">[</span><a href="/index.php?title=Parser_test&action=edit&section=1" title="Edit section: Headline 1">edit</a><span class="mw-editsection-bracket">]</span></span></h2> -<p>Some text -</p> -<h2><span class="mw-headline" id="Headline_2">Headline 2</span><span class="mw-editsection"><span class="mw-editsection-bracket">[</span><a href="/index.php?title=Parser_test&action=edit&section=2" title="Edit section: Headline 2">edit</a><span class="mw-editsection-bracket">]</span></span></h2> -<p>More -</p> -<h3><span class="mw-headline" id="Smaller_headline">Smaller headline</span><span class="mw-editsection"><span class="mw-editsection-bracket">[</span><a href="/index.php?title=Parser_test&action=edit&section=3" title="Edit section: Smaller headline">edit</a><span class="mw-editsection-bracket">]</span></span></h3> -<p>Blah blah -</p> -!! end - -!! test -Section headings with TOC -!! input -== Headline 1 == -=== Subheadline 1 === -===== Skipping a level ===== -====== Skipping a level ====== - -== Headline 2 == -Some text -===Another headline=== -!! result -<div id="toc" class="toc"><div id="toctitle"><h2>Contents</h2></div> -<ul> -<li class="toclevel-1 tocsection-1"><a href="#Headline_1"><span class="tocnumber">1</span> <span class="toctext">Headline 1</span></a> -<ul> -<li class="toclevel-2 tocsection-2"><a href="#Subheadline_1"><span class="tocnumber">1.1</span> <span class="toctext">Subheadline 1</span></a> -<ul> -<li class="toclevel-3 tocsection-3"><a href="#Skipping_a_level"><span class="tocnumber">1.1.1</span> <span class="toctext">Skipping a level</span></a> -<ul> -<li class="toclevel-4 tocsection-4"><a href="#Skipping_a_level_2"><span class="tocnumber">1.1.1.1</span> <span class="toctext">Skipping a level</span></a></li> -</ul> -</li> -</ul> -</li> -</ul> -</li> -<li class="toclevel-1 tocsection-5"><a href="#Headline_2"><span class="tocnumber">2</span> <span class="toctext">Headline 2</span></a> -<ul> -<li class="toclevel-2 tocsection-6"><a href="#Another_headline"><span class="tocnumber">2.1</span> <span class="toctext">Another headline</span></a></li> -</ul> -</li> -</ul> -</div> - -<h2><span class="mw-headline" id="Headline_1">Headline 1</span><span class="mw-editsection"><span class="mw-editsection-bracket">[</span><a href="/index.php?title=Parser_test&action=edit&section=1" title="Edit section: Headline 1">edit</a><span class="mw-editsection-bracket">]</span></span></h2> -<h3><span class="mw-headline" id="Subheadline_1">Subheadline 1</span><span class="mw-editsection"><span class="mw-editsection-bracket">[</span><a href="/index.php?title=Parser_test&action=edit&section=2" title="Edit section: Subheadline 1">edit</a><span class="mw-editsection-bracket">]</span></span></h3> -<h5><span class="mw-headline" id="Skipping_a_level">Skipping a level</span><span class="mw-editsection"><span class="mw-editsection-bracket">[</span><a href="/index.php?title=Parser_test&action=edit&section=3" title="Edit section: Skipping a level">edit</a><span class="mw-editsection-bracket">]</span></span></h5> -<h6><span class="mw-headline" id="Skipping_a_level_2">Skipping a level</span><span class="mw-editsection"><span class="mw-editsection-bracket">[</span><a href="/index.php?title=Parser_test&action=edit&section=4" title="Edit section: Skipping a level">edit</a><span class="mw-editsection-bracket">]</span></span></h6> -<h2><span class="mw-headline" id="Headline_2">Headline 2</span><span class="mw-editsection"><span class="mw-editsection-bracket">[</span><a href="/index.php?title=Parser_test&action=edit&section=5" title="Edit section: Headline 2">edit</a><span class="mw-editsection-bracket">]</span></span></h2> -<p>Some text -</p> -<h3><span class="mw-headline" id="Another_headline">Another headline</span><span class="mw-editsection"><span class="mw-editsection-bracket">[</span><a href="/index.php?title=Parser_test&action=edit&section=6" title="Edit section: Another headline">edit</a><span class="mw-editsection-bracket">]</span></span></h3> - -!! end - -# perl -e 'print "="x$_," Level $_ heading","="x$_,"\n" for 1..10' -!! test -Handling of sections up to level 6 and beyond -!! input -= Level 1 Heading= -== Level 2 Heading== -=== Level 3 Heading=== -==== Level 4 Heading==== -===== Level 5 Heading===== -====== Level 6 Heading====== -======= Level 7 Heading======= -======== Level 8 Heading======== -========= Level 9 Heading========= -========== Level 10 Heading========== -!! result -<div id="toc" class="toc"><div id="toctitle"><h2>Contents</h2></div> -<ul> -<li class="toclevel-1 tocsection-1"><a href="#Level_1_Heading"><span class="tocnumber">1</span> <span class="toctext">Level 1 Heading</span></a> -<ul> -<li class="toclevel-2 tocsection-2"><a href="#Level_2_Heading"><span class="tocnumber">1.1</span> <span class="toctext">Level 2 Heading</span></a> -<ul> -<li class="toclevel-3 tocsection-3"><a href="#Level_3_Heading"><span class="tocnumber">1.1.1</span> <span class="toctext">Level 3 Heading</span></a> -<ul> -<li class="toclevel-4 tocsection-4"><a href="#Level_4_Heading"><span class="tocnumber">1.1.1.1</span> <span class="toctext">Level 4 Heading</span></a> -<ul> -<li class="toclevel-5 tocsection-5"><a href="#Level_5_Heading"><span class="tocnumber">1.1.1.1.1</span> <span class="toctext">Level 5 Heading</span></a> -<ul> -<li class="toclevel-6 tocsection-6"><a href="#Level_6_Heading"><span class="tocnumber">1.1.1.1.1.1</span> <span class="toctext">Level 6 Heading</span></a></li> -<li class="toclevel-6 tocsection-7"><a href="#.3D_Level_7_Heading.3D"><span class="tocnumber">1.1.1.1.1.2</span> <span class="toctext">= Level 7 Heading=</span></a></li> -<li class="toclevel-6 tocsection-8"><a href="#.3D.3D_Level_8_Heading.3D.3D"><span class="tocnumber">1.1.1.1.1.3</span> <span class="toctext">== Level 8 Heading==</span></a></li> -<li class="toclevel-6 tocsection-9"><a href="#.3D.3D.3D_Level_9_Heading.3D.3D.3D"><span class="tocnumber">1.1.1.1.1.4</span> <span class="toctext">=== Level 9 Heading===</span></a></li> -<li class="toclevel-6 tocsection-10"><a href="#.3D.3D.3D.3D_Level_10_Heading.3D.3D.3D.3D"><span class="tocnumber">1.1.1.1.1.5</span> <span class="toctext">==== Level 10 Heading====</span></a></li> -</ul> -</li> -</ul> -</li> -</ul> -</li> -</ul> -</li> -</ul> -</li> -</ul> -</div> - -<h1><span class="mw-headline" id="Level_1_Heading">Level 1 Heading</span><span class="mw-editsection"><span class="mw-editsection-bracket">[</span><a href="/index.php?title=Parser_test&action=edit&section=1" title="Edit section: Level 1 Heading">edit</a><span class="mw-editsection-bracket">]</span></span></h1> -<h2><span class="mw-headline" id="Level_2_Heading">Level 2 Heading</span><span class="mw-editsection"><span class="mw-editsection-bracket">[</span><a href="/index.php?title=Parser_test&action=edit&section=2" title="Edit section: Level 2 Heading">edit</a><span class="mw-editsection-bracket">]</span></span></h2> -<h3><span class="mw-headline" id="Level_3_Heading">Level 3 Heading</span><span class="mw-editsection"><span class="mw-editsection-bracket">[</span><a href="/index.php?title=Parser_test&action=edit&section=3" title="Edit section: Level 3 Heading">edit</a><span class="mw-editsection-bracket">]</span></span></h3> -<h4><span class="mw-headline" id="Level_4_Heading">Level 4 Heading</span><span class="mw-editsection"><span class="mw-editsection-bracket">[</span><a href="/index.php?title=Parser_test&action=edit&section=4" title="Edit section: Level 4 Heading">edit</a><span class="mw-editsection-bracket">]</span></span></h4> -<h5><span class="mw-headline" id="Level_5_Heading">Level 5 Heading</span><span class="mw-editsection"><span class="mw-editsection-bracket">[</span><a href="/index.php?title=Parser_test&action=edit&section=5" title="Edit section: Level 5 Heading">edit</a><span class="mw-editsection-bracket">]</span></span></h5> -<h6><span class="mw-headline" id="Level_6_Heading">Level 6 Heading</span><span class="mw-editsection"><span class="mw-editsection-bracket">[</span><a href="/index.php?title=Parser_test&action=edit&section=6" title="Edit section: Level 6 Heading">edit</a><span class="mw-editsection-bracket">]</span></span></h6> -<h6><span class="mw-headline" id=".3D_Level_7_Heading.3D">= Level 7 Heading=</span><span class="mw-editsection"><span class="mw-editsection-bracket">[</span><a href="/index.php?title=Parser_test&action=edit&section=7" title="Edit section: = Level 7 Heading=">edit</a><span class="mw-editsection-bracket">]</span></span></h6> -<h6><span class="mw-headline" id=".3D.3D_Level_8_Heading.3D.3D">== Level 8 Heading==</span><span class="mw-editsection"><span class="mw-editsection-bracket">[</span><a href="/index.php?title=Parser_test&action=edit&section=8" title="Edit section: == Level 8 Heading==">edit</a><span class="mw-editsection-bracket">]</span></span></h6> -<h6><span class="mw-headline" id=".3D.3D.3D_Level_9_Heading.3D.3D.3D">=== Level 9 Heading===</span><span class="mw-editsection"><span class="mw-editsection-bracket">[</span><a href="/index.php?title=Parser_test&action=edit&section=9" title="Edit section: === Level 9 Heading===">edit</a><span class="mw-editsection-bracket">]</span></span></h6> -<h6><span class="mw-headline" id=".3D.3D.3D.3D_Level_10_Heading.3D.3D.3D.3D">==== Level 10 Heading====</span><span class="mw-editsection"><span class="mw-editsection-bracket">[</span><a href="/index.php?title=Parser_test&action=edit&section=10" title="Edit section: ==== Level 10 Heading====">edit</a><span class="mw-editsection-bracket">]</span></span></h6> - -!! end - -!! test -TOC regression (bug 9764) -!! input -== title 1 == -=== title 1.1 === -==== title 1.1.1 ==== -=== title 1.2 === -== title 2 == -=== title 2.1 === -!! result -<div id="toc" class="toc"><div id="toctitle"><h2>Contents</h2></div> -<ul> -<li class="toclevel-1 tocsection-1"><a href="#title_1"><span class="tocnumber">1</span> <span class="toctext">title 1</span></a> -<ul> -<li class="toclevel-2 tocsection-2"><a href="#title_1.1"><span class="tocnumber">1.1</span> <span class="toctext">title 1.1</span></a> -<ul> -<li class="toclevel-3 tocsection-3"><a href="#title_1.1.1"><span class="tocnumber">1.1.1</span> <span class="toctext">title 1.1.1</span></a></li> -</ul> -</li> -<li class="toclevel-2 tocsection-4"><a href="#title_1.2"><span class="tocnumber">1.2</span> <span class="toctext">title 1.2</span></a></li> -</ul> -</li> -<li class="toclevel-1 tocsection-5"><a href="#title_2"><span class="tocnumber">2</span> <span class="toctext">title 2</span></a> -<ul> -<li class="toclevel-2 tocsection-6"><a href="#title_2.1"><span class="tocnumber">2.1</span> <span class="toctext">title 2.1</span></a></li> -</ul> -</li> -</ul> -</div> - -<h2><span class="mw-headline" id="title_1">title 1</span><span class="mw-editsection"><span class="mw-editsection-bracket">[</span><a href="/index.php?title=Parser_test&action=edit&section=1" title="Edit section: title 1">edit</a><span class="mw-editsection-bracket">]</span></span></h2> -<h3><span class="mw-headline" id="title_1.1">title 1.1</span><span class="mw-editsection"><span class="mw-editsection-bracket">[</span><a href="/index.php?title=Parser_test&action=edit&section=2" title="Edit section: title 1.1">edit</a><span class="mw-editsection-bracket">]</span></span></h3> -<h4><span class="mw-headline" id="title_1.1.1">title 1.1.1</span><span class="mw-editsection"><span class="mw-editsection-bracket">[</span><a href="/index.php?title=Parser_test&action=edit&section=3" title="Edit section: title 1.1.1">edit</a><span class="mw-editsection-bracket">]</span></span></h4> -<h3><span class="mw-headline" id="title_1.2">title 1.2</span><span class="mw-editsection"><span class="mw-editsection-bracket">[</span><a href="/index.php?title=Parser_test&action=edit&section=4" title="Edit section: title 1.2">edit</a><span class="mw-editsection-bracket">]</span></span></h3> -<h2><span class="mw-headline" id="title_2">title 2</span><span class="mw-editsection"><span class="mw-editsection-bracket">[</span><a href="/index.php?title=Parser_test&action=edit&section=5" title="Edit section: title 2">edit</a><span class="mw-editsection-bracket">]</span></span></h2> -<h3><span class="mw-headline" id="title_2.1">title 2.1</span><span class="mw-editsection"><span class="mw-editsection-bracket">[</span><a href="/index.php?title=Parser_test&action=edit&section=6" title="Edit section: title 2.1">edit</a><span class="mw-editsection-bracket">]</span></span></h3> - -!! end - -!! test -TOC with wgMaxTocLevel=3 (bug 6204) -!! options -wgMaxTocLevel=3 -!! input -== title 1 == -=== title 1.1 === -==== title 1.1.1 ==== -=== title 1.2 === -== title 2 == -=== title 2.1 === -!! result -<div id="toc" class="toc"><div id="toctitle"><h2>Contents</h2></div> -<ul> -<li class="toclevel-1 tocsection-1"><a href="#title_1"><span class="tocnumber">1</span> <span class="toctext">title 1</span></a> -<ul> -<li class="toclevel-2 tocsection-2"><a href="#title_1.1"><span class="tocnumber">1.1</span> <span class="toctext">title 1.1</span></a></li> -<li class="toclevel-2 tocsection-4"><a href="#title_1.2"><span class="tocnumber">1.2</span> <span class="toctext">title 1.2</span></a></li> -</ul> -</li> -<li class="toclevel-1 tocsection-5"><a href="#title_2"><span class="tocnumber">2</span> <span class="toctext">title 2</span></a> -<ul> -<li class="toclevel-2 tocsection-6"><a href="#title_2.1"><span class="tocnumber">2.1</span> <span class="toctext">title 2.1</span></a></li> -</ul> -</li> -</ul> -</div> - -<h2><span class="mw-headline" id="title_1">title 1</span><span class="mw-editsection"><span class="mw-editsection-bracket">[</span><a href="/index.php?title=Parser_test&action=edit&section=1" title="Edit section: title 1">edit</a><span class="mw-editsection-bracket">]</span></span></h2> -<h3><span class="mw-headline" id="title_1.1">title 1.1</span><span class="mw-editsection"><span class="mw-editsection-bracket">[</span><a href="/index.php?title=Parser_test&action=edit&section=2" title="Edit section: title 1.1">edit</a><span class="mw-editsection-bracket">]</span></span></h3> -<h4><span class="mw-headline" id="title_1.1.1">title 1.1.1</span><span class="mw-editsection"><span class="mw-editsection-bracket">[</span><a href="/index.php?title=Parser_test&action=edit&section=3" title="Edit section: title 1.1.1">edit</a><span class="mw-editsection-bracket">]</span></span></h4> -<h3><span class="mw-headline" id="title_1.2">title 1.2</span><span class="mw-editsection"><span class="mw-editsection-bracket">[</span><a href="/index.php?title=Parser_test&action=edit&section=4" title="Edit section: title 1.2">edit</a><span class="mw-editsection-bracket">]</span></span></h3> -<h2><span class="mw-headline" id="title_2">title 2</span><span class="mw-editsection"><span class="mw-editsection-bracket">[</span><a href="/index.php?title=Parser_test&action=edit&section=5" title="Edit section: title 2">edit</a><span class="mw-editsection-bracket">]</span></span></h2> -<h3><span class="mw-headline" id="title_2.1">title 2.1</span><span class="mw-editsection"><span class="mw-editsection-bracket">[</span><a href="/index.php?title=Parser_test&action=edit&section=6" title="Edit section: title 2.1">edit</a><span class="mw-editsection-bracket">]</span></span></h3> - -!! end - -!! test -TOC with wgMaxTocLevel=3 and two level four headings (bug 6204) -!! options -wgMaxTocLevel=3 -!! input -==Section 1== -===Section 1.1=== -====Section 1.1.1==== -====Section 1.1.1.1==== -==Section 2== -!! result -<div id="toc" class="toc"><div id="toctitle"><h2>Contents</h2></div> -<ul> -<li class="toclevel-1 tocsection-1"><a href="#Section_1"><span class="tocnumber">1</span> <span class="toctext">Section 1</span></a> -<ul> -<li class="toclevel-2 tocsection-2"><a href="#Section_1.1"><span class="tocnumber">1.1</span> <span class="toctext">Section 1.1</span></a></li> -</ul> -</li> -<li class="toclevel-1 tocsection-5"><a href="#Section_2"><span class="tocnumber">2</span> <span class="toctext">Section 2</span></a></li> -</ul> -</div> - -<h2><span class="mw-headline" id="Section_1">Section 1</span><span class="mw-editsection"><span class="mw-editsection-bracket">[</span><a href="/index.php?title=Parser_test&action=edit&section=1" title="Edit section: Section 1">edit</a><span class="mw-editsection-bracket">]</span></span></h2> -<h3><span class="mw-headline" id="Section_1.1">Section 1.1</span><span class="mw-editsection"><span class="mw-editsection-bracket">[</span><a href="/index.php?title=Parser_test&action=edit&section=2" title="Edit section: Section 1.1">edit</a><span class="mw-editsection-bracket">]</span></span></h3> -<h4><span class="mw-headline" id="Section_1.1.1">Section 1.1.1</span><span class="mw-editsection"><span class="mw-editsection-bracket">[</span><a href="/index.php?title=Parser_test&action=edit&section=3" title="Edit section: Section 1.1.1">edit</a><span class="mw-editsection-bracket">]</span></span></h4> -<h4><span class="mw-headline" id="Section_1.1.1.1">Section 1.1.1.1</span><span class="mw-editsection"><span class="mw-editsection-bracket">[</span><a href="/index.php?title=Parser_test&action=edit&section=4" title="Edit section: Section 1.1.1.1">edit</a><span class="mw-editsection-bracket">]</span></span></h4> -<h2><span class="mw-headline" id="Section_2">Section 2</span><span class="mw-editsection"><span class="mw-editsection-bracket">[</span><a href="/index.php?title=Parser_test&action=edit&section=5" title="Edit section: Section 2">edit</a><span class="mw-editsection-bracket">]</span></span></h2> - -!! end - - -!! test -Resolving duplicate section names -!! input -== Foo bar == -== Foo bar == -!! result -<h2><span class="mw-headline" id="Foo_bar">Foo bar</span><span class="mw-editsection"><span class="mw-editsection-bracket">[</span><a href="/index.php?title=Parser_test&action=edit&section=1" title="Edit section: Foo bar">edit</a><span class="mw-editsection-bracket">]</span></span></h2> -<h2><span class="mw-headline" id="Foo_bar_2">Foo bar</span><span class="mw-editsection"><span class="mw-editsection-bracket">[</span><a href="/index.php?title=Parser_test&action=edit&section=2" title="Edit section: Foo bar">edit</a><span class="mw-editsection-bracket">]</span></span></h2> - -!! end - -!! test -Resolving duplicate section names with differing case (bug 10721) -!! input -== Foo bar == -== Foo Bar == -!! result -<h2><span class="mw-headline" id="Foo_bar">Foo bar</span><span class="mw-editsection"><span class="mw-editsection-bracket">[</span><a href="/index.php?title=Parser_test&action=edit&section=1" title="Edit section: Foo bar">edit</a><span class="mw-editsection-bracket">]</span></span></h2> -<h2><span class="mw-headline" id="Foo_Bar_2">Foo Bar</span><span class="mw-editsection"><span class="mw-editsection-bracket">[</span><a href="/index.php?title=Parser_test&action=edit&section=2" title="Edit section: Foo Bar">edit</a><span class="mw-editsection-bracket">]</span></span></h2> - -!! end - -!! article -Template:sections -!! text -===Section 1=== -==Section 2== -!! endarticle - -!! test -Template with sections, __NOTOC__ -!! input -__NOTOC__ -==Section 0== -{{sections}} -==Section 4== -!! result -<h2><span class="mw-headline" id="Section_0">Section 0</span><span class="mw-editsection"><span class="mw-editsection-bracket">[</span><a href="/index.php?title=Parser_test&action=edit&section=1" title="Edit section: Section 0">edit</a><span class="mw-editsection-bracket">]</span></span></h2> -<h3><span class="mw-headline" id="Section_1">Section 1</span><span class="mw-editsection"><span class="mw-editsection-bracket">[</span><a href="/index.php?title=Template:Sections&action=edit&section=T-1" title="Template:Sections">edit</a><span class="mw-editsection-bracket">]</span></span></h3> -<h2><span class="mw-headline" id="Section_2">Section 2</span><span class="mw-editsection"><span class="mw-editsection-bracket">[</span><a href="/index.php?title=Template:Sections&action=edit&section=T-2" title="Template:Sections">edit</a><span class="mw-editsection-bracket">]</span></span></h2> -<h2><span class="mw-headline" id="Section_4">Section 4</span><span class="mw-editsection"><span class="mw-editsection-bracket">[</span><a href="/index.php?title=Parser_test&action=edit&section=2" title="Edit section: Section 4">edit</a><span class="mw-editsection-bracket">]</span></span></h2> - -!! end - -!! test -__NOEDITSECTION__ keyword -!! input -__NOEDITSECTION__ -==Section 1== -==Section 2== -!! result -<h2><span class="mw-headline" id="Section_1">Section 1</span></h2> -<h2><span class="mw-headline" id="Section_2">Section 2</span></h2> - -!! end - -!! test -Link inside a section heading -!! input -==Section with a [[Main Page|link]] in it== -!! result -<h2><span class="mw-headline" id="Section_with_a_link_in_it">Section with a <a href="/wiki/Main_Page" title="Main Page">link</a> in it</span><span class="mw-editsection"><span class="mw-editsection-bracket">[</span><a href="/index.php?title=Parser_test&action=edit&section=1" title="Edit section: Section with a link in it">edit</a><span class="mw-editsection-bracket">]</span></span></h2> - -!! end - -!! test -TOC regression (bug 12077) -!! input -__TOC__ -== title 1 == -=== title 1.1 === -== title 2 == -!! result -<div id="toc" class="toc"><div id="toctitle"><h2>Contents</h2></div> -<ul> -<li class="toclevel-1 tocsection-1"><a href="#title_1"><span class="tocnumber">1</span> <span class="toctext">title 1</span></a> -<ul> -<li class="toclevel-2 tocsection-2"><a href="#title_1.1"><span class="tocnumber">1.1</span> <span class="toctext">title 1.1</span></a></li> -</ul> -</li> -<li class="toclevel-1 tocsection-3"><a href="#title_2"><span class="tocnumber">2</span> <span class="toctext">title 2</span></a></li> -</ul> -</div> - -<h2><span class="mw-headline" id="title_1">title 1</span><span class="mw-editsection"><span class="mw-editsection-bracket">[</span><a href="/index.php?title=Parser_test&action=edit&section=1" title="Edit section: title 1">edit</a><span class="mw-editsection-bracket">]</span></span></h2> -<h3><span class="mw-headline" id="title_1.1">title 1.1</span><span class="mw-editsection"><span class="mw-editsection-bracket">[</span><a href="/index.php?title=Parser_test&action=edit&section=2" title="Edit section: title 1.1">edit</a><span class="mw-editsection-bracket">]</span></span></h3> -<h2><span class="mw-headline" id="title_2">title 2</span><span class="mw-editsection"><span class="mw-editsection-bracket">[</span><a href="/index.php?title=Parser_test&action=edit&section=3" title="Edit section: title 2">edit</a><span class="mw-editsection-bracket">]</span></span></h2> - -!! end - -!! test -BUG 1219 URL next to image (good) -!! input -http://example.com [[Image:foobar.jpg]] -!! result -<p><a rel="nofollow" class="external free" href="http://example.com">http://example.com</a> <a href="/wiki/File:Foobar.jpg" class="image"><img alt="Foobar.jpg" src="http://example.com/images/3/3a/Foobar.jpg" width="1941" height="220" /></a> -</p> -!!end - -!! test -Short headings with trailing space should match behavior of Parser::doHeadings (bug 19910) -!! input -=== -The line above must have a trailing space! -=== <!-- ---> <!-- --> -But just in case it doesn't... -!! result -<h1><span class="mw-headline" id=".3D">=</span><span class="mw-editsection"><span class="mw-editsection-bracket">[</span><a href="/index.php?title=Parser_test&action=edit&section=1" title="Edit section: =">edit</a><span class="mw-editsection-bracket">]</span></span></h1> -<p>The line above must have a trailing space! -</p> -<h1><span class="mw-headline" id=".3D_2">=</span><span class="mw-editsection"><span class="mw-editsection-bracket">[</span><a href="/index.php?title=Parser_test&action=edit&section=2" title="Edit section: =">edit</a><span class="mw-editsection-bracket">]</span></span></h1> -<p>But just in case it doesn't... -</p> -!! end - -!! test -Header with special characters (bug 25462) -!! input -The tooltips shall not show entities to the user (ie. be double escaped) - -== text > text == -section 1 - -== text < text == -section 2 - -== text & text == -section 3 - -== text ' text == -section 4 - -== text " text == -section 5 -!! result -<p>The tooltips shall not show entities to the user (ie. be double escaped) -</p> -<div id="toc" class="toc"><div id="toctitle"><h2>Contents</h2></div> -<ul> -<li class="toclevel-1 tocsection-1"><a href="#text_.3E_text"><span class="tocnumber">1</span> <span class="toctext">text > text</span></a></li> -<li class="toclevel-1 tocsection-2"><a href="#text_.3C_text"><span class="tocnumber">2</span> <span class="toctext">text < text</span></a></li> -<li class="toclevel-1 tocsection-3"><a href="#text_.26_text"><span class="tocnumber">3</span> <span class="toctext">text & text</span></a></li> -<li class="toclevel-1 tocsection-4"><a href="#text_.27_text"><span class="tocnumber">4</span> <span class="toctext">text ' text</span></a></li> -<li class="toclevel-1 tocsection-5"><a href="#text_.22_text"><span class="tocnumber">5</span> <span class="toctext">text " text</span></a></li> -</ul> -</div> - -<h2><span class="mw-headline" id="text_.3E_text">text > text</span><span class="mw-editsection"><span class="mw-editsection-bracket">[</span><a href="/index.php?title=Parser_test&action=edit&section=1" title="Edit section: text > text">edit</a><span class="mw-editsection-bracket">]</span></span></h2> -<p>section 1 -</p> -<h2><span class="mw-headline" id="text_.3C_text">text < text</span><span class="mw-editsection"><span class="mw-editsection-bracket">[</span><a href="/index.php?title=Parser_test&action=edit&section=2" title="Edit section: text < text">edit</a><span class="mw-editsection-bracket">]</span></span></h2> -<p>section 2 -</p> -<h2><span class="mw-headline" id="text_.26_text">text & text</span><span class="mw-editsection"><span class="mw-editsection-bracket">[</span><a href="/index.php?title=Parser_test&action=edit&section=3" title="Edit section: text & text">edit</a><span class="mw-editsection-bracket">]</span></span></h2> -<p>section 3 -</p> -<h2><span class="mw-headline" id="text_.27_text">text ' text</span><span class="mw-editsection"><span class="mw-editsection-bracket">[</span><a href="/index.php?title=Parser_test&action=edit&section=4" title="Edit section: text ' text">edit</a><span class="mw-editsection-bracket">]</span></span></h2> -<p>section 4 -</p> -<h2><span class="mw-headline" id="text_.22_text">text " text</span><span class="mw-editsection"><span class="mw-editsection-bracket">[</span><a href="/index.php?title=Parser_test&action=edit&section=5" title="Edit section: text " text">edit</a><span class="mw-editsection-bracket">]</span></span></h2> -<p>section 5 -</p> -!! end - -!! test -Headers with excess '=' characters -(Are similar tests necessary beyond the 1st level?) -!! input -=foo== -==foo= -=''italic'' heading== -==''italic'' heading= -!! result -<div id="toc" class="toc"><div id="toctitle"><h2>Contents</h2></div> -<ul> -<li class="toclevel-1 tocsection-1"><a href="#foo.3D"><span class="tocnumber">1</span> <span class="toctext">foo=</span></a></li> -<li class="toclevel-1 tocsection-2"><a href="#.3Dfoo"><span class="tocnumber">2</span> <span class="toctext">=foo</span></a></li> -<li class="toclevel-1 tocsection-3"><a href="#italic_heading.3D"><span class="tocnumber">3</span> <span class="toctext"><i>italic</i> heading=</span></a></li> -<li class="toclevel-1 tocsection-4"><a href="#.3Ditalic_heading"><span class="tocnumber">4</span> <span class="toctext">=<i>italic</i> heading</span></a></li> -</ul> -</div> - -<h1><span class="mw-headline" id="foo.3D">foo=</span><span class="mw-editsection"><span class="mw-editsection-bracket">[</span><a href="/index.php?title=Parser_test&action=edit&section=1" title="Edit section: foo=">edit</a><span class="mw-editsection-bracket">]</span></span></h1> -<h1><span class="mw-headline" id=".3Dfoo">=foo</span><span class="mw-editsection"><span class="mw-editsection-bracket">[</span><a href="/index.php?title=Parser_test&action=edit&section=2" title="Edit section: =foo">edit</a><span class="mw-editsection-bracket">]</span></span></h1> -<h1><span class="mw-headline" id="italic_heading.3D"><i>italic</i> heading=</span><span class="mw-editsection"><span class="mw-editsection-bracket">[</span><a href="/index.php?title=Parser_test&action=edit&section=3" title="Edit section: italic heading=">edit</a><span class="mw-editsection-bracket">]</span></span></h1> -<h1><span class="mw-headline" id=".3Ditalic_heading">=<i>italic</i> heading</span><span class="mw-editsection"><span class="mw-editsection-bracket">[</span><a href="/index.php?title=Parser_test&action=edit&section=4" title="Edit section: =italic heading">edit</a><span class="mw-editsection-bracket">]</span></span></h1> - -!! end - -!! test -HTML headers vs TOC (bug 23393) -(__NOEDITSECTION__ for clearer output, doesn't matter here) -!! input -<h1>Header 1</h1> -== Header 1.1 == -== Header 1.2 == - -<h1>Header 2 -</h1> -== Header 2.1 == -== Header 2.2 == -__NOEDITSECTION__ -!! result -<div id="toc" class="toc"><div id="toctitle"><h2>Contents</h2></div> -<ul> -<li class="toclevel-1"><a href="#Header_1"><span class="tocnumber">1</span> <span class="toctext">Header 1</span></a> -<ul> -<li class="toclevel-2 tocsection-1"><a href="#Header_1.1"><span class="tocnumber">1.1</span> <span class="toctext">Header 1.1</span></a></li> -<li class="toclevel-2 tocsection-2"><a href="#Header_1.2"><span class="tocnumber">1.2</span> <span class="toctext">Header 1.2</span></a></li> -</ul> -</li> -<li class="toclevel-1"><a href="#Header_2"><span class="tocnumber">2</span> <span class="toctext">Header 2</span></a> -<ul> -<li class="toclevel-2 tocsection-3"><a href="#Header_2.1"><span class="tocnumber">2.1</span> <span class="toctext">Header 2.1</span></a></li> -<li class="toclevel-2 tocsection-4"><a href="#Header_2.2"><span class="tocnumber">2.2</span> <span class="toctext">Header 2.2</span></a></li> -</ul> |