Hard deprecate Language::commafy; deprecate mediawiki.language.commafy

Language::commafy was deprecated; it is poorly named, and its functionality
is rolled into ::formatNum/::formatNumNoSeparators.

Deprecate mediawiki.language.commafy for similar reasons, and because
it parallels a deprecated core PHP method.  Perhaps it would be
worthwhile to add a new JS method in the future more closely matching
the PHP ::formatNum/::formatNumNoSeparators pair.

Code search: https://codesearch.wmcloud.org/search/?q=commafy%5C%28&i=nope&files=&repos=

Change-Id: Id3fc5dc2c7e62495a532db93d85a6f1cb8e8cbeb
This commit is contained in:
C. Scott Ananian 2020-10-21 13:40:28 -04:00 committed by C. Scott Ananian
parent af231558d6
commit 4bc5c76129
5 changed files with 67 additions and 36 deletions

View file

@ -345,6 +345,10 @@ because of Phabricator reports.
- findVariantLink
- convertTitle
- updateConversionTable
- commafy
* The mw.language.commafy client-side method has been deprecated, to match
the deprecation of Language::commafy. Use mw.language.convertNumber
instead.
* …
=== Other changes in 1.36 ===

View file

@ -3425,6 +3425,7 @@ class Language {
* @return string
*/
public function commafy( $number ) {
wfDeprecated( __METHOD__, '1.36' );
// Validate the input argument.
if ( $number === null || $number === '' ) {
return '';

View file

@ -164,6 +164,43 @@
return valueParts.join( options.decimal );
}
/**
* Apply pattern to format value as a string.
*
* Using patterns from [Unicode TR35](https://www.unicode.org/reports/tr35/#Number_Format_Patterns).
*
* @param {number} value
* @param {string} pattern Pattern string as described by Unicode TR35
* @param {number|null} [minimumGroupingDigits=null]
* @throws {Error} If unable to find a number expression in `pattern`.
* @return {string}
* @private
*/
function commafyInternal( value, pattern, minimumGroupingDigits ) {
var numberPattern,
transformTable = mw.language.getSeparatorTransformTable(),
group = transformTable[ ',' ] || ',',
numberPatternRE = /[#0,]*[#0](?:\.0*#*)?/, // not precise, but good enough
decimal = transformTable[ '.' ] || '.',
patternList = pattern.split( ';' ),
positivePattern = patternList[ 0 ];
pattern = patternList[ ( value < 0 ) ? 1 : 0 ] || ( '-' + positivePattern );
numberPattern = positivePattern.match( numberPatternRE );
minimumGroupingDigits = minimumGroupingDigits !== undefined ? minimumGroupingDigits : null;
if ( !numberPattern ) {
throw new Error( 'unable to find a number expression in pattern: ' + pattern );
}
return pattern.replace( numberPatternRE, commafyNumber( value, numberPattern[ 0 ], {
minimumGroupingDigits: minimumGroupingDigits,
decimal: decimal,
group: group
} ) );
}
/**
* Helper function to flip transformation tables.
*
@ -226,7 +263,7 @@
'digitGroupingPattern' ) || '#,##0.###';
minimumGroupingDigits = mw.language.getData( mw.config.get( 'wgUserLanguage' ),
'minimumGroupingDigits' ) || null;
numberString = mw.language.commafy( num, pattern, minimumGroupingDigits );
numberString = commafyInternal( num, pattern, minimumGroupingDigits );
}
if ( transformTable ) {
@ -268,43 +305,25 @@
getSeparatorTransformTable: function () {
return mw.language.getData( mw.config.get( 'wgUserLanguage' ),
'separatorTransformTable' ) || [];
},
/**
* Apply pattern to format value as a string.
*
* Using patterns from [Unicode TR35](https://www.unicode.org/reports/tr35/#Number_Format_Patterns).
*
* @param {number} value
* @param {string} pattern Pattern string as described by Unicode TR35
* @param {number|null} [minimumGroupingDigits=null]
* @throws {Error} If unable to find a number expression in `pattern`.
* @return {string}
*/
commafy: function ( value, pattern, minimumGroupingDigits ) {
var numberPattern,
transformTable = mw.language.getSeparatorTransformTable(),
group = transformTable[ ',' ] || ',',
numberPatternRE = /[#0,]*[#0](?:\.0*#*)?/, // not precise, but good enough
decimal = transformTable[ '.' ] || '.',
patternList = pattern.split( ';' ),
positivePattern = patternList[ 0 ];
pattern = patternList[ ( value < 0 ) ? 1 : 0 ] || ( '-' + positivePattern );
numberPattern = positivePattern.match( numberPatternRE );
minimumGroupingDigits = minimumGroupingDigits !== undefined ? minimumGroupingDigits : null;
if ( !numberPattern ) {
throw new Error( 'unable to find a number expression in pattern: ' + pattern );
}
return pattern.replace( numberPatternRE, commafyNumber( value, numberPattern[ 0 ], {
minimumGroupingDigits: minimumGroupingDigits,
decimal: decimal,
group: group
} ) );
}
} );
/**
* Apply pattern to format value as a string.
*
* Using patterns from [Unicode TR35](https://www.unicode.org/reports/tr35/#Number_Format_Patterns).
*
* @method commafy
* @deprecated This function will be made private in a future release;
* it is poorly named, corresponds to a deprecated function in core, and
* its functionality should be rolled into convertNumber().
* @param {number} value
* @param {string} pattern Pattern string as described by Unicode TR35
* @param {number|null} [minimumGroupingDigits=null]
* @throws {Error} If unable to find a number expression in `pattern`.
* @return {string}
*/
mw.log.deprecate( mw.language, 'commafy', commafyInternal, 'Use mw.language.convertNumber instead', 'mw.language.commafy' );
}() );

View file

@ -1762,6 +1762,7 @@ class LanguageIntegrationTest extends LanguageClassesTestCase {
* @dataProvider provideCommafyData
*/
public function testCommafy( $number, $numbersWithCommas ) {
$this->hideDeprecated( 'Language::commafy' );
$this->hideDeprecated( 'Language::formatNum with a non-numeric string' );
$this->assertEquals(
$numbersWithCommas,

View file

@ -64,6 +64,12 @@
assert.strictEqual( mw.language.convertNumber( 180 ), '180', 'formatting 3-digit with minimumGroupingDigits=2' );
assert.strictEqual( mw.language.convertNumber( 1800 ), '1800', 'formatting 4-digit with minimumGroupingDigits=2' );
assert.strictEqual( mw.language.convertNumber( 18000 ), '18.000', 'formatting 5-digit with minimumGroupingDigits=2' );
mw.language.setData( 'en', 'minimumGroupingDigits', 3 );
assert.strictEqual( mw.language.convertNumber( 180 ), '180', 'formatting 3-digit with minimumGroupingDigits=3' );
assert.strictEqual( mw.language.convertNumber( 1800 ), '1800', 'formatting 4-digit with minimumGroupingDigits=3' );
assert.strictEqual( mw.language.convertNumber( 18000 ), '18000', 'formatting 5-digit with minimumGroupingDigits=3' );
assert.strictEqual( mw.language.convertNumber( 180000 ), '180.000', 'formatting 6-digit with minimumGroupingDigits=3' );
} );
QUnit.test( 'mw.language.convertNumber - digitTransformTable', function ( assert ) {