@visulima/string
Version:
Functions for manipulating strings.
2 lines (1 loc) • 2.55 kB
JavaScript
const B=/\$([\d&$`'])/g,b=/\$(\d+|&|\$)/g,S=l=>{if(l.length===0)return[];const u=[];let d=[...l[0]];for(let c=1;c<l.length;c++){const p=l[c];p&&p[0]<=d[1]+1?d[1]=Math.max(d[1],p[1]):(u.push(d),d=[...p])}return u.push(d),u},y=(l,u,d)=>{if(!l)return"";const c=[];let p=0;for(const n of u){const[e,r]=n;if(r!==void 0)try{if(e instanceof RegExp){const t=new RegExp(e.source,`${e.flags.replace("g","")}g`);let i;for(;(i=t.exec(l))!==null;){const s=i.index,f=i[0];f.length===0&&t.lastIndex===i.index&&(t.lastIndex+=1);const I=s+f.length-1,M=r.replaceAll(B,(R,o)=>{if(o==="&")return f;if(o==="$")return"$";if(o==="`")return l.slice(0,Math.max(0,s));if(o==="'")return l.slice(Math.max(0,s+f.length));const h=Number.parseInt(o,10);return i&&h>0&&h<i.length?i[h]??"":R});c.push({end:I,id:p++,original:f,replacement:M,start:s}),f.length===0&&t.lastIndex===s&&(t.lastIndex+=1)}}else if(typeof e=="string"&&e.length>0)for(let t=0;(t=l.indexOf(e,t))!==-1;t++){const i=t,s=e,f=i+s.length-1,I=Object.assign([s],{index:i,input:l}),M=r.replaceAll(b,(R,o)=>{if(o==="&")return s;if(o==="$")return"$";const h=Number.parseInt(o,10);return h>0&&h<I.length?I[h]??"":R});c.push({end:f,id:p++,original:s,replacement:M,start:i})}else continue}catch{continue}}c.sort((n,e)=>n.start!==e.start?n.start-e.start:e.end-n.end);const $=d.toSorted((n,e)=>n[0]-e[0]),v=S($),a=l.split("").map((n,e)=>({appliedMatchId:void 0,char:n,index:e,insertBeforeReplacement:void 0,isIgnored:!1,isMatchStart:!1,matchReplacement:void 0}));for(const n of v){const e=n;for(let r=e[0];r<=e[1];r++)a[r]&&(a[r].isIgnored=!0)}let x="";for(const n of c){const e=n;if(e.original.length===0&&e.start>=0&&e.start<=a.length){const r=e.start;if(a[r]){const t=a[r];t.isIgnored||(t.insertBeforeReplacement=(t.insertBeforeReplacement??"")+e.replacement)}else r===a.length&&(x+=e.replacement)}}for(const n of c){const e=n;if(e.original.length===0)continue;let r=!0;for(let t=e.start;t<=e.end;t++)if(!a[t]||a[t].isIgnored||a[t].appliedMatchId!==void 0){r=!1;break}if(r&&e.start>=0&&e.start<a.length){for(let t=e.start;t<=e.end;t++)a[t]&&(a[t].appliedMatchId=e.id);a[e.start]&&(a[e.start].isMatchStart=!0,a[e.start].matchReplacement=e.replacement)}}let m="",g=0;for(;g<a.length;){const n=a[g];if(n.insertBeforeReplacement!==void 0&&(m+=n.insertBeforeReplacement),n.isMatchStart&&n.appliedMatchId!==void 0){m+=n.matchReplacement??"";let e=g;for(let r=g+1;r<a.length&&a[r]?.appliedMatchId===n.appliedMatchId;r++)e=r;g=e+1}else n.appliedMatchId===void 0&&(m+=n.char),g+=1}return x.length>0&&(m+=x),m};export{y as default};