From: Matthew Flaschen Date: Wed, 22 Mar 2017 06:09:48 +0000 (-0400) Subject: Allow extensions to add jQueryMsg magic words X-Git-Tag: 1.31.0-rc.0~3719^2 X-Git-Url: https://git.heureux-cyclage.org/?p=lhc%2Fweb%2Fwiklou.git;a=commitdiff_plain;h=7e65b6b3a766c1be3f7dee8fe4f11367a7820829 Allow extensions to add jQueryMsg magic words Change-Id: Ie82a147ff32ccda3f757108474f5cbab71d45ace --- diff --git a/docs/hooks.txt b/docs/hooks.txt index f307f45363..cf4e3abe83 100644 --- a/docs/hooks.txt +++ b/docs/hooks.txt @@ -2702,6 +2702,13 @@ variables from $wgResourceLoaderLESSVars are added. Can be used to add context-based variables. &$lessVars: array of variables already added +'ResourceLoaderJqueryMsgModuleMagicWords': Called in +ResourceLoaderJqueryMsgModule to allow adding magic words for jQueryMsg. +The value should be a string, and they can depend only on the +ResourceLoaderContext. +$context: ResourceLoaderContext +&$magicWords: Associative array mapping all-caps magic word to a string value + 'ResourceLoaderRegisterModules': Right before modules information is required, such as when responding to a resource loader request or generating HTML output. diff --git a/includes/resourceloader/ResourceLoaderJqueryMsgModule.php b/includes/resourceloader/ResourceLoaderJqueryMsgModule.php index a3b059b7bf..1704481224 100644 --- a/includes/resourceloader/ResourceLoaderJqueryMsgModule.php +++ b/includes/resourceloader/ResourceLoaderJqueryMsgModule.php @@ -43,9 +43,26 @@ class ResourceLoaderJqueryMsgModule extends ResourceLoaderFileModule { ) ); - $dataScript = Xml::encodeJsCall( 'mw.jqueryMsg.setParserDefaults', [ $parserDefaults ] ); + $mainDataScript = Xml::encodeJsCall( 'mw.jqueryMsg.setParserDefaults', [ $parserDefaults ] ); - return $fileScript . $dataScript; + // Associative array mapping magic words (e.g. SITENAME) + // to their values. + $magicWords = [ + 'SITENAME' => $this->getConfig()->get( 'Sitename' ), + ]; + + Hooks::run( 'ResourceLoaderJqueryMsgModuleMagicWords', [ $context, &$magicWords ] ); + + $magicWordExtendData = [ + 'magic' => $magicWords, + ]; + + $magicWordDataScript = Xml::encodeJsCall( 'mw.jqueryMsg.setParserDefaults', [ + $magicWordExtendData, + /* deep= */ true + ] ); + + return $fileScript . $mainDataScript . $magicWordDataScript; } /** diff --git a/resources/src/mediawiki/mediawiki.jqueryMsg.js b/resources/src/mediawiki/mediawiki.jqueryMsg.js index c82b9cbfb9..282a2ee739 100644 --- a/resources/src/mediawiki/mediawiki.jqueryMsg.js +++ b/resources/src/mediawiki/mediawiki.jqueryMsg.js @@ -16,8 +16,7 @@ parserDefaults = { magic: { PAGENAME: mw.config.get( 'wgPageName' ), - PAGENAMEE: mw.util.wikiUrlencode( mw.config.get( 'wgPageName' ) ), - SITENAME: mw.config.get( 'wgSiteName' ) + PAGENAMEE: mw.util.wikiUrlencode( mw.config.get( 'wgPageName' ) ) }, // Whitelist for allowed HTML elements in wikitext. // Self-closing tags are not currently supported. @@ -164,10 +163,15 @@ * parsers, pass the relevant options to mw.jqueryMsg.parser. * * @private - * @param {Object} data + * @param {Object} data New data to extend parser defaults with + * @param {boolean} [deep=false] Whether the extend is done recursively (deep) */ - mw.jqueryMsg.setParserDefaults = function ( data ) { - $.extend( parserDefaults, data ); + mw.jqueryMsg.setParserDefaults = function ( data, deep ) { + if ( deep ) { + $.extend( true, parserDefaults, data ); + } else { + $.extend( parserDefaults, data ); + } }; /** diff --git a/tests/qunit/suites/resources/mediawiki/mediawiki.jqueryMsg.test.js b/tests/qunit/suites/resources/mediawiki/mediawiki.jqueryMsg.test.js index 3b549bdc04..3c77a00805 100644 --- a/tests/qunit/suites/resources/mediawiki/mediawiki.jqueryMsg.test.js +++ b/tests/qunit/suites/resources/mediawiki/mediawiki.jqueryMsg.test.js @@ -1196,4 +1196,40 @@ ); } ); + QUnit.test( 'setParserDefaults', function ( assert ) { + mw.jqueryMsg.setParserDefaults( { + magic: { + FOO: 'foo', + BAR: 'bar' + } + } ); + + assert.deepEqual( + mw.jqueryMsg.getParserDefaults().magic, + { + FOO: 'foo', + BAR: 'bar' + }, + 'setParserDefaults is shallow by default' + ); + + mw.jqueryMsg.setParserDefaults( + { + magic: { + BAZ: 'baz' + } + }, + true + ); + + assert.deepEqual( + mw.jqueryMsg.getParserDefaults().magic, + { + FOO: 'foo', + BAR: 'bar', + BAZ: 'baz' + }, + 'setParserDefaults is deep if requested' + ); + } ); }( mediaWiki, jQuery ) );