UNPKG

ilib

Version:

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

2 lines 16.2 kB
// !data name var ilib=require("../index.js"),Utils=require("./Utils.js"),JSUtils=require("./JSUtils.js"),Locale=require("./Locale.js"),IString=require("./IString.js"),CType=require("./CType.js"),isAlpha=require("./isAlpha.js"),isIdeo=require("./isIdeo.js"),isPunct=require("./isPunct.js"),isSpace=require("./isSpace.js"),Name=function(name,options){var sync=!0;name&&0!==name.length?(this.loadParams={},options&&(options.locale&&(this.locale="string"==typeof options.locale?new Locale(options.locale):options.locale),!options.style||"asian"!==options.style&&"western"!==options.style||(this.style=options.style),!options.order||"gmf"!==options.order&&"fmg"!==options.order&&"fgm"!==options.order||(this.order=options.order),"boolean"==typeof options.sync&&(sync=options.sync),void 0!==options.loadParams&&(this.loadParams=options.loadParams),void 0!==options.compoundFamilyName)&&(this.singleFamilyName=!options.compoundFamilyName),this.locale=this.locale||new Locale(),isAlpha._init(sync,this.loadParams,ilib.bind(this,function(){isIdeo._init(sync,this.loadParams,ilib.bind(this,function(){isPunct._init(sync,this.loadParams,ilib.bind(this,function(){isSpace._init(sync,this.loadParams,ilib.bind(this,function(){Utils.loadData({object:"Name",locale:this.locale,name:"name.json",sync:sync,loadParams:this.loadParams,callback:ilib.bind(this,function(info){info=info||Name.defaultInfo[this.style||"western"],"object"==typeof name?(this.prefix=name.prefix,this.givenName=name.givenName,this.middleName=name.middleName,this.familyName=name.familyName,this.suffix=name.suffix,this.honorific=name.honorific,this.locale=name.locale,this.style=name.style,this.order=name.order,this.useSpaces=name.useSpaces,this.isAsianName=name.isAsianName):(this.info=info,this._init(name)),options&&"function"==typeof options.onLoad&&options.onLoad(this)})})}))}))}))}))):options&&"function"==typeof options.onLoad&&options.onLoad(void 0)};Name.defaultInfo={western:ilib.data.name||{components:{short:"gf",medium:"gmf",long:"pgmf",full:"pgmfs",formal_short:"hf",formal_long:"hgf"},format:"{prefix} {givenName} {middleName} {familyName}{suffix}",sortByHeadWord:!1,nameStyle:"western",conjunctions:{and1:"and",and2:"and",or1:"or",or2:"or"},auxillaries:{von:1,"von der":1,"von den":1,van:1,"van der":1,"van de":1,"van den":1,de:1,di:1,la:1,lo:1,des:1,le:1,les:1,du:1,"de la":1,del:1,"de los":1,"de las":1},prefixes:["doctor","dr","mr","mrs","ms","mister","madame","madamoiselle","miss","monsieur","señor","señora","señorita"],suffixes:[",","junior","jr","senior","sr","i","ii","iii","esq","phd","md"],patronymicName:[],familyNames:[]},asian:{components:{short:"gf",medium:"gmf",long:"hgmf",full:"hgmf",formal_short:"hf",formal_long:"hgf"},format:"{prefix}{familyName}{middleName}{givenName}{suffix}",nameStyle:"asian",sortByHeadWord:!1,conjunctions:{},auxillaries:{},prefixes:[],suffixes:[],patronymicName:[],familyNames:[]}},Name._isAsianChar=function(c){return isIdeo(c)||CType.withinRange(c,"hangul")||CType.withinRange(c,"hiragana")||CType.withinRange(c,"katakana")},Name._isAsianName=function(name,language){var i,asian=0,latin=0;if(name&&0<name.length){for(i=0;i<name.length;i++){var c=name.charAt(i);if(Name._isAsianChar(c)){if("ko"===language||"ja"===language||"zh"===language)return!0;asian++}else if(isAlpha(c)){if("ko"!==language||"ja"!==language||"zh"!==language)return!1;latin++}}return latin<asian}return!1},Name._isEuroName=function(name,language){for(var c,it=new IString(name).charIterator();it.hasNext();){if(c=it.next(),!(Name._isAsianChar(c)||isPunct(c)||isSpace(c)))return!0;if(Name._isAsianChar(c)&&("ko"===language||"ja"===language||"zh"===language))return!1}return!1},Name.prototype={_init:function(name){var parts,prefix,prefixLower,suffix,suffixLower,hpSuffix,suffixArray,i,currentLanguage=this.locale.getLanguage();if(name){if(-1!==(i=name.search(/\s*[,\/\(\[\{<]/))&&(suffixArray=(hpSuffix=(hpSuffix=name.substring(i)).replace(/\s+/g," ")).split(" "),-1<this._findLastConjunction(suffixArray)?hpSuffix=void 0:name=name.substring(0,i)),this.isAsianName=Name._isAsianName(name,currentLanguage),"asian"===this.info.nameStyle?this.isAsianName?this.info:Name.defaultInfo.western:this.isAsianName?Name.defaultInfo.asian:this.info,1<(parts=this.isAsianName?(name=!1===this.useSpaces?name.replace(/\s+/g,""):name).trim().split(""):(name=(name=name.replace(/, /g," , ")).replace(/\s+/g," ")).trim().split(" ")).length)for(i=parts.length;0<i;i--)prefixLower=(prefixLower=(prefix=parts.slice(0,i).join(this.isAsianName?"":" ")).toLowerCase()).replace(/[,\.]/g,""),ilib.isArray(this.info.prefixes)&&(-1<JSUtils.indexOf(this.info.prefixes,prefixLower)||this._isConjunction(prefixLower))&&(this.prefix?(this.isAsianName||(this.prefix+=" "),this.prefix+=prefix):this.prefix=prefix,i=(parts=parts.slice(i)).length);if(1<parts.length)for(i=parts.length;0<i;i--)suffixLower=(suffixLower=(suffix=(suffixArray=parts.slice(-i)).join(this.isAsianName?"":" ")).toLowerCase()).replace(/[\.]/g,""),ilib.isArray(this.info.suffixes)&&-1<JSUtils.indexOf(this.info.suffixes,suffixLower)&&(this.suffix?(this.isAsianName||isPunct(this.suffix.charAt(0))||(this.suffix=" "+this.suffix),this.suffix=suffix+this.suffix):this.suffix=suffix,i=(parts=parts.slice(0,parts.length-i)).length);hpSuffix&&(this.suffix=this.suffix&&this.suffix+hpSuffix||hpSuffix),1<parts.length&&!this.isAsianName&&(parts=this._joinAuxillaries(parts,this.isAsianName)),this.isAsianName?this._parseAsianName(parts,currentLanguage):this._parseWesternName(parts),this._joinNameArrays()}},_findPrefix:function(parts,names,isAsian,noCompoundPrefix){var i,prefix,prefixArray,aux=[];if(0<parts.length&&names)for(i=parts.length;0<i;i--)if((prefix=(prefixArray=parts.slice(0,i)).join(isAsian?"":" ")).toLowerCase().replace(/[,\.]/g,"")in names){if(aux=aux.concat(isAsian?prefix:prefixArray),noCompoundPrefix)return aux;i=(parts=parts.slice(i)).length+1}return aux},_findSuffix:function(parts,names,isAsian){for(var j,seq="",i=0;i<names.length;i++)if(parts.length>=names[i].length){for(j=0;j<names[i].length&&parts[parts.length-j]===names[i][names[i].length-j];)j++;j>=names[i].length&&(seq=parts.slice(parts.length-j).join(isAsian?"":" ")+(isAsian?"":" ")+seq,parts=parts.slice(0,parts.length-j),i=-1)}return this.suffix=seq,parts},_isConjunction:function _isConjunction(word){return this.info.conjunctions.and1===word||this.info.conjunctions.and2===word||this.info.conjunctions.or1===word||this.info.conjunctions.or2===word||"&"===word||"+"===word},_findLastConjunction:function _findLastConjunction(parts){for(var part,conjunctionIndex=-1,index=0;index<parts.length;index++)"string"==typeof(part=parts[index])&&("and"!==(part=part.toLowerCase())&&"or"!==part&&"&"!==part&&"+"!==part||(conjunctionIndex=index),this._isConjunction(part))&&(conjunctionIndex=index);return conjunctionIndex},_extractPrefixes:function(parts,isAsian){var i=this._findPrefix(parts,this.info.prefixes,isAsian);return 0<i?(this.prefix=parts.slice(0,i).join(isAsian?"":" "),parts.slice(i)):parts},_extractSuffixes:function(parts,isAsian){var i=this._findSuffix(parts,this.info.suffixes,isAsian);return 0<i?(this.suffix=parts.slice(i).join(isAsian?"":" "),parts.slice(0,i)):parts},_joinAuxillaries:function(parts,isAsian){var start,i,prefixArray;if(this.info.auxillaries&&(2<parts.length||this.prefix))for(start=0;start<parts.length-1;start++)for(i=parts.length;start<i;i--)(prefixArray=parts.slice(start,i)).join(" ").toLowerCase().replace(/[,\.]/g,"")in this.info.auxillaries&&(parts.splice(start,i+1-start,prefixArray.concat(parts[i])),i=start);return parts},_joinArrayOrString:function _joinArrayOrString(part){var i;if("object"!=typeof part)return part;for(i=0;i<part.length;i++)part[i]=this._joinArrayOrString(part[i]);var ret="";return part.forEach(function(segment){0<ret.length&&!isPunct(segment.charAt(0))&&(ret+=" "),ret+=segment}),ret},_joinNameArrays:function _joinNameArrays(){for(var prop in this)void 0!==this[prop]&&"object"==typeof this[prop]&&ilib.isArray(this[prop])&&(this[prop]=this._joinArrayOrString(this[prop]))},_parseAsianName:function(parts,language){var familyNameArray=this._findPrefix(parts,this.info.knownFamilyNames,!0,void 0!==this.singleFamilyName?this.singleFamilyName:this.info.noCompoundFamilyNames),tempFullName=parts.join("");familyNameArray&&0<familyNameArray.length?(this.familyName=familyNameArray.join(""),this.givenName=parts.slice(this.familyName.length).join(""),"ko"===language&&-1<tempFullName.search(/\s*[/\s]/)&&!this.suffix&&this._parseKoreanName(tempFullName)):"ja"===this.locale.getLanguage()?this._parseJapaneseName(parts):this.suffix||this.prefix?this.familyName=parts.join(""):this.givenName=parts.join("")},_parseKoreanName:function(name){var spaceSplit=name.split(" "),spceCount=spaceSplit.length,fistSpaceIndex=name.indexOf(" "),lastSpaceIndex=name.lastIndexOf(" ");2===spceCount?(this.familyName=spaceSplit[0],this.givenName=name.slice(fistSpaceIndex,name.length)):(this.familyName=spaceSplit[0],this.middleName=name.slice(fistSpaceIndex,lastSpaceIndex),this.givenName=name.slice(lastSpaceIndex,name.length))},_parseJapaneseName:function(parts){if(this.suffix&&1<this.suffix.length&&-1<this.info.honorifics.indexOf(this.suffix)){if(1===parts.length)return void(CType.withinRange(parts[0],"cjk")?this.familyName=parts[0]:this.givenName=parts[0]);if(2===parts.length)return void(this.familyName=parts.slice(0,parts.length).join(""))}if(1<parts.length)for(var fn="",i=0;i<parts.length;i++){if(!CType.withinRange(parts[i],"cjk")){if(1<fn.length&&CType.withinRange(parts[i],"hiragana"))return this.familyName=fn,void(this.givenName=parts.slice(i,parts.length).join(""));break}fn+=parts[i]}1===parts.length?this.familyName=parts[0]:2===parts.length?(this.familyName=parts[0],this.givenName=parts[1]):3===parts.length?(this.familyName=parts[0],this.givenName=parts.slice(1,parts.length).join("")):3<parts.length&&(this.familyName=parts.slice(0,2).join(""),this.givenName=parts.slice(2,parts.length).join(""))},_parseSpanishName:function(parts){var conjunctionIndex;1===parts.length?this.prefix||"object"==typeof parts[0]?this.familyName=parts[0]:this.givenName=parts[0]:2===parts.length?(this.givenName=parts[0],this.familyName=parts[1]):3===parts.length?1===(conjunctionIndex=this._findLastConjunction(parts))?this.givenName=parts:(this.givenName=parts[0],this.familyName=parts.slice(1)):3<parts.length&&(0<(conjunctionIndex=this._findLastConjunction(parts))?(this.givenName=parts.splice(0,conjunctionIndex+2),1<parts.length?(this.familyName=parts.splice(parts.length-2,2),0<parts.length&&(this.middleName=parts)):1===parts.length&&(this.familyName=parts[0])):(this.givenName=parts.splice(0,1),this.familyName=parts.splice(parts.length-2,2),this.middleName=parts))},_parseIndonesianName:function(parts){var conjunctionIndex;1===parts.length?this.givenName=parts[0]:2<=parts.length&&(0<(conjunctionIndex=this._findLastConjunction(parts))?(this.givenName=parts.splice(0,conjunctionIndex+2),1<parts.length&&(this.middleName=parts)):(this.givenName=parts.splice(0,1),this.middleName=parts))},_parseGenericWesternName:function(parts){var conjunctionIndex;1===parts.length?this.prefix||"object"==typeof parts[0]?this.familyName=parts[0]:this.givenName=parts[0]:2===parts.length?"fgm"===this.info.order?(this.givenName=parts[1],this.familyName=parts[0]):"gmf"!==this.info.order&&void 0!==this.info.order||(this.givenName=parts[0],this.familyName=parts[1]):3<=parts.length&&(0<(conjunctionIndex=this._findLastConjunction(parts))?(this.givenName=parts.slice(0,conjunctionIndex+2),conjunctionIndex+1<parts.length-1?(this.familyName=parts.splice(parts.length-1,1),conjunctionIndex+2<parts.length-1&&(this.middleName=parts.slice(conjunctionIndex+2,parts.length-conjunctionIndex-3))):"fgm"===this.info.order&&(this.familyName=parts.slice(0,conjunctionIndex+2),conjunctionIndex+1<parts.length-1)&&(this.middleName=parts.splice(parts.length-1,1),conjunctionIndex+2<parts.length-1)&&(this.givenName=parts.slice(conjunctionIndex+2,parts.length-conjunctionIndex-3))):"fgm"===this.info.order?(this.givenName=parts[1],this.middleName=parts.slice(2),this.familyName=parts[0]):(this.givenName=parts[0],this.middleName=parts.slice(1,parts.length-1),this.familyName=parts[parts.length-1]))},_findPatronymicName:function(parts){for(var index=0;index<parts.length;index++)if("string"==typeof(part=parts[index]))for(var part=part.toLowerCase(),subLength=this.info.patronymicName.length;subLength--;)if(-1!==part.indexOf(this.info.patronymicName[subLength]))return index;return-1},_isPatronymicName:function(part){if("string"==typeof part)for(var pName=part.toLowerCase(),subLength=this.info.patronymicName.length;subLength--;)if(-1!==pName.indexOf(this.info.patronymicName[subLength]))return!0;return!1},_findFamilyName:function(parts){for(var substring,index=0;index<parts.length;index++)if("string"==typeof(part=parts[index])){var part,length=(part=part.toLowerCase()).length-1;if(-1!==this.info.familyName.indexOf(part))return index;if("в"===part[length]||"н"===part[length]||"й"===part[length]){if(substring=part.slice(0,-1),-1!==this.info.familyName.indexOf(substring))return index}else if(("в"===part[length-1]&&"а"===part[length]||"н"===part[length-1]&&"а"===part[length]||"а"===part[length-1]&&"я"===part[length])&&(substring=part.slice(0,-2),-1!==this.info.familyName.indexOf(substring)))return index}return-1},_parseRussianName:function(parts){var familyIndex,patronymicNameIndex;1===parts.length?this.prefix||"object"==typeof parts[0]?this.familyName=parts[0]:this.givenName=parts[0]:2===parts.length?"fgm"===this.info.order?(this.givenName=parts[1],this.familyName=parts[0]):"gmf"===this.info.order?(this.givenName=parts[0],this.familyName=parts[1]):void 0===this.info.order&&(!0===this._isPatronymicName(parts[1])?(this.middleName=parts[1],this.givenName=parts[0]):-1===(familyIndex=this._findFamilyName(parts))||1===familyIndex?(this.givenName=parts[0],this.familyName=parts[1]):(this.familyName=parts[0],this.givenName=parts[1])):3<=parts.length&&(familyIndex=this._findLastConjunction(parts),patronymicNameIndex=this._findPatronymicName(parts),0<familyIndex?(this.givenName=parts.slice(0,familyIndex+2),familyIndex+1<parts.length-1?(this.familyName=parts.splice(parts.length-1,1),familyIndex+2<parts.length-1&&(this.middleName=parts.slice(familyIndex+2,parts.length-familyIndex-3))):"fgm"===this.order&&(this.familyName=parts.slice(0,familyIndex+2),familyIndex+1<parts.length-1)&&(this.middleName=parts.splice(parts.length-1,1),familyIndex+2<parts.length-1)&&(this.givenName=parts.slice(familyIndex+2,parts.length-familyIndex-3))):-1!==patronymicNameIndex?(this.middleName=parts[patronymicNameIndex],patronymicNameIndex===parts.length-1?(this.familyName=parts[0],this.givenName=parts.slice(1,patronymicNameIndex)):(this.givenName=parts.slice(0,patronymicNameIndex),this.familyName=parts[parts.length-1])):(this.givenName=parts[0],this.middleName=parts.slice(1,parts.length-1),this.familyName=parts[parts.length-1]))},_parseWesternName:function(parts){"es"===this.locale.getLanguage()||"pt"===this.locale.getLanguage()?this._parseSpanishName(parts):"ru"===this.locale.getLanguage()?this._parseRussianName(parts):"id"===this.locale.getLanguage()?this._parseIndonesianName(parts):this._parseGenericWesternName(parts)},getSortFamilyName:function(){var auxillaries,auxString;if(this.familyName){if(this.info)if(this.info.sortByHeadWord)parts="string"==typeof this.familyName?(name=this.familyName.replace(/\s+/g," ")).trim().split(" "):this.familyName,(auxillaries=this._findPrefix(parts,this.info.auxillaries,!1))&&0<auxillaries.length&&(name="string"==typeof this.familyName?(auxString=auxillaries.join(" "),this.familyName.substring(auxString.length+1)+", "+auxString):parts.slice(auxillaries.length).join(" ")+", "+parts.slice(0,auxillaries.length).join(" "));else if(this.info.knownFamilyNames&&this.familyName)for(var parts=this.familyName.split(""),familyNameArray=this._findPrefix(parts,this.info.knownFamilyNames,!0,this.info.noCompoundFamilyNames),name="",i=0;i<familyNameArray.length;i++)name+=this.info.knownFamilyNames[familyNameArray[i]]||"";return name||this.familyName}},getHeadFamilyName:function(){},clone:function(){return new Name(this)}},module.exports=Name;