ilib
Version:
iLib is a cross-engine library of internationalization (i18n) classes written in pure JS
1 lines • 4.1 kB
JavaScript
var ilib=require("./ilib.js");var Utils=require("./Utils.js");var JSUtils=require("./JSUtils.js");var IString=require("./IString.js");var GlyphString=require("./GlyphString.js");var NormString=function(r){GlyphString.call(this,r)};NormString.prototype=new GlyphString("",{noinstance:true});NormString.prototype.parent=GlyphString;NormString.prototype.constructor=NormString;NormString.init=function(r){if(!ilib._load||typeof ilib._load!=="function"&&typeof ilib._load.loadFiles!=="function"){return}var t="nfkc";var n="all";var i=true;var e=undefined;var a=undefined;if(r){t=r.form||"nfkc";n=r.script||"all";i=typeof r.sync!=="undefined"?r.sync:true;e=typeof r.onLoad==="function"?r.onLoad:undefined;if(r.loadParams){a=r.loadParams}}var o={nfd:["nfd"],nfc:["nfd"],nfkd:["nfkd","nfd"],nfkc:["nfkd","nfd"]};var f=["normdata.json"];var l=o[t];for(var c in l){f.push(l[c]+"/"+n+".json")}if(JSUtils.isEmpty(ilib.data.norm.ccc)||JSUtils.isEmpty(ilib.data.norm.nfd)||JSUtils.isEmpty(ilib.data.norm.nfkd)){Utils._callLoadData(f,i,a,function(r){ilib.extend(ilib.data.norm,r[0]);for(var t=1;t<r.length;t++){if(typeof r[t]!=="undefined"){ilib.extend(ilib.data.norm[l[t-1]],r[t])}}if(e){e(r)}})}};NormString._decomposeHangul=function(r){var t=r-44032;var n=String.fromCharCode(4352+t/588)+String.fromCharCode(4449+t%588/28);var i=t%28;if(i!==0){n+=String.fromCharCode(4519+i)}return n};NormString._expand=function(r,t,n){var i,e="",a=r.charCodeAt(0);if(GlyphString._isHangul(a)){e=NormString._decomposeHangul(a)}else{var o=t[r];if(!o&&n){o=n[r]}if(o&&o!==r){for(i=0;i<o.length;i++){e+=NormString._expand(o[i],t,n)}}else{e=r}}return e};NormString.prototype.normalize=function(r){var t;if(typeof r!=="string"||this.str.length===0){return new IString(this.str)}var n=false,i=false;switch(r){default:break;case"nfc":n=true;break;case"nfkd":i=true;break;case"nfkc":i=true;n=true;break}var e="";if(i){var a,o=IString.prototype.charIterator.call(this);while(o.hasNext()){a=o.next();e+=NormString._expand(a,ilib.data.norm.nfd,ilib.data.norm.nfkd)}}else{var a,o=IString.prototype.charIterator.call(this);while(o.hasNext()){a=o.next();e+=NormString._expand(a,ilib.data.norm.nfd)}}function f(r,t){return ilib.data.norm.ccc[r]-ilib.data.norm.ccc[t]}function l(r){return ilib.data.norm.ccc[r]||0}function c(r,t){if(ilib._getPlatform()==="qt"){var n;for(var i=r.length-1;i>0;i--){for(var e=0;e<i;e++){if(t(r[e],r[e+1])>0){n=r[e];r[e]=r[e+1];r[e+1]=n}}}return r}else{return r.sort(t)}}var d=new IString(e);var o=d.charIterator();var s=[];while(o.hasNext()){s.push(o.next())}t=0;while(t<s.length){if(typeof ilib.data.norm.ccc[s[t]]!=="undefined"&&l(s[t])!==0){var h=t+1;while(h<s.length&&typeof ilib.data.norm.ccc[s[h]]!=="undefined"&&l(s[h])!==0){h++}if(h-t>1){s=s.slice(0,t).concat(c(s.slice(t,h),f),s.slice(h))}}t++}if(n){t=0;while(t<s.length){if(typeof ilib.data.norm.ccc[s[t]]==="undefined"||ilib.data.norm.ccc[s[t]]===0){var h=t+1;var u=true;while(h<s.length&&u){if(typeof ilib.data.norm.ccc[s[h]]!=="undefined"&&ilib.data.norm.ccc[s[h]]!==0){if(l(s[h-1])<l(s[h])){var p=GlyphString._compose(s[t],s[h]);if(typeof p!=="undefined"){s[t]=p;s.splice(h,1);h=t}}h++}else{var p=GlyphString._compose(s[t],s[h]);if(l(s[h-1])===0&&typeof p!=="undefined"){s[t]=p;s.splice(h,1);h=t+1}else{u=false}}}}t++}}return new IString(s.length>0?s.join(""):"")};NormString.prototype.charIterator=function(){var r=IString.prototype.charIterator.call(this);function t(t){var n=function(r){return ilib.data.norm.ccc[r]||0};this.index=0;this.hasNext=function(){return!!this.nextChar||r.hasNext()};this.next=function(){var t=this.nextChar||r.next(),i=n(t),e,a=t;this.nextChar=undefined;if(ilib.data.norm.ccc&&(typeof ilib.data.norm.ccc[t]==="undefined"||n(t)===0)){var o=true;while(r.hasNext()&&o){this.nextChar=r.next();e=n(this.nextChar);if(typeof ilib.data.norm.ccc[this.nextChar]!=="undefined"&&e!==0){t+=this.nextChar;this.nextChar=undefined}else{var f=GlyphString._compose(a,this.nextChar);if(i===0&&typeof f!=="undefined"){a=f;t+=this.nextChar;this.nextChar=undefined}else{o=false}}i=e}}return t}}return new t(this)};module.exports=NormString;