UNPKG

@remotex-labs/xansi

Version:

A lightweight ANSI utility library for styling terminal output

4 lines (3 loc) 3.61 kB
var R={1:"22",3:"23",4:"24",5:"25",7:"27",8:"28",9:"29",30:"39",31:"39",32:"39",33:"39",34:"39",35:"39",36:"39",37:"39",40:"49",41:"49",42:"49",43:"49",44:"49",45:"49",46:"49",47:"49",0:null,22:null,23:null,24:null,25:null,27:null,28:null,29:null,39:null,49:null};function w(s,t,n,r){if((s==="38"||s==="48")&&n[t+1]==="2"){let i=n.slice(t+2,t+5);if(i.length===3){let l=`${s};2;${i.join(";")}`,o=s==="38"?"39":"49";return r.set(l,o),t+4}}let e=R[s];if(e===null)if(s==="0")r.clear();else for(let[i,l]of r)(i===s||l===s)&&r.delete(i);else e&&r.set(s,e);return t}function g(s){let t=/\x1b\[[0-9;]*m/g,n=s.match(new RegExp(`${t.source}|.`,"g"))||[],r=new Map,e=[];for(let i of n){if(!i.startsWith("\x1B[")){let o=[...r.keys()].map(u=>`\x1B[${u}m`).join(""),c=[...new Set(r.values())].map(u=>`\x1B[${u}m`).join("");e.push(`${o}${i}${c}`);continue}let l=i.slice(2,-1).split(";");for(let o=0;o<l.length;o++)o=w(l[o],o,l,r)}return e}function a(s){process.stdout.write?process.stdout.write(s):console.log(s)}function p(s,t=0){return`\x1B[${s};${t}H`}function b(s){return s.replace(/\x1b\[[0-9;]*m/g,"")}var f={CLEAR_LINE:"\x1B[K",HIDE_CURSOR:"\x1B[?25l",SHOW_CURSOR:"\x1B[?25h",SAVE_CURSOR:"\x1B[s",CLEAR_SCREEN:"\x1B[2J\x1B[H",RESTORE_CURSOR:"\x1B[u",CLEAR_SCREEN_DOWN:"\x1B[J",RESET_TERMINAL:"\x1Bc"};var v=class{constructor(t,n,r,e){this.terminalHeight=t;this.terminalWidth=n;this.topPosition=r;this.leftPosition=e}scrollPosition=0;viewBuffer=[];contentBuffer=[];get top(){return this.topPosition}get left(){return this.leftPosition}get width(){return this.terminalWidth}get height(){return this.terminalHeight}get scroll(){return this.scrollPosition}set top(t){this.topPosition=t}set left(t){this.leftPosition=t}set width(t){this.terminalWidth=t}set height(t){this.terminalHeight=t}set scroll(t){let n=t<0?this.scrollPosition+t:t;n>=this.contentBuffer.length||(this.scrollPosition=n,this.render())}clear(){this.clearScreen(),this.viewBuffer=[],this.contentBuffer=[]}clearScreen(){let t="";for(let n=0;n<this.viewBuffer.length;n++)t+=this.moveCursor(n,0),t+=f.CLEAR_LINE;a(t)}writeText(t,n,r,e=!1){if(t<0||n>=this.terminalWidth)return;e&&(this.contentBuffer[t]=[]),r=r.split(` `)[0];let i=this.contentBuffer[t]??=[],l=b(r),o=Math.min(this.terminalWidth-n,l.length),c=g(r);for(let u=0;u<o;u++){let h=n+u,m=c[u];i[h]||(i[h]={char:"",dirty:!0}),i[h].char!==m&&(i[h].char=m,i[h].dirty=!0)}i.length=Math.min(Math.max(n+o,this.terminalWidth),this.terminalWidth)}render(t=!1){let n=Math.min(this.scrollPosition,this.contentBuffer.length),r=Math.min(n+this.terminalHeight,this.contentBuffer.length);if(n>=r)return;let e={force:t,output:"",viewLine:[],screenRow:1,contentLine:[]};for(let i=n;i<r;i++,e.screenRow++)e.contentLine=this.contentBuffer[i],e.contentLine&&(e.viewLine=this.viewBuffer[e.screenRow]??=[],this.renderLine(e),e.viewLine.length>e.contentLine.length&&(e.output+=f.CLEAR_LINE,e.viewLine.length=e.contentLine.length));if(r>=this.contentBuffer.length){this.viewBuffer.length=e.screenRow;for(let i=e.screenRow;i<=this.terminalHeight;i++)e.output+=this.moveCursor(i,0),e.output+=f.CLEAR_LINE}e.output+=this.moveCursor(this.viewBuffer.length,this.terminalWidth),a(e.output)}renderLine(t){let n=!0;for(let r=0;r<t.contentLine.length;r++){let e=t.contentLine[r];if(e&&!e.dirty&&e.char===t.viewLine[r]&&!t.force){n=!0;continue}if(n&&(t.output+=this.moveCursor(t.screenRow,r+1),n=!1),!e){t.viewLine[r]=" ",t.output+=" ";continue}t.viewLine[r]=e.char,t.output+=e.char,e.dirty=!1}}moveCursor(t,n=0){return p(t+this.topPosition,n+this.leftPosition)}};export{v as ShadowRenderer}; //# sourceMappingURL=shadow.service.js.map