Sorting languages by script.

* Clarified naming: separated regions from region groups.
* New utility functions for sorting and grouping languages.
* JSHint fixes.
* Added tests.

Change-Id: I8153a2b89fbc7b9a7d6b7deeb87208efc9f4d021
This commit is contained in:
Amir E. Aharoni
2012-07-02 08:49:57 +03:00
parent 47b1a7f16f
commit 607abaa201
5 changed files with 199 additions and 63 deletions

View File

@@ -1,11 +1,11 @@
/*
/**
* @author Amir E. Aharoni
* Utilities for querying language data.
* Utility functions for querying language data.
*/
(function ( $ ) {
"use strict";
/*
/**
* Returns the script of the language.
* @param string language code
* @return string
@@ -14,7 +14,7 @@
return $.uls.data.languages[language][0];
};
/*
/**
* Returns the regions in which a language is spoken.
* @param string language code
* @return array of strings
@@ -23,7 +23,7 @@
return $.uls.data.languages[language][1];
};
/*
/**
* Returns the autonym of the language.
* @param string language code
* @return string
@@ -32,7 +32,7 @@
return $.uls.data.autonyms[language];
};
/*
/**
* Returns all languages written in script.
* @param script string
* @return array of strings (languages codes)
@@ -41,7 +41,7 @@
return $.uls.data.languagesInScripts( [ script ] );
};
/*
/**
* Returns all languages written in the given scripts.
* @param scripts array of strings
* @return array of strings (languages codes)
@@ -61,7 +61,7 @@
return languagesInScripts;
};
/*
/**
* Returns all languages in a given region.
* @param region string
* @return array of strings (languages codes)
@@ -70,7 +70,7 @@
return $.uls.data.languagesInRegions( [ region ] );
};
/*
/**
* Returns all languages in given regions.
* @param region array of strings.
* @return array of strings (languages codes)
@@ -90,7 +90,16 @@
return languagesInRegions;
};
/*
/**
* Returns all languages in a region group.
* @param groupNum number.
* @return array of strings (languages codes)
*/
$.uls.data.languagesInRegionGroup = function( groupNum ) {
return $.uls.data.languagesInRegions( $.uls.data.regionsInGroup( groupNum ) );
};
/**
* Returns an associative array of languages in a region,
* grouped by script.
* @param string region code
@@ -112,7 +121,84 @@
return languagesByScriptInRegion;
};
/*
/**
* Returns an associative array of languages in a region,
* grouped by script group.
* @param string region code
* @return associative array
*/
$.uls.data.languagesByScriptGroupInRegion = function( region ) {
return $.uls.data.languagesByScriptGroupInRegions( [ region ] );
};
/**
* Returns an associative array of languages in several regions,
* grouped by script group.
* @param array of strings - region codes
* @return associative array
*/
$.uls.data.languagesByScriptGroupInRegions = function( regions ) {
var languagesByScriptGroupInRegions = {};
for ( var language in $.uls.data.languages ) {
for ( var i = 0; i < regions.length; i++ ) {
if ( $.inArray( regions[i], $.uls.data.regions( language ) ) !== -1 ) {
var scriptGroup = $.uls.data.scriptGroupOfLanguage( language );
if ( languagesByScriptGroupInRegions[scriptGroup] === undefined ) {
languagesByScriptGroupInRegions[scriptGroup] = [];
}
languagesByScriptGroupInRegions[scriptGroup].push( language );
break;
}
}
}
return languagesByScriptGroupInRegions;
};
/**
* Returns an array of languages grouped by region group,
* region, script group and script.
* @return associative array
*/
$.uls.data.allLanguagesByRegionAndScript = function() {
var allLanguagesByRegionAndScript = {},
region,
regionGroup;
for ( region in $.uls.data.regiongroups ) {
regionGroup = $.uls.data.regiongroups[region];
if ( allLanguagesByRegionAndScript[regionGroup] === undefined ) {
allLanguagesByRegionAndScript[regionGroup] = {};
}
allLanguagesByRegionAndScript[regionGroup][region] = {};
}
for ( var language in $.uls.data.languages ) {
var script = $.uls.data.script( language );
var scriptGroup = $.uls.data.groupOfScript( script );
var regions = $.uls.data.regions( language );
for ( var regionNum = 0; regionNum < regions.length; regionNum++ ) {
region = regions[regionNum];
regionGroup = $.uls.data.regiongroups[region];
if ( allLanguagesByRegionAndScript[regionGroup][region][scriptGroup] === undefined ) {
allLanguagesByRegionAndScript[regionGroup][region][scriptGroup] = {};
}
if ( allLanguagesByRegionAndScript[regionGroup][region][scriptGroup][script] === undefined ) {
allLanguagesByRegionAndScript[regionGroup][region][scriptGroup][script] = [];
}
allLanguagesByRegionAndScript[regionGroup][region][scriptGroup][script].push( language );
}
}
return allLanguagesByRegionAndScript;
};
/**
* Returns all regions in a region group.
* @param number groupNum
* @return array of strings
@@ -129,7 +215,7 @@
return regionsInGroup;
};
/*
/**
* Returns the script group of a script or 'Other' if it doesn't
* belong to any group.
* @param string script code
@@ -145,9 +231,13 @@
return 'Other';
};
$.uls.data.sortByScriptGroup = function( languages ) {
// FIXME sort it.
return languages;
/**
* Returns the script group of a language.
* @param string language code
* @return string script group name
*/
$.uls.data.scriptGroupOfLanguage = function( language ) {
return $.uls.data.groupOfScript( $.uls.data.script( language ) );
};
} )( jQuery );