@xterm/addon-search 0.16.0-beta.4 → 0.16.0-beta.41

This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
@@ -1,2 +1,2 @@
1
- !function(e,t){"object"==typeof exports&&"object"==typeof module?module.exports=t():"function"==typeof define&&define.amd?define([],t):"object"==typeof exports?exports.SearchAddon=t():e.SearchAddon=t()}(self,(()=>(()=>{"use strict";var e={345:(e,t)=>{Object.defineProperty(t,"__esModule",{value:!0}),t.runAndSubscribe=t.forwardEvent=t.EventEmitter=void 0,t.EventEmitter=class{constructor(){this._listeners=[],this._disposed=!1}get event(){return this._event||(this._event=e=>(this._listeners.push(e),{dispose:()=>{if(!this._disposed)for(let t=0;t<this._listeners.length;t++)if(this._listeners[t]===e)return void this._listeners.splice(t,1)}})),this._event}fire(e,t){const i=[];for(let e=0;e<this._listeners.length;e++)i.push(this._listeners[e]);for(let s=0;s<i.length;s++)i[s].call(void 0,e,t)}dispose(){this.clearListeners(),this._disposed=!0}clearListeners(){this._listeners&&(this._listeners.length=0)}},t.forwardEvent=function(e,t){return e((e=>t.fire(e)))},t.runAndSubscribe=function(e,t){return t(void 0),e((e=>t(e)))}},859:(e,t)=>{function i(e){for(const t of e)t.dispose();e.length=0}Object.defineProperty(t,"__esModule",{value:!0}),t.getDisposeArrayDisposable=t.disposeArray=t.toDisposable=t.MutableDisposable=t.Disposable=void 0,t.Disposable=class{constructor(){this._disposables=[],this._isDisposed=!1}dispose(){this._isDisposed=!0;for(const e of this._disposables)e.dispose();this._disposables.length=0}register(e){return this._disposables.push(e),e}unregister(e){const t=this._disposables.indexOf(e);-1!==t&&this._disposables.splice(t,1)}},t.MutableDisposable=class{constructor(){this._isDisposed=!1}get value(){return this._isDisposed?void 0:this._value}set value(e){this._isDisposed||e===this._value||(this._value?.dispose(),this._value=e)}clear(){this.value=void 0}dispose(){this._isDisposed=!0,this._value?.dispose(),this._value=void 0}},t.toDisposable=function(e){return{dispose:e}},t.disposeArray=i,t.getDisposeArrayDisposable=function(e){return{dispose:()=>i(e)}}}},t={};function i(s){var r=t[s];if(void 0!==r)return r.exports;var o=t[s]={exports:{}};return e[s](o,o.exports,i),o.exports}var s={};return(()=>{var e=s;Object.defineProperty(e,"__esModule",{value:!0}),e.SearchAddon=void 0;const t=i(345),r=i(859),o=" ~!@#$%^&*()+`-=[]{}|\\;:\"',./<>?";class n extends r.Disposable{constructor(e){super(),this._highlightedLines=new Set,this._highlightDecorations=[],this._selectedDecoration=this.register(new r.MutableDisposable),this._linesCacheTimeoutId=0,this._linesCacheDisposables=new r.MutableDisposable,this._onDidChangeResults=this.register(new t.EventEmitter),this.onDidChangeResults=this._onDidChangeResults.event,this._highlightLimit=e?.highlightLimit??1e3}activate(e){this._terminal=e,this.register(this._terminal.onWriteParsed((()=>this._updateMatches()))),this.register(this._terminal.onResize((()=>this._updateMatches()))),this.register((0,r.toDisposable)((()=>this.clearDecorations())))}_updateMatches(){this._highlightTimeout&&window.clearTimeout(this._highlightTimeout),this._cachedSearchTerm&&this._lastSearchOptions?.decorations&&(this._highlightTimeout=setTimeout((()=>{const e=this._cachedSearchTerm;this._cachedSearchTerm=void 0,this.findPrevious(e,{...this._lastSearchOptions,incremental:!0,noScroll:!0})}),200))}clearDecorations(e){this._selectedDecoration.clear(),(0,r.disposeArray)(this._highlightDecorations),this._highlightDecorations=[],this._highlightedLines.clear(),e||(this._cachedSearchTerm=void 0)}clearActiveDecoration(){this._selectedDecoration.clear()}findNext(e,t){if(!this._terminal)throw new Error("Cannot use addon until it has been loaded");const i=!this._lastSearchOptions||this._didOptionsChange(this._lastSearchOptions,t);this._lastSearchOptions=t,t?.decorations&&(void 0===this._cachedSearchTerm||e!==this._cachedSearchTerm||i)&&this._highlightAllMatches(e,t);const s=this._findNextAndSelect(e,t);return this._fireResults(t),this._cachedSearchTerm=e,s}_highlightAllMatches(e,t){if(!this._terminal)throw new Error("Cannot use addon until it has been loaded");if(!e||0===e.length)return void this.clearDecorations();t=t||{},this.clearDecorations(!0);const i=[];let s,r=this._find(e,0,0,t);for(;r&&(s?.row!==r.row||s?.col!==r.col)&&!(i.length>=this._highlightLimit);)s=r,i.push(s),r=this._find(e,s.col+s.term.length>=this._terminal.cols?s.row+1:s.row,s.col+s.term.length>=this._terminal.cols?0:s.col+1,t);for(const e of i){const i=this._createResultDecoration(e,t.decorations);i&&(this._highlightedLines.add(i.marker.line),this._highlightDecorations.push({decoration:i,match:e,dispose(){i.dispose()}}))}}_find(e,t,i,s){if(!this._terminal||!e||0===e.length)return this._terminal?.clearSelection(),void this.clearDecorations();if(i>this._terminal.cols)throw new Error(`Invalid col: ${i} to search in terminal of ${this._terminal.cols} cols`);let r;this._initLinesCache();const o={startRow:t,startCol:i};if(r=this._findInLine(e,o,s),!r)for(let i=t+1;i<this._terminal.buffer.active.baseY+this._terminal.rows&&(o.startRow=i,o.startCol=0,r=this._findInLine(e,o,s),!r);i++);return r}_findNextAndSelect(e,t){if(!this._terminal||!e||0===e.length)return this._terminal?.clearSelection(),this.clearDecorations(),!1;const i=this._terminal.getSelectionPosition();this._terminal.clearSelection();let s=0,r=0;i&&(this._cachedSearchTerm===e?(s=i.end.x,r=i.end.y):(s=i.start.x,r=i.start.y)),this._initLinesCache();const o={startRow:r,startCol:s};let n=this._findInLine(e,o,t);if(!n)for(let i=r+1;i<this._terminal.buffer.active.baseY+this._terminal.rows&&(o.startRow=i,o.startCol=0,n=this._findInLine(e,o,t),!n);i++);if(!n&&0!==r)for(let i=0;i<r&&(o.startRow=i,o.startCol=0,n=this._findInLine(e,o,t),!n);i++);return!n&&i&&(o.startRow=i.start.y,o.startCol=0,n=this._findInLine(e,o,t)),this._selectResult(n,t?.decorations,t?.noScroll)}findPrevious(e,t){if(!this._terminal)throw new Error("Cannot use addon until it has been loaded");const i=!this._lastSearchOptions||this._didOptionsChange(this._lastSearchOptions,t);this._lastSearchOptions=t,t?.decorations&&(void 0===this._cachedSearchTerm||e!==this._cachedSearchTerm||i)&&this._highlightAllMatches(e,t);const s=this._findPreviousAndSelect(e,t);return this._fireResults(t),this._cachedSearchTerm=e,s}_didOptionsChange(e,t){return!!t&&(e.caseSensitive!==t.caseSensitive||e.regex!==t.regex||e.wholeWord!==t.wholeWord)}_fireResults(e){if(e?.decorations){let e=-1;if(this._selectedDecoration.value){const t=this._selectedDecoration.value.match;for(let i=0;i<this._highlightDecorations.length;i++){const s=this._highlightDecorations[i].match;if(s.row===t.row&&s.col===t.col&&s.size===t.size){e=i;break}}}this._onDidChangeResults.fire({resultIndex:e,resultCount:this._highlightDecorations.length})}}_findPreviousAndSelect(e,t){if(!this._terminal)throw new Error("Cannot use addon until it has been loaded");if(!this._terminal||!e||0===e.length)return this._terminal?.clearSelection(),this.clearDecorations(),!1;const i=this._terminal.getSelectionPosition();this._terminal.clearSelection();let s=this._terminal.buffer.active.baseY+this._terminal.rows-1,r=this._terminal.cols;const o=!0;this._initLinesCache();const n={startRow:s,startCol:r};let h;if(i&&(n.startRow=s=i.start.y,n.startCol=r=i.start.x,this._cachedSearchTerm!==e&&(h=this._findInLine(e,n,t,!1),h||(n.startRow=s=i.end.y,n.startCol=r=i.end.x))),h||(h=this._findInLine(e,n,t,o)),!h){n.startCol=Math.max(n.startCol,this._terminal.cols);for(let i=s-1;i>=0&&(n.startRow=i,h=this._findInLine(e,n,t,o),!h);i--);}if(!h&&s!==this._terminal.buffer.active.baseY+this._terminal.rows-1)for(let i=this._terminal.buffer.active.baseY+this._terminal.rows-1;i>=s&&(n.startRow=i,h=this._findInLine(e,n,t,o),!h);i--);return this._selectResult(h,t?.decorations,t?.noScroll)}_initLinesCache(){const e=this._terminal;this._linesCache||(this._linesCache=new Array(e.buffer.active.length),this._linesCacheDisposables.value=(0,r.getDisposeArrayDisposable)([e.onLineFeed((()=>this._destroyLinesCache())),e.onCursorMove((()=>this._destroyLinesCache())),e.onResize((()=>this._destroyLinesCache()))])),window.clearTimeout(this._linesCacheTimeoutId),this._linesCacheTimeoutId=window.setTimeout((()=>this._destroyLinesCache()),15e3)}_destroyLinesCache(){this._linesCache=void 0,this._linesCacheDisposables.clear(),this._linesCacheTimeoutId&&(window.clearTimeout(this._linesCacheTimeoutId),this._linesCacheTimeoutId=0)}_isWholeWord(e,t,i){return(0===e||o.includes(t[e-1]))&&(e+i.length===t.length||o.includes(t[e+i.length]))}_findInLine(e,t,i={},s=!1){const r=this._terminal,o=t.startRow,n=t.startCol,h=r.buffer.active.getLine(o);if(h?.isWrapped)return s?void(t.startCol+=r.cols):(t.startRow--,t.startCol+=r.cols,this._findInLine(e,t,i));let a=this._linesCache?.[o];a||(a=this._translateBufferLineToStringWithWrap(o,!0),this._linesCache&&(this._linesCache[o]=a));const[l,c]=a,d=this._bufferColsToStringOffset(o,n),_=i.caseSensitive?e:e.toLowerCase(),u=i.caseSensitive?l:l.toLowerCase();let f=-1;if(i.regex){const t=RegExp(_,"g");let i;if(s)for(;i=t.exec(u.slice(0,d));)f=t.lastIndex-i[0].length,e=i[0],t.lastIndex-=e.length-1;else i=t.exec(u.slice(d)),i&&i[0].length>0&&(f=d+(t.lastIndex-i[0].length),e=i[0])}else s?d-_.length>=0&&(f=u.lastIndexOf(_,d-_.length)):f=u.indexOf(_,d);if(f>=0){if(i.wholeWord&&!this._isWholeWord(f,u,e))return;let t=0;for(;t<c.length-1&&f>=c[t+1];)t++;let s=t;for(;s<c.length-1&&f+e.length>=c[s+1];)s++;const n=f-c[t],h=f+e.length-c[s],a=this._stringLengthToBufferSize(o+t,n);return{term:e,col:a,row:o+t,size:this._stringLengthToBufferSize(o+s,h)-a+r.cols*(s-t)}}}_stringLengthToBufferSize(e,t){const i=this._terminal.buffer.active.getLine(e);if(!i)return 0;for(let e=0;e<t;e++){const s=i.getCell(e);if(!s)break;const r=s.getChars();r.length>1&&(t-=r.length-1);const o=i.getCell(e+1);o&&0===o.getWidth()&&t++}return t}_bufferColsToStringOffset(e,t){const i=this._terminal;let s=e,r=0,o=i.buffer.active.getLine(s);for(;t>0&&o;){for(let e=0;e<t&&e<i.cols;e++){const t=o.getCell(e);if(!t)break;t.getWidth()&&(r+=0===t.getCode()?1:t.getChars().length)}if(s++,o=i.buffer.active.getLine(s),o&&!o.isWrapped)break;t-=i.cols}return r}_translateBufferLineToStringWithWrap(e,t){const i=this._terminal,s=[],r=[0];let o=i.buffer.active.getLine(e);for(;o;){const n=i.buffer.active.getLine(e+1),h=!!n&&n.isWrapped;let a=o.translateToString(!h&&t);if(h&&n){const e=o.getCell(o.length-1);e&&0===e.getCode()&&1===e.getWidth()&&2===n.getCell(0)?.getWidth()&&(a=a.slice(0,-1))}if(s.push(a),!h)break;r.push(r[r.length-1]+a.length),e++,o=n}return[s.join(""),r]}_selectResult(e,t,i){const s=this._terminal;if(this._selectedDecoration.clear(),!e)return s.clearSelection(),!1;if(s.select(e.col,e.row,e.size),t){const i=s.registerMarker(-s.buffer.active.baseY-s.buffer.active.cursorY+e.row);if(i){const o=s.registerDecoration({marker:i,x:e.col,width:e.size,backgroundColor:t.activeMatchBackground,layer:"top",overviewRulerOptions:{color:t.activeMatchColorOverviewRuler}});if(o){const s=[];s.push(i),s.push(o.onRender((e=>this._applyStyles(e,t.activeMatchBorder,!0)))),s.push(o.onDispose((()=>(0,r.disposeArray)(s)))),this._selectedDecoration.value={decoration:o,match:e,dispose(){o.dispose()}}}}}if(!i&&(e.row>=s.buffer.active.viewportY+s.rows||e.row<s.buffer.active.viewportY)){let t=e.row-s.buffer.active.viewportY;t-=Math.floor(s.rows/2),s.scrollLines(t)}return!0}_applyStyles(e,t,i){e.classList.contains("xterm-find-result-decoration")||(e.classList.add("xterm-find-result-decoration"),t&&(e.style.outline=`1px solid ${t}`)),i&&e.classList.add("xterm-find-active-result-decoration")}_createResultDecoration(e,t){const i=this._terminal,s=i.registerMarker(-i.buffer.active.baseY-i.buffer.active.cursorY+e.row);if(!s)return;const o=i.registerDecoration({marker:s,x:e.col,width:e.size,backgroundColor:t.matchBackground,overviewRulerOptions:this._highlightedLines.has(s.line)?void 0:{color:t.matchOverviewRuler,position:"center"}});if(o){const e=[];e.push(s),e.push(o.onRender((e=>this._applyStyles(e,t.matchBorder,!1)))),e.push(o.onDispose((()=>(0,r.disposeArray)(e))))}return o}}e.SearchAddon=n})(),s})()));
1
+ !function(e,t){"object"==typeof exports&&"object"==typeof module?module.exports=t():"function"==typeof define&&define.amd?define([],t):"object"==typeof exports?exports.SearchAddon=t():e.SearchAddon=t()}(globalThis,(()=>(()=>{"use strict";var e={345:(e,t)=>{Object.defineProperty(t,"__esModule",{value:!0}),t.EventEmitter=void 0,t.forwardEvent=function(e,t){return e((e=>t.fire(e)))},t.runAndSubscribe=function(e,t){return t(void 0),e((e=>t(e)))},t.EventEmitter=class{constructor(){this._listeners=new Set,this._disposed=!1}get event(){return this._event||(this._event=e=>(this._listeners.add(e),{dispose:()=>{this._disposed||this._listeners.delete(e)}})),this._event}fire(e,t){const i=[];for(const e of this._listeners.values())i.push(e);for(let s=0;s<i.length;s++)i[s].call(void 0,e,t)}dispose(){this.clearListeners(),this._disposed=!0}clearListeners(){this._listeners&&this._listeners.clear()}}},859:(e,t)=>{function i(e){for(const t of e)t.dispose();e.length=0}Object.defineProperty(t,"__esModule",{value:!0}),t.MutableDisposable=t.Disposable=void 0,t.toDisposable=function(e){return{dispose:e}},t.disposeArray=i,t.getDisposeArrayDisposable=function(e){return{dispose:()=>i(e)}},t.Disposable=class{constructor(){this._disposables=[],this._isDisposed=!1}dispose(){this._isDisposed=!0;for(const e of this._disposables)e.dispose();this._disposables.length=0}register(e){return this._disposables.push(e),e}unregister(e){const t=this._disposables.indexOf(e);-1!==t&&this._disposables.splice(t,1)}},t.MutableDisposable=class{constructor(){this._isDisposed=!1}get value(){return this._isDisposed?void 0:this._value}set value(e){this._isDisposed||e===this._value||(this._value?.dispose(),this._value=e)}clear(){this.value=void 0}dispose(){this._isDisposed=!0,this._value?.dispose(),this._value=void 0}}}},t={};function i(s){var r=t[s];if(void 0!==r)return r.exports;var o=t[s]={exports:{}};return e[s](o,o.exports,i),o.exports}var s={};return(()=>{var e=s;Object.defineProperty(e,"__esModule",{value:!0}),e.SearchAddon=void 0;const t=i(345),r=i(859),o=" ~!@#$%^&*()+`-=[]{}|\\;:\"',./<>?";class n extends r.Disposable{constructor(e){super(),this._highlightedLines=new Set,this._highlightDecorations=[],this._selectedDecoration=this.register(new r.MutableDisposable),this._linesCacheTimeoutId=0,this._linesCacheDisposables=new r.MutableDisposable,this._onDidChangeResults=this.register(new t.EventEmitter),this.onDidChangeResults=this._onDidChangeResults.event,this._highlightLimit=e?.highlightLimit??1e3}activate(e){this._terminal=e,this.register(this._terminal.onWriteParsed((()=>this._updateMatches()))),this.register(this._terminal.onResize((()=>this._updateMatches()))),this.register((0,r.toDisposable)((()=>this.clearDecorations())))}_updateMatches(){this._highlightTimeout&&window.clearTimeout(this._highlightTimeout),this._cachedSearchTerm&&this._lastSearchOptions?.decorations&&(this._highlightTimeout=setTimeout((()=>{const e=this._cachedSearchTerm;this._cachedSearchTerm=void 0,this.findPrevious(e,{...this._lastSearchOptions,incremental:!0,noScroll:!0})}),200))}clearDecorations(e){this._selectedDecoration.clear(),(0,r.disposeArray)(this._highlightDecorations),this._highlightDecorations=[],this._highlightedLines.clear(),e||(this._cachedSearchTerm=void 0)}clearActiveDecoration(){this._selectedDecoration.clear()}findNext(e,t){if(!this._terminal)throw new Error("Cannot use addon until it has been loaded");const i=!this._lastSearchOptions||this._didOptionsChange(this._lastSearchOptions,t);this._lastSearchOptions=t,t?.decorations&&(void 0===this._cachedSearchTerm||e!==this._cachedSearchTerm||i)&&this._highlightAllMatches(e,t);const s=this._findNextAndSelect(e,t);return this._fireResults(t),this._cachedSearchTerm=e,s}_highlightAllMatches(e,t){if(!this._terminal)throw new Error("Cannot use addon until it has been loaded");if(!e||0===e.length)return void this.clearDecorations();t=t||{},this.clearDecorations(!0);const i=[];let s,r=this._find(e,0,0,t);for(;r&&(s?.row!==r.row||s?.col!==r.col)&&!(i.length>=this._highlightLimit);)s=r,i.push(s),r=this._find(e,s.col+s.term.length>=this._terminal.cols?s.row+1:s.row,s.col+s.term.length>=this._terminal.cols?0:s.col+1,t);for(const e of i){const i=this._createResultDecoration(e,t.decorations);i&&(this._highlightedLines.add(i.marker.line),this._highlightDecorations.push({decoration:i,match:e,dispose(){i.dispose()}}))}}_find(e,t,i,s){if(!this._terminal||!e||0===e.length)return this._terminal?.clearSelection(),void this.clearDecorations();if(i>this._terminal.cols)throw new Error(`Invalid col: ${i} to search in terminal of ${this._terminal.cols} cols`);let r;this._initLinesCache();const o={startRow:t,startCol:i};if(r=this._findInLine(e,o,s),!r)for(let i=t+1;i<this._terminal.buffer.active.baseY+this._terminal.rows&&(o.startRow=i,o.startCol=0,r=this._findInLine(e,o,s),!r);i++);return r}_findNextAndSelect(e,t){if(!this._terminal||!e||0===e.length)return this._terminal?.clearSelection(),this.clearDecorations(),!1;const i=this._terminal.getSelectionPosition();this._terminal.clearSelection();let s=0,r=0;i&&(this._cachedSearchTerm===e?(s=i.end.x,r=i.end.y):(s=i.start.x,r=i.start.y)),this._initLinesCache();const o={startRow:r,startCol:s};let n=this._findInLine(e,o,t);if(!n)for(let i=r+1;i<this._terminal.buffer.active.baseY+this._terminal.rows&&(o.startRow=i,o.startCol=0,n=this._findInLine(e,o,t),!n);i++);if(!n&&0!==r)for(let i=0;i<r&&(o.startRow=i,o.startCol=0,n=this._findInLine(e,o,t),!n);i++);return!n&&i&&(o.startRow=i.start.y,o.startCol=0,n=this._findInLine(e,o,t)),this._selectResult(n,t?.decorations,t?.noScroll)}findPrevious(e,t){if(!this._terminal)throw new Error("Cannot use addon until it has been loaded");const i=!this._lastSearchOptions||this._didOptionsChange(this._lastSearchOptions,t);this._lastSearchOptions=t,t?.decorations&&(void 0===this._cachedSearchTerm||e!==this._cachedSearchTerm||i)&&this._highlightAllMatches(e,t);const s=this._findPreviousAndSelect(e,t);return this._fireResults(t),this._cachedSearchTerm=e,s}_didOptionsChange(e,t){return!!t&&(e.caseSensitive!==t.caseSensitive||e.regex!==t.regex||e.wholeWord!==t.wholeWord)}_fireResults(e){if(e?.decorations){let e=-1;if(this._selectedDecoration.value){const t=this._selectedDecoration.value.match;for(let i=0;i<this._highlightDecorations.length;i++){const s=this._highlightDecorations[i].match;if(s.row===t.row&&s.col===t.col&&s.size===t.size){e=i;break}}}this._onDidChangeResults.fire({resultIndex:e,resultCount:this._highlightDecorations.length})}}_findPreviousAndSelect(e,t){if(!this._terminal)throw new Error("Cannot use addon until it has been loaded");if(!this._terminal||!e||0===e.length)return this._terminal?.clearSelection(),this.clearDecorations(),!1;const i=this._terminal.getSelectionPosition();this._terminal.clearSelection();let s=this._terminal.buffer.active.baseY+this._terminal.rows-1,r=this._terminal.cols;const o=!0;this._initLinesCache();const n={startRow:s,startCol:r};let h;if(i&&(n.startRow=s=i.start.y,n.startCol=r=i.start.x,this._cachedSearchTerm!==e&&(h=this._findInLine(e,n,t,!1),h||(n.startRow=s=i.end.y,n.startCol=r=i.end.x))),h||(h=this._findInLine(e,n,t,o)),!h){n.startCol=Math.max(n.startCol,this._terminal.cols);for(let i=s-1;i>=0&&(n.startRow=i,h=this._findInLine(e,n,t,o),!h);i--);}if(!h&&s!==this._terminal.buffer.active.baseY+this._terminal.rows-1)for(let i=this._terminal.buffer.active.baseY+this._terminal.rows-1;i>=s&&(n.startRow=i,h=this._findInLine(e,n,t,o),!h);i--);return this._selectResult(h,t?.decorations,t?.noScroll)}_initLinesCache(){const e=this._terminal;this._linesCache||(this._linesCache=new Array(e.buffer.active.length),this._linesCacheDisposables.value=(0,r.getDisposeArrayDisposable)([e.onLineFeed((()=>this._destroyLinesCache())),e.onCursorMove((()=>this._destroyLinesCache())),e.onResize((()=>this._destroyLinesCache()))])),window.clearTimeout(this._linesCacheTimeoutId),this._linesCacheTimeoutId=window.setTimeout((()=>this._destroyLinesCache()),15e3)}_destroyLinesCache(){this._linesCache=void 0,this._linesCacheDisposables.clear(),this._linesCacheTimeoutId&&(window.clearTimeout(this._linesCacheTimeoutId),this._linesCacheTimeoutId=0)}_isWholeWord(e,t,i){return(0===e||o.includes(t[e-1]))&&(e+i.length===t.length||o.includes(t[e+i.length]))}_findInLine(e,t,i={},s=!1){const r=this._terminal,o=t.startRow,n=t.startCol,h=r.buffer.active.getLine(o);if(h?.isWrapped)return s?void(t.startCol+=r.cols):(t.startRow--,t.startCol+=r.cols,this._findInLine(e,t,i));let a=this._linesCache?.[o];a||(a=this._translateBufferLineToStringWithWrap(o,!0),this._linesCache&&(this._linesCache[o]=a));const[l,c]=a,d=this._bufferColsToStringOffset(o,n),_=i.caseSensitive?e:e.toLowerCase(),u=i.caseSensitive?l:l.toLowerCase();let f=-1;if(i.regex){const t=RegExp(_,"g");let i;if(s)for(;i=t.exec(u.slice(0,d));)f=t.lastIndex-i[0].length,e=i[0],t.lastIndex-=e.length-1;else i=t.exec(u.slice(d)),i&&i[0].length>0&&(f=d+(t.lastIndex-i[0].length),e=i[0])}else s?d-_.length>=0&&(f=u.lastIndexOf(_,d-_.length)):f=u.indexOf(_,d);if(f>=0){if(i.wholeWord&&!this._isWholeWord(f,u,e))return;let t=0;for(;t<c.length-1&&f>=c[t+1];)t++;let s=t;for(;s<c.length-1&&f+e.length>=c[s+1];)s++;const n=f-c[t],h=f+e.length-c[s],a=this._stringLengthToBufferSize(o+t,n);return{term:e,col:a,row:o+t,size:this._stringLengthToBufferSize(o+s,h)-a+r.cols*(s-t)}}}_stringLengthToBufferSize(e,t){const i=this._terminal.buffer.active.getLine(e);if(!i)return 0;for(let e=0;e<t;e++){const s=i.getCell(e);if(!s)break;const r=s.getChars();r.length>1&&(t-=r.length-1);const o=i.getCell(e+1);o&&0===o.getWidth()&&t++}return t}_bufferColsToStringOffset(e,t){const i=this._terminal;let s=e,r=0,o=i.buffer.active.getLine(s);for(;t>0&&o;){for(let e=0;e<t&&e<i.cols;e++){const t=o.getCell(e);if(!t)break;t.getWidth()&&(r+=0===t.getCode()?1:t.getChars().length)}if(s++,o=i.buffer.active.getLine(s),o&&!o.isWrapped)break;t-=i.cols}return r}_translateBufferLineToStringWithWrap(e,t){const i=this._terminal,s=[],r=[0];let o=i.buffer.active.getLine(e);for(;o;){const n=i.buffer.active.getLine(e+1),h=!!n&&n.isWrapped;let a=o.translateToString(!h&&t);if(h&&n){const e=o.getCell(o.length-1);e&&0===e.getCode()&&1===e.getWidth()&&2===n.getCell(0)?.getWidth()&&(a=a.slice(0,-1))}if(s.push(a),!h)break;r.push(r[r.length-1]+a.length),e++,o=n}return[s.join(""),r]}_selectResult(e,t,i){const s=this._terminal;if(this._selectedDecoration.clear(),!e)return s.clearSelection(),!1;if(s.select(e.col,e.row,e.size),t){const i=s.registerMarker(-s.buffer.active.baseY-s.buffer.active.cursorY+e.row);if(i){const o=s.registerDecoration({marker:i,x:e.col,width:e.size,backgroundColor:t.activeMatchBackground,layer:"top",overviewRulerOptions:{color:t.activeMatchColorOverviewRuler}});if(o){const s=[];s.push(i),s.push(o.onRender((e=>this._applyStyles(e,t.activeMatchBorder,!0)))),s.push(o.onDispose((()=>(0,r.disposeArray)(s)))),this._selectedDecoration.value={decoration:o,match:e,dispose(){o.dispose()}}}}}if(!i&&(e.row>=s.buffer.active.viewportY+s.rows||e.row<s.buffer.active.viewportY)){let t=e.row-s.buffer.active.viewportY;t-=Math.floor(s.rows/2),s.scrollLines(t)}return!0}_applyStyles(e,t,i){e.classList.contains("xterm-find-result-decoration")||(e.classList.add("xterm-find-result-decoration"),t&&(e.style.outline=`1px solid ${t}`)),i&&e.classList.add("xterm-find-active-result-decoration")}_createResultDecoration(e,t){const i=this._terminal,s=i.registerMarker(-i.buffer.active.baseY-i.buffer.active.cursorY+e.row);if(!s)return;const o=i.registerDecoration({marker:s,x:e.col,width:e.size,backgroundColor:t.matchBackground,overviewRulerOptions:this._highlightedLines.has(s.line)?void 0:{color:t.matchOverviewRuler,position:"center"}});if(o){const e=[];e.push(s),e.push(o.onRender((e=>this._applyStyles(e,t.matchBorder,!1)))),e.push(o.onDispose((()=>(0,r.disposeArray)(e))))}return o}}e.SearchAddon=n})(),s})()));
2
2
  //# sourceMappingURL=addon-search.js.map
@@ -1 +1 @@
1
- {"version":3,"file":"addon-search.js","mappings":"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","sources":["webpack://SearchAddon/webpack/universalModuleDefinition","webpack://SearchAddon/../../src/common/EventEmitter.ts","webpack://SearchAddon/../../src/common/Lifecycle.ts","webpack://SearchAddon/webpack/bootstrap","webpack://SearchAddon/./src/SearchAddon.ts"],"sourcesContent":["(function webpackUniversalModuleDefinition(root, factory) {\n\tif(typeof exports === 'object' && typeof module === 'object')\n\t\tmodule.exports = factory();\n\telse if(typeof define === 'function' && define.amd)\n\t\tdefine([], factory);\n\telse if(typeof exports === 'object')\n\t\texports[\"SearchAddon\"] = factory();\n\telse\n\t\troot[\"SearchAddon\"] = factory();\n})(self, () => {\nreturn ","/**\n * Copyright (c) 2019 The xterm.js authors. All rights reserved.\n * @license MIT\n */\n\nimport { IDisposable } from 'common/Types';\n\ninterface IListener<T, U = void> {\n (arg1: T, arg2: U): void;\n}\n\nexport interface IEvent<T, U = void> {\n (listener: (arg1: T, arg2: U) => any): IDisposable;\n}\n\nexport interface IEventEmitter<T, U = void> {\n event: IEvent<T, U>;\n fire(arg1: T, arg2: U): void;\n dispose(): void;\n}\n\nexport class EventEmitter<T, U = void> implements IEventEmitter<T, U> {\n private _listeners: IListener<T, U>[] = [];\n private _event?: IEvent<T, U>;\n private _disposed: boolean = false;\n\n public get event(): IEvent<T, U> {\n if (!this._event) {\n this._event = (listener: (arg1: T, arg2: U) => any) => {\n this._listeners.push(listener);\n const disposable = {\n dispose: () => {\n if (!this._disposed) {\n for (let i = 0; i < this._listeners.length; i++) {\n if (this._listeners[i] === listener) {\n this._listeners.splice(i, 1);\n return;\n }\n }\n }\n }\n };\n return disposable;\n };\n }\n return this._event;\n }\n\n public fire(arg1: T, arg2: U): void {\n const queue: IListener<T, U>[] = [];\n for (let i = 0; i < this._listeners.length; i++) {\n queue.push(this._listeners[i]);\n }\n for (let i = 0; i < queue.length; i++) {\n queue[i].call(undefined, arg1, arg2);\n }\n }\n\n public dispose(): void {\n this.clearListeners();\n this._disposed = true;\n }\n\n public clearListeners(): void {\n if (this._listeners) {\n this._listeners.length = 0;\n }\n }\n}\n\nexport function forwardEvent<T>(from: IEvent<T>, to: IEventEmitter<T>): IDisposable {\n return from(e => to.fire(e));\n}\n\nexport function runAndSubscribe<T>(event: IEvent<T>, handler: (e: T | undefined) => any): IDisposable {\n handler(undefined);\n return event(e => handler(e));\n}\n","/**\n * Copyright (c) 2018 The xterm.js authors. All rights reserved.\n * @license MIT\n */\n\nimport { IDisposable } from 'common/Types';\n\n/**\n * A base class that can be extended to provide convenience methods for managing the lifecycle of an\n * object and its components.\n */\nexport abstract class Disposable implements IDisposable {\n protected _disposables: IDisposable[] = [];\n protected _isDisposed: boolean = false;\n\n /**\n * Disposes the object, triggering the `dispose` method on all registered IDisposables.\n */\n public dispose(): void {\n this._isDisposed = true;\n for (const d of this._disposables) {\n d.dispose();\n }\n this._disposables.length = 0;\n }\n\n /**\n * Registers a disposable object.\n * @param d The disposable to register.\n * @returns The disposable.\n */\n public register<T extends IDisposable>(d: T): T {\n this._disposables.push(d);\n return d;\n }\n\n /**\n * Unregisters a disposable object if it has been registered, if not do\n * nothing.\n * @param d The disposable to unregister.\n */\n public unregister<T extends IDisposable>(d: T): void {\n const index = this._disposables.indexOf(d);\n if (index !== -1) {\n this._disposables.splice(index, 1);\n }\n }\n}\n\nexport class MutableDisposable<T extends IDisposable> implements IDisposable {\n private _value?: T;\n private _isDisposed = false;\n\n /**\n * Gets the value if it exists.\n */\n public get value(): T | undefined {\n return this._isDisposed ? undefined : this._value;\n }\n\n /**\n * Sets the value, disposing of the old value if it exists.\n */\n public set value(value: T | undefined) {\n if (this._isDisposed || value === this._value) {\n return;\n }\n this._value?.dispose();\n this._value = value;\n }\n\n /**\n * Resets the stored value and disposes of the previously stored value.\n */\n public clear(): void {\n this.value = undefined;\n }\n\n public dispose(): void {\n this._isDisposed = true;\n this._value?.dispose();\n this._value = undefined;\n }\n}\n\n/**\n * Wrap a function in a disposable.\n */\nexport function toDisposable(f: () => void): IDisposable {\n return { dispose: f };\n}\n\n/**\n * Dispose of all disposables in an array and set its length to 0.\n */\nexport function disposeArray(disposables: IDisposable[]): void {\n for (const d of disposables) {\n d.dispose();\n }\n disposables.length = 0;\n}\n\n/**\n * Creates a disposable that will dispose of an array of disposables when disposed.\n */\nexport function getDisposeArrayDisposable(array: IDisposable[]): IDisposable {\n return { dispose: () => disposeArray(array) };\n}\n","// The module cache\nvar __webpack_module_cache__ = {};\n\n// The require function\nfunction __webpack_require__(moduleId) {\n\t// Check if module is in cache\n\tvar cachedModule = __webpack_module_cache__[moduleId];\n\tif (cachedModule !== undefined) {\n\t\treturn cachedModule.exports;\n\t}\n\t// Create a new module (and put it into the cache)\n\tvar module = __webpack_module_cache__[moduleId] = {\n\t\t// no module.id needed\n\t\t// no module.loaded needed\n\t\texports: {}\n\t};\n\n\t// Execute the module function\n\t__webpack_modules__[moduleId](module, module.exports, __webpack_require__);\n\n\t// Return the exports of the module\n\treturn module.exports;\n}\n\n","/**\n * Copyright (c) 2017 The xterm.js authors. All rights reserved.\n * @license MIT\n */\n\nimport type { Terminal, IDisposable, ITerminalAddon, IDecoration } from '@xterm/xterm';\nimport type { SearchAddon as ISearchApi } from '@xterm/addon-search';\nimport { EventEmitter } from 'common/EventEmitter';\nimport { Disposable, toDisposable, disposeArray, MutableDisposable, getDisposeArrayDisposable } from 'common/Lifecycle';\n\nexport interface ISearchOptions {\n regex?: boolean;\n wholeWord?: boolean;\n caseSensitive?: boolean;\n incremental?: boolean;\n decorations?: ISearchDecorationOptions;\n noScroll?: boolean;\n}\n\ninterface ISearchDecorationOptions {\n matchBackground?: string;\n matchBorder?: string;\n matchOverviewRuler: string;\n activeMatchBackground?: string;\n activeMatchBorder?: string;\n activeMatchColorOverviewRuler: string;\n}\n\nexport interface ISearchPosition {\n startCol: number;\n startRow: number;\n}\n\nexport interface ISearchAddonOptions {\n highlightLimit: number;\n}\n\nexport interface ISearchResult {\n term: string;\n col: number;\n row: number;\n size: number;\n}\n\ntype LineCacheEntry = [\n /**\n * The string representation of a line (as opposed to the buffer cell representation).\n */\n lineAsString: string,\n /**\n * The offsets where each line starts when the entry describes a wrapped line.\n */\n lineOffsets: number[]\n];\n\ninterface IHighlight extends IDisposable {\n decoration: IDecoration;\n match: ISearchResult;\n}\n\nconst NON_WORD_CHARACTERS = ' ~!@#$%^&*()+`-=[]{}|\\\\;:\"\\',./<>?';\nconst LINES_CACHE_TIME_TO_LIVE = 15 * 1000; // 15 secs\nconst DEFAULT_HIGHLIGHT_LIMIT = 1000;\n\nexport class SearchAddon extends Disposable implements ITerminalAddon , ISearchApi {\n private _terminal: Terminal | undefined;\n private _cachedSearchTerm: string | undefined;\n private _highlightedLines: Set<number> = new Set();\n private _highlightDecorations: IHighlight[] = [];\n private _selectedDecoration: MutableDisposable<IHighlight> = this.register(new MutableDisposable());\n private _highlightLimit: number;\n private _lastSearchOptions: ISearchOptions | undefined;\n private _highlightTimeout: number | undefined;\n /**\n * translateBufferLineToStringWithWrap is a fairly expensive call.\n * We memoize the calls into an array that has a time based ttl.\n * _linesCache is also invalidated when the terminal cursor moves.\n */\n private _linesCache: LineCacheEntry[] | undefined;\n private _linesCacheTimeoutId = 0;\n private _linesCacheDisposables = new MutableDisposable();\n\n private readonly _onDidChangeResults = this.register(new EventEmitter<{ resultIndex: number, resultCount: number }>());\n public readonly onDidChangeResults = this._onDidChangeResults.event;\n\n constructor(options?: Partial<ISearchAddonOptions>) {\n super();\n\n this._highlightLimit = options?.highlightLimit ?? DEFAULT_HIGHLIGHT_LIMIT;\n }\n\n public activate(terminal: Terminal): void {\n this._terminal = terminal;\n this.register(this._terminal.onWriteParsed(() => this._updateMatches()));\n this.register(this._terminal.onResize(() => this._updateMatches()));\n this.register(toDisposable(() => this.clearDecorations()));\n }\n\n private _updateMatches(): void {\n if (this._highlightTimeout) {\n window.clearTimeout(this._highlightTimeout);\n }\n if (this._cachedSearchTerm && this._lastSearchOptions?.decorations) {\n this._highlightTimeout = setTimeout(() => {\n const term = this._cachedSearchTerm;\n this._cachedSearchTerm = undefined;\n this.findPrevious(term!, { ...this._lastSearchOptions, incremental: true, noScroll: true });\n }, 200);\n }\n }\n\n public clearDecorations(retainCachedSearchTerm?: boolean): void {\n this._selectedDecoration.clear();\n disposeArray(this._highlightDecorations);\n this._highlightDecorations = [];\n this._highlightedLines.clear();\n if (!retainCachedSearchTerm) {\n this._cachedSearchTerm = undefined;\n }\n }\n\n public clearActiveDecoration(): void {\n this._selectedDecoration.clear();\n }\n\n /**\n * Find the next instance of the term, then scroll to and select it. If it\n * doesn't exist, do nothing.\n * @param term The search term.\n * @param searchOptions Search options.\n * @returns Whether a result was found.\n */\n public findNext(term: string, searchOptions?: ISearchOptions): boolean {\n if (!this._terminal) {\n throw new Error('Cannot use addon until it has been loaded');\n }\n const didOptionsChanged = this._lastSearchOptions ? this._didOptionsChange(this._lastSearchOptions, searchOptions) : true;\n this._lastSearchOptions = searchOptions;\n if (searchOptions?.decorations) {\n if (this._cachedSearchTerm === undefined || term !== this._cachedSearchTerm || didOptionsChanged) {\n this._highlightAllMatches(term, searchOptions);\n }\n }\n\n const found = this._findNextAndSelect(term, searchOptions);\n this._fireResults(searchOptions);\n this._cachedSearchTerm = term;\n\n return found;\n }\n\n private _highlightAllMatches(term: string, searchOptions: ISearchOptions): void {\n if (!this._terminal) {\n throw new Error('Cannot use addon until it has been loaded');\n }\n if (!term || term.length === 0) {\n this.clearDecorations();\n return;\n }\n searchOptions = searchOptions || {};\n\n // new search, clear out the old decorations\n this.clearDecorations(true);\n\n const searchResultsWithHighlight: ISearchResult[] = [];\n let prevResult: ISearchResult | undefined = undefined;\n let result = this._find(term, 0, 0, searchOptions);\n while (result && (prevResult?.row !== result.row || prevResult?.col !== result.col)) {\n if (searchResultsWithHighlight.length >= this._highlightLimit) {\n break;\n }\n prevResult = result;\n searchResultsWithHighlight.push(prevResult);\n result = this._find(\n term,\n prevResult.col + prevResult.term.length >= this._terminal.cols ? prevResult.row + 1 : prevResult.row,\n prevResult.col + prevResult.term.length >= this._terminal.cols ? 0 : prevResult.col + 1,\n searchOptions\n );\n }\n for (const match of searchResultsWithHighlight) {\n const decoration = this._createResultDecoration(match, searchOptions.decorations!);\n if (decoration) {\n this._highlightedLines.add(decoration.marker.line);\n this._highlightDecorations.push({ decoration, match, dispose() { decoration.dispose(); } });\n }\n }\n }\n\n private _find(term: string, startRow: number, startCol: number, searchOptions?: ISearchOptions): ISearchResult | undefined {\n if (!this._terminal || !term || term.length === 0) {\n this._terminal?.clearSelection();\n this.clearDecorations();\n return undefined;\n }\n if (startCol > this._terminal.cols) {\n throw new Error(`Invalid col: ${startCol} to search in terminal of ${this._terminal.cols} cols`);\n }\n\n let result: ISearchResult | undefined = undefined;\n\n this._initLinesCache();\n\n const searchPosition: ISearchPosition = {\n startRow,\n startCol\n };\n\n // Search startRow\n result = this._findInLine(term, searchPosition, searchOptions);\n // Search from startRow + 1 to end\n if (!result) {\n\n for (let y = startRow + 1; y < this._terminal.buffer.active.baseY + this._terminal.rows; y++) {\n searchPosition.startRow = y;\n searchPosition.startCol = 0;\n // If the current line is wrapped line, increase index of column to ignore the previous scan\n // Otherwise, reset beginning column index to zero with set new unwrapped line index\n result = this._findInLine(term, searchPosition, searchOptions);\n if (result) {\n break;\n }\n }\n }\n return result;\n }\n\n private _findNextAndSelect(term: string, searchOptions?: ISearchOptions): boolean {\n if (!this._terminal || !term || term.length === 0) {\n this._terminal?.clearSelection();\n this.clearDecorations();\n return false;\n }\n\n const prevSelectedPos = this._terminal.getSelectionPosition();\n this._terminal.clearSelection();\n\n let startCol = 0;\n let startRow = 0;\n if (prevSelectedPos) {\n if (this._cachedSearchTerm === term) {\n startCol = prevSelectedPos.end.x;\n startRow = prevSelectedPos.end.y;\n } else {\n startCol = prevSelectedPos.start.x;\n startRow = prevSelectedPos.start.y;\n }\n }\n\n this._initLinesCache();\n\n const searchPosition: ISearchPosition = {\n startRow,\n startCol\n };\n\n // Search startRow\n let result = this._findInLine(term, searchPosition, searchOptions);\n // Search from startRow + 1 to end\n if (!result) {\n\n for (let y = startRow + 1; y < this._terminal.buffer.active.baseY + this._terminal.rows; y++) {\n searchPosition.startRow = y;\n searchPosition.startCol = 0;\n // If the current line is wrapped line, increase index of column to ignore the previous scan\n // Otherwise, reset beginning column index to zero with set new unwrapped line index\n result = this._findInLine(term, searchPosition, searchOptions);\n if (result) {\n break;\n }\n }\n }\n // If we hit the bottom and didn't search from the very top wrap back up\n if (!result && startRow !== 0) {\n for (let y = 0; y < startRow; y++) {\n searchPosition.startRow = y;\n searchPosition.startCol = 0;\n result = this._findInLine(term, searchPosition, searchOptions);\n if (result) {\n break;\n }\n }\n }\n\n // If there is only one result, wrap back and return selection if it exists.\n if (!result && prevSelectedPos) {\n searchPosition.startRow = prevSelectedPos.start.y;\n searchPosition.startCol = 0;\n result = this._findInLine(term, searchPosition, searchOptions);\n }\n\n // Set selection and scroll if a result was found\n return this._selectResult(result, searchOptions?.decorations, searchOptions?.noScroll);\n }\n /**\n * Find the previous instance of the term, then scroll to and select it. If it\n * doesn't exist, do nothing.\n * @param term The search term.\n * @param searchOptions Search options.\n * @returns Whether a result was found.\n */\n public findPrevious(term: string, searchOptions?: ISearchOptions): boolean {\n if (!this._terminal) {\n throw new Error('Cannot use addon until it has been loaded');\n }\n const didOptionsChanged = this._lastSearchOptions ? this._didOptionsChange(this._lastSearchOptions, searchOptions) : true;\n this._lastSearchOptions = searchOptions;\n if (searchOptions?.decorations) {\n if (this._cachedSearchTerm === undefined || term !== this._cachedSearchTerm || didOptionsChanged) {\n this._highlightAllMatches(term, searchOptions);\n }\n }\n\n const found = this._findPreviousAndSelect(term, searchOptions);\n this._fireResults(searchOptions);\n this._cachedSearchTerm = term;\n\n return found;\n }\n\n private _didOptionsChange(lastSearchOptions: ISearchOptions, searchOptions?: ISearchOptions): boolean {\n if (!searchOptions) {\n return false;\n }\n if (lastSearchOptions.caseSensitive !== searchOptions.caseSensitive) {\n return true;\n }\n if (lastSearchOptions.regex !== searchOptions.regex) {\n return true;\n }\n if (lastSearchOptions.wholeWord !== searchOptions.wholeWord) {\n return true;\n }\n return false;\n }\n\n private _fireResults(searchOptions?: ISearchOptions): void {\n if (searchOptions?.decorations) {\n let resultIndex = -1;\n if (this._selectedDecoration.value) {\n const selectedMatch = this._selectedDecoration.value.match;\n for (let i = 0; i < this._highlightDecorations.length; i++) {\n const match = this._highlightDecorations[i].match;\n if (match.row === selectedMatch.row && match.col === selectedMatch.col && match.size === selectedMatch.size) {\n resultIndex = i;\n break;\n }\n }\n }\n this._onDidChangeResults.fire({ resultIndex, resultCount: this._highlightDecorations.length });\n }\n }\n\n private _findPreviousAndSelect(term: string, searchOptions?: ISearchOptions): boolean {\n if (!this._terminal) {\n throw new Error('Cannot use addon until it has been loaded');\n }\n if (!this._terminal || !term || term.length === 0) {\n this._terminal?.clearSelection();\n this.clearDecorations();\n return false;\n }\n\n const prevSelectedPos = this._terminal.getSelectionPosition();\n this._terminal.clearSelection();\n\n let startRow = this._terminal.buffer.active.baseY + this._terminal.rows - 1;\n let startCol = this._terminal.cols;\n const isReverseSearch = true;\n\n this._initLinesCache();\n const searchPosition: ISearchPosition = {\n startRow,\n startCol\n };\n\n let result: ISearchResult | undefined;\n if (prevSelectedPos) {\n searchPosition.startRow = startRow = prevSelectedPos.start.y;\n searchPosition.startCol = startCol = prevSelectedPos.start.x;\n if (this._cachedSearchTerm !== term) {\n // Try to expand selection to right first.\n result = this._findInLine(term, searchPosition, searchOptions, false);\n if (!result) {\n // If selection was not able to be expanded to the right, then try reverse search\n searchPosition.startRow = startRow = prevSelectedPos.end.y;\n searchPosition.startCol = startCol = prevSelectedPos.end.x;\n }\n }\n }\n\n if (!result) {\n result = this._findInLine(term, searchPosition, searchOptions, isReverseSearch);\n }\n\n // Search from startRow - 1 to top\n if (!result) {\n searchPosition.startCol = Math.max(searchPosition.startCol, this._terminal.cols);\n for (let y = startRow - 1; y >= 0; y--) {\n searchPosition.startRow = y;\n result = this._findInLine(term, searchPosition, searchOptions, isReverseSearch);\n if (result) {\n break;\n }\n }\n }\n // If we hit the top and didn't search from the very bottom wrap back down\n if (!result && startRow !== (this._terminal.buffer.active.baseY + this._terminal.rows - 1)) {\n for (let y = (this._terminal.buffer.active.baseY + this._terminal.rows - 1); y >= startRow; y--) {\n searchPosition.startRow = y;\n result = this._findInLine(term, searchPosition, searchOptions, isReverseSearch);\n if (result) {\n break;\n }\n }\n }\n\n // Set selection and scroll if a result was found\n return this._selectResult(result, searchOptions?.decorations, searchOptions?.noScroll);\n }\n\n /**\n * Sets up a line cache with a ttl\n */\n private _initLinesCache(): void {\n const terminal = this._terminal!;\n if (!this._linesCache) {\n this._linesCache = new Array(terminal.buffer.active.length);\n this._linesCacheDisposables.value = getDisposeArrayDisposable([\n terminal.onLineFeed(() => this._destroyLinesCache()),\n terminal.onCursorMove(() => this._destroyLinesCache()),\n terminal.onResize(() => this._destroyLinesCache())\n ]);\n }\n\n window.clearTimeout(this._linesCacheTimeoutId);\n this._linesCacheTimeoutId = window.setTimeout(() => this._destroyLinesCache(), LINES_CACHE_TIME_TO_LIVE);\n }\n\n private _destroyLinesCache(): void {\n this._linesCache = undefined;\n this._linesCacheDisposables.clear();\n if (this._linesCacheTimeoutId) {\n window.clearTimeout(this._linesCacheTimeoutId);\n this._linesCacheTimeoutId = 0;\n }\n }\n\n /**\n * A found substring is a whole word if it doesn't have an alphanumeric character directly\n * adjacent to it.\n * @param searchIndex starting indext of the potential whole word substring\n * @param line entire string in which the potential whole word was found\n * @param term the substring that starts at searchIndex\n */\n private _isWholeWord(searchIndex: number, line: string, term: string): boolean {\n return ((searchIndex === 0) || (NON_WORD_CHARACTERS.includes(line[searchIndex - 1]))) &&\n (((searchIndex + term.length) === line.length) || (NON_WORD_CHARACTERS.includes(line[searchIndex + term.length])));\n }\n\n /**\n * Searches a line for a search term. Takes the provided terminal line and searches the text line,\n * which may contain subsequent terminal lines if the text is wrapped. If the provided line number\n * is part of a wrapped text line that started on an earlier line then it is skipped since it will\n * be properly searched when the terminal line that the text starts on is searched.\n * @param term The search term.\n * @param searchPosition The position to start the search.\n * @param searchOptions Search options.\n * @param isReverseSearch Whether the search should start from the right side of the terminal and\n * search to the left.\n * @returns The search result if it was found.\n */\n protected _findInLine(term: string, searchPosition: ISearchPosition, searchOptions: ISearchOptions = {}, isReverseSearch: boolean = false): ISearchResult | undefined {\n const terminal = this._terminal!;\n const row = searchPosition.startRow;\n const col = searchPosition.startCol;\n\n // Ignore wrapped lines, only consider on unwrapped line (first row of command string).\n const firstLine = terminal.buffer.active.getLine(row);\n if (firstLine?.isWrapped) {\n if (isReverseSearch) {\n searchPosition.startCol += terminal.cols;\n return;\n }\n\n // This will iterate until we find the line start.\n // When we find it, we will search using the calculated start column.\n searchPosition.startRow--;\n searchPosition.startCol += terminal.cols;\n return this._findInLine(term, searchPosition, searchOptions);\n }\n let cache = this._linesCache?.[row];\n if (!cache) {\n cache = this._translateBufferLineToStringWithWrap(row, true);\n if (this._linesCache) {\n this._linesCache[row] = cache;\n }\n }\n const [stringLine, offsets] = cache;\n\n const offset = this._bufferColsToStringOffset(row, col);\n const searchTerm = searchOptions.caseSensitive ? term : term.toLowerCase();\n const searchStringLine = searchOptions.caseSensitive ? stringLine : stringLine.toLowerCase();\n\n let resultIndex = -1;\n if (searchOptions.regex) {\n const searchRegex = RegExp(searchTerm, 'g');\n let foundTerm: RegExpExecArray | null;\n if (isReverseSearch) {\n // This loop will get the resultIndex of the _last_ regex match in the range 0..offset\n while (foundTerm = searchRegex.exec(searchStringLine.slice(0, offset))) {\n resultIndex = searchRegex.lastIndex - foundTerm[0].length;\n term = foundTerm[0];\n searchRegex.lastIndex -= (term.length - 1);\n }\n } else {\n foundTerm = searchRegex.exec(searchStringLine.slice(offset));\n if (foundTerm && foundTerm[0].length > 0) {\n resultIndex = offset + (searchRegex.lastIndex - foundTerm[0].length);\n term = foundTerm[0];\n }\n }\n } else {\n if (isReverseSearch) {\n if (offset - searchTerm.length >= 0) {\n resultIndex = searchStringLine.lastIndexOf(searchTerm, offset - searchTerm.length);\n }\n } else {\n resultIndex = searchStringLine.indexOf(searchTerm, offset);\n }\n }\n\n if (resultIndex >= 0) {\n if (searchOptions.wholeWord && !this._isWholeWord(resultIndex, searchStringLine, term)) {\n return;\n }\n\n // Adjust the row number and search index if needed since a \"line\" of text can span multiple\n // rows\n let startRowOffset = 0;\n while (startRowOffset < offsets.length - 1 && resultIndex >= offsets[startRowOffset + 1]) {\n startRowOffset++;\n }\n let endRowOffset = startRowOffset;\n while (endRowOffset < offsets.length - 1 && resultIndex + term.length >= offsets[endRowOffset + 1]) {\n endRowOffset++;\n }\n const startColOffset = resultIndex - offsets[startRowOffset];\n const endColOffset = resultIndex + term.length - offsets[endRowOffset];\n const startColIndex = this._stringLengthToBufferSize(row + startRowOffset, startColOffset);\n const endColIndex = this._stringLengthToBufferSize(row + endRowOffset, endColOffset);\n const size = endColIndex - startColIndex + terminal.cols * (endRowOffset - startRowOffset);\n\n return {\n term,\n col: startColIndex,\n row: row + startRowOffset,\n size\n };\n }\n }\n\n private _stringLengthToBufferSize(row: number, offset: number): number {\n const line = this._terminal!.buffer.active.getLine(row);\n if (!line) {\n return 0;\n }\n for (let i = 0; i < offset; i++) {\n const cell = line.getCell(i);\n if (!cell) {\n break;\n }\n // Adjust the searchIndex to normalize emoji into single chars\n const char = cell.getChars();\n if (char.length > 1) {\n offset -= char.length - 1;\n }\n // Adjust the searchIndex for empty characters following wide unicode\n // chars (eg. CJK)\n const nextCell = line.getCell(i + 1);\n if (nextCell && nextCell.getWidth() === 0) {\n offset++;\n }\n }\n return offset;\n }\n\n private _bufferColsToStringOffset(startRow: number, cols: number): number {\n const terminal = this._terminal!;\n let lineIndex = startRow;\n let offset = 0;\n let line = terminal.buffer.active.getLine(lineIndex);\n while (cols > 0 && line) {\n for (let i = 0; i < cols && i < terminal.cols; i++) {\n const cell = line.getCell(i);\n if (!cell) {\n break;\n }\n if (cell.getWidth()) {\n // Treat null characters as whitespace to align with the translateToString API\n offset += cell.getCode() === 0 ? 1 : cell.getChars().length;\n }\n }\n lineIndex++;\n line = terminal.buffer.active.getLine(lineIndex);\n if (line && !line.isWrapped) {\n break;\n }\n cols -= terminal.cols;\n }\n return offset;\n }\n\n /**\n * Translates a buffer line to a string, including subsequent lines if they are wraps.\n * Wide characters will count as two columns in the resulting string. This\n * function is useful for getting the actual text underneath the raw selection\n * position.\n * @param lineIndex The index of the line being translated.\n * @param trimRight Whether to trim whitespace to the right.\n */\n private _translateBufferLineToStringWithWrap(lineIndex: number, trimRight: boolean): LineCacheEntry {\n const terminal = this._terminal!;\n const strings = [];\n const lineOffsets = [0];\n let line = terminal.buffer.active.getLine(lineIndex);\n while (line) {\n const nextLine = terminal.buffer.active.getLine(lineIndex + 1);\n const lineWrapsToNext = nextLine ? nextLine.isWrapped : false;\n let string = line.translateToString(!lineWrapsToNext && trimRight);\n if (lineWrapsToNext && nextLine) {\n const lastCell = line.getCell(line.length - 1);\n const lastCellIsNull = lastCell && lastCell.getCode() === 0 && lastCell.getWidth() === 1;\n // a wide character wrapped to the next line\n if (lastCellIsNull && nextLine.getCell(0)?.getWidth() === 2) {\n string = string.slice(0, -1);\n }\n }\n strings.push(string);\n if (lineWrapsToNext) {\n lineOffsets.push(lineOffsets[lineOffsets.length - 1] + string.length);\n } else {\n break;\n }\n lineIndex++;\n line = nextLine;\n }\n return [strings.join(''), lineOffsets];\n }\n\n /**\n * Selects and scrolls to a result.\n * @param result The result to select.\n * @returns Whether a result was selected.\n */\n private _selectResult(result: ISearchResult | undefined, options?: ISearchDecorationOptions, noScroll?: boolean): boolean {\n const terminal = this._terminal!;\n this._selectedDecoration.clear();\n if (!result) {\n terminal.clearSelection();\n return false;\n }\n terminal.select(result.col, result.row, result.size);\n if (options) {\n const marker = terminal.registerMarker(-terminal.buffer.active.baseY - terminal.buffer.active.cursorY + result.row);\n if (marker) {\n const decoration = terminal.registerDecoration({\n marker,\n x: result.col,\n width: result.size,\n backgroundColor: options.activeMatchBackground,\n layer: 'top',\n overviewRulerOptions: {\n color: options.activeMatchColorOverviewRuler\n }\n });\n if (decoration) {\n const disposables: IDisposable[] = [];\n disposables.push(marker);\n disposables.push(decoration.onRender((e) => this._applyStyles(e, options.activeMatchBorder, true)));\n disposables.push(decoration.onDispose(() => disposeArray(disposables)));\n this._selectedDecoration.value = { decoration, match: result, dispose() { decoration.dispose(); } };\n }\n }\n }\n\n if (!noScroll) {\n // If it is not in the viewport then we scroll else it just gets selected\n if (result.row >= (terminal.buffer.active.viewportY + terminal.rows) || result.row < terminal.buffer.active.viewportY) {\n let scroll = result.row - terminal.buffer.active.viewportY;\n scroll -= Math.floor(terminal.rows / 2);\n terminal.scrollLines(scroll);\n }\n }\n return true;\n }\n\n /**\n * Applies styles to the decoration when it is rendered.\n * @param element The decoration's element.\n * @param borderColor The border color to apply.\n * @param isActiveResult Whether the element is part of the active search result.\n * @returns\n */\n private _applyStyles(element: HTMLElement, borderColor: string | undefined, isActiveResult: boolean): void {\n if (!element.classList.contains('xterm-find-result-decoration')) {\n element.classList.add('xterm-find-result-decoration');\n if (borderColor) {\n element.style.outline = `1px solid ${borderColor}`;\n }\n }\n if (isActiveResult) {\n element.classList.add('xterm-find-active-result-decoration');\n }\n }\n\n /**\n * Creates a decoration for the result and applies styles\n * @param result the search result for which to create the decoration\n * @param options the options for the decoration\n * @returns the {@link IDecoration} or undefined if the marker has already been disposed of\n */\n private _createResultDecoration(result: ISearchResult, options: ISearchDecorationOptions): IDecoration | undefined {\n const terminal = this._terminal!;\n const marker = terminal.registerMarker(-terminal.buffer.active.baseY - terminal.buffer.active.cursorY + result.row);\n if (!marker) {\n return undefined;\n }\n const findResultDecoration = terminal.registerDecoration({\n marker,\n x: result.col,\n width: result.size,\n backgroundColor: options.matchBackground,\n overviewRulerOptions: this._highlightedLines.has(marker.line) ? undefined : {\n color: options.matchOverviewRuler,\n position: 'center'\n }\n });\n if (findResultDecoration) {\n const disposables: IDisposable[] = [];\n disposables.push(marker);\n disposables.push(findResultDecoration.onRender((e) => this._applyStyles(e, options.matchBorder, false)));\n disposables.push(findResultDecoration.onDispose(() => disposeArray(disposables)));\n }\n return findResultDecoration;\n }\n}\n"],"names":["root","factory","exports","module","define","amd","self","_listeners","_disposed","event","this","_event","listener","push","dispose","i","length","splice","fire","arg1","arg2","queue","call","undefined","clearListeners","from","to","e","handler","disposeArray","disposables","d","_disposables","_isDisposed","register","unregister","index","indexOf","value","_value","clear","f","array","__webpack_module_cache__","__webpack_require__","moduleId","cachedModule","__webpack_modules__","NON_WORD_CHARACTERS","SearchAddon","Disposable","constructor","options","super","_highlightedLines","Set","_highlightDecorations","_selectedDecoration","MutableDisposable","_linesCacheTimeoutId","_linesCacheDisposables","_onDidChangeResults","EventEmitter","onDidChangeResults","_highlightLimit","highlightLimit","activate","terminal","_terminal","onWriteParsed","_updateMatches","onResize","toDisposable","clearDecorations","_highlightTimeout","window","clearTimeout","_cachedSearchTerm","_lastSearchOptions","decorations","setTimeout","term","findPrevious","incremental","noScroll","retainCachedSearchTerm","clearActiveDecoration","findNext","searchOptions","Error","didOptionsChanged","_didOptionsChange","_highlightAllMatches","found","_findNextAndSelect","_fireResults","searchResultsWithHighlight","prevResult","result","_find","row","col","cols","match","decoration","_createResultDecoration","add","marker","line","startRow","startCol","clearSelection","_initLinesCache","searchPosition","_findInLine","y","buffer","active","baseY","rows","prevSelectedPos","getSelectionPosition","end","x","start","_selectResult","_findPreviousAndSelect","lastSearchOptions","caseSensitive","regex","wholeWord","resultIndex","selectedMatch","size","resultCount","isReverseSearch","Math","max","_linesCache","Array","getDisposeArrayDisposable","onLineFeed","_destroyLinesCache","onCursorMove","_isWholeWord","searchIndex","includes","firstLine","getLine","isWrapped","cache","_translateBufferLineToStringWithWrap","stringLine","offsets","offset","_bufferColsToStringOffset","searchTerm","toLowerCase","searchStringLine","searchRegex","RegExp","foundTerm","exec","slice","lastIndex","lastIndexOf","startRowOffset","endRowOffset","startColOffset","endColOffset","startColIndex","_stringLengthToBufferSize","cell","getCell","char","getChars","nextCell","getWidth","lineIndex","getCode","trimRight","strings","lineOffsets","nextLine","lineWrapsToNext","string","translateToString","lastCell","join","select","registerMarker","cursorY","registerDecoration","width","backgroundColor","activeMatchBackground","layer","overviewRulerOptions","color","activeMatchColorOverviewRuler","onRender","_applyStyles","activeMatchBorder","onDispose","viewportY","scroll","floor","scrollLines","element","borderColor","isActiveResult","classList","contains","style","outline","findResultDecoration","matchBackground","has","matchOverviewRuler","position","matchBorder"],"sourceRoot":""}
1
+ {"version":3,"file":"addon-search.js","mappings":"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","sources":["webpack://SearchAddon/webpack/universalModuleDefinition","webpack://SearchAddon/../../src/common/EventEmitter.ts","webpack://SearchAddon/../../src/common/Lifecycle.ts","webpack://SearchAddon/webpack/bootstrap","webpack://SearchAddon/./src/SearchAddon.ts"],"sourcesContent":["(function webpackUniversalModuleDefinition(root, factory) {\n\tif(typeof exports === 'object' && typeof module === 'object')\n\t\tmodule.exports = factory();\n\telse if(typeof define === 'function' && define.amd)\n\t\tdefine([], factory);\n\telse if(typeof exports === 'object')\n\t\texports[\"SearchAddon\"] = factory();\n\telse\n\t\troot[\"SearchAddon\"] = factory();\n})(globalThis, () => {\nreturn ","/**\n * Copyright (c) 2019 The xterm.js authors. All rights reserved.\n * @license MIT\n */\n\nimport { IDisposable } from 'common/Types';\n\ninterface IListener<T, U = void> {\n (arg1: T, arg2: U): void;\n}\n\nexport interface IEvent<T, U = void> {\n (listener: (arg1: T, arg2: U) => any): IDisposable;\n}\n\nexport interface IEventEmitter<T, U = void> {\n event: IEvent<T, U>;\n fire(arg1: T, arg2: U): void;\n dispose(): void;\n}\n\nexport class EventEmitter<T, U = void> implements IEventEmitter<T, U> {\n private _listeners: Set<IListener<T, U>> = new Set();\n private _event?: IEvent<T, U>;\n private _disposed: boolean = false;\n\n public get event(): IEvent<T, U> {\n if (!this._event) {\n this._event = (listener: (arg1: T, arg2: U) => any) => {\n this._listeners.add(listener);\n const disposable = {\n dispose: () => {\n if (!this._disposed) {\n this._listeners.delete(listener);\n }\n }\n };\n return disposable;\n };\n }\n return this._event;\n }\n\n public fire(arg1: T, arg2: U): void {\n const queue: IListener<T, U>[] = [];\n for (const l of this._listeners.values()) {\n queue.push(l);\n }\n for (let i = 0; i < queue.length; i++) {\n queue[i].call(undefined, arg1, arg2);\n }\n }\n\n public dispose(): void {\n this.clearListeners();\n this._disposed = true;\n }\n\n public clearListeners(): void {\n if (this._listeners) {\n this._listeners.clear();\n }\n }\n}\n\nexport function forwardEvent<T>(from: IEvent<T>, to: IEventEmitter<T>): IDisposable {\n return from(e => to.fire(e));\n}\n\nexport function runAndSubscribe<T>(event: IEvent<T>, handler: (e: T | undefined) => any): IDisposable {\n handler(undefined);\n return event(e => handler(e));\n}\n","/**\n * Copyright (c) 2018 The xterm.js authors. All rights reserved.\n * @license MIT\n */\n\nimport { IDisposable } from 'common/Types';\n\n/**\n * A base class that can be extended to provide convenience methods for managing the lifecycle of an\n * object and its components.\n */\nexport abstract class Disposable implements IDisposable {\n protected _disposables: IDisposable[] = [];\n protected _isDisposed: boolean = false;\n\n /**\n * Disposes the object, triggering the `dispose` method on all registered IDisposables.\n */\n public dispose(): void {\n this._isDisposed = true;\n for (const d of this._disposables) {\n d.dispose();\n }\n this._disposables.length = 0;\n }\n\n /**\n * Registers a disposable object.\n * @param d The disposable to register.\n * @returns The disposable.\n */\n public register<T extends IDisposable>(d: T): T {\n this._disposables.push(d);\n return d;\n }\n\n /**\n * Unregisters a disposable object if it has been registered, if not do\n * nothing.\n * @param d The disposable to unregister.\n */\n public unregister<T extends IDisposable>(d: T): void {\n const index = this._disposables.indexOf(d);\n if (index !== -1) {\n this._disposables.splice(index, 1);\n }\n }\n}\n\nexport class MutableDisposable<T extends IDisposable> implements IDisposable {\n private _value?: T;\n private _isDisposed = false;\n\n /**\n * Gets the value if it exists.\n */\n public get value(): T | undefined {\n return this._isDisposed ? undefined : this._value;\n }\n\n /**\n * Sets the value, disposing of the old value if it exists.\n */\n public set value(value: T | undefined) {\n if (this._isDisposed || value === this._value) {\n return;\n }\n this._value?.dispose();\n this._value = value;\n }\n\n /**\n * Resets the stored value and disposes of the previously stored value.\n */\n public clear(): void {\n this.value = undefined;\n }\n\n public dispose(): void {\n this._isDisposed = true;\n this._value?.dispose();\n this._value = undefined;\n }\n}\n\n/**\n * Wrap a function in a disposable.\n */\nexport function toDisposable(f: () => void): IDisposable {\n return { dispose: f };\n}\n\n/**\n * Dispose of all disposables in an array and set its length to 0.\n */\nexport function disposeArray(disposables: IDisposable[]): void {\n for (const d of disposables) {\n d.dispose();\n }\n disposables.length = 0;\n}\n\n/**\n * Creates a disposable that will dispose of an array of disposables when disposed.\n */\nexport function getDisposeArrayDisposable(array: IDisposable[]): IDisposable {\n return { dispose: () => disposeArray(array) };\n}\n","// The module cache\nvar __webpack_module_cache__ = {};\n\n// The require function\nfunction __webpack_require__(moduleId) {\n\t// Check if module is in cache\n\tvar cachedModule = __webpack_module_cache__[moduleId];\n\tif (cachedModule !== undefined) {\n\t\treturn cachedModule.exports;\n\t}\n\t// Create a new module (and put it into the cache)\n\tvar module = __webpack_module_cache__[moduleId] = {\n\t\t// no module.id needed\n\t\t// no module.loaded needed\n\t\texports: {}\n\t};\n\n\t// Execute the module function\n\t__webpack_modules__[moduleId](module, module.exports, __webpack_require__);\n\n\t// Return the exports of the module\n\treturn module.exports;\n}\n\n","/**\n * Copyright (c) 2017 The xterm.js authors. All rights reserved.\n * @license MIT\n */\n\nimport type { Terminal, IDisposable, ITerminalAddon, IDecoration } from '@xterm/xterm';\nimport type { SearchAddon as ISearchApi } from '@xterm/addon-search';\nimport { EventEmitter } from 'common/EventEmitter';\nimport { Disposable, toDisposable, disposeArray, MutableDisposable, getDisposeArrayDisposable } from 'common/Lifecycle';\n\nexport interface ISearchOptions {\n regex?: boolean;\n wholeWord?: boolean;\n caseSensitive?: boolean;\n incremental?: boolean;\n decorations?: ISearchDecorationOptions;\n noScroll?: boolean;\n}\n\ninterface ISearchDecorationOptions {\n matchBackground?: string;\n matchBorder?: string;\n matchOverviewRuler: string;\n activeMatchBackground?: string;\n activeMatchBorder?: string;\n activeMatchColorOverviewRuler: string;\n}\n\nexport interface ISearchPosition {\n startCol: number;\n startRow: number;\n}\n\nexport interface ISearchAddonOptions {\n highlightLimit: number;\n}\n\nexport interface ISearchResult {\n term: string;\n col: number;\n row: number;\n size: number;\n}\n\ntype LineCacheEntry = [\n /**\n * The string representation of a line (as opposed to the buffer cell representation).\n */\n lineAsString: string,\n /**\n * The offsets where each line starts when the entry describes a wrapped line.\n */\n lineOffsets: number[]\n];\n\ninterface IHighlight extends IDisposable {\n decoration: IDecoration;\n match: ISearchResult;\n}\n\nconst NON_WORD_CHARACTERS = ' ~!@#$%^&*()+`-=[]{}|\\\\;:\"\\',./<>?';\nconst LINES_CACHE_TIME_TO_LIVE = 15 * 1000; // 15 secs\nconst DEFAULT_HIGHLIGHT_LIMIT = 1000;\n\nexport class SearchAddon extends Disposable implements ITerminalAddon , ISearchApi {\n private _terminal: Terminal | undefined;\n private _cachedSearchTerm: string | undefined;\n private _highlightedLines: Set<number> = new Set();\n private _highlightDecorations: IHighlight[] = [];\n private _selectedDecoration: MutableDisposable<IHighlight> = this.register(new MutableDisposable());\n private _highlightLimit: number;\n private _lastSearchOptions: ISearchOptions | undefined;\n private _highlightTimeout: number | undefined;\n /**\n * translateBufferLineToStringWithWrap is a fairly expensive call.\n * We memoize the calls into an array that has a time based ttl.\n * _linesCache is also invalidated when the terminal cursor moves.\n */\n private _linesCache: LineCacheEntry[] | undefined;\n private _linesCacheTimeoutId = 0;\n private _linesCacheDisposables = new MutableDisposable();\n\n private readonly _onDidChangeResults = this.register(new EventEmitter<{ resultIndex: number, resultCount: number }>());\n public readonly onDidChangeResults = this._onDidChangeResults.event;\n\n constructor(options?: Partial<ISearchAddonOptions>) {\n super();\n\n this._highlightLimit = options?.highlightLimit ?? DEFAULT_HIGHLIGHT_LIMIT;\n }\n\n public activate(terminal: Terminal): void {\n this._terminal = terminal;\n this.register(this._terminal.onWriteParsed(() => this._updateMatches()));\n this.register(this._terminal.onResize(() => this._updateMatches()));\n this.register(toDisposable(() => this.clearDecorations()));\n }\n\n private _updateMatches(): void {\n if (this._highlightTimeout) {\n window.clearTimeout(this._highlightTimeout);\n }\n if (this._cachedSearchTerm && this._lastSearchOptions?.decorations) {\n this._highlightTimeout = setTimeout(() => {\n const term = this._cachedSearchTerm;\n this._cachedSearchTerm = undefined;\n this.findPrevious(term!, { ...this._lastSearchOptions, incremental: true, noScroll: true });\n }, 200);\n }\n }\n\n public clearDecorations(retainCachedSearchTerm?: boolean): void {\n this._selectedDecoration.clear();\n disposeArray(this._highlightDecorations);\n this._highlightDecorations = [];\n this._highlightedLines.clear();\n if (!retainCachedSearchTerm) {\n this._cachedSearchTerm = undefined;\n }\n }\n\n public clearActiveDecoration(): void {\n this._selectedDecoration.clear();\n }\n\n /**\n * Find the next instance of the term, then scroll to and select it. If it\n * doesn't exist, do nothing.\n * @param term The search term.\n * @param searchOptions Search options.\n * @returns Whether a result was found.\n */\n public findNext(term: string, searchOptions?: ISearchOptions): boolean {\n if (!this._terminal) {\n throw new Error('Cannot use addon until it has been loaded');\n }\n const didOptionsChanged = this._lastSearchOptions ? this._didOptionsChange(this._lastSearchOptions, searchOptions) : true;\n this._lastSearchOptions = searchOptions;\n if (searchOptions?.decorations) {\n if (this._cachedSearchTerm === undefined || term !== this._cachedSearchTerm || didOptionsChanged) {\n this._highlightAllMatches(term, searchOptions);\n }\n }\n\n const found = this._findNextAndSelect(term, searchOptions);\n this._fireResults(searchOptions);\n this._cachedSearchTerm = term;\n\n return found;\n }\n\n private _highlightAllMatches(term: string, searchOptions: ISearchOptions): void {\n if (!this._terminal) {\n throw new Error('Cannot use addon until it has been loaded');\n }\n if (!term || term.length === 0) {\n this.clearDecorations();\n return;\n }\n searchOptions = searchOptions || {};\n\n // new search, clear out the old decorations\n this.clearDecorations(true);\n\n const searchResultsWithHighlight: ISearchResult[] = [];\n let prevResult: ISearchResult | undefined = undefined;\n let result = this._find(term, 0, 0, searchOptions);\n while (result && (prevResult?.row !== result.row || prevResult?.col !== result.col)) {\n if (searchResultsWithHighlight.length >= this._highlightLimit) {\n break;\n }\n prevResult = result;\n searchResultsWithHighlight.push(prevResult);\n result = this._find(\n term,\n prevResult.col + prevResult.term.length >= this._terminal.cols ? prevResult.row + 1 : prevResult.row,\n prevResult.col + prevResult.term.length >= this._terminal.cols ? 0 : prevResult.col + 1,\n searchOptions\n );\n }\n for (const match of searchResultsWithHighlight) {\n const decoration = this._createResultDecoration(match, searchOptions.decorations!);\n if (decoration) {\n this._highlightedLines.add(decoration.marker.line);\n this._highlightDecorations.push({ decoration, match, dispose() { decoration.dispose(); } });\n }\n }\n }\n\n private _find(term: string, startRow: number, startCol: number, searchOptions?: ISearchOptions): ISearchResult | undefined {\n if (!this._terminal || !term || term.length === 0) {\n this._terminal?.clearSelection();\n this.clearDecorations();\n return undefined;\n }\n if (startCol > this._terminal.cols) {\n throw new Error(`Invalid col: ${startCol} to search in terminal of ${this._terminal.cols} cols`);\n }\n\n let result: ISearchResult | undefined = undefined;\n\n this._initLinesCache();\n\n const searchPosition: ISearchPosition = {\n startRow,\n startCol\n };\n\n // Search startRow\n result = this._findInLine(term, searchPosition, searchOptions);\n // Search from startRow + 1 to end\n if (!result) {\n\n for (let y = startRow + 1; y < this._terminal.buffer.active.baseY + this._terminal.rows; y++) {\n searchPosition.startRow = y;\n searchPosition.startCol = 0;\n // If the current line is wrapped line, increase index of column to ignore the previous scan\n // Otherwise, reset beginning column index to zero with set new unwrapped line index\n result = this._findInLine(term, searchPosition, searchOptions);\n if (result) {\n break;\n }\n }\n }\n return result;\n }\n\n private _findNextAndSelect(term: string, searchOptions?: ISearchOptions): boolean {\n if (!this._terminal || !term || term.length === 0) {\n this._terminal?.clearSelection();\n this.clearDecorations();\n return false;\n }\n\n const prevSelectedPos = this._terminal.getSelectionPosition();\n this._terminal.clearSelection();\n\n let startCol = 0;\n let startRow = 0;\n if (prevSelectedPos) {\n if (this._cachedSearchTerm === term) {\n startCol = prevSelectedPos.end.x;\n startRow = prevSelectedPos.end.y;\n } else {\n startCol = prevSelectedPos.start.x;\n startRow = prevSelectedPos.start.y;\n }\n }\n\n this._initLinesCache();\n\n const searchPosition: ISearchPosition = {\n startRow,\n startCol\n };\n\n // Search startRow\n let result = this._findInLine(term, searchPosition, searchOptions);\n // Search from startRow + 1 to end\n if (!result) {\n\n for (let y = startRow + 1; y < this._terminal.buffer.active.baseY + this._terminal.rows; y++) {\n searchPosition.startRow = y;\n searchPosition.startCol = 0;\n // If the current line is wrapped line, increase index of column to ignore the previous scan\n // Otherwise, reset beginning column index to zero with set new unwrapped line index\n result = this._findInLine(term, searchPosition, searchOptions);\n if (result) {\n break;\n }\n }\n }\n // If we hit the bottom and didn't search from the very top wrap back up\n if (!result && startRow !== 0) {\n for (let y = 0; y < startRow; y++) {\n searchPosition.startRow = y;\n searchPosition.startCol = 0;\n result = this._findInLine(term, searchPosition, searchOptions);\n if (result) {\n break;\n }\n }\n }\n\n // If there is only one result, wrap back and return selection if it exists.\n if (!result && prevSelectedPos) {\n searchPosition.startRow = prevSelectedPos.start.y;\n searchPosition.startCol = 0;\n result = this._findInLine(term, searchPosition, searchOptions);\n }\n\n // Set selection and scroll if a result was found\n return this._selectResult(result, searchOptions?.decorations, searchOptions?.noScroll);\n }\n /**\n * Find the previous instance of the term, then scroll to and select it. If it\n * doesn't exist, do nothing.\n * @param term The search term.\n * @param searchOptions Search options.\n * @returns Whether a result was found.\n */\n public findPrevious(term: string, searchOptions?: ISearchOptions): boolean {\n if (!this._terminal) {\n throw new Error('Cannot use addon until it has been loaded');\n }\n const didOptionsChanged = this._lastSearchOptions ? this._didOptionsChange(this._lastSearchOptions, searchOptions) : true;\n this._lastSearchOptions = searchOptions;\n if (searchOptions?.decorations) {\n if (this._cachedSearchTerm === undefined || term !== this._cachedSearchTerm || didOptionsChanged) {\n this._highlightAllMatches(term, searchOptions);\n }\n }\n\n const found = this._findPreviousAndSelect(term, searchOptions);\n this._fireResults(searchOptions);\n this._cachedSearchTerm = term;\n\n return found;\n }\n\n private _didOptionsChange(lastSearchOptions: ISearchOptions, searchOptions?: ISearchOptions): boolean {\n if (!searchOptions) {\n return false;\n }\n if (lastSearchOptions.caseSensitive !== searchOptions.caseSensitive) {\n return true;\n }\n if (lastSearchOptions.regex !== searchOptions.regex) {\n return true;\n }\n if (lastSearchOptions.wholeWord !== searchOptions.wholeWord) {\n return true;\n }\n return false;\n }\n\n private _fireResults(searchOptions?: ISearchOptions): void {\n if (searchOptions?.decorations) {\n let resultIndex = -1;\n if (this._selectedDecoration.value) {\n const selectedMatch = this._selectedDecoration.value.match;\n for (let i = 0; i < this._highlightDecorations.length; i++) {\n const match = this._highlightDecorations[i].match;\n if (match.row === selectedMatch.row && match.col === selectedMatch.col && match.size === selectedMatch.size) {\n resultIndex = i;\n break;\n }\n }\n }\n this._onDidChangeResults.fire({ resultIndex, resultCount: this._highlightDecorations.length });\n }\n }\n\n private _findPreviousAndSelect(term: string, searchOptions?: ISearchOptions): boolean {\n if (!this._terminal) {\n throw new Error('Cannot use addon until it has been loaded');\n }\n if (!this._terminal || !term || term.length === 0) {\n this._terminal?.clearSelection();\n this.clearDecorations();\n return false;\n }\n\n const prevSelectedPos = this._terminal.getSelectionPosition();\n this._terminal.clearSelection();\n\n let startRow = this._terminal.buffer.active.baseY + this._terminal.rows - 1;\n let startCol = this._terminal.cols;\n const isReverseSearch = true;\n\n this._initLinesCache();\n const searchPosition: ISearchPosition = {\n startRow,\n startCol\n };\n\n let result: ISearchResult | undefined;\n if (prevSelectedPos) {\n searchPosition.startRow = startRow = prevSelectedPos.start.y;\n searchPosition.startCol = startCol = prevSelectedPos.start.x;\n if (this._cachedSearchTerm !== term) {\n // Try to expand selection to right first.\n result = this._findInLine(term, searchPosition, searchOptions, false);\n if (!result) {\n // If selection was not able to be expanded to the right, then try reverse search\n searchPosition.startRow = startRow = prevSelectedPos.end.y;\n searchPosition.startCol = startCol = prevSelectedPos.end.x;\n }\n }\n }\n\n if (!result) {\n result = this._findInLine(term, searchPosition, searchOptions, isReverseSearch);\n }\n\n // Search from startRow - 1 to top\n if (!result) {\n searchPosition.startCol = Math.max(searchPosition.startCol, this._terminal.cols);\n for (let y = startRow - 1; y >= 0; y--) {\n searchPosition.startRow = y;\n result = this._findInLine(term, searchPosition, searchOptions, isReverseSearch);\n if (result) {\n break;\n }\n }\n }\n // If we hit the top and didn't search from the very bottom wrap back down\n if (!result && startRow !== (this._terminal.buffer.active.baseY + this._terminal.rows - 1)) {\n for (let y = (this._terminal.buffer.active.baseY + this._terminal.rows - 1); y >= startRow; y--) {\n searchPosition.startRow = y;\n result = this._findInLine(term, searchPosition, searchOptions, isReverseSearch);\n if (result) {\n break;\n }\n }\n }\n\n // Set selection and scroll if a result was found\n return this._selectResult(result, searchOptions?.decorations, searchOptions?.noScroll);\n }\n\n /**\n * Sets up a line cache with a ttl\n */\n private _initLinesCache(): void {\n const terminal = this._terminal!;\n if (!this._linesCache) {\n this._linesCache = new Array(terminal.buffer.active.length);\n this._linesCacheDisposables.value = getDisposeArrayDisposable([\n terminal.onLineFeed(() => this._destroyLinesCache()),\n terminal.onCursorMove(() => this._destroyLinesCache()),\n terminal.onResize(() => this._destroyLinesCache())\n ]);\n }\n\n window.clearTimeout(this._linesCacheTimeoutId);\n this._linesCacheTimeoutId = window.setTimeout(() => this._destroyLinesCache(), LINES_CACHE_TIME_TO_LIVE);\n }\n\n private _destroyLinesCache(): void {\n this._linesCache = undefined;\n this._linesCacheDisposables.clear();\n if (this._linesCacheTimeoutId) {\n window.clearTimeout(this._linesCacheTimeoutId);\n this._linesCacheTimeoutId = 0;\n }\n }\n\n /**\n * A found substring is a whole word if it doesn't have an alphanumeric character directly\n * adjacent to it.\n * @param searchIndex starting indext of the potential whole word substring\n * @param line entire string in which the potential whole word was found\n * @param term the substring that starts at searchIndex\n */\n private _isWholeWord(searchIndex: number, line: string, term: string): boolean {\n return ((searchIndex === 0) || (NON_WORD_CHARACTERS.includes(line[searchIndex - 1]))) &&\n (((searchIndex + term.length) === line.length) || (NON_WORD_CHARACTERS.includes(line[searchIndex + term.length])));\n }\n\n /**\n * Searches a line for a search term. Takes the provided terminal line and searches the text line,\n * which may contain subsequent terminal lines if the text is wrapped. If the provided line number\n * is part of a wrapped text line that started on an earlier line then it is skipped since it will\n * be properly searched when the terminal line that the text starts on is searched.\n * @param term The search term.\n * @param searchPosition The position to start the search.\n * @param searchOptions Search options.\n * @param isReverseSearch Whether the search should start from the right side of the terminal and\n * search to the left.\n * @returns The search result if it was found.\n */\n protected _findInLine(term: string, searchPosition: ISearchPosition, searchOptions: ISearchOptions = {}, isReverseSearch: boolean = false): ISearchResult | undefined {\n const terminal = this._terminal!;\n const row = searchPosition.startRow;\n const col = searchPosition.startCol;\n\n // Ignore wrapped lines, only consider on unwrapped line (first row of command string).\n const firstLine = terminal.buffer.active.getLine(row);\n if (firstLine?.isWrapped) {\n if (isReverseSearch) {\n searchPosition.startCol += terminal.cols;\n return;\n }\n\n // This will iterate until we find the line start.\n // When we find it, we will search using the calculated start column.\n searchPosition.startRow--;\n searchPosition.startCol += terminal.cols;\n return this._findInLine(term, searchPosition, searchOptions);\n }\n let cache = this._linesCache?.[row];\n if (!cache) {\n cache = this._translateBufferLineToStringWithWrap(row, true);\n if (this._linesCache) {\n this._linesCache[row] = cache;\n }\n }\n const [stringLine, offsets] = cache;\n\n const offset = this._bufferColsToStringOffset(row, col);\n const searchTerm = searchOptions.caseSensitive ? term : term.toLowerCase();\n const searchStringLine = searchOptions.caseSensitive ? stringLine : stringLine.toLowerCase();\n\n let resultIndex = -1;\n if (searchOptions.regex) {\n const searchRegex = RegExp(searchTerm, 'g');\n let foundTerm: RegExpExecArray | null;\n if (isReverseSearch) {\n // This loop will get the resultIndex of the _last_ regex match in the range 0..offset\n while (foundTerm = searchRegex.exec(searchStringLine.slice(0, offset))) {\n resultIndex = searchRegex.lastIndex - foundTerm[0].length;\n term = foundTerm[0];\n searchRegex.lastIndex -= (term.length - 1);\n }\n } else {\n foundTerm = searchRegex.exec(searchStringLine.slice(offset));\n if (foundTerm && foundTerm[0].length > 0) {\n resultIndex = offset + (searchRegex.lastIndex - foundTerm[0].length);\n term = foundTerm[0];\n }\n }\n } else {\n if (isReverseSearch) {\n if (offset - searchTerm.length >= 0) {\n resultIndex = searchStringLine.lastIndexOf(searchTerm, offset - searchTerm.length);\n }\n } else {\n resultIndex = searchStringLine.indexOf(searchTerm, offset);\n }\n }\n\n if (resultIndex >= 0) {\n if (searchOptions.wholeWord && !this._isWholeWord(resultIndex, searchStringLine, term)) {\n return;\n }\n\n // Adjust the row number and search index if needed since a \"line\" of text can span multiple\n // rows\n let startRowOffset = 0;\n while (startRowOffset < offsets.length - 1 && resultIndex >= offsets[startRowOffset + 1]) {\n startRowOffset++;\n }\n let endRowOffset = startRowOffset;\n while (endRowOffset < offsets.length - 1 && resultIndex + term.length >= offsets[endRowOffset + 1]) {\n endRowOffset++;\n }\n const startColOffset = resultIndex - offsets[startRowOffset];\n const endColOffset = resultIndex + term.length - offsets[endRowOffset];\n const startColIndex = this._stringLengthToBufferSize(row + startRowOffset, startColOffset);\n const endColIndex = this._stringLengthToBufferSize(row + endRowOffset, endColOffset);\n const size = endColIndex - startColIndex + terminal.cols * (endRowOffset - startRowOffset);\n\n return {\n term,\n col: startColIndex,\n row: row + startRowOffset,\n size\n };\n }\n }\n\n private _stringLengthToBufferSize(row: number, offset: number): number {\n const line = this._terminal!.buffer.active.getLine(row);\n if (!line) {\n return 0;\n }\n for (let i = 0; i < offset; i++) {\n const cell = line.getCell(i);\n if (!cell) {\n break;\n }\n // Adjust the searchIndex to normalize emoji into single chars\n const char = cell.getChars();\n if (char.length > 1) {\n offset -= char.length - 1;\n }\n // Adjust the searchIndex for empty characters following wide unicode\n // chars (eg. CJK)\n const nextCell = line.getCell(i + 1);\n if (nextCell && nextCell.getWidth() === 0) {\n offset++;\n }\n }\n return offset;\n }\n\n private _bufferColsToStringOffset(startRow: number, cols: number): number {\n const terminal = this._terminal!;\n let lineIndex = startRow;\n let offset = 0;\n let line = terminal.buffer.active.getLine(lineIndex);\n while (cols > 0 && line) {\n for (let i = 0; i < cols && i < terminal.cols; i++) {\n const cell = line.getCell(i);\n if (!cell) {\n break;\n }\n if (cell.getWidth()) {\n // Treat null characters as whitespace to align with the translateToString API\n offset += cell.getCode() === 0 ? 1 : cell.getChars().length;\n }\n }\n lineIndex++;\n line = terminal.buffer.active.getLine(lineIndex);\n if (line && !line.isWrapped) {\n break;\n }\n cols -= terminal.cols;\n }\n return offset;\n }\n\n /**\n * Translates a buffer line to a string, including subsequent lines if they are wraps.\n * Wide characters will count as two columns in the resulting string. This\n * function is useful for getting the actual text underneath the raw selection\n * position.\n * @param lineIndex The index of the line being translated.\n * @param trimRight Whether to trim whitespace to the right.\n */\n private _translateBufferLineToStringWithWrap(lineIndex: number, trimRight: boolean): LineCacheEntry {\n const terminal = this._terminal!;\n const strings = [];\n const lineOffsets = [0];\n let line = terminal.buffer.active.getLine(lineIndex);\n while (line) {\n const nextLine = terminal.buffer.active.getLine(lineIndex + 1);\n const lineWrapsToNext = nextLine ? nextLine.isWrapped : false;\n let string = line.translateToString(!lineWrapsToNext && trimRight);\n if (lineWrapsToNext && nextLine) {\n const lastCell = line.getCell(line.length - 1);\n const lastCellIsNull = lastCell && lastCell.getCode() === 0 && lastCell.getWidth() === 1;\n // a wide character wrapped to the next line\n if (lastCellIsNull && nextLine.getCell(0)?.getWidth() === 2) {\n string = string.slice(0, -1);\n }\n }\n strings.push(string);\n if (lineWrapsToNext) {\n lineOffsets.push(lineOffsets[lineOffsets.length - 1] + string.length);\n } else {\n break;\n }\n lineIndex++;\n line = nextLine;\n }\n return [strings.join(''), lineOffsets];\n }\n\n /**\n * Selects and scrolls to a result.\n * @param result The result to select.\n * @returns Whether a result was selected.\n */\n private _selectResult(result: ISearchResult | undefined, options?: ISearchDecorationOptions, noScroll?: boolean): boolean {\n const terminal = this._terminal!;\n this._selectedDecoration.clear();\n if (!result) {\n terminal.clearSelection();\n return false;\n }\n terminal.select(result.col, result.row, result.size);\n if (options) {\n const marker = terminal.registerMarker(-terminal.buffer.active.baseY - terminal.buffer.active.cursorY + result.row);\n if (marker) {\n const decoration = terminal.registerDecoration({\n marker,\n x: result.col,\n width: result.size,\n backgroundColor: options.activeMatchBackground,\n layer: 'top',\n overviewRulerOptions: {\n color: options.activeMatchColorOverviewRuler\n }\n });\n if (decoration) {\n const disposables: IDisposable[] = [];\n disposables.push(marker);\n disposables.push(decoration.onRender((e) => this._applyStyles(e, options.activeMatchBorder, true)));\n disposables.push(decoration.onDispose(() => disposeArray(disposables)));\n this._selectedDecoration.value = { decoration, match: result, dispose() { decoration.dispose(); } };\n }\n }\n }\n\n if (!noScroll) {\n // If it is not in the viewport then we scroll else it just gets selected\n if (result.row >= (terminal.buffer.active.viewportY + terminal.rows) || result.row < terminal.buffer.active.viewportY) {\n let scroll = result.row - terminal.buffer.active.viewportY;\n scroll -= Math.floor(terminal.rows / 2);\n terminal.scrollLines(scroll);\n }\n }\n return true;\n }\n\n /**\n * Applies styles to the decoration when it is rendered.\n * @param element The decoration's element.\n * @param borderColor The border color to apply.\n * @param isActiveResult Whether the element is part of the active search result.\n * @returns\n */\n private _applyStyles(element: HTMLElement, borderColor: string | undefined, isActiveResult: boolean): void {\n if (!element.classList.contains('xterm-find-result-decoration')) {\n element.classList.add('xterm-find-result-decoration');\n if (borderColor) {\n element.style.outline = `1px solid ${borderColor}`;\n }\n }\n if (isActiveResult) {\n element.classList.add('xterm-find-active-result-decoration');\n }\n }\n\n /**\n * Creates a decoration for the result and applies styles\n * @param result the search result for which to create the decoration\n * @param options the options for the decoration\n * @returns the {@link IDecoration} or undefined if the marker has already been disposed of\n */\n private _createResultDecoration(result: ISearchResult, options: ISearchDecorationOptions): IDecoration | undefined {\n const terminal = this._terminal!;\n const marker = terminal.registerMarker(-terminal.buffer.active.baseY - terminal.buffer.active.cursorY + result.row);\n if (!marker) {\n return undefined;\n }\n const findResultDecoration = terminal.registerDecoration({\n marker,\n x: result.col,\n width: result.size,\n backgroundColor: options.matchBackground,\n overviewRulerOptions: this._highlightedLines.has(marker.line) ? undefined : {\n color: options.matchOverviewRuler,\n position: 'center'\n }\n });\n if (findResultDecoration) {\n const disposables: IDisposable[] = [];\n disposables.push(marker);\n disposables.push(findResultDecoration.onRender((e) => this._applyStyles(e, options.matchBorder, false)));\n disposables.push(findResultDecoration.onDispose(() => disposeArray(disposables)));\n }\n return findResultDecoration;\n }\n}\n"],"names":["root","factory","exports","module","define","amd","globalThis","from","to","e","fire","event","handler","undefined","_listeners","Set","_disposed","this","_event","listener","add","dispose","delete","arg1","arg2","queue","l","values","push","i","length","call","clearListeners","clear","disposeArray","disposables","d","f","array","_disposables","_isDisposed","register","unregister","index","indexOf","splice","value","_value","__webpack_module_cache__","__webpack_require__","moduleId","cachedModule","__webpack_modules__","NON_WORD_CHARACTERS","SearchAddon","Disposable","constructor","options","super","_highlightedLines","_highlightDecorations","_selectedDecoration","MutableDisposable","_linesCacheTimeoutId","_linesCacheDisposables","_onDidChangeResults","EventEmitter","onDidChangeResults","_highlightLimit","highlightLimit","activate","terminal","_terminal","onWriteParsed","_updateMatches","onResize","toDisposable","clearDecorations","_highlightTimeout","window","clearTimeout","_cachedSearchTerm","_lastSearchOptions","decorations","setTimeout","term","findPrevious","incremental","noScroll","retainCachedSearchTerm","clearActiveDecoration","findNext","searchOptions","Error","didOptionsChanged","_didOptionsChange","_highlightAllMatches","found","_findNextAndSelect","_fireResults","searchResultsWithHighlight","prevResult","result","_find","row","col","cols","match","decoration","_createResultDecoration","marker","line","startRow","startCol","clearSelection","_initLinesCache","searchPosition","_findInLine","y","buffer","active","baseY","rows","prevSelectedPos","getSelectionPosition","end","x","start","_selectResult","_findPreviousAndSelect","lastSearchOptions","caseSensitive","regex","wholeWord","resultIndex","selectedMatch","size","resultCount","isReverseSearch","Math","max","_linesCache","Array","getDisposeArrayDisposable","onLineFeed","_destroyLinesCache","onCursorMove","_isWholeWord","searchIndex","includes","firstLine","getLine","isWrapped","cache","_translateBufferLineToStringWithWrap","stringLine","offsets","offset","_bufferColsToStringOffset","searchTerm","toLowerCase","searchStringLine","searchRegex","RegExp","foundTerm","exec","slice","lastIndex","lastIndexOf","startRowOffset","endRowOffset","startColOffset","endColOffset","startColIndex","_stringLengthToBufferSize","cell","getCell","char","getChars","nextCell","getWidth","lineIndex","getCode","trimRight","strings","lineOffsets","nextLine","lineWrapsToNext","string","translateToString","lastCell","join","select","registerMarker","cursorY","registerDecoration","width","backgroundColor","activeMatchBackground","layer","overviewRulerOptions","color","activeMatchColorOverviewRuler","onRender","_applyStyles","activeMatchBorder","onDispose","viewportY","scroll","floor","scrollLines","element","borderColor","isActiveResult","classList","contains","style","outline","findResultDecoration","matchBackground","has","matchOverviewRuler","position","matchBorder"],"sourceRoot":""}
@@ -0,0 +1,18 @@
1
+ /**
2
+ * Copyright (c) 2014-2024 The xterm.js authors. All rights reserved.
3
+ * @license MIT
4
+ *
5
+ * Copyright (c) 2012-2013, Christopher Jeffrey (MIT License)
6
+ * @license MIT
7
+ *
8
+ * Originally forked from (with the author's permission):
9
+ * Fabrice Bellard's javascript vt100 for jslinux:
10
+ * http://bellard.org/jslinux/
11
+ * Copyright (c) 2011 Fabrice Bellard
12
+ */
13
+ /*---------------------------------------------------------------------------------------------
14
+ * Copyright (c) Microsoft Corporation. All rights reserved.
15
+ * Licensed under the MIT License. See License.txt in the project root for license information.
16
+ *--------------------------------------------------------------------------------------------*/
17
+ var S=class{constructor(){this._listeners=new Set;this._disposed=!1}get event(){return this._event||(this._event=l=>(this._listeners.add(l),{dispose:()=>{this._disposed||this._listeners.delete(l)}})),this._event}fire(l,e){let t=[];for(let s of this._listeners.values())t.push(s);for(let s=0;s<t.length;s++)t[s].call(void 0,l,e)}dispose(){this.clearListeners(),this._disposed=!0}clearListeners(){this._listeners&&this._listeners.clear()}};var C=class{constructor(){this._disposables=[];this._isDisposed=!1}dispose(){this._isDisposed=!0;for(let l of this._disposables)l.dispose();this._disposables.length=0}register(l){return this._disposables.push(l),l}unregister(l){let e=this._disposables.indexOf(l);e!==-1&&this._disposables.splice(e,1)}},m=class{constructor(){this._isDisposed=!1}get value(){return this._isDisposed?void 0:this._value}set value(l){this._isDisposed||l===this._value||(this._value?.dispose(),this._value=l)}clear(){this.value=void 0}dispose(){this._isDisposed=!0,this._value?.dispose(),this._value=void 0}};function T(f){return{dispose:f}}function I(f){for(let l of f)l.dispose();f.length=0}function D(f){return{dispose:()=>I(f)}}var L=" ~!@#$%^&*()+`-=[]{}|\\;:\"',./<>?",A=15*1e3,W=1e3,x=class extends C{constructor(e){super();this._highlightedLines=new Set;this._highlightDecorations=[];this._selectedDecoration=this.register(new m);this._linesCacheTimeoutId=0;this._linesCacheDisposables=new m;this._onDidChangeResults=this.register(new S);this.onDidChangeResults=this._onDidChangeResults.event;this._highlightLimit=e?.highlightLimit??W}activate(e){this._terminal=e,this.register(this._terminal.onWriteParsed(()=>this._updateMatches())),this.register(this._terminal.onResize(()=>this._updateMatches())),this.register(T(()=>this.clearDecorations()))}_updateMatches(){this._highlightTimeout&&window.clearTimeout(this._highlightTimeout),this._cachedSearchTerm&&this._lastSearchOptions?.decorations&&(this._highlightTimeout=setTimeout(()=>{let e=this._cachedSearchTerm;this._cachedSearchTerm=void 0,this.findPrevious(e,{...this._lastSearchOptions,incremental:!0,noScroll:!0})},200))}clearDecorations(e){this._selectedDecoration.clear(),I(this._highlightDecorations),this._highlightDecorations=[],this._highlightedLines.clear(),e||(this._cachedSearchTerm=void 0)}clearActiveDecoration(){this._selectedDecoration.clear()}findNext(e,t){if(!this._terminal)throw new Error("Cannot use addon until it has been loaded");let s=this._lastSearchOptions?this._didOptionsChange(this._lastSearchOptions,t):!0;this._lastSearchOptions=t,t?.decorations&&(this._cachedSearchTerm===void 0||e!==this._cachedSearchTerm||s)&&this._highlightAllMatches(e,t);let i=this._findNextAndSelect(e,t);return this._fireResults(t),this._cachedSearchTerm=e,i}_highlightAllMatches(e,t){if(!this._terminal)throw new Error("Cannot use addon until it has been loaded");if(!e||e.length===0){this.clearDecorations();return}t=t||{},this.clearDecorations(!0);let s=[],i,r=this._find(e,0,0,t);for(;r&&(i?.row!==r.row||i?.col!==r.col)&&!(s.length>=this._highlightLimit);)i=r,s.push(i),r=this._find(e,i.col+i.term.length>=this._terminal.cols?i.row+1:i.row,i.col+i.term.length>=this._terminal.cols?0:i.col+1,t);for(let n of s){let o=this._createResultDecoration(n,t.decorations);o&&(this._highlightedLines.add(o.marker.line),this._highlightDecorations.push({decoration:o,match:n,dispose(){o.dispose()}}))}}_find(e,t,s,i){if(!this._terminal||!e||e.length===0){this._terminal?.clearSelection(),this.clearDecorations();return}if(s>this._terminal.cols)throw new Error(`Invalid col: ${s} to search in terminal of ${this._terminal.cols} cols`);let r;this._initLinesCache();let n={startRow:t,startCol:s};if(r=this._findInLine(e,n,i),!r)for(let o=t+1;o<this._terminal.buffer.active.baseY+this._terminal.rows&&(n.startRow=o,n.startCol=0,r=this._findInLine(e,n,i),!r);o++);return r}_findNextAndSelect(e,t){if(!this._terminal||!e||e.length===0)return this._terminal?.clearSelection(),this.clearDecorations(),!1;let s=this._terminal.getSelectionPosition();this._terminal.clearSelection();let i=0,r=0;s&&(this._cachedSearchTerm===e?(i=s.end.x,r=s.end.y):(i=s.start.x,r=s.start.y)),this._initLinesCache();let n={startRow:r,startCol:i},o=this._findInLine(e,n,t);if(!o)for(let a=r+1;a<this._terminal.buffer.active.baseY+this._terminal.rows&&(n.startRow=a,n.startCol=0,o=this._findInLine(e,n,t),!o);a++);if(!o&&r!==0)for(let a=0;a<r&&(n.startRow=a,n.startCol=0,o=this._findInLine(e,n,t),!o);a++);return!o&&s&&(n.startRow=s.start.y,n.startCol=0,o=this._findInLine(e,n,t)),this._selectResult(o,t?.decorations,t?.noScroll)}findPrevious(e,t){if(!this._terminal)throw new Error("Cannot use addon until it has been loaded");let s=this._lastSearchOptions?this._didOptionsChange(this._lastSearchOptions,t):!0;this._lastSearchOptions=t,t?.decorations&&(this._cachedSearchTerm===void 0||e!==this._cachedSearchTerm||s)&&this._highlightAllMatches(e,t);let i=this._findPreviousAndSelect(e,t);return this._fireResults(t),this._cachedSearchTerm=e,i}_didOptionsChange(e,t){return t?e.caseSensitive!==t.caseSensitive||e.regex!==t.regex||e.wholeWord!==t.wholeWord:!1}_fireResults(e){if(e?.decorations){let t=-1;if(this._selectedDecoration.value){let s=this._selectedDecoration.value.match;for(let i=0;i<this._highlightDecorations.length;i++){let r=this._highlightDecorations[i].match;if(r.row===s.row&&r.col===s.col&&r.size===s.size){t=i;break}}}this._onDidChangeResults.fire({resultIndex:t,resultCount:this._highlightDecorations.length})}}_findPreviousAndSelect(e,t){if(!this._terminal)throw new Error("Cannot use addon until it has been loaded");if(!this._terminal||!e||e.length===0)return this._terminal?.clearSelection(),this.clearDecorations(),!1;let s=this._terminal.getSelectionPosition();this._terminal.clearSelection();let i=this._terminal.buffer.active.baseY+this._terminal.rows-1,r=this._terminal.cols,n=!0;this._initLinesCache();let o={startRow:i,startCol:r},a;if(s&&(o.startRow=i=s.start.y,o.startCol=r=s.start.x,this._cachedSearchTerm!==e&&(a=this._findInLine(e,o,t,!1),a||(o.startRow=i=s.end.y,o.startCol=r=s.end.x))),a||(a=this._findInLine(e,o,t,n)),!a){o.startCol=Math.max(o.startCol,this._terminal.cols);for(let h=i-1;h>=0&&(o.startRow=h,a=this._findInLine(e,o,t,n),!a);h--);}if(!a&&i!==this._terminal.buffer.active.baseY+this._terminal.rows-1)for(let h=this._terminal.buffer.active.baseY+this._terminal.rows-1;h>=i&&(o.startRow=h,a=this._findInLine(e,o,t,n),!a);h--);return this._selectResult(a,t?.decorations,t?.noScroll)}_initLinesCache(){let e=this._terminal;this._linesCache||(this._linesCache=new Array(e.buffer.active.length),this._linesCacheDisposables.value=D([e.onLineFeed(()=>this._destroyLinesCache()),e.onCursorMove(()=>this._destroyLinesCache()),e.onResize(()=>this._destroyLinesCache())])),window.clearTimeout(this._linesCacheTimeoutId),this._linesCacheTimeoutId=window.setTimeout(()=>this._destroyLinesCache(),A)}_destroyLinesCache(){this._linesCache=void 0,this._linesCacheDisposables.clear(),this._linesCacheTimeoutId&&(window.clearTimeout(this._linesCacheTimeoutId),this._linesCacheTimeoutId=0)}_isWholeWord(e,t,s){return(e===0||L.includes(t[e-1]))&&(e+s.length===t.length||L.includes(t[e+s.length]))}_findInLine(e,t,s={},i=!1){let r=this._terminal,n=t.startRow,o=t.startCol;if(r.buffer.active.getLine(n)?.isWrapped){if(i){t.startCol+=r.cols;return}return t.startRow--,t.startCol+=r.cols,this._findInLine(e,t,s)}let h=this._linesCache?.[n];h||(h=this._translateBufferLineToStringWithWrap(n,!0),this._linesCache&&(this._linesCache[n]=h));let[g,_]=h,p=this._bufferColsToStringOffset(n,o),v=s.caseSensitive?e:e.toLowerCase(),b=s.caseSensitive?g:g.toLowerCase(),u=-1;if(s.regex){let d=RegExp(v,"g"),c;if(i)for(;c=d.exec(b.slice(0,p));)u=d.lastIndex-c[0].length,e=c[0],d.lastIndex-=e.length-1;else c=d.exec(b.slice(p)),c&&c[0].length>0&&(u=p+(d.lastIndex-c[0].length),e=c[0])}else i?p-v.length>=0&&(u=b.lastIndexOf(v,p-v.length)):u=b.indexOf(v,p);if(u>=0){if(s.wholeWord&&!this._isWholeWord(u,b,e))return;let d=0;for(;d<_.length-1&&u>=_[d+1];)d++;let c=d;for(;c<_.length-1&&u+e.length>=_[c+1];)c++;let R=u-_[d],y=u+e.length-_[c],w=this._stringLengthToBufferSize(n+d,R),E=this._stringLengthToBufferSize(n+c,y)-w+r.cols*(c-d);return{term:e,col:w,row:n+d,size:E}}}_stringLengthToBufferSize(e,t){let s=this._terminal.buffer.active.getLine(e);if(!s)return 0;for(let i=0;i<t;i++){let r=s.getCell(i);if(!r)break;let n=r.getChars();n.length>1&&(t-=n.length-1);let o=s.getCell(i+1);o&&o.getWidth()===0&&t++}return t}_bufferColsToStringOffset(e,t){let s=this._terminal,i=e,r=0,n=s.buffer.active.getLine(i);for(;t>0&&n;){for(let o=0;o<t&&o<s.cols;o++){let a=n.getCell(o);if(!a)break;a.getWidth()&&(r+=a.getCode()===0?1:a.getChars().length)}if(i++,n=s.buffer.active.getLine(i),n&&!n.isWrapped)break;t-=s.cols}return r}_translateBufferLineToStringWithWrap(e,t){let s=this._terminal,i=[],r=[0],n=s.buffer.active.getLine(e);for(;n;){let o=s.buffer.active.getLine(e+1),a=o?o.isWrapped:!1,h=n.translateToString(!a&&t);if(a&&o){let g=n.getCell(n.length-1);g&&g.getCode()===0&&g.getWidth()===1&&o.getCell(0)?.getWidth()===2&&(h=h.slice(0,-1))}if(i.push(h),a)r.push(r[r.length-1]+h.length);else break;e++,n=o}return[i.join(""),r]}_selectResult(e,t,s){let i=this._terminal;if(this._selectedDecoration.clear(),!e)return i.clearSelection(),!1;if(i.select(e.col,e.row,e.size),t){let r=i.registerMarker(-i.buffer.active.baseY-i.buffer.active.cursorY+e.row);if(r){let n=i.registerDecoration({marker:r,x:e.col,width:e.size,backgroundColor:t.activeMatchBackground,layer:"top",overviewRulerOptions:{color:t.activeMatchColorOverviewRuler}});if(n){let o=[];o.push(r),o.push(n.onRender(a=>this._applyStyles(a,t.activeMatchBorder,!0))),o.push(n.onDispose(()=>I(o))),this._selectedDecoration.value={decoration:n,match:e,dispose(){n.dispose()}}}}}if(!s&&(e.row>=i.buffer.active.viewportY+i.rows||e.row<i.buffer.active.viewportY)){let r=e.row-i.buffer.active.viewportY;r-=Math.floor(i.rows/2),i.scrollLines(r)}return!0}_applyStyles(e,t,s){e.classList.contains("xterm-find-result-decoration")||(e.classList.add("xterm-find-result-decoration"),t&&(e.style.outline=`1px solid ${t}`)),s&&e.classList.add("xterm-find-active-result-decoration")}_createResultDecoration(e,t){let s=this._terminal,i=s.registerMarker(-s.buffer.active.baseY-s.buffer.active.cursorY+e.row);if(!i)return;let r=s.registerDecoration({marker:i,x:e.col,width:e.size,backgroundColor:t.matchBackground,overviewRulerOptions:this._highlightedLines.has(i.line)?void 0:{color:t.matchOverviewRuler,position:"center"}});if(r){let n=[];n.push(i),n.push(r.onRender(o=>this._applyStyles(o,t.matchBorder,!1))),n.push(r.onDispose(()=>I(n)))}return r}};export{x as SearchAddon};
18
+ //# sourceMappingURL=xterm-addon-search.mjs.map
@@ -0,0 +1,7 @@
1
+ {
2
+ "version": 3,
3
+ "sources": ["../../../src/common/EventEmitter.ts", "../../../src/common/Lifecycle.ts", "../src/SearchAddon.ts"],
4
+ "sourcesContent": ["/**\n * Copyright (c) 2019 The xterm.js authors. All rights reserved.\n * @license MIT\n */\n\nimport { IDisposable } from 'common/Types';\n\ninterface IListener<T, U = void> {\n (arg1: T, arg2: U): void;\n}\n\nexport interface IEvent<T, U = void> {\n (listener: (arg1: T, arg2: U) => any): IDisposable;\n}\n\nexport interface IEventEmitter<T, U = void> {\n event: IEvent<T, U>;\n fire(arg1: T, arg2: U): void;\n dispose(): void;\n}\n\nexport class EventEmitter<T, U = void> implements IEventEmitter<T, U> {\n private _listeners: Set<IListener<T, U>> = new Set();\n private _event?: IEvent<T, U>;\n private _disposed: boolean = false;\n\n public get event(): IEvent<T, U> {\n if (!this._event) {\n this._event = (listener: (arg1: T, arg2: U) => any) => {\n this._listeners.add(listener);\n const disposable = {\n dispose: () => {\n if (!this._disposed) {\n this._listeners.delete(listener);\n }\n }\n };\n return disposable;\n };\n }\n return this._event;\n }\n\n public fire(arg1: T, arg2: U): void {\n const queue: IListener<T, U>[] = [];\n for (const l of this._listeners.values()) {\n queue.push(l);\n }\n for (let i = 0; i < queue.length; i++) {\n queue[i].call(undefined, arg1, arg2);\n }\n }\n\n public dispose(): void {\n this.clearListeners();\n this._disposed = true;\n }\n\n public clearListeners(): void {\n if (this._listeners) {\n this._listeners.clear();\n }\n }\n}\n\nexport function forwardEvent<T>(from: IEvent<T>, to: IEventEmitter<T>): IDisposable {\n return from(e => to.fire(e));\n}\n\nexport function runAndSubscribe<T>(event: IEvent<T>, handler: (e: T | undefined) => any): IDisposable {\n handler(undefined);\n return event(e => handler(e));\n}\n", "/**\n * Copyright (c) 2018 The xterm.js authors. All rights reserved.\n * @license MIT\n */\n\nimport { IDisposable } from 'common/Types';\n\n/**\n * A base class that can be extended to provide convenience methods for managing the lifecycle of an\n * object and its components.\n */\nexport abstract class Disposable implements IDisposable {\n protected _disposables: IDisposable[] = [];\n protected _isDisposed: boolean = false;\n\n /**\n * Disposes the object, triggering the `dispose` method on all registered IDisposables.\n */\n public dispose(): void {\n this._isDisposed = true;\n for (const d of this._disposables) {\n d.dispose();\n }\n this._disposables.length = 0;\n }\n\n /**\n * Registers a disposable object.\n * @param d The disposable to register.\n * @returns The disposable.\n */\n public register<T extends IDisposable>(d: T): T {\n this._disposables.push(d);\n return d;\n }\n\n /**\n * Unregisters a disposable object if it has been registered, if not do\n * nothing.\n * @param d The disposable to unregister.\n */\n public unregister<T extends IDisposable>(d: T): void {\n const index = this._disposables.indexOf(d);\n if (index !== -1) {\n this._disposables.splice(index, 1);\n }\n }\n}\n\nexport class MutableDisposable<T extends IDisposable> implements IDisposable {\n private _value?: T;\n private _isDisposed = false;\n\n /**\n * Gets the value if it exists.\n */\n public get value(): T | undefined {\n return this._isDisposed ? undefined : this._value;\n }\n\n /**\n * Sets the value, disposing of the old value if it exists.\n */\n public set value(value: T | undefined) {\n if (this._isDisposed || value === this._value) {\n return;\n }\n this._value?.dispose();\n this._value = value;\n }\n\n /**\n * Resets the stored value and disposes of the previously stored value.\n */\n public clear(): void {\n this.value = undefined;\n }\n\n public dispose(): void {\n this._isDisposed = true;\n this._value?.dispose();\n this._value = undefined;\n }\n}\n\n/**\n * Wrap a function in a disposable.\n */\nexport function toDisposable(f: () => void): IDisposable {\n return { dispose: f };\n}\n\n/**\n * Dispose of all disposables in an array and set its length to 0.\n */\nexport function disposeArray(disposables: IDisposable[]): void {\n for (const d of disposables) {\n d.dispose();\n }\n disposables.length = 0;\n}\n\n/**\n * Creates a disposable that will dispose of an array of disposables when disposed.\n */\nexport function getDisposeArrayDisposable(array: IDisposable[]): IDisposable {\n return { dispose: () => disposeArray(array) };\n}\n", "/**\n * Copyright (c) 2017 The xterm.js authors. All rights reserved.\n * @license MIT\n */\n\nimport type { Terminal, IDisposable, ITerminalAddon, IDecoration } from '@xterm/xterm';\nimport type { SearchAddon as ISearchApi } from '@xterm/addon-search';\nimport { EventEmitter } from 'common/EventEmitter';\nimport { Disposable, toDisposable, disposeArray, MutableDisposable, getDisposeArrayDisposable } from 'common/Lifecycle';\n\nexport interface ISearchOptions {\n regex?: boolean;\n wholeWord?: boolean;\n caseSensitive?: boolean;\n incremental?: boolean;\n decorations?: ISearchDecorationOptions;\n noScroll?: boolean;\n}\n\ninterface ISearchDecorationOptions {\n matchBackground?: string;\n matchBorder?: string;\n matchOverviewRuler: string;\n activeMatchBackground?: string;\n activeMatchBorder?: string;\n activeMatchColorOverviewRuler: string;\n}\n\nexport interface ISearchPosition {\n startCol: number;\n startRow: number;\n}\n\nexport interface ISearchAddonOptions {\n highlightLimit: number;\n}\n\nexport interface ISearchResult {\n term: string;\n col: number;\n row: number;\n size: number;\n}\n\ntype LineCacheEntry = [\n /**\n * The string representation of a line (as opposed to the buffer cell representation).\n */\n lineAsString: string,\n /**\n * The offsets where each line starts when the entry describes a wrapped line.\n */\n lineOffsets: number[]\n];\n\ninterface IHighlight extends IDisposable {\n decoration: IDecoration;\n match: ISearchResult;\n}\n\nconst NON_WORD_CHARACTERS = ' ~!@#$%^&*()+`-=[]{}|\\\\;:\"\\',./<>?';\nconst LINES_CACHE_TIME_TO_LIVE = 15 * 1000; // 15 secs\nconst DEFAULT_HIGHLIGHT_LIMIT = 1000;\n\nexport class SearchAddon extends Disposable implements ITerminalAddon , ISearchApi {\n private _terminal: Terminal | undefined;\n private _cachedSearchTerm: string | undefined;\n private _highlightedLines: Set<number> = new Set();\n private _highlightDecorations: IHighlight[] = [];\n private _selectedDecoration: MutableDisposable<IHighlight> = this.register(new MutableDisposable());\n private _highlightLimit: number;\n private _lastSearchOptions: ISearchOptions | undefined;\n private _highlightTimeout: number | undefined;\n /**\n * translateBufferLineToStringWithWrap is a fairly expensive call.\n * We memoize the calls into an array that has a time based ttl.\n * _linesCache is also invalidated when the terminal cursor moves.\n */\n private _linesCache: LineCacheEntry[] | undefined;\n private _linesCacheTimeoutId = 0;\n private _linesCacheDisposables = new MutableDisposable();\n\n private readonly _onDidChangeResults = this.register(new EventEmitter<{ resultIndex: number, resultCount: number }>());\n public readonly onDidChangeResults = this._onDidChangeResults.event;\n\n constructor(options?: Partial<ISearchAddonOptions>) {\n super();\n\n this._highlightLimit = options?.highlightLimit ?? DEFAULT_HIGHLIGHT_LIMIT;\n }\n\n public activate(terminal: Terminal): void {\n this._terminal = terminal;\n this.register(this._terminal.onWriteParsed(() => this._updateMatches()));\n this.register(this._terminal.onResize(() => this._updateMatches()));\n this.register(toDisposable(() => this.clearDecorations()));\n }\n\n private _updateMatches(): void {\n if (this._highlightTimeout) {\n window.clearTimeout(this._highlightTimeout);\n }\n if (this._cachedSearchTerm && this._lastSearchOptions?.decorations) {\n this._highlightTimeout = setTimeout(() => {\n const term = this._cachedSearchTerm;\n this._cachedSearchTerm = undefined;\n this.findPrevious(term!, { ...this._lastSearchOptions, incremental: true, noScroll: true });\n }, 200);\n }\n }\n\n public clearDecorations(retainCachedSearchTerm?: boolean): void {\n this._selectedDecoration.clear();\n disposeArray(this._highlightDecorations);\n this._highlightDecorations = [];\n this._highlightedLines.clear();\n if (!retainCachedSearchTerm) {\n this._cachedSearchTerm = undefined;\n }\n }\n\n public clearActiveDecoration(): void {\n this._selectedDecoration.clear();\n }\n\n /**\n * Find the next instance of the term, then scroll to and select it. If it\n * doesn't exist, do nothing.\n * @param term The search term.\n * @param searchOptions Search options.\n * @returns Whether a result was found.\n */\n public findNext(term: string, searchOptions?: ISearchOptions): boolean {\n if (!this._terminal) {\n throw new Error('Cannot use addon until it has been loaded');\n }\n const didOptionsChanged = this._lastSearchOptions ? this._didOptionsChange(this._lastSearchOptions, searchOptions) : true;\n this._lastSearchOptions = searchOptions;\n if (searchOptions?.decorations) {\n if (this._cachedSearchTerm === undefined || term !== this._cachedSearchTerm || didOptionsChanged) {\n this._highlightAllMatches(term, searchOptions);\n }\n }\n\n const found = this._findNextAndSelect(term, searchOptions);\n this._fireResults(searchOptions);\n this._cachedSearchTerm = term;\n\n return found;\n }\n\n private _highlightAllMatches(term: string, searchOptions: ISearchOptions): void {\n if (!this._terminal) {\n throw new Error('Cannot use addon until it has been loaded');\n }\n if (!term || term.length === 0) {\n this.clearDecorations();\n return;\n }\n searchOptions = searchOptions || {};\n\n // new search, clear out the old decorations\n this.clearDecorations(true);\n\n const searchResultsWithHighlight: ISearchResult[] = [];\n let prevResult: ISearchResult | undefined = undefined;\n let result = this._find(term, 0, 0, searchOptions);\n while (result && (prevResult?.row !== result.row || prevResult?.col !== result.col)) {\n if (searchResultsWithHighlight.length >= this._highlightLimit) {\n break;\n }\n prevResult = result;\n searchResultsWithHighlight.push(prevResult);\n result = this._find(\n term,\n prevResult.col + prevResult.term.length >= this._terminal.cols ? prevResult.row + 1 : prevResult.row,\n prevResult.col + prevResult.term.length >= this._terminal.cols ? 0 : prevResult.col + 1,\n searchOptions\n );\n }\n for (const match of searchResultsWithHighlight) {\n const decoration = this._createResultDecoration(match, searchOptions.decorations!);\n if (decoration) {\n this._highlightedLines.add(decoration.marker.line);\n this._highlightDecorations.push({ decoration, match, dispose() { decoration.dispose(); } });\n }\n }\n }\n\n private _find(term: string, startRow: number, startCol: number, searchOptions?: ISearchOptions): ISearchResult | undefined {\n if (!this._terminal || !term || term.length === 0) {\n this._terminal?.clearSelection();\n this.clearDecorations();\n return undefined;\n }\n if (startCol > this._terminal.cols) {\n throw new Error(`Invalid col: ${startCol} to search in terminal of ${this._terminal.cols} cols`);\n }\n\n let result: ISearchResult | undefined = undefined;\n\n this._initLinesCache();\n\n const searchPosition: ISearchPosition = {\n startRow,\n startCol\n };\n\n // Search startRow\n result = this._findInLine(term, searchPosition, searchOptions);\n // Search from startRow + 1 to end\n if (!result) {\n\n for (let y = startRow + 1; y < this._terminal.buffer.active.baseY + this._terminal.rows; y++) {\n searchPosition.startRow = y;\n searchPosition.startCol = 0;\n // If the current line is wrapped line, increase index of column to ignore the previous scan\n // Otherwise, reset beginning column index to zero with set new unwrapped line index\n result = this._findInLine(term, searchPosition, searchOptions);\n if (result) {\n break;\n }\n }\n }\n return result;\n }\n\n private _findNextAndSelect(term: string, searchOptions?: ISearchOptions): boolean {\n if (!this._terminal || !term || term.length === 0) {\n this._terminal?.clearSelection();\n this.clearDecorations();\n return false;\n }\n\n const prevSelectedPos = this._terminal.getSelectionPosition();\n this._terminal.clearSelection();\n\n let startCol = 0;\n let startRow = 0;\n if (prevSelectedPos) {\n if (this._cachedSearchTerm === term) {\n startCol = prevSelectedPos.end.x;\n startRow = prevSelectedPos.end.y;\n } else {\n startCol = prevSelectedPos.start.x;\n startRow = prevSelectedPos.start.y;\n }\n }\n\n this._initLinesCache();\n\n const searchPosition: ISearchPosition = {\n startRow,\n startCol\n };\n\n // Search startRow\n let result = this._findInLine(term, searchPosition, searchOptions);\n // Search from startRow + 1 to end\n if (!result) {\n\n for (let y = startRow + 1; y < this._terminal.buffer.active.baseY + this._terminal.rows; y++) {\n searchPosition.startRow = y;\n searchPosition.startCol = 0;\n // If the current line is wrapped line, increase index of column to ignore the previous scan\n // Otherwise, reset beginning column index to zero with set new unwrapped line index\n result = this._findInLine(term, searchPosition, searchOptions);\n if (result) {\n break;\n }\n }\n }\n // If we hit the bottom and didn't search from the very top wrap back up\n if (!result && startRow !== 0) {\n for (let y = 0; y < startRow; y++) {\n searchPosition.startRow = y;\n searchPosition.startCol = 0;\n result = this._findInLine(term, searchPosition, searchOptions);\n if (result) {\n break;\n }\n }\n }\n\n // If there is only one result, wrap back and return selection if it exists.\n if (!result && prevSelectedPos) {\n searchPosition.startRow = prevSelectedPos.start.y;\n searchPosition.startCol = 0;\n result = this._findInLine(term, searchPosition, searchOptions);\n }\n\n // Set selection and scroll if a result was found\n return this._selectResult(result, searchOptions?.decorations, searchOptions?.noScroll);\n }\n /**\n * Find the previous instance of the term, then scroll to and select it. If it\n * doesn't exist, do nothing.\n * @param term The search term.\n * @param searchOptions Search options.\n * @returns Whether a result was found.\n */\n public findPrevious(term: string, searchOptions?: ISearchOptions): boolean {\n if (!this._terminal) {\n throw new Error('Cannot use addon until it has been loaded');\n }\n const didOptionsChanged = this._lastSearchOptions ? this._didOptionsChange(this._lastSearchOptions, searchOptions) : true;\n this._lastSearchOptions = searchOptions;\n if (searchOptions?.decorations) {\n if (this._cachedSearchTerm === undefined || term !== this._cachedSearchTerm || didOptionsChanged) {\n this._highlightAllMatches(term, searchOptions);\n }\n }\n\n const found = this._findPreviousAndSelect(term, searchOptions);\n this._fireResults(searchOptions);\n this._cachedSearchTerm = term;\n\n return found;\n }\n\n private _didOptionsChange(lastSearchOptions: ISearchOptions, searchOptions?: ISearchOptions): boolean {\n if (!searchOptions) {\n return false;\n }\n if (lastSearchOptions.caseSensitive !== searchOptions.caseSensitive) {\n return true;\n }\n if (lastSearchOptions.regex !== searchOptions.regex) {\n return true;\n }\n if (lastSearchOptions.wholeWord !== searchOptions.wholeWord) {\n return true;\n }\n return false;\n }\n\n private _fireResults(searchOptions?: ISearchOptions): void {\n if (searchOptions?.decorations) {\n let resultIndex = -1;\n if (this._selectedDecoration.value) {\n const selectedMatch = this._selectedDecoration.value.match;\n for (let i = 0; i < this._highlightDecorations.length; i++) {\n const match = this._highlightDecorations[i].match;\n if (match.row === selectedMatch.row && match.col === selectedMatch.col && match.size === selectedMatch.size) {\n resultIndex = i;\n break;\n }\n }\n }\n this._onDidChangeResults.fire({ resultIndex, resultCount: this._highlightDecorations.length });\n }\n }\n\n private _findPreviousAndSelect(term: string, searchOptions?: ISearchOptions): boolean {\n if (!this._terminal) {\n throw new Error('Cannot use addon until it has been loaded');\n }\n if (!this._terminal || !term || term.length === 0) {\n this._terminal?.clearSelection();\n this.clearDecorations();\n return false;\n }\n\n const prevSelectedPos = this._terminal.getSelectionPosition();\n this._terminal.clearSelection();\n\n let startRow = this._terminal.buffer.active.baseY + this._terminal.rows - 1;\n let startCol = this._terminal.cols;\n const isReverseSearch = true;\n\n this._initLinesCache();\n const searchPosition: ISearchPosition = {\n startRow,\n startCol\n };\n\n let result: ISearchResult | undefined;\n if (prevSelectedPos) {\n searchPosition.startRow = startRow = prevSelectedPos.start.y;\n searchPosition.startCol = startCol = prevSelectedPos.start.x;\n if (this._cachedSearchTerm !== term) {\n // Try to expand selection to right first.\n result = this._findInLine(term, searchPosition, searchOptions, false);\n if (!result) {\n // If selection was not able to be expanded to the right, then try reverse search\n searchPosition.startRow = startRow = prevSelectedPos.end.y;\n searchPosition.startCol = startCol = prevSelectedPos.end.x;\n }\n }\n }\n\n if (!result) {\n result = this._findInLine(term, searchPosition, searchOptions, isReverseSearch);\n }\n\n // Search from startRow - 1 to top\n if (!result) {\n searchPosition.startCol = Math.max(searchPosition.startCol, this._terminal.cols);\n for (let y = startRow - 1; y >= 0; y--) {\n searchPosition.startRow = y;\n result = this._findInLine(term, searchPosition, searchOptions, isReverseSearch);\n if (result) {\n break;\n }\n }\n }\n // If we hit the top and didn't search from the very bottom wrap back down\n if (!result && startRow !== (this._terminal.buffer.active.baseY + this._terminal.rows - 1)) {\n for (let y = (this._terminal.buffer.active.baseY + this._terminal.rows - 1); y >= startRow; y--) {\n searchPosition.startRow = y;\n result = this._findInLine(term, searchPosition, searchOptions, isReverseSearch);\n if (result) {\n break;\n }\n }\n }\n\n // Set selection and scroll if a result was found\n return this._selectResult(result, searchOptions?.decorations, searchOptions?.noScroll);\n }\n\n /**\n * Sets up a line cache with a ttl\n */\n private _initLinesCache(): void {\n const terminal = this._terminal!;\n if (!this._linesCache) {\n this._linesCache = new Array(terminal.buffer.active.length);\n this._linesCacheDisposables.value = getDisposeArrayDisposable([\n terminal.onLineFeed(() => this._destroyLinesCache()),\n terminal.onCursorMove(() => this._destroyLinesCache()),\n terminal.onResize(() => this._destroyLinesCache())\n ]);\n }\n\n window.clearTimeout(this._linesCacheTimeoutId);\n this._linesCacheTimeoutId = window.setTimeout(() => this._destroyLinesCache(), LINES_CACHE_TIME_TO_LIVE);\n }\n\n private _destroyLinesCache(): void {\n this._linesCache = undefined;\n this._linesCacheDisposables.clear();\n if (this._linesCacheTimeoutId) {\n window.clearTimeout(this._linesCacheTimeoutId);\n this._linesCacheTimeoutId = 0;\n }\n }\n\n /**\n * A found substring is a whole word if it doesn't have an alphanumeric character directly\n * adjacent to it.\n * @param searchIndex starting indext of the potential whole word substring\n * @param line entire string in which the potential whole word was found\n * @param term the substring that starts at searchIndex\n */\n private _isWholeWord(searchIndex: number, line: string, term: string): boolean {\n return ((searchIndex === 0) || (NON_WORD_CHARACTERS.includes(line[searchIndex - 1]))) &&\n (((searchIndex + term.length) === line.length) || (NON_WORD_CHARACTERS.includes(line[searchIndex + term.length])));\n }\n\n /**\n * Searches a line for a search term. Takes the provided terminal line and searches the text line,\n * which may contain subsequent terminal lines if the text is wrapped. If the provided line number\n * is part of a wrapped text line that started on an earlier line then it is skipped since it will\n * be properly searched when the terminal line that the text starts on is searched.\n * @param term The search term.\n * @param searchPosition The position to start the search.\n * @param searchOptions Search options.\n * @param isReverseSearch Whether the search should start from the right side of the terminal and\n * search to the left.\n * @returns The search result if it was found.\n */\n protected _findInLine(term: string, searchPosition: ISearchPosition, searchOptions: ISearchOptions = {}, isReverseSearch: boolean = false): ISearchResult | undefined {\n const terminal = this._terminal!;\n const row = searchPosition.startRow;\n const col = searchPosition.startCol;\n\n // Ignore wrapped lines, only consider on unwrapped line (first row of command string).\n const firstLine = terminal.buffer.active.getLine(row);\n if (firstLine?.isWrapped) {\n if (isReverseSearch) {\n searchPosition.startCol += terminal.cols;\n return;\n }\n\n // This will iterate until we find the line start.\n // When we find it, we will search using the calculated start column.\n searchPosition.startRow--;\n searchPosition.startCol += terminal.cols;\n return this._findInLine(term, searchPosition, searchOptions);\n }\n let cache = this._linesCache?.[row];\n if (!cache) {\n cache = this._translateBufferLineToStringWithWrap(row, true);\n if (this._linesCache) {\n this._linesCache[row] = cache;\n }\n }\n const [stringLine, offsets] = cache;\n\n const offset = this._bufferColsToStringOffset(row, col);\n const searchTerm = searchOptions.caseSensitive ? term : term.toLowerCase();\n const searchStringLine = searchOptions.caseSensitive ? stringLine : stringLine.toLowerCase();\n\n let resultIndex = -1;\n if (searchOptions.regex) {\n const searchRegex = RegExp(searchTerm, 'g');\n let foundTerm: RegExpExecArray | null;\n if (isReverseSearch) {\n // This loop will get the resultIndex of the _last_ regex match in the range 0..offset\n while (foundTerm = searchRegex.exec(searchStringLine.slice(0, offset))) {\n resultIndex = searchRegex.lastIndex - foundTerm[0].length;\n term = foundTerm[0];\n searchRegex.lastIndex -= (term.length - 1);\n }\n } else {\n foundTerm = searchRegex.exec(searchStringLine.slice(offset));\n if (foundTerm && foundTerm[0].length > 0) {\n resultIndex = offset + (searchRegex.lastIndex - foundTerm[0].length);\n term = foundTerm[0];\n }\n }\n } else {\n if (isReverseSearch) {\n if (offset - searchTerm.length >= 0) {\n resultIndex = searchStringLine.lastIndexOf(searchTerm, offset - searchTerm.length);\n }\n } else {\n resultIndex = searchStringLine.indexOf(searchTerm, offset);\n }\n }\n\n if (resultIndex >= 0) {\n if (searchOptions.wholeWord && !this._isWholeWord(resultIndex, searchStringLine, term)) {\n return;\n }\n\n // Adjust the row number and search index if needed since a \"line\" of text can span multiple\n // rows\n let startRowOffset = 0;\n while (startRowOffset < offsets.length - 1 && resultIndex >= offsets[startRowOffset + 1]) {\n startRowOffset++;\n }\n let endRowOffset = startRowOffset;\n while (endRowOffset < offsets.length - 1 && resultIndex + term.length >= offsets[endRowOffset + 1]) {\n endRowOffset++;\n }\n const startColOffset = resultIndex - offsets[startRowOffset];\n const endColOffset = resultIndex + term.length - offsets[endRowOffset];\n const startColIndex = this._stringLengthToBufferSize(row + startRowOffset, startColOffset);\n const endColIndex = this._stringLengthToBufferSize(row + endRowOffset, endColOffset);\n const size = endColIndex - startColIndex + terminal.cols * (endRowOffset - startRowOffset);\n\n return {\n term,\n col: startColIndex,\n row: row + startRowOffset,\n size\n };\n }\n }\n\n private _stringLengthToBufferSize(row: number, offset: number): number {\n const line = this._terminal!.buffer.active.getLine(row);\n if (!line) {\n return 0;\n }\n for (let i = 0; i < offset; i++) {\n const cell = line.getCell(i);\n if (!cell) {\n break;\n }\n // Adjust the searchIndex to normalize emoji into single chars\n const char = cell.getChars();\n if (char.length > 1) {\n offset -= char.length - 1;\n }\n // Adjust the searchIndex for empty characters following wide unicode\n // chars (eg. CJK)\n const nextCell = line.getCell(i + 1);\n if (nextCell && nextCell.getWidth() === 0) {\n offset++;\n }\n }\n return offset;\n }\n\n private _bufferColsToStringOffset(startRow: number, cols: number): number {\n const terminal = this._terminal!;\n let lineIndex = startRow;\n let offset = 0;\n let line = terminal.buffer.active.getLine(lineIndex);\n while (cols > 0 && line) {\n for (let i = 0; i < cols && i < terminal.cols; i++) {\n const cell = line.getCell(i);\n if (!cell) {\n break;\n }\n if (cell.getWidth()) {\n // Treat null characters as whitespace to align with the translateToString API\n offset += cell.getCode() === 0 ? 1 : cell.getChars().length;\n }\n }\n lineIndex++;\n line = terminal.buffer.active.getLine(lineIndex);\n if (line && !line.isWrapped) {\n break;\n }\n cols -= terminal.cols;\n }\n return offset;\n }\n\n /**\n * Translates a buffer line to a string, including subsequent lines if they are wraps.\n * Wide characters will count as two columns in the resulting string. This\n * function is useful for getting the actual text underneath the raw selection\n * position.\n * @param lineIndex The index of the line being translated.\n * @param trimRight Whether to trim whitespace to the right.\n */\n private _translateBufferLineToStringWithWrap(lineIndex: number, trimRight: boolean): LineCacheEntry {\n const terminal = this._terminal!;\n const strings = [];\n const lineOffsets = [0];\n let line = terminal.buffer.active.getLine(lineIndex);\n while (line) {\n const nextLine = terminal.buffer.active.getLine(lineIndex + 1);\n const lineWrapsToNext = nextLine ? nextLine.isWrapped : false;\n let string = line.translateToString(!lineWrapsToNext && trimRight);\n if (lineWrapsToNext && nextLine) {\n const lastCell = line.getCell(line.length - 1);\n const lastCellIsNull = lastCell && lastCell.getCode() === 0 && lastCell.getWidth() === 1;\n // a wide character wrapped to the next line\n if (lastCellIsNull && nextLine.getCell(0)?.getWidth() === 2) {\n string = string.slice(0, -1);\n }\n }\n strings.push(string);\n if (lineWrapsToNext) {\n lineOffsets.push(lineOffsets[lineOffsets.length - 1] + string.length);\n } else {\n break;\n }\n lineIndex++;\n line = nextLine;\n }\n return [strings.join(''), lineOffsets];\n }\n\n /**\n * Selects and scrolls to a result.\n * @param result The result to select.\n * @returns Whether a result was selected.\n */\n private _selectResult(result: ISearchResult | undefined, options?: ISearchDecorationOptions, noScroll?: boolean): boolean {\n const terminal = this._terminal!;\n this._selectedDecoration.clear();\n if (!result) {\n terminal.clearSelection();\n return false;\n }\n terminal.select(result.col, result.row, result.size);\n if (options) {\n const marker = terminal.registerMarker(-terminal.buffer.active.baseY - terminal.buffer.active.cursorY + result.row);\n if (marker) {\n const decoration = terminal.registerDecoration({\n marker,\n x: result.col,\n width: result.size,\n backgroundColor: options.activeMatchBackground,\n layer: 'top',\n overviewRulerOptions: {\n color: options.activeMatchColorOverviewRuler\n }\n });\n if (decoration) {\n const disposables: IDisposable[] = [];\n disposables.push(marker);\n disposables.push(decoration.onRender((e) => this._applyStyles(e, options.activeMatchBorder, true)));\n disposables.push(decoration.onDispose(() => disposeArray(disposables)));\n this._selectedDecoration.value = { decoration, match: result, dispose() { decoration.dispose(); } };\n }\n }\n }\n\n if (!noScroll) {\n // If it is not in the viewport then we scroll else it just gets selected\n if (result.row >= (terminal.buffer.active.viewportY + terminal.rows) || result.row < terminal.buffer.active.viewportY) {\n let scroll = result.row - terminal.buffer.active.viewportY;\n scroll -= Math.floor(terminal.rows / 2);\n terminal.scrollLines(scroll);\n }\n }\n return true;\n }\n\n /**\n * Applies styles to the decoration when it is rendered.\n * @param element The decoration's element.\n * @param borderColor The border color to apply.\n * @param isActiveResult Whether the element is part of the active search result.\n * @returns\n */\n private _applyStyles(element: HTMLElement, borderColor: string | undefined, isActiveResult: boolean): void {\n if (!element.classList.contains('xterm-find-result-decoration')) {\n element.classList.add('xterm-find-result-decoration');\n if (borderColor) {\n element.style.outline = `1px solid ${borderColor}`;\n }\n }\n if (isActiveResult) {\n element.classList.add('xterm-find-active-result-decoration');\n }\n }\n\n /**\n * Creates a decoration for the result and applies styles\n * @param result the search result for which to create the decoration\n * @param options the options for the decoration\n * @returns the {@link IDecoration} or undefined if the marker has already been disposed of\n */\n private _createResultDecoration(result: ISearchResult, options: ISearchDecorationOptions): IDecoration | undefined {\n const terminal = this._terminal!;\n const marker = terminal.registerMarker(-terminal.buffer.active.baseY - terminal.buffer.active.cursorY + result.row);\n if (!marker) {\n return undefined;\n }\n const findResultDecoration = terminal.registerDecoration({\n marker,\n x: result.col,\n width: result.size,\n backgroundColor: options.matchBackground,\n overviewRulerOptions: this._highlightedLines.has(marker.line) ? undefined : {\n color: options.matchOverviewRuler,\n position: 'center'\n }\n });\n if (findResultDecoration) {\n const disposables: IDisposable[] = [];\n disposables.push(marker);\n disposables.push(findResultDecoration.onRender((e) => this._applyStyles(e, options.matchBorder, false)));\n disposables.push(findResultDecoration.onDispose(() => disposeArray(disposables)));\n }\n return findResultDecoration;\n }\n}\n"],
5
+ "mappings": "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",
6
+ "names": ["EventEmitter", "listener", "arg1", "arg2", "queue", "l", "i", "Disposable", "d", "index", "MutableDisposable", "value", "toDisposable", "disposeArray", "disposables", "getDisposeArrayDisposable", "array", "NON_WORD_CHARACTERS", "LINES_CACHE_TIME_TO_LIVE", "DEFAULT_HIGHLIGHT_LIMIT", "SearchAddon", "Disposable", "options", "MutableDisposable", "EventEmitter", "terminal", "toDisposable", "term", "retainCachedSearchTerm", "disposeArray", "searchOptions", "didOptionsChanged", "found", "searchResultsWithHighlight", "prevResult", "result", "match", "decoration", "startRow", "startCol", "searchPosition", "y", "prevSelectedPos", "lastSearchOptions", "resultIndex", "selectedMatch", "isReverseSearch", "getDisposeArrayDisposable", "searchIndex", "line", "row", "col", "cache", "stringLine", "offsets", "offset", "searchTerm", "searchStringLine", "searchRegex", "foundTerm", "startRowOffset", "endRowOffset", "startColOffset", "endColOffset", "startColIndex", "size", "cell", "char", "nextCell", "cols", "lineIndex", "i", "trimRight", "strings", "lineOffsets", "nextLine", "lineWrapsToNext", "string", "lastCell", "noScroll", "marker", "disposables", "e", "scroll", "element", "borderColor", "isActiveResult", "findResultDecoration"]
7
+ }
package/package.json CHANGED
@@ -1,11 +1,12 @@
1
1
  {
2
2
  "name": "@xterm/addon-search",
3
- "version": "0.16.0-beta.4",
3
+ "version": "0.16.0-beta.41",
4
4
  "author": {
5
5
  "name": "The xterm.js authors",
6
6
  "url": "https://xtermjs.org/"
7
7
  },
8
8
  "main": "lib/addon-search.js",
9
+ "module": "lib/addon-search.mjs",
9
10
  "types": "typings/addon-search.d.ts",
10
11
  "repository": "https://github.com/xtermjs/xterm.js/tree/master/addons/addon-search",
11
12
  "license": "MIT",
@@ -17,7 +18,8 @@
17
18
  "scripts": {
18
19
  "prepackage": "../../node_modules/.bin/tsc -p .",
19
20
  "package": "../../node_modules/.bin/webpack",
20
- "prepublishOnly": "npm run package"
21
+ "prepublishOnly": "npm run package",
22
+ "start": "node ../../demo/start"
21
23
  },
22
24
  "peerDependencies": {
23
25
  "@xterm/xterm": "^5.0.0"