From 30ee73172765a160eadb8ffaac333c780d0b69ab Mon Sep 17 00:00:00 2001 From: Amire80 Date: Tue, 22 May 2018 14:29:22 +0300 Subject: [PATCH] Add sortByScriptGroupAndAutonym A step to resolving downstream bug: https://phabricator.wikimedia.org/T189090 --- index.js | 58 ++++++++++++++++++++++++++++++++++++++------------- test/index.js | 9 +++++++- 2 files changed, 51 insertions(+), 16 deletions(-) diff --git a/index.js b/index.js index 1df72e8..1b8f453 100644 --- a/index.js +++ b/index.js @@ -141,22 +141,28 @@ 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 ) { - var languagesByScriptGroup = {}, - language, resolvedRedirect, langScriptGroup; - for ( language in languages ) { - resolvedRedirect = isRedirect( language ) || language; - langScriptGroup = getScriptGroupOfLanguage( resolvedRedirect ); - if ( !languagesByScriptGroup[ langScriptGroup ] ) { - languagesByScriptGroup[ langScriptGroup ] = []; - } - languagesByScriptGroup[ langScriptGroup ].push( language ); - } - return languagesByScriptGroup; -} + function getLanguagesByScriptGroup( languages ) { + var languagesByScriptGroup = {}, + 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 ] ) { + languagesByScriptGroup[ langScriptGroup ] = []; + } + 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 }; diff --git a/test/index.js b/test/index.js index f963da6..f26da94 100644 --- a/test/index.js +++ b/test/index.js @@ -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'