UNPKG

@visulima/string

Version:

Functions for manipulating strings.

9 lines (8 loc) 6.66 kB
import{O as m,P as B,Q as v,S as x,T as H,U as $,V as D,W as N,X as y}from"./packem_shared/constants-aPzGW29R.js";import{getStringWidth as E}from"./get-string-width.js";const O=/\x1B\[(\d+)m/;class T{activeForeground=void 0;activeBackground=void 0;activeFormatting=[];processEscape(t){const i=O.exec(t);if(!i)return;const s=Number.parseInt(i[1],10);switch(s){case 0:{this.activeForeground=void 0,this.activeBackground=void 0,this.activeFormatting=[];break}case 39:{this.activeForeground=void 0;break}case 49:{this.activeBackground=void 0;break}default:if(s>=30&&s<=37||s>=90&&s<=97)this.activeForeground=t;else if(s>=40&&s<=47||s>=100&&s<=107)this.activeBackground=t;else if([1,2,3,4,7,8,9].includes(s))this.activeFormatting.push(t);else if([22,23,24,27,28,29].includes(s)){const u={22:"[1m",23:"[3m",24:"[4m",27:"[7m",28:"[8m",29:"[9m"}[s];u&&(this.activeFormatting=this.activeFormatting.filter(n=>!n.includes(u)))}}}getStartEscapesForAllActiveAttributes(){return[this.activeBackground,this.activeForeground,...this.activeFormatting].filter(Boolean).join("")}getEndEscapesForAllActiveAttributes(){const t=[];if(this.activeFormatting.length>0){const i={"\x1B[1m":"\x1B[22m","\x1B[2m":"\x1B[22m","\x1B[3m":"\x1B[23m","\x1B[4m":"\x1B[24m","\x1B[7m":"\x1B[27m","\x1B[8m":"\x1B[28m","\x1B[9m":"\x1B[29m"};[...this.activeFormatting].toReversed().forEach(s=>{const u=i[s];u&&t.push(u)})}return this.activeForeground&&t.push("\x1B[39m"),this.activeBackground&&t.push("\x1B[49m"),t.join("")}}const P=(e,t)=>{if(!m.has(e[t]))return{isInsideEscape:!1,isInsideLinkEscape:!1};const i=!0,s=e.slice(t+1,t+1+v.length).join("")===v;return{isInsideEscape:i,isInsideLinkEscape:s}},q=(e,t={})=>{const i=new T;let s="",u=!1,n="",r="",o=!1;const a=[...e];for(let l=0;l<a.length;l++){const c=a[l];if(c&&m.has(c)){if(s){const g=t.getWidth?.(s)??0,S={isEscapeSequence:!1,isGrapheme:!0,text:s,width:g};if(o&&(S.isHyperlink=!0,S.hyperlinkUrl=r),t.onSegment?.(S,i)===!1)return;s=""}u=!0,n=c;const p=P(a,l),{isInsideLinkEscape:C}=p;if(C){let g=l+1;for(r="";g<a.length;){const _=a[g];if(_===x)break;r+=_,g+=1}r=r.slice(4);const S={hyperlinkUrl:r,isEscapeSequence:!0,isGrapheme:!1,isHyperlink:!0,isHyperlinkStart:!0,width:0};if(t.onSegment?.(S,i)===!1)return;l=g,o=!0,u=!1,n="";continue}if(l+1<a.length&&a[l+1]==="\\"&&o){const g={isEscapeSequence:!0,isGrapheme:!1,isHyperlink:!0,isHyperlinkEnd:!0,width:0};if(t.onSegment?.(g,i)===!1)return;o=!1,r="",l+=1,u=!1,n="";continue}}if(u){if(n!==c&&(n+=c),c===B){u=!1,i.processEscape(n);const p={isEscapeSequence:!0,isGrapheme:!1,text:n,width:0};if(t.onSegment?.(p,i)===!1)return;n=""}continue}s+=c;const h=t.getWidth?.(s)??0,f={isEscapeSequence:!1,isGrapheme:!0,text:s,width:h};if(o&&(f.isHyperlink=!0,f.hyperlinkUrl=r),t.onSegment?.(f,i)===!1)return;s=""}if(s){const l=t.getWidth?.(s)??0,c={isEscapeSequence:!1,isGrapheme:!0,text:s,width:l};o&&(c.isHyperlink=!0,c.hyperlinkUrl=r),t.onSegment?.(c,i)}if(n){const l={isEscapeSequence:!0,isGrapheme:!1,text:n,width:0};t.onSegment?.(l,i)}},k=e=>`${m.values().next().value}${H}${String(e)}${B}`,F=e=>`${m.values().next().value}${v}${e}${x}`,G=e=>{if(e.length===0)return"";if(e.length===1)return e[0];let t="",i,s;const u=e.join(` `),n=[...u];let r=0;for(const[o,a]of n.entries()){if(t+=a,m.has(a)){const c=$.exec(u.slice(r))?.groups??{};if(c.code!==void 0){const h=Number.parseFloat(c.code);i=h===N?void 0:h}else c.uri!==void 0&&(s=c.uri.length===0?void 0:c.uri)}const l=D.get(Number(i));n[o+1]===` `?(s&&(t+=F("")),i&&l&&(t+=k(l))):a===` `&&(i&&l&&(t+=k(i)),s&&(t+=F(s))),r+=a.length}return t},W=/(?=\s)|(?<=\s)/,b=/^\s+$/,I=new Map,j=e=>{const t=I.get(e);if(t!==void 0)return t;const i=E(e);return I.set(e,i),i},R=e=>{if(!e.includes("\x1B"))return e;let t=e;return e.includes("\x1B[30m")&&(t+="\x1B[39m"),e.includes("\x1B[42m")&&(t+="\x1B[49m"),t},d=e=>{const t=e.split(" ");let i=t.length;for(;i>0&&E(t[i-1])===0;)i--;return i===t.length?e:t.slice(0,i).join(" ")+t.slice(i).join("")},w=(e,t,i)=>{if(e.length===0)return[""];if(t<=0)return[e];const s=[],u=new T;let n="",r=0,o=!1,a=!1,l="",c=0;for(;c<e.length;){const h=e[c];if(m.has(h)){o=!0,l=h,n+=h,a=e.startsWith(v,c+1),c+=1;continue}if(o){l+=h,n+=h,a?h===x&&(o=a=!1):h===B&&(o=!1,u.processEscape(l)),c+=1;continue}const f=j(h),p=h===" ";if(f===0){n+=h,c+=1;continue}if(r+f>t&&(n&&s.push(n+u.getEndEscapesForAllActiveAttributes()),n=u.getStartEscapesForAllActiveAttributes(),r=E(n),p&&i)){for(;c<e.length&&e[c]===" ";)c+=1;continue}if(n+=h,r+=f,r===t&&c<e.length-1&&(s.push(n+u.getEndEscapesForAllActiveAttributes()),n=u.getStartEscapesForAllActiveAttributes(),r=E(n),c+1<e.length&&e[c+1]===" "&&i)){for(c+=1;c<e.length&&e[c]===" ";)c+=1;continue}c+=1}return n&&s.push(n+u.getEndEscapesForAllActiveAttributes()),i?s.map(h=>d(h)):s},K=(e,t,i)=>{if(e.length===0)return[];const s=i?e.trim():e;if(s.length===0)return[];const u=[];let n="",r=0;return q(s,{getWidth:E,onSegment:(o,a)=>{const l=o.text??"";if(o.isEscapeSequence)n+=l;else{const c=l===" ";if(o.width===0)return n+=l,!0;if(r+o.width>t&&(n&&u.push(n),n=a.getStartEscapesForAllActiveAttributes(),r=0,c))return i||u.push(a.getStartEscapesForAllActiveAttributes()+l),!0;n+=l,r+=o.width}return!0}}),n&&u.push(n),i?u.map(o=>d(o)):u},L=(e,t,i)=>{if(e.length===0)return[];const s=i?e.trim():e;if(s.length===0)return[];const u=s.split(W),n=[];let r="",o=0,a=0;for(;a<u.length;){const l=u[a],c=b.test(l),h=E(l);if(l.length===0){a+=1;continue}if(i&&c&&o===0){a+=1;continue}if(o+h>t&&o>0){i?n.push(d(r)):n.push(r),r="",o=0;continue}r+=l,o+=h,a+=1}return r&&(i?n.push(d(r)):n.push(r)),n},U=(e,t,i)=>{if(e.length===0)return[];const s=i?e.trim():e;if(s.length===0)return[];const u=s.split(W),n=[];let r="",o=0,a=0;for(;a<u.length;){const l=u[a],c=b.test(l),h=E(l);if(l.length===0){a+=1;continue}if(i&&c&&o===0){a+=1;continue}if(h>t){r&&n.push(R(i?d(r):r));const f=w(l,t,i);if(f.length>0){for(let p=0;p<f.length-1;p+=1)n.push(f[p]);r=f.at(-1),o=E(r)}else r="",o=0;a+=1;continue}if(o+h>t&&o>0&&(n.push(R(i?d(r):r)),r="",o=0,i&&c)){a+=1;continue}r+=l,o+=h,a+=1}return r&&n.push(R(i?d(r):r)),n},A={BREAK_AT_CHARACTERS:"BREAK_AT_CHARACTERS",BREAK_WORDS:"BREAK_WORDS",PRESERVE_WORDS:"PRESERVE_WORDS",STRICT_WIDTH:"STRICT_WIDTH"},Z=(e,t={})=>{const{removeZeroWidthCharacters:i=!0,trim:s=!0,width:u=80,wrapMode:n=A.PRESERVE_WORDS}=t;if(s&&e.trim()==="")return"";let r=e.normalize("NFC").replaceAll(`\r `,` `);return i&&(r=r.replaceAll(y,"")),r.split(` `).map(o=>{if(s&&o.trim()==="")return"";let a;switch(n){case A.BREAK_AT_CHARACTERS:{a=K(o,u,s);break}case A.BREAK_WORDS:{a=U(o,u,s);break}case A.STRICT_WIDTH:{a=w(o,u,s);break}default:a=L(o,u,s)}return G(a)}).join(` `)};export{A as WrapMode,Z as wordWrap};