ilib
Version:
iLib is a cross-engine library of internationalization (i18n) classes written in pure JS
1 lines • 5.68 kB
JavaScript
var ilib=require("./ilib.js");var MathUtils=require("./MathUtils.js");var Utils=require("./Utils.js");var Locale=require("./Locale.js");var LocaleInfo=require("./LocaleInfo.js");var INumber=require("./INumber.js");var isPunct=require("./isPunct.js");var isDigit=require("./isDigit.js");var NormString=require("./NormString.js");var CodePointSource=require("./CodePointSource.js");var ElementIterator=require("./ElementIterator.js");var GlyphString=require("./GlyphString.js");var Collator=function(e){var t=true,i=undefined,a=true;this.locale=new Locale(ilib.getLocale());this.caseFirst="upper";this.sensitivity="variant";this.level=4;this.usage="sort";this.reverse=false;this.numeric=false;this.style="default";this.ignorePunctuation=false;if(e){if(e.locale){this.locale=typeof e.locale==="string"?new Locale(e.locale):e.locale}if(e.sensitivity){switch(e.sensitivity){case"primary":case"base":this.sensitivity="base";this.level=1;break;case"secondary":case"accent":this.sensitivity="accent";this.level=2;break;case"tertiary":case"case":this.sensitivity="case";this.level=3;break;case"quaternary":case"variant":this.sensitivity="variant";this.level=4;break}}if(typeof e.upperFirst!=="undefined"){this.caseFirst=e.upperFirst?"upper":"lower"}if(typeof e.ignorePunctuation!=="undefined"){this.ignorePunctuation=e.ignorePunctuation}if(typeof e.sync!=="undefined"){t=e.sync==true}i=e.loadParams;if(typeof e.useNative!=="undefined"){a=e.useNative}if(e.usage==="sort"||e.usage==="search"){this.usage=e.usage}if(typeof e.reverse==="boolean"){this.reverse=e.reverse}if(typeof e.numeric==="boolean"){this.numeric=e.numeric}if(typeof e.style==="string"){this.style=e.style}}if(this.usage==="sort"){this.level=4}if(a&&typeof Intl!=="undefined"&&Intl){this.collator=new Intl.Collator(this.locale.getSpec(),this);if(e&&typeof e.onLoad==="function"){e.onLoad(this)}}else{if(!Collator.cache){Collator.cache={}}Utils.loadData({object:Collator,locale:this.locale,name:"collation.json",sync:t,loadParams:i,callback:ilib.bind(this,function(a){if(!a){a=ilib.data.collation;var r=this.locale.getSpec().replace(/-/g,"_");Collator.cache[r]=a}this._init(a);new LocaleInfo(this.locale,{sync:t,loadParams:i,onLoad:ilib.bind(this,function(a){this.li=a;if(this.ignorePunctuation){isPunct._init(t,i,ilib.bind(this,function(){if(e&&typeof e.onLoad==="function"){e.onLoad(this)}}))}else{if(e&&typeof e.onLoad==="function"){e.onLoad(this)}}})})})})}};Collator.prototype={_pack:function(e,t){var i=0;if(e){if(typeof e==="number"){e=[e]}for(var a=0;a<this.level;a++){var r=typeof e[a]!=="undefined"?e[a]:0;if(a===0){r+=t}if(a>0){i<<=this.collation.bits[a]}if(a===2&&this.caseFirst==="lower"){i=i|1-r}else{i=i|r}}}return i},_packRule:function(e,t){if(ilib.isArray(e[0])){var i=[];for(var a=0;a<e.length;a++){i.push(this._pack(e[a],t))}return i}else{return[this._pack(e,t)]}},_addChars:function(e,t){var i=new GlyphString(e);var a=i.charIterator();var r;while(a.hasNext()){r=a.next();if(r==="'"){r="";var s="";while(a.hasNext()&&s!=="'"){r+=s;s=a.next()}}this.lastMap++;this.map[r]=this._packRule([this.lastMap],t)}},_addRules:function(e,t){var i;for(var a in e.map){if(a){this.map[a]=this._packRule(e.map[a],t);i=typeof e.map[a][0]==="number"?e.map[a][0]:e.map[a][0][0];this.lastMap=Math.max(i+t,this.lastMap)}}if(typeof e.ranges!=="undefined"){for(var r=0;r<e.ranges.length;r++){var s=e.ranges[r];this.lastMap=s.start;if(typeof s.chars==="string"){this._addChars(s.chars,t)}else{for(var n=0;n<s.chars.length;n++){this._addChars(s.chars[n],t)}}}}},_init:function(e){var t=this.style;while(typeof t==="string"){t=e[t]}if(!t){t="default";while(typeof t==="string"){t=e[t]}}if(!t){this.map={};return}this.collation=t;this.map={};this.lastMap=-1;this.keysize=this.collation.keysize[this.level-1];if(typeof this.collation.inherit!=="undefined"){for(var i=0;i<this.collation.inherit.length;i++){var a=this.collation.inherit[i];t=typeof a==="object"?a.name:a;if(e[t]){this._addRules(e[t],a.start||this.lastMap+1)}}}this._addRules(this.collation,this.lastMap+1)},_basicCompare:function(e,t){var i=e instanceof NormString?e:new NormString(e),a=t instanceof NormString?t:new NormString(t),r,s,n,o;if(this.numeric){var l=new INumber(e,{locale:this.locale});var h=new INumber(t,{locale:this.locale});if(!isNaN(l.valueOf())&&!isNaN(h.valueOf())){var c=l.valueOf()-h.valueOf();if(c){return c}else{i=new NormString(e.substring(l.parsed.length));a=new NormString(t.substring(h.parsed.length))}}}n=new ElementIterator(new CodePointSource(i,this.ignorePunctuation),this.map,this.keysize);o=new ElementIterator(new CodePointSource(a,this.ignorePunctuation),this.map,this.keysize);while(n.hasNext()&&o.hasNext()){var c=n.next()-o.next();if(c){return c}}if(!n.hasNext()&&!o.hasNext()){return 0}else if(n.hasNext()){return 1}else{return-1}},compare:function(e,t){if(this.collator){return this.collator.compare(e,t)}var i=this._basicCompare(e,t);return this.reverse?-i:i},getComparator:function(){if(this.collator){return this.collator.compare}return ilib.bind(this,this.compare)},sortKey:function(e){if(!e){return""}if(this.collator){return e}function t(e,t){return"0000000000000000".substring(0,t-e.length)+e}if(this.numeric){var i=new INumber(e,{locale:this.locale});var a=isNaN(i.valueOf())?"":i.valueOf().toString(16);return t(a,16)}else{var r=typeof e==="string"?new NormString(e):e,s="",n=new ElementIterator(new CodePointSource(r,this.ignorePunctuation),this.map,this.keysize),o;while(n.hasNext()){o=n.next();if(this.reverse){o=(1<<this.keysize)-o}s+=t(o.toString(16),this.keysize/4)}}return s}};Collator.getAvailableStyles=function(e){return["standard"]};Collator.getAvailableScripts=function(){return["Latn"]};module.exports=Collator;