@marketto/diacritic-remover
Version:
Tool to replace diacritics in strings
15 lines (14 loc) • 5.15 kB
JavaScript
/**
* @marketto/diacritic-remover 1.0.8
* Copyright (c) 2019, Marco Ricupero <marco.ricupero@gmail.com>
* License: MIT
* ===========================================
* Latin diacritic json file use material from Wikitionary article "Latin script"
* Source: https://en.wiktionary.org/wiki/Appendix:Latin_script
* License: CC-BY-SA 3.0
* ===========================================
* These diacritic i18n json files use material from Wikipedia article "Diacritic"
* Source: https://en.wikipedia.org/wiki/Diacritic
* License: CC-BY-SA 3.0
*/
var DiacriticRemover=function(){"use strict";class e{constructor(){this.USE_VALIDATOR=!1,this.FALLBACK_MARKER_MATCHER="̸̵̶̡̢̨̛͓̳̜̪̟̠̻̖̹̣̤̙͚̱͇̬͕̰͍̮͎̝͈̫͐̂̍̅̔͋͂͗̃̈̏̎̄̿͌̑̓̈́̇̆̕͘͜͝ͅ",this.LOWERCASE_MARKER_MATCHER="\\p{M}",this.UPPERCASE_MARKER_MATCHER="\\P{M}",this.IS_MARKER_REPLACING_AVAILABLE=!1;try{this.IS_MARKER_REPLACING_AVAILABLE=!!new RegExp(`(${this.LOWERCASE_MARKER_MATCHER})`,"gui")}catch(e){return}}get(e,t,r){return t.length<=1?this.USE_VALIDATOR?this.diacriticValidatorTrap(e,t):this.diacriticTrap(e,t):Reflect.get(e,t,r)}diacriticTrap(e,t){return t.replace(this.diacriticValidatorTrap(e,t),"")}diacriticValidatorTrap(e,t){return this.INSENSITIVE_MARKER_REGEXP}get INSENSITIVE_MARKER_REGEXP(){return new RegExp(this.IS_MARKER_REPLACING_AVAILABLE?`(${this.LOWERCASE_MARKER_MATCHER})`:`([${this.FALLBACK_MARKER_MATCHER}]*)`,"gui")}get INSENSITIVE_MARKER_MATCHER(){return this.IS_MARKER_REPLACING_AVAILABLE?`[${this.LOWERCASE_MARKER_MATCHER}${this.UPPERCASE_MARKER_MATCHER}]*`:`[${this.FALLBACK_MARKER_MATCHER}${this.FALLBACK_MARKER_MATCHER.toUpperCase()}]*`}}class t extends e{diacriticTrap(e,t){const r=super.diacriticTrap(e,t).toLowerCase(),i=e.dictionary[r]||"";return[...new Set([r,r.toUpperCase(),...i,...i.toUpperCase()])].sort().join("")}}class r extends e{constructor(){super(...arguments),this.USE_VALIDATOR=!0}diacriticValidatorTrap(e,t){const r=t.replace(super.diacriticValidatorTrap(e,t),""),i=e.dictionary[t.toLowerCase()]||"";let s="",a="";return(r||i)&&(s=`[${r}${i}]`,a=this.INSENSITIVE_MARKER_MATCHER,e.isUpperCase(r)&&(s=s.toUpperCase())),new RegExp(`^${s}${a}$`,"u")}}class i extends r{diacriticValidatorTrap(e,t){const{source:r}=super.diacriticValidatorTrap(e,t);return new RegExp(r,"ui")}}class s extends e{diacriticTrap(e,t){let r=super.diacriticTrap(e,t);const i=e.dictionary[t.toLowerCase()];return i&&(r+=e.isUpperCase(r)?i.toUpperCase():i),r}}class a extends e{diacriticTrap(e,t){const r=super.diacriticTrap(e,t);if(!r.trim()||1!==r.length)return r;const i=r.toLowerCase(),[s]=Object.entries(e.dictionary).find(([e,t])=>"string"==typeof t&&[e,...t].includes(i))||[r];return e.isUpperCase(r)?s.toUpperCase():s}}var c={"":"ʰ'ʼ·׳"},n={a:"àáâãäåāăąǎǟǡǻȁȃȧɐɑɒᴀᶏḁạảấầẩẫậắằẳẵặⱥa",ae:"æǣǽᴁᴂᴭᵆ",b:"ƀƃɓʙᵬᶀḃḅḇb",c:"cçćĉċčƈȼɕ̄ᴄḉc",d:"dðþďđƌȡɖɗ̦ᴅᵭᶁᶑḋḍḏḑḓd",db:"ȸ",dz:"dždz",e:"èéêëēĕėęěǝȅȇȩɇəɛᴇᶒḕḗḙḛḝẹẻẽếềểễệⱸe",eo:"ᴔ",f:"fƒᵮᶂḟꜰfff",g:"ĝğġģǥǧǵȝɠɢᶃḡg",h:"hĥħȟɦʜʰ̱ḣḥḧḩḫẖⱨh",i:"iìíîïĩīĭįıǐȉȋɨɩɪ̇ᵻᶖḭḯỉịi",ij:"ij",j:"jĵǰȷɉɟʄʝ̌ᴊj",k:"ķƙǩᴋᶄḱḳḵⱪꝁk",l:"lĺļľŀłƚȴɫɬɭʟᶅḷḹḻḽⱡl",lj:"lj",m:"ɱᴍᵯᶆḿṁṃm",n:"nñńņňƞǹȵɲɳɴᵰᶇṅṇṉṋn",nj:"ŋnj̈",o:"òóôõöøōŏőơǒǫǭǿȍȏȫȭȯȱɔɵᴏṍṏṑṓọỏốồổỗộớờởỡợⱺo",oe:"œ",p:"pƥƿ̃ᴘᵱᵽᶈṕṗp",q:"ƣɋʠq",qp:"ȹ",r:"ŕŗřȑȓɍɼɽɾʀᵲᵳᶉṙṛṝṟꝛr",s:"sśŝşšſșȿʂʃ̩ᵴᶊṡṣṥṧṩẛꜱs",ss:"ß",t:"tţťŧƫƭțȶʈᴛᵵṫṭṯṱẗⱦt",u:"ùúûüũūŭůűųưǔǖǘǚǜȕȗʉʊᴜᵾṳṵṷṹṻụủứừửữựu",ue:"ᵫ",uo:"ȣ",ut:"ᶙ",v:"ʋʌᴠᶌṽṿⱱⱴv",w:"ŵᴡẁẃẅẇẉẘⱳw",x:"ᶍẋẍx",y:"ýÿŷƴȳɏʏẏẙỳỵỷỹy",z:"zźżžƶƹȥɀʐʑʒᴢᵶᶎẑẓẕⱬz"};return class extends class{constructor(e={}){this.dictionary=e,this.matcher=new Proxy(this,new s),this.insensitiveMatcher=new Proxy(this,new t),this.validator=new Proxy(this,new r),this.insensitiveValidator=new Proxy(this,new i)}matcherBy(e){return[...Object.entries(this.dictionary).filter(([t,r])=>r&&e.test(t)).map(([e,t])=>e+t),...Object.entries(this.dictionary).filter(([t,r])=>r&&e.test(t.toUpperCase())).map(([e,t])=>(e+t).toUpperCase())].join("")}replace(e){return e.replace(/./g,e=>this[e])}isUpperCase(e=""){return e.toLowerCase()!==e}isLowerCase(e=""){return e.toUpperCase()!==e}}{constructor(...e){super();const t=Object.freeze((e.length?e:[n,c]).reduce((e,t)=>[...e,...Object.entries(t)],[]).reduce((e,[t,r])=>{let i=e.find(([e])=>e===t);return i||(i=[t,[]],e.push(i)),i[1]=[...i[1],...r],e},[]).reduce((e,[t,r])=>Object.assign(Object.assign({},e),{[t]:[...new Set(r)].sort().join("")}),{}));return Object.defineProperty(this,"dictionary",{configurable:!1,enumerable:!1,value:t}),new Proxy(this,new a)}}}();