From 261aac63ec0777d60fd4761cab5aab93326ce9b6 Mon Sep 17 00:00:00 2001 From: Santhosh Thottingal Date: Thu, 10 Jan 2013 23:03:51 +0530 Subject: [PATCH] (bug 40354) Add support for formatnum in jqueryMsg parser Support for {{formatnum:$1}} and {{formatnum:$1|R}} syntax in jqueryMsg parser. Takes an unformatted number (arab, no group separators and '.' as decimal separator) and outputs it in the localized digit script and formatted with decimal separator, according to the current language. Unlike the result from php for this syntax, this does not do number grouping(commafy). See http://www.mediawiki.org/wiki/Help:Magic_words#Formatting. Includes testcases for a few languages Change-Id: I912fc719bd25e8b103f87facd05dcb409df7441c --- .../mediawiki.language/mediawiki.language.js | 11 ++- resources/mediawiki/mediawiki.jqueryMsg.js | 14 ++++ .../mediawiki/mediawiki.jqueryMsg.test.js | 79 ++++++++++++++++++- 3 files changed, 99 insertions(+), 5 deletions(-) diff --git a/resources/mediawiki.language/mediawiki.language.js b/resources/mediawiki.language/mediawiki.language.js index 514dbd5ef8..f8af0a00f0 100644 --- a/resources/mediawiki.language/mediawiki.language.js +++ b/resources/mediawiki.language/mediawiki.language.js @@ -77,17 +77,20 @@ var language = { /** * Converts a number using digitTransformTable. * - * @param {num} number Value to be converted + * @param {Number} number Value to be converted * @param {boolean} integer Convert the return value to an integer + * @return {Number|String} formatted number */ convertNumber: function ( num, integer ) { var i, tmp, transformTable, numberString, convertedNumber; - if ( !mw.language.digitTransformTable ) { + // Set the target Transform table: + transformTable = mw.language.getData( mw.config.get( 'wgUserLanguage' ), 'digitTransformTable' ); + + if ( !transformTable ) { return num; } - // Set the target Transform table: - transformTable = mw.language.digitTransformTable; + // Check if the "restore" to Latin number flag is set: if ( integer ) { if ( parseInt( num, 10 ) === num ) { diff --git a/resources/mediawiki/mediawiki.jqueryMsg.js b/resources/mediawiki/mediawiki.jqueryMsg.js index 8ab4a7e531..934e9063dd 100644 --- a/resources/mediawiki/mediawiki.jqueryMsg.js +++ b/resources/mediawiki/mediawiki.jqueryMsg.js @@ -766,6 +766,20 @@ */ int: function ( nodes ) { return mw.jqueryMsg.getMessageFunction()( nodes[0].toLowerCase() ); + }, + + /** + * Takes an unformatted number (arab, no group separators and . as decimal separator) + * and outputs it in the localized digit script and formatted with decimal + * separator, according to the current language + * @param {Array} of nodes + * @return {Number|String} formatted number + */ + formatnum: function ( nodes ) { + var isInteger = ( nodes[1] && nodes[1] === 'R' ) ? true : false, + number = nodes[0]; + + return this.language.convertNumber( number, isInteger ); } }; // Deprecated! don't rely on gM existing. diff --git a/tests/qunit/suites/resources/mediawiki/mediawiki.jqueryMsg.test.js b/tests/qunit/suites/resources/mediawiki/mediawiki.jqueryMsg.test.js index b90644ea1f..d7c73e5f4f 100644 --- a/tests/qunit/suites/resources/mediawiki/mediawiki.jqueryMsg.test.js +++ b/tests/qunit/suites/resources/mediawiki/mediawiki.jqueryMsg.test.js @@ -1,6 +1,6 @@ ( function ( mw, $ ) { -var mwLanguageCache = {}, oldGetOuterHtml; +var mwLanguageCache = {}, oldGetOuterHtml, formatnumTests; QUnit.module( 'mediawiki.jqueryMsg', QUnit.newMwEnvironment( { setup: function () { @@ -381,4 +381,81 @@ QUnit.test( 'mw.msg()', 8, function ( assert ) { mw.jqueryMsg.getMessageFunction = oldGMF; } ); +formatnumTests = [ + { + lang: 'en', + number: 987654321.654321, + result: '987654321.654321', + description: 'formatnum test for English, decimal seperator' + }, + { + lang: 'ar', + number: 987654321.654321, + result: '٩٨٧٦٥٤٣٢١٫٦٥٤٣٢١', + description: 'formatnum test for Arabic, with decimal seperator' + }, + { + lang: 'ar', + number: '٩٨٧٦٥٤٣٢١٫٦٥٤٣٢١', + result: 987654321, + integer: true, + description: 'formatnum test for Arabic, with decimal seperator, reverse' + }, + { + lang: 'ar', + number: -12.89, + result: '-١٢٫٨٩', + description: 'formatnum test for Arabic, negative number' + }, + { + lang: 'ar', + number: '-١٢٫٨٩', + result: -12, + integer: true, + description: 'formatnum test for Arabic, negative number, reverse' + }, + { + lang: 'nl', + number: 987654321.654321, + result: '987654321,654321', + description: 'formatnum test for Nederlands, decimal seperator' + }, + { + lang: 'nl', + number: -12.89, + result: '-12,89', + description: 'formatnum test for Nederlands, negative number' + }, + { + lang: 'nl', + number: 'invalidnumber', + result: 'invalidnumber', + description: 'formatnum test for Nederlands, invalid number' + } +]; + +QUnit.test( 'formatnum', formatnumTests.length, function ( assert ) { + mw.messages.set( 'formatnum-msg', '{{formatnum:$1}}' ); + mw.messages.set( 'formatnum-msg-int', '{{formatnum:$1|R}}' ); + $.each( formatnumTests, function ( i, test ) { + QUnit.stop(); + getMwLanguage( test.lang, function ( langClass ) { + QUnit.start(); + if ( !langClass ) { + assert.ok( false, 'Language "' + test.lang + '" failed to load' ); + return; + } + mw.messages.set(test.message ); + mw.config.set( 'wgUserLanguage', test.lang ) ; + var parser = new mw.jqueryMsg.parser( { language: langClass } ); + assert.equal( + parser.parse( test.integer ? 'formatnum-msg-int' : 'formatnum-msg', + [ test.number ] ).html(), + test.result, + test.description + ); + } ); + } ); +}); + }( mediaWiki, jQuery ) ); -- 2.20.1