UNPKG

ilib

Version:

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

2 lines 4.53 kB
// !data phonefmt var ilib=require("../index.js"),Utils=require("./Utils.js"),JSUtils=require("./JSUtils.js"),Locale=require("./Locale.js"),PhoneNumber=require("./PhoneNumber.js"),PhoneLocale=require("./PhoneLocale.js"),PhoneFmt=function(options){this.sync=!0,this.styleName="default",this.loadParams={};var locale=new Locale();options&&(options.locale&&(locale=options.locale),void 0!==options.sync&&(this.sync=!!options.sync),options.loadParams&&(this.loadParams=options.loadParams),options.style)&&(this.style=options.style),new PhoneLocale({locale:locale,mcc:options&&options.mcc,countryCode:options&&options.countryCode,onLoad:ilib.bind(this,function(data){this.locale=data,Utils.loadData({name:"phonefmt.json",object:"PhoneFmt",locale:this.locale,sync:this.sync,loadParams:JSUtils.merge(this.loadParams,{returnOne:!0}),callback:ilib.bind(this,function(fmtdata){this.fmtdata=fmtdata,options&&"function"==typeof options.onLoad&&options.onLoad(this)})})})})};PhoneFmt.prototype={_substituteDigits:function(part,formats,mustUseAll){var formatString,templates,i,formatted="",partIndex=0;if(part){if("object"==typeof formats){if(templates=void 0!==formats.template?formats.template:formats,part.length>templates.length)throw"part "+part+" is too big. We do not have a format template to format it.";formatString=templates[part.length-1]}else formatString=formats;for(i=0;i<formatString.length;i++)"X"===formatString.charAt(i)?(formatted+=part.charAt(partIndex),partIndex++):formatted+=formatString.charAt(i);if(mustUseAll&&partIndex<part.length-1)throw"too many digits in "+part+" for format "+formatString}return formatted},_getStyle:function(name,fmtdata){return fmtdata[name]||fmtdata.default},_doFormat:function(number,options,startField,locale,fmtdata,callback){var fieldName,templates,isWhole,style,lastFieldName,sync=!0,loadParams={},formatted="";options&&(void 0!==options.sync&&(sync=!!options.sync),options.loadParams)&&(loadParams=options.loadParams),style=this.style,number.countryCode?style=number.mobilePrefix?"internationalmobile":"international":void 0!==number.mobilePrefix?style="mobile":void 0!==number.serviceCode&&void 0!==fmtdata.service&&(style="service"),isWhole=!options||!options.partial,styleTemplates=this._getStyle(style,fmtdata);for(var styleTemplates=(isWhole?styleTemplates.whole:styleTemplates.partial)||styleTemplates,i=startField;i<PhoneNumber._fieldOrder.length;i++)if(fieldName=PhoneNumber._fieldOrder[i],void 0!==number[fieldName])if(void 0!==styleTemplates[fieldName]){if(templates=styleTemplates[fieldName],"trunkAccess"===fieldName&&void 0===number.areaCode&&void 0===number.serviceCode&&void 0===number.mobilePrefix&&(templates="X"),lastFieldName&&void 0!==styleTemplates[lastFieldName].suffix&&"extension"!==fieldName&&number[fieldName].search(/[xwtp,;]/i)<=-1&&(formatted+=styleTemplates[lastFieldName].suffix),templates=this._substituteDigits(number[lastFieldName=fieldName],templates,"subscriberNumber"===fieldName),formatted+=templates,"countryCode"===fieldName)return templates=number.countryCode.replace(/[wWpPtT\+#\*]/g,""),new PhoneLocale({locale:this.locale,sync:sync,loadParms:loadParams,countryCode:templates,onLoad:ilib.bind(this,function(locale){Utils.loadData({name:"phonefmt.json",object:"PhoneFmt",locale:locale,sync:sync,loadParams:JSUtils.merge(loadParams,{returnOne:!0}),callback:ilib.bind(this,function(fmtdata){var subfmt="";this._doFormat(number,options,i+1,locale,fmtdata,function(subformat){subfmt=subformat,"function"==typeof callback&&callback(formatted+subformat)}),formatted+=subfmt})})})}),formatted}else formatted+=number[fieldName];return"function"==typeof callback&&callback(formatted),formatted},format:function(number,options){var formatted="",callback=options&&options.onLoad;try{this._doFormat(number,options,0,this.locale,this.fmtdata,function(fmt){formatted=fmt,"function"==typeof callback&&callback(fmt)})}catch(e){if("string"!=typeof e)throw e;for(var field in formatted="",PhoneNumber._fieldOrder)"string"==typeof field&&"string"==typeof PhoneNumber._fieldOrder[field]&&void 0!==number[PhoneNumber._fieldOrder[field]]&&(formatted+=number[PhoneNumber._fieldOrder[field]],"countryCode"===PhoneNumber._fieldOrder[field])&&(formatted+=" ");"function"==typeof callback&&callback(formatted)}return formatted},getAvailableStyles:function(){var style,ret=[];if(this.fmtdata)for(style in this.fmtdata)this.fmtdata[style].example&&ret.push(style);return ret},getStyleExample:function(style){return this.fmtdata[style].example||void 0}},module.exports=PhoneFmt;