@visulima/string
Version:
Functions for manipulating strings.
2 lines (1 loc) • 1.72 kB
JavaScript
import{getStringTruncatedWidth as g}from"./get-string-truncated-width.js";import{getStringWidth as S}from"./get-string-width.js";import{slice as n}from"./slice.js";const x="…",N=3,u=(r,e,t=!1)=>{if(r.charAt(e)===" ")return e;const i=t?1:-1,d=Math.min(N,t?r.length-e:e);for(let w=1;w<=d;w++){const l=e+w*i;if(r.charAt(l)===" ")return l}return e},f=(r,e,t)=>g(r,{...t,ellipsis:"",ellipsisWidth:0,limit:e}).index,m=(r,e,t)=>S(r.slice(0,e),t),v=(r,e,t={})=>{if(typeof r!="string")throw new TypeError(`Expected \`input\` to be a string, got ${typeof r}`);if(typeof e!="number")throw new TypeError(`Expected \`limit\` to be a number, got ${typeof e}`);if(r===""||e<=0)return"";const i=r.normalize("NFC"),{ellipsis:d=x,position:w="end",preferTruncationOnSpace:l=!1}=t;let o=t.ellipsisWidth??(d===x?1:void 0);o??=g(d,{...t.width,ellipsis:"",ellipsisWidth:0,limit:Number.POSITIVE_INFINITY}).width;const{width:h}=g(i,{...t.width,ellipsis:d,ellipsisWidth:o});if(h<=e)return i;switch(w){case"end":{if(l){const p=e-o,a=f(i,p,t.width),s=u(i,a),c=m(i,s,t.width);return n(i,0,c,{width:t.width})+d}return n(i,0,e-o,{width:t.width})+d}case"middle":{const p=Math.floor(e/2),a=Math.max(0,e-o),s=Math.min(p,a),c=Math.max(0,a-s);if(l){const E=f(i,s,t.width),I=u(i,E),T=m(i,I,t.width),W=h-c,b=f(i,W,t.width),y=u(i,b,!0),M=m(i,y,t.width);return n(i,0,T,{width:t.width})+d+n(i,M,h,{width:t.width}).trim()}return n(i,0,s,{width:t.width})+d+n(i,h-c,h,{width:t.width})}case"start":{if(l){const p=h-e+o,a=f(i,p,t.width),s=u(i,a,!0),c=m(i,s,t.width);return d+n(i,c,h,{width:t.width}).trim()}return d+n(i,h-e+o,h,{width:t.width})}default:throw new Error(`Invalid position: expected 'start', 'middle' or 'end', got '${w}'`)}};export{v as truncate};