vietnamese-search
Version:
Slugify and search Vietnamese text with diacritics support
2 lines (1 loc) • 1.02 kB
JavaScript
function l(t,g={}){let{separator:r="-"}=g;if(!t)return"";if(t=t.toLowerCase().normalize("NFD").replace(/[\u0300-\u036f]/g,"").replace(/[đĐ]/g,"d").replace(/[^\w]|_|-/g,r),!r)return t.trim();let n=r.replace(/[.*+?^${}()|[\]\\]/g,"\\$&");return t.replace(new RegExp(`${n}+`,"g"),r).replace(new RegExp(`^${n}|${n}$`,"g"),"").trim()}var p={separator:" "};function h(t,g){let r=l(g,p),n=r.length,s={matches:[],positions:[]};if(!n)return s;let o=[...t.split("")].map((e,i)=>({originIndex:i,slugified:l(e,p),char:e})).filter((e,i,a)=>i===0?e.slugified:e.char===" "?a[i-1].slugified:1);if(o.length<n)return s;for(let e=0;e<o.length;){let i=o[e];if(i.slugified!==r[0]){++e;continue}let a=e+n;if(a>o.length)break;let c=o.slice(e,a);if(c.map(f=>f.slugified===""?" ":f.slugified).join("").replace(/\s+/g," ").trim()!==r){++e;continue}let d=c[c.length-1],u=t.substring(i.originIndex,d.originIndex+1),m=u.length;s.matches.push(u),s.positions.push({start:i.originIndex,length:m}),e=a+1}return s}export{h as search,l as slugify};