Add sortByScriptGroupAndAutonym
A step to resolving downstream bug: https://phabricator.wikimedia.org/T189090
This commit is contained in:
40
index.js
40
index.js
@@ -141,13 +141,19 @@ function getScriptGroupOfLanguage( language ) {
|
||||
|
||||
/**
|
||||
* Get the given list of languages grouped by script.
|
||||
* @param {string[]} languages Array of language codes
|
||||
* @return {Object} Array of languages indexed by script codes
|
||||
* @param {string[]|Object} languages Array of language codes or associative array of autonyms indexed by language code
|
||||
* @return {Object} Associative array of languages indexed by script groups
|
||||
*/
|
||||
function getLanguagesByScriptGroup( languages ) {
|
||||
function getLanguagesByScriptGroup( languages ) {
|
||||
var languagesByScriptGroup = {},
|
||||
language, resolvedRedirect, langScriptGroup;
|
||||
for ( language in languages ) {
|
||||
languagesList, language, languageIndex, resolvedRedirect, langScriptGroup;
|
||||
|
||||
languagesList = Array.isArray( languages )
|
||||
? languages
|
||||
: Object.keys( languages );
|
||||
|
||||
for ( languageIndex = 0; languageIndex < languagesList.length; languageIndex++ ) {
|
||||
language = languagesList[ languageIndex ];
|
||||
resolvedRedirect = isRedirect( language ) || language;
|
||||
langScriptGroup = getScriptGroupOfLanguage( resolvedRedirect );
|
||||
if ( !languagesByScriptGroup[ langScriptGroup ] ) {
|
||||
@@ -156,7 +162,7 @@ function getLanguagesByScriptGroup( languages ) {
|
||||
languagesByScriptGroup[ langScriptGroup ].push( language );
|
||||
}
|
||||
return languagesByScriptGroup;
|
||||
}
|
||||
}
|
||||
|
||||
/**
|
||||
* Returns an associative array of languages in several regions,
|
||||
@@ -195,6 +201,27 @@ function getLanguagesByScriptGroupInRegion( 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.
|
||||
* Can be used as an argument to a sort function.
|
||||
@@ -269,5 +296,6 @@ module.exports = {
|
||||
isKnown,
|
||||
isRedirect,
|
||||
isRtl,
|
||||
sortByScriptGroupAndAutonym,
|
||||
sortByAutonym
|
||||
};
|
||||
|
||||
@@ -114,7 +114,7 @@ describe( 'languagedata', function () {
|
||||
], 'Languages are correctly sorted by autonym' );
|
||||
} );
|
||||
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'
|
||||
// group. Actually, this may become wrong some day.
|
||||
assert.deepEqual( orphanScripts(), [], 'All scripts belong to script groups.' );
|
||||
@@ -138,6 +138,13 @@ describe( 'languagedata', function () {
|
||||
], '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.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 () {
|
||||
// This test assumes that we don't want any scripts to be in the 'Other'
|
||||
|
||||
Reference in New Issue
Block a user