UNPKG

neo-neo-bblessed

Version:

A fork of neo-blessed (which is a fork of blessed) with bug fixes and maintenance.

12 lines (11 loc) 6.75 kB
var I=require("../unicode"),b=global.setImmediate||process.nextTick.bind(process),C=require("./node"),y=require("./input");function s(i){var t=this;if(!(this instanceof C))return new s(i);i=i||{},i.scrollable=i.scrollable!==!1,y.call(this,i),this.screen._listenKeys(this),this.offsetY=0,this.offsetX=0,this.value=i.value||"",this.__updateCursor=this._updateCursor.bind(this),this.on("resize",this.__updateCursor),this.on("move",this.__updateCursor),i.inputOnFocus&&this.on("focus",this.readInput.bind(this,null)),!i.inputOnFocus&&i.keys&&this.on("keypress",function(f,l){if(!t._reading){if(l.name==="enter"||i.vi&&l.name==="i")return t.readInput();if(l.name==="e")return t.readEditor()}}),i.mouse&&this.on("click",function(f){t._reading||f.button==="right"&&t.readEditor()})}s.prototype.__proto__=y.prototype,s.prototype.type="textarea",s.prototype.getCursor=function(){return{x:this.offsetX,y:this.offsetY}},s.prototype.setCursor=function(i,t){this.offsetX=i,this.offsetY=t},s.prototype.moveCursor=function(i,t){var f=this._clines.length-1+this.offsetY;let l=!1;t<=0&&t>this._clines.length*-1&&(l=this.offsetY!==t,this.offsetY=t);var e=this._clines.length-1+this.offsetY,r=this._clines[e];if(l){var p=this._clines[f],_=Math.max(this.strWidth(p)+this.offsetX,0);i=Math.max(0,this.strWidth(r)-_)*-1}i<=0&&i>=this.strWidth(r)*-1&&(this.offsetX=i),this._updateCursor(!0),this.screen.render()},s.prototype._updateCursor=function(i){if(this.screen.focused!==this)return;var t=i?this.lpos:this._getCoords();if(!t)return;const f=this._clines.length-1+this.offsetY;var l=this._clines[f],e=this.screen.program,r,p,_;l===""&&this.value[this.value.length-1],r=Math.min(f-(this.childBase||0),t.yl-t.yi-this.iheight-1),r=Math.max(0,r),_=t.yi+this.itop+r,p=this.offsetX+t.xi+this.ileft+this.strWidth(l),!(_===e.y&&p===e.x)&&(_===e.y?p>e.x?e.cuf(p-e.x):p<e.x&&e.cub(e.x-p):p===e.x?_>e.y?e.cud(_-e.y):_<e.y&&e.cuu(e.y-_):e.cup(_,p))},s.prototype.input=s.prototype.setInput=s.prototype.readInput=function(i){var t=this,f=this.screen.focused===this;this._reading||(this._reading=!0,this._callback=i,f||(this.screen.saveFocus(),this.focus()),this.screen.grabKeys=!0,this._updateCursor(),this.screen.program.showCursor(),this._done=function l(e,r){if(t._reading&&!l.done&&(l.done=!0,t._reading=!1,delete t._callback,delete t._done,t.removeListener("keypress",t.__listener),delete t.__listener,t.removeListener("blur",t.__done),delete t.__done,t.screen.program.hideCursor(),t.screen.grabKeys=!1,f||t.screen.restoreFocus(),t.options.inputOnFocus&&t.screen.rewindFocus(),e!=="stop"&&(e?t.emit("error",e):r!=null?t.emit("submit",r):t.emit("cancel",r),t.emit("action",r),!!i)))return e?i(e):i(null,r)},b(function(){t.__listener=t._listener.bind(t),t.on("keypress",t.__listener)}),this.__done=this._done.bind(this,null,null),this.on("blur",this.__done))},s.prototype._listener=function(i,t){var r,p,_,x;var f=this._done,l=this.value;if(t.name==="return")return;t.name==="enter"&&(i=` `);const e=this.getCursor();if(t.name==="left"||t.name==="right"||t.name==="up"||t.name==="down"||t.name==="end"||t.name==="home"){if(t.name==="left"?e.x--:t.name==="right"&&e.x++,t.name==="up"?e.y--:t.name==="down"&&e.y++,t.name==="end")e.x=0;else if(t.name==="home"){const d=this._clines.length-1+this.offsetY,n=this.strWidth((r=this._clines[d])!=null?r:"");e.x=-n}this.moveCursor(e.x,e.y)}if(this.options.keys&&t.ctrl&&t.name==="e")return this.readEditor();if(t.name==="escape")f(null,null);else if(t.name==="backspace"){if(this.value.length&&!this.screen.fullUnicode)if(e.x===0&&e.y===0)this.value=this.value.slice(0,-1);else{const d=this._clines.real.slice(),n=this._clines.fake.slice(),a=this._clines.rtof,h=d.length-1+e.y,u=a[h];let o=0;for(let c=0;c<=h;c++)a[c]===u&&(o+=this.strWidth(d[c]));o+=e.x;let g=this.strWidth(d[h])+e.x;if(n[u]==="")n.splice(u,1);else if(e.x===-this.strWidth(d[h])){if(h>0){const c=this.strWidth((p=d[h-1])!=null?p:"");if(a[h]!==a[h-1]){const v=n.splice(u,1);n[u-1]+=v}const m=this._wrapContent(n.join(` `),this.width-this.iwidth);e.x=-(this.strWidth((_=m[h-1])!=null?_:"")-c),m.real.length===d.length&&e.y--}}else{n[u]=n[u].slice(0,o-1)+n[u].slice(o);const c=this._wrapContent(n.join(` `),this.width-this.iwidth);e.x=-(this.strWidth(c.real[h])-g+1),c.real.length!==d.length&&e.y++}this.value=n.join(` `),this.setCursor(e.x,e.y)}}else if(t.name==="delete"){if(this.value.length&&!this.screen.fullUnicode){const d=this._clines.length-1+e.y;if(!(e.x===0&&e.y===0)){const n=this._clines.real.slice(),a=this._clines.fake.slice(),h=this._clines.rtof,u=n.length-1+e.y,o=h[u];let g=0;for(let m=0;m<=u;m++)h[m]===o&&(g+=this.strWidth(n[m]));g+=e.x;let c=this.strWidth(n[u])+e.x;if(a[o]===""){const m=this.strWidth((x=a[o+1])!=null?x:"");a.splice(o,1),e.y++,e.x=-m}else if(o<a.length-1){e.x===-this.strWidth(n[u])?a[o]=a[o].substring(1):a[o]=a[o].slice(0,g)+a[o].slice(g+1);const m=this._wrapContent(a.join(` `),this.width-this.iwidth);e.x=-(this.strWidth(m.real[u])-c),m.real.length!==n.length&&e.y++}this.value=a.join(` `),this.setCursor(e.x,e.y)}}}else if(i&&!/^[\x00-\x08\x0b-\x0c\x0e-\x1f\x7f]$/.test(i)){if(e.x===0&&e.y===0)this.value+=i;else if(e.x>=this.value.length*-1){const d=this._clines.real.slice(),n=this._clines.fake.slice(),a=this._clines.rtof,h=d.length-1+e.y,u=a[h];let o=0;for(let c=0;c<=h;c++)a[c]===u&&(o+=this.strWidth(d[c]));o+=e.x,n[u]=n[u].slice(0,o)+i+n[u].slice(o);const g=this._wrapContent(n.join(` `),this.width-this.iwidth);i===` `&&(g.real.length===d.length&&e.y++,e.x=-this.strWidth(g[g.length-1+e.y])),this.value=n.join(` `),this.setCursor(e.x,e.y)}}this.value!==l&&this.screen.render()},s.prototype._typeScroll=function(){const i=this._clines.length-1+this.offsetY;this.setScroll(i)},s.prototype.getValue=function(){return this.value},s.prototype.setValue=function(i){i==null&&(i=this.value),this._value!==i&&(this.value=i,this._value=i,this.setContent(this.value),this._typeScroll(),this._updateCursor())},s.prototype.clearInput=s.prototype.clearValue=function(){return this.setValue("")},s.prototype.submit=function(){if(this.__listener)return this.__listener("\x1B",{name:"escape"})},s.prototype.cancel=function(){if(this.__listener)return this.__listener("\x1B",{name:"escape"})},s.prototype.render=function(){return this.setValue(),this._render()},s.prototype.editor=s.prototype.setEditor=s.prototype.readEditor=function(i){var t=this;if(this._reading){var f=this._callback,l=i;this._done("stop"),i=function(e,r){f&&f(e,r),l&&l(e,r)}}return i||(i=function(){}),this.screen.readEditor({value:this.value},function(e,r){return e?e.message==="Unsuccessful."?(t.screen.render(),t.readInput(i)):(t.screen.render(),t.readInput(i),i(e)):(t.setValue(r),t.screen.render(),i(null,r))})},module.exports=s; //# sourceMappingURL=textarea.js.map