From 75e54ae99928954937e2861617c25b275c4f6f6f Mon Sep 17 00:00:00 2001 From: Sam Wilson Date: Tue, 23 Oct 2018 12:59:11 +0800 Subject: [PATCH] Ignore bang magic word in table syntax when guessing parameters Three-braces-and-a-bang can be a table starting construct in templates. This also fixes an overlooked bug in which the test wasn't checking array element key names. Bug: T157029 Change-Id: I69ed4fc9fe3bb126b7b39abea0f58ad56adf3885 --- includes/TemplateDataBlob.php | 2 +- modules/ext.templateDataGenerator.sourceHandler.js | 2 +- tests/phpunit/TemplateDataBlobTest.php | 13 +++++++++++-- 3 files changed, 13 insertions(+), 4 deletions(-) diff --git a/includes/TemplateDataBlob.php b/includes/TemplateDataBlob.php index 78e092f2..dd97868f 100644 --- a/includes/TemplateDataBlob.php +++ b/includes/TemplateDataBlob.php @@ -904,7 +904,7 @@ class TemplateDataBlob { */ public static function getRawParams( $wikitext ) { // This regex matches the one in ext.TemplateDataGenerator.sourceHandler.js - preg_match_all( '/{{3,}([^#]*?)[<|}]/m', $wikitext, $rawParams ); + preg_match_all( '/{{3,}([^#]*?)([<|]|}{3,})/m', $wikitext, $rawParams ); $params = []; $normalizedParams = []; if ( isset( $rawParams[1] ) ) { diff --git a/modules/ext.templateDataGenerator.sourceHandler.js b/modules/ext.templateDataGenerator.sourceHandler.js index f31e897b..719f551e 100644 --- a/modules/ext.templateDataGenerator.sourceHandler.js +++ b/modules/ext.templateDataGenerator.sourceHandler.js @@ -167,7 +167,7 @@ mw.TemplateData.SourceHandler.prototype.extractParametersFromTemplateCode = func paramNames = [], normalizedParamNames = [], // This regex matches the one in TemplateDataBlob.php - paramExtractor = /{{3,}([^#]*?)[<|}]/mg; + paramExtractor = /{{3,}([^#]*?)([<|]|}{3,})/mg; while ( ( matches = paramExtractor.exec( templateCode ) ) !== null ) { // This normalization process is repeated in PHP in TemplateDataBlob.php diff --git a/tests/phpunit/TemplateDataBlobTest.php b/tests/phpunit/TemplateDataBlobTest.php index f57cfc0e..745bb916 100644 --- a/tests/phpunit/TemplateDataBlobTest.php +++ b/tests/phpunit/TemplateDataBlobTest.php @@ -1214,7 +1214,8 @@ class TemplateDataBlobTest extends MediaWikiTestCase { * @dataProvider provideGetRawParams */ public function testGetRawParams( $inputWikitext, $expectedParams ) { - $this->assertArrayEquals( $expectedParams, TemplateDataBlob::getRawParams( $inputWikitext ) ); + $params = TemplateDataBlob::getRawParams( $inputWikitext ); + $this->assertArrayEquals( $expectedParams, $params, true, true ); } public function provideGetRawParams() { @@ -1246,7 +1247,15 @@ class TemplateDataBlobTest extends MediaWikiTestCase { 'More complicated dynamic param name' => [ '{{{party{{#if:{{{party_election||}}}|_election||}}|}}}', [ 'party_election' => [] ] - ] + ], + 'Bang in a param name' => [ + '{{{!}}} {{{foo!}}}', + [ '!' => [], 'foo!' => [] ] + ], + 'Bang as a magic word in a table construct' => [ + '{{{!}} class=""', + [] + ], ]; } }