ilib
Version:
iLib is a cross-engine library of internationalization (i18n) classes written in pure JS
1 lines • 6.13 kB
JavaScript
var ilib=require("./ilib.js");var Utils=require("./Utils.js");var JSUtils=require("./JSUtils.js");var Locale=require("./Locale.js");var CType=require("./CType.js");var isIdeo=require("./isIdeo.js");var isAscii=require("./isAscii.js");var isDigit=require("./isDigit.js");var IString=require("./IString.js");var Address=function(i,t){var s;if(!i){return undefined}this.sync=true;this.loadParams={};if(t){if(t.locale){this.locale=typeof t.locale==="string"?new Locale(t.locale):t.locale}if(typeof t.sync!=="undefined"){this.sync=t.sync==true}if(t.loadParams){this.loadParams=t.loadParams}}this.locale=this.locale||new Locale;if(typeof i==="object"){this.streetAddress=i.streetAddress;this.locality=i.locality;this.region=i.region;this.postalCode=i.postalCode;this.postOffice=i.postOffice;this.country=i.country;if(i.countryCode){this.countryCode=i.countryCode}if(i.format){this.format=i.format}return this}s=i.replace(/[ \t\r]+/g," ").trim();s=s.replace(/[\s\n]+$/,"");s=s.replace(/^[\s\n]+/,"");this.lines=s.split(/[,,\n]/g);this.removeEmptyLines(this.lines);isAscii._init(this.sync,this.loadParams,ilib.bind(this,function(){isIdeo._init(this.sync,this.loadParams,ilib.bind(this,function(){isDigit._init(this.sync,this.loadParams,ilib.bind(this,function(){if(typeof ilib.data.nativecountries==="undefined"){Utils.loadData({object:Address,name:"nativecountries.json",locale:"-",nonlocale:true,sync:this.sync,loadParams:this.loadParams,callback:ilib.bind(this,function(i){ilib.data.nativecountries=i;this._loadCountries(t&&t.onLoad)})})}else{this._loadCountries(t&&t.onLoad)}}))}))}))};Address.prototype={_loadCountries:function(i){if(typeof ilib.data.countries==="undefined"){Utils.loadData({object:Address,name:"countries.json",locale:"-",nonlocale:true,sync:this.sync,loadParams:this.loadParams,callback:ilib.bind(this,function(t){ilib.data.countries=t;this._loadCtrynames(i)})})}else{this._loadCtrynames(i)}},_loadCtrynames:function(i){Utils.loadData({name:"ctrynames.json",object:Address,locale:this.locale,sync:this.sync,loadParams:this.loadParams,callback:ilib.bind(this,function(t){this._determineDest(t,i)})})},_findDest:function(i){var t;for(var s in i){if(s&&s!=="generated"){if(!t||t.text.length<s.length){var e=this._findCountry(s);if(e){t=e;this.country=t.text;this.countryCode=i[s]}}}}return t},_determineDest:function(i,t){var s;var e=[];if(i){e.push(i)}e.push(ilib.data.nativecountries);e.push(ilib.data.countries);for(var n=0;n<e.length;n++){s=this._findDest(e[n]);if(s){this.lines[s.line]=this.lines[s.line].substring(0,s.start)+this.lines[s.line].substring(s.start+s.text.length);this._init(t);return}}this.country=undefined;this.countryCode=this.locale.getRegion();this._init(t)},_init:function(i){Utils.loadData({object:Address,locale:new Locale(this.countryCode),name:"address.json",sync:this.sync,loadParams:this.loadParams,callback:ilib.bind(this,function(t){if(!t||JSUtils.isEmpty(t)){Utils.loadData({object:Address,locale:new Locale("XX"),name:"address.json",sync:this.sync,loadParams:this.loadParams,callback:ilib.bind(this,function(t){this.info=t;this._parseAddress();if(typeof i==="function"){i(this)}})})}else{this.info=t;this._parseAddress();if(typeof i==="function"){i(this)}}})})},_parseAddress:function(){var i,t=0,s=0,e,n,a,r,l,o,h;if(this.info&&this.info.multiformat){for(var c=0;c<this.lines.length;c++){var f=new IString(this.lines[c]);var d=f.charIterator();while(d.hasNext()){var u=d.next();if(isIdeo(u)||CType.withinRange(u,"Hangul")){t++}else if(isAscii(u)&&!isDigit(u)){s++}}}this.format=t>=s?"asian":"latin";e=this.info.startAt[this.format];n=this.info.fields[this.format]}else{e=this.info&&this.info.startAt||"end";n=this.info.fields}this.compare=e==="end"?this.endsWith:this.startsWith;for(i=0;i<n.length&&this.lines.length>0;i++){a=n[i];this.removeEmptyLines(this.lines);if(a.pattern){if(typeof a.pattern==="string"){r=new RegExp(a.pattern,"img");l=this.matchRegExp}else{r=a.pattern;l=this.matchPattern}switch(a.line){case"startAtFirst":for(h=0;h<this.lines.length;h++){o=l(this,this.lines[h],r,a.matchGroup,e);if(o){break}}break;case"startAtLast":for(h=this.lines.length-1;h>=0;h--){o=l(this,this.lines[h],r,a.matchGroup,e);if(o){break}}break;case"first":h=0;o=l(this,this.lines[h],r,a.matchGroup,e);break;case"last":default:h=this.lines.length-1;o=l(this,this.lines[h],r,a.matchGroup,e);break}if(o){this.lines[h]=o.line;this[a.name]=o.match}}else{this[a.name]=this.lines.splice(h,1)[0].trim()}}this.removeEmptyLines(this.lines);if(this.lines.length>0){var m=this.info.joinString&&this.info.joinString[this.format]||(this.format&&this.format==="asian"?"":", ");this.streetAddress=this.lines.join(m).trim()}this.lines=undefined},_findCountry:function(i){var t=-1,s,e=0;if(this.lines.length>0){t=this.startsWith(this.lines[e],i);if(t===-1){e=this.lines.length-1;t=this.endsWith(this.lines[e],i)}if(t!==-1){s={text:this.lines[e].substring(t,t+i.length),line:e,start:t}}}return s},endsWith:function(i,t){var s=i.length-t.length,e,n;for(e=0;e<t.length;e++){if(i.charAt(s+e).toLowerCase()!==t.charAt(e).toLowerCase()){return-1}}if(s>0){n=/\s/;if(!n.test(i.charAt(s-1))){return-1}}return s},startsWith:function(i,t){var s;for(s=0;s<t.length;s++){if(i.charAt(s).toLowerCase()!==t.charAt(s).toLowerCase()){return-1}}return 0},removeEmptyLines:function(i){var t=0;while(t<i.length){if(i[t]){i[t]=i[t].trim();if(i[t].length===0){i.splice(t,1)}else{t++}}else{i.splice(t,1)}}},matchRegExp:function(i,t,s,e,n){var a,r,l={},o;r=s.exec(t);if(n==="end"){while(r!==null&&r.length>0){a=r;r=s.exec(t)}r=a}if(r&&r!==null){e=e||0;if(r[e]!==undefined){l.match=r[e].trim();l.match=l.match.replace(/^\-|\-+$/,"");l.match=l.match.replace(/\s+$/,"");o=n==="end"?t.lastIndexOf(r[e]):t.indexOf(r[e]);l.line=t.slice(0,o);if(i.format!=="asian"){l.line+=" "}l.line+=t.slice(o+r[e].length);l.line=l.line.trim();return l}}return undefined},matchPattern:function(i,t,s,e){var n,a,r={};for(a=0;a<s.length;a++){n=i.compare(t,s[a]);if(n!==-1){r.match=t.substring(n,n+s[a].length);if(n!==0){r.line=t.substring(0,n).trim()}else{r.line=t.substring(s[a].length).trim()}return r}}return undefined}};module.exports=Address;