UNPKG

ilib

Version:

iLib is a cross-engine library of internationalization (i18n) classes written in pure JS

2 lines 7.75 kB
// !data address countries nativecountries ctrynames var ilib=require("../index.js"),Utils=require("./Utils.js"),JSUtils=require("./JSUtils.js"),Locale=require("./Locale.js"),CType=require("./CType.js"),isIdeo=require("./isIdeo.js"),isAscii=require("./isAscii.js"),isDigit=require("./isDigit.js"),IString=require("./IString.js"),Address=function(freeformAddress,options){if(freeformAddress){if(this.sync=!0,this.loadParams={},options&&(options.locale&&(this.locale="string"==typeof options.locale?new Locale(options.locale):options.locale),void 0!==options.sync&&(this.sync=!!options.sync),options.loadParams)&&(this.loadParams=options.loadParams),this.locale=this.locale||new Locale(),"object"==typeof freeformAddress)return this.streetAddress=freeformAddress.streetAddress,this.locality=freeformAddress.locality,this.region=freeformAddress.region,this.postalCode=freeformAddress.postalCode,this.postOffice=freeformAddress.postOffice,this.country=freeformAddress.country,freeformAddress.countryCode&&(this.countryCode=freeformAddress.countryCode),freeformAddress.format&&(this.format=freeformAddress.format),this;freeformAddress=(freeformAddress=(freeformAddress=freeformAddress.replace(/[ \t\r]+/g," ").trim()).replace(/[\s\n]+$/,"")).replace(/^[\s\n]+/,""),this.lines=freeformAddress.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(){void 0===ilib.data.nativecountries?Utils.loadData({object:"Address",name:"nativecountries.json",locale:"-",nonlocale:!0,sync:this.sync,loadParams:this.loadParams,callback:ilib.bind(this,function(nativecountries){ilib.data.nativecountries=nativecountries,this._loadCountries(options&&options.onLoad)})}):this._loadCountries(options&&options.onLoad)}))}))}))}};Address.prototype={_loadCountries:function(onLoad){void 0===ilib.data.countries?Utils.loadData({object:"Address",name:"countries.json",locale:"-",nonlocale:!0,sync:this.sync,loadParams:this.loadParams,callback:ilib.bind(this,function(countries){ilib.data.countries=countries,this._loadCtrynames(onLoad)})}):this._loadCtrynames(onLoad)},_loadCtrynames:function(onLoad){Utils.loadData({name:"ctrynames.json",object:"Address",locale:this.locale,sync:this.sync,loadParams:JSUtils.merge(this.loadParams,{returnOne:!0}),callback:ilib.bind(this,function(ctrynames){this.ctrynames=ctrynames,this._determineDest(ctrynames,onLoad)})})},_findDest:function(ctrynames){var match,countryName,temp;for(countryName in ctrynames)countryName&&"generated"!==countryName&&(!match||match.text.length<countryName.length)&&(temp=this._findCountry(countryName))&&(this.country=(match=temp).text,this.countryCode=ctrynames[countryName]);return match},_determineDest:function(localizedCountries,callback){var match,tables=[];localizedCountries&&tables.push(localizedCountries),tables.push(ilib.data.nativecountries),tables.push(ilib.data.countries);for(var i=0;i<tables.length;i++)if(match=this._findDest(tables[i]))return this.lines[match.line]=this.lines[match.line].substring(0,match.start)+this.lines[match.line].substring(match.start+match.text.length),void this._init(callback);this.country=void 0,this.countryCode=this.locale.getRegion(),this._init(callback)},_init:function(callback){Utils.loadData({object:"Address",locale:new Locale(this.countryCode),name:"address.json",sync:this.sync,loadParams:this.loadParams,callback:ilib.bind(this,function(info){info&&!JSUtils.isEmpty(info)&&info.fields?(this.info=info,this._parseAddress(),"function"==typeof callback&&callback(this)):Utils.loadData({object:"Address",locale:new Locale("XX"),name:"address.json",sync:this.sync,loadParams:this.loadParams,callback:ilib.bind(this,function(info){this.info=info,this._parseAddress(),"function"==typeof callback&&callback(this)})})})})},_parseAddress:function(){var i,startAt,infoFields,field,pattern,matchFunction,match,fieldNumber,joinString,asianChars=0,latinChars=0;if(this.info&&this.info.multiformat){for(var j=0;j<this.lines.length;j++)for(var it=new IString(this.lines[j]).charIterator();it.hasNext();){var c=it.next();isIdeo(c)||CType.withinRange(c,"hangul")||CType.withinRange(c,"katakana")||CType.withinRange(c,"hiragana")||CType.withinRange(c,"bopomofo")?asianChars++:isAscii(c)&&!isDigit(c)&&latinChars++}this.format=latinChars<=asianChars?"asian":"latin",startAt=this.info.startAt[this.format],infoFields=this.info.fields[this.format]}else startAt=this.info&&this.info.startAt||"end",infoFields=this.info&&this.info.fields||[];for(this.compare="end"===startAt?this.endsWith:this.startsWith,i=0;i<infoFields.length&&0<this.lines.length;i++)if(field=infoFields[i],this.removeEmptyLines(this.lines),field.pattern){switch(matchFunction="string"==typeof field.pattern?(pattern=new RegExp(field.pattern,"img"),this.matchRegExp):(pattern=field.pattern,this.matchPattern),field.line){case"startAtFirst":for(fieldNumber=0;fieldNumber<this.lines.length&&!(match=matchFunction(this,this.lines[fieldNumber],pattern,field.matchGroup,startAt));fieldNumber++);break;case"startAtLast":for(fieldNumber=this.lines.length-1;0<=fieldNumber&&!(match=matchFunction(this,this.lines[fieldNumber],pattern,field.matchGroup,startAt));fieldNumber--);break;case"first":match=matchFunction(this,this.lines[fieldNumber=0],pattern,field.matchGroup,startAt);break;default:fieldNumber=this.lines.length-1,match=matchFunction(this,this.lines[fieldNumber],pattern,field.matchGroup,startAt)}match&&(this.lines[fieldNumber]=match.line,this[field.name]=match.match)}else this[field.name]=this.lines.splice(fieldNumber,1)[0].trim();this.removeEmptyLines(this.lines),0<this.lines.length&&(joinString=this.info.joinString&&this.info.joinString[this.format]||(this.format&&"asian"===this.format?"":", "),this.streetAddress=this.lines.join(joinString).trim()),this.lines=void 0},_findCountry:function(name){var match,start=-1,line=0;return match=0<this.lines.length&&(-1===(start=this.startsWith(this.lines[line],name))&&(line=this.lines.length-1,start=this.endsWith(this.lines[line],name)),-1!==start)?{text:this.lines[line].substring(start,start+name.length),line:line,start:start}:match},endsWith:function(subject,query){for(var start=subject.length-query.length,i=0;i<query.length;i++)if(subject.charAt(start+i).toLowerCase()!==query.charAt(i).toLowerCase())return-1;return 0<start&&!/\s/.test(subject.charAt(start-1))?-1:start},startsWith:function(subject,query){for(var i=0;i<query.length;i++)if(subject.charAt(i).toLowerCase()!==query.charAt(i).toLowerCase())return-1;return 0},removeEmptyLines:function(arr){for(var i=0;i<arr.length;)!arr[i]||(arr[i]=arr[i].trim(),0===arr[i].length)?arr.splice(i,1):i++},matchRegExp:function(address,line,expression,matchGroup,startAt){var lastMatch,ret={},match=expression.exec(line);if("end"===startAt){for(;null!==match&&0<match.length;)lastMatch=match,match=expression.exec(line);match=lastMatch}if(match&&null!==match&&void 0!==match[matchGroup=matchGroup||0])return ret.match=match[matchGroup].trim(),ret.match=ret.match.replace(/^\-|\-+$/,""),ret.match=ret.match.replace(/\s+$/,""),startAt="end"===startAt?line.lastIndexOf(match[matchGroup]):line.indexOf(match[matchGroup]),ret.line=line.slice(0,startAt),"asian"!==address.format&&(ret.line+=" "),ret.line+=line.slice(startAt+match[matchGroup].length),ret.line=ret.line.trim(),ret},matchPattern:function(address,line,pattern,matchGroup){for(var start,ret={},j=0;j<pattern.length;j++)if(-1!==(start=address.compare(line,pattern[j])))return ret.match=line.substring(start,start+pattern[j].length),ret.line=(0!==start?line.substring(0,start):line.substring(pattern[j].length)).trim(),ret}},module.exports=Address;