string-collapse-white-space
Version:
Replace chunks of whitespace with a single spaces
22 lines (20 loc) • 3.56 kB
JavaScript
/**
* @name string-collapse-white-space
* @fileoverview Replace chunks of whitespace with a single spaces
* @version 11.0.23
* @author Roy Revelt, Codsen Ltd
* @license MIT
* {@link https://codsen.com/os/string-collapse-white-space/}
*/
import{rApply as w}from"ranges-apply";import{Ranges as x}from"ranges-push";import{right as D}from"string-left-right";var A="11.0.23";var L=A,O={trimStart:!0,trimEnd:!0,trimLines:!1,trimnbsp:!1,removeEmptyLines:!1,limitConsecutiveEmptyLinesTo:0,enforceSpacesOnly:!1,cb:({suggested:e})=>e},R=["suggested","whiteSpaceStartsAt","whiteSpaceEndsAt","str"];function J(e,b){if(typeof e!="string")throw new Error(`string-collapse-white-space/collapse(): [THROW_ID_01] The input is not string but ${typeof e}, equal to: ${JSON.stringify(e,null,4)}`);if(b&&typeof b!="object")throw new Error(`string-collapse-white-space/collapse(): [THROW_ID_02] The resolvedOpts is not a plain object but ${typeof b}, equal to:
${JSON.stringify(b,null,4)}`);if(!e.length)return{result:"",ranges:null};let S=new x,c="\xA0",n={...O,...b};function p(t,y){if(typeof n.cb=="function"){let o=n.cb({suggested:t,...y});Array.isArray(o)&&S.push(...o)}else t&&S.push(...t)}let l=null,s=null,i=null,a=null,E=null,m=!1,f=[],h=0;for(let t=0,y=e.length;t<=y;t++){if((e[t]==="\r"||e[t]===`
`&&e[t-1]!=="\r")&&(h+=1,a===null&&(a=t),E=e[t]==="\r"&&e[t+1]===`
`?t+2:t+1),!n.trimnbsp&&e[t]===c&&!m&&(m=!0),l!==null&&e[t]!==" "){let o=l&&s||!s&&(!n.trimStart||!n.trimnbsp&&(e[t]===c||e[l-1]===c)),$=e[t]||!n.trimEnd||!n.trimnbsp&&(e[t]===c||e[l-1]===c),r=!n.enforceSpacesOnly||(!e[l-1]||e[l-1].trim())&&(!e[t]||e[t].trim());if(l<t-1&&o&&$&&r){let u=l,g=t,d=" ";n.trimLines&&(!l||!e[t]||e[l-1]&&`\r
`.includes(e[l-1])||e[t]&&`\r
`.includes(e[t]))&&(d=null),d&&e[l]===" "&&(g-=1,d=null),(!l&&n.trimStart||!e[t]&&n.trimEnd)&&(g=t),f.push([d?[u,g,d]:[u,g],{whiteSpaceStartsAt:s,whiteSpaceEndsAt:D(e,t-1)||t,str:e}])}}if(l===null&&e[t]===" "&&(l=t),s===null&&e[t]&&!e[t].trim()&&(s=t),i!==null&&(`
\r`.includes(e[t])||!e[t]||e[t].trim()||!(n.trimnbsp||n.enforceSpacesOnly)&&e[t]===c)&&(i||!n.trimStart||n.enforceSpacesOnly&&m)&&(e[t]||!n.trimEnd||n.enforceSpacesOnly&&m)){if(n.enforceSpacesOnly&&(t>i+1||e[i]!==" ")){let o=i,$=t,r=" ";e[$-1]===" "?($-=1,r=null):e[i]===" "&&(o+=1,r=null),((n.trimStart||n.trimLines)&&!i||(n.trimEnd||n.trimLines)&&!e[t])&&(r=null),p(r?[o,$,r]:[o,$],{whiteSpaceStartsAt:s,whiteSpaceEndsAt:t,str:e})}n.trimLines&&(!i||`\r
`.includes(e[i-1])||!e[t]||`\r
`.includes(e[t]))&&(n.trimnbsp||!m)&&p([i,t],{whiteSpaceStartsAt:s,whiteSpaceEndsAt:D(e,t-1)||t,str:e}),i=null}if(i===null&&!`\r
`.includes(e[t])&&e[t]&&!e[t].trim()&&(n.trimnbsp||e[t]!==c||n.enforceSpacesOnly)&&(i=t),s!==null&&(!e[t]||e[t].trim())){if((!s&&(n.trimStart||n.trimLines&&a===null)||!e[t]&&(n.trimEnd||n.trimLines&&a===null))&&(n.trimnbsp||!m||n.enforceSpacesOnly))p([s,t],{whiteSpaceStartsAt:s,whiteSpaceEndsAt:t,str:e});else{let o=!1;if(n.removeEmptyLines&&a!==null&&h>(n.limitConsecutiveEmptyLinesTo||0)+1){o=!0;let $=a,r=E||e.length,u=`${e[a]==="\r"&&e[a+1]===`
`?`\r
`:e[a]}`.repeat((n.limitConsecutiveEmptyLinesTo||0)+1);e.endsWith(u,E)?(r-=u.length||0,u=null):e.startsWith(u,a)&&($+=u.length,u=null),p(u?[$,r,u]:[$,r],{whiteSpaceStartsAt:s,whiteSpaceEndsAt:t,str:e})}if(f.length){for(;f.length;)p(...f.shift());o=!0}o||p(null,{whiteSpaceStartsAt:s,whiteSpaceEndsAt:t,str:e})}s=null,i=null,m=!1,h&&(h=0,a=null,E=null)}l!==null&&e[t]!==" "&&(l=null)}return{result:w(e,S.current()),ranges:S.current()}}export{R as cbSchema,J as collapse,O as defaults,L as version};