Add sortByScriptGroupAndAutonym

A step to resolving downstream bug:
https://phabricator.wikimedia.org/T189090
This commit is contained in:
Amire80
2018-05-22 14:29:22 +03:00
committed by Niklas Laxström
parent 3956e2b7f2
commit 30ee731727
2 changed files with 51 additions and 16 deletions

View File

@@ -141,22 +141,28 @@ function getScriptGroupOfLanguage( language ) {
/** /**
* Get the given list of languages grouped by script. * Get the given list of languages grouped by script.
* @param {string[]} languages Array of language codes * @param {string[]|Object} languages Array of language codes or associative array of autonyms indexed by language code
* @return {Object} Array of languages indexed by script codes * @return {Object} Associative array of languages indexed by script groups
*/ */
function getLanguagesByScriptGroup( languages ) { function getLanguagesByScriptGroup( languages ) {
var languagesByScriptGroup = {}, var languagesByScriptGroup = {},
language, resolvedRedirect, langScriptGroup; languagesList, language, languageIndex, resolvedRedirect, langScriptGroup;
for ( language in languages ) {
resolvedRedirect = isRedirect( language ) || language; languagesList = Array.isArray( languages )
langScriptGroup = getScriptGroupOfLanguage( resolvedRedirect ); ? languages
if ( !languagesByScriptGroup[ langScriptGroup ] ) { : Object.keys( languages );
languagesByScriptGroup[ langScriptGroup ] = [];
} for ( languageIndex = 0; languageIndex < languagesList.length; languageIndex++ ) {
languagesByScriptGroup[ langScriptGroup ].push( language ); language = languagesList[ languageIndex ];
} resolvedRedirect = isRedirect( language ) || language;
return languagesByScriptGroup; langScriptGroup = getScriptGroupOfLanguage( resolvedRedirect );
} if ( !languagesByScriptGroup[ langScriptGroup ] ) {
languagesByScriptGroup[ langScriptGroup ] = [];
}
languagesByScriptGroup[ langScriptGroup ].push( language );
}
return languagesByScriptGroup;
}
/** /**
* Returns an associative array of languages in several regions, * Returns an associative array of languages in several regions,
@@ -195,6 +201,27 @@ function getLanguagesByScriptGroupInRegion( region ) {
return getLanguagesByScriptGroupInRegions( [ region ] ); return getLanguagesByScriptGroupInRegions( [ region ] );
} }
/**
* Get the given list of languages grouped by script.
* @param {string[], Object} languages Array of language codes or associative array of autonyms indexed by language code
* @return {string[]} Array of language codes
*/
function sortByScriptGroupAndAutonym( languages ) {
var groupedLanguages, scriptGroups, i,
sortedByAutonym = [],
allLanguages = [];
groupedLanguages = getLanguagesByScriptGroup( languages );
scriptGroups = Object.keys( groupedLanguages ).sort();
for ( i = 0; i < scriptGroups.length; i++ ) {
sortedByAutonym = groupedLanguages[ scriptGroups[i] ].sort( sortByAutonym )
allLanguages = allLanguages.concat( sortedByAutonym );
}
return allLanguages;
}
/** /**
* A callback for sorting languages by autonym. * A callback for sorting languages by autonym.
* Can be used as an argument to a sort function. * Can be used as an argument to a sort function.
@@ -269,5 +296,6 @@ module.exports = {
isKnown, isKnown,
isRedirect, isRedirect,
isRtl, isRtl,
sortByScriptGroupAndAutonym,
sortByAutonym sortByAutonym
}; };

View File

@@ -114,7 +114,7 @@ describe( 'languagedata', function () {
], 'Languages are correctly sorted by autonym' ); ], 'Languages are correctly sorted by autonym' );
} ); } );
it( 'regions and groups', function () { it( 'regions and groups', function () {
var languagesToGroup, groupedLanguages; var languagesToGroup, groupedLanguages, languagesAM;
// This test assumes that we don't want any scripts to be in the 'Other' // This test assumes that we don't want any scripts to be in the 'Other'
// group. Actually, this may become wrong some day. // group. Actually, this may become wrong some day.
assert.deepEqual( orphanScripts(), [], 'All scripts belong to script groups.' ); assert.deepEqual( orphanScripts(), [], 'All scripts belong to script groups.' );
@@ -138,6 +138,13 @@ describe( 'languagedata', function () {
], 'Correct regions of the Laz language were selected' ); ], 'Correct regions of the Laz language were selected' );
assert.strictEqual( languageData.getRegions( 'no-such-language' ), 'UNKNOWN', 'The region of an invalid language is "UNKNOWN"' ); assert.strictEqual( languageData.getRegions( 'no-such-language' ), 'UNKNOWN', 'The region of an invalid language is "UNKNOWN"' );
assert.ok( languageData.getLanguagesInTerritory( 'RU' ).includes( 'sah' ), 'Sakha language is spoken in Russia' ); assert.ok( languageData.getLanguagesInTerritory( 'RU' ).includes( 'sah' ), 'Sakha language is spoken in Russia' );
languagesAM = [ 'atj', 'chr', 'chy', 'cr', 'en', 'es', 'fr', 'gn', 'haw', 'ike-cans', 'ik', 'kl', 'nl', 'pt', 'qu', 'srn', 'yi' ];
assert.deepEqual(
languageData.sortByScriptGroupAndAutonym( languagesAM ),
[ 'atj', 'gn', 'en', 'es', 'fr', 'haw', 'ik', 'kl', 'nl', 'pt', 'qu', 'srn', 'chy', 'yi', 'chr', 'ike-cans', 'cr' ],
'languages in region AM are ordered correctly by script group'
);
} ); } );
it( 'scripts', function () { it( 'scripts', function () {
// This test assumes that we don't want any scripts to be in the 'Other' // This test assumes that we don't want any scripts to be in the 'Other'