UNPKG

monaco-editor

Version:
109 lines (108 loc) 5.24 kB
/*--------------------------------------------------------------------------------------------- * Copyright (c) Microsoft Corporation. All rights reserved. * Licensed under the MIT License. See License.txt in the project root for license information. *--------------------------------------------------------------------------------------------*/ import { Position } from '../core/position.js'; import { PrefixSumComputer } from '../viewModel/prefixSumComputer.js'; var MirrorTextModel = /** @class */ (function () { function MirrorTextModel(uri, lines, eol, versionId) { this._uri = uri; this._lines = lines; this._eol = eol; this._versionId = versionId; this._lineStarts = null; } MirrorTextModel.prototype.dispose = function () { this._lines.length = 0; }; MirrorTextModel.prototype.getText = function () { return this._lines.join(this._eol); }; MirrorTextModel.prototype.onEvents = function (e) { if (e.eol && e.eol !== this._eol) { this._eol = e.eol; this._lineStarts = null; } // Update my lines var changes = e.changes; for (var i = 0, len = changes.length; i < len; i++) { var change = changes[i]; this._acceptDeleteRange(change.range); this._acceptInsertText(new Position(change.range.startLineNumber, change.range.startColumn), change.text); } this._versionId = e.versionId; }; MirrorTextModel.prototype._ensureLineStarts = function () { if (!this._lineStarts) { var eolLength = this._eol.length; var linesLength = this._lines.length; var lineStartValues = new Uint32Array(linesLength); for (var i = 0; i < linesLength; i++) { lineStartValues[i] = this._lines[i].length + eolLength; } this._lineStarts = new PrefixSumComputer(lineStartValues); } }; /** * All changes to a line's text go through this method */ MirrorTextModel.prototype._setLineText = function (lineIndex, newValue) { this._lines[lineIndex] = newValue; if (this._lineStarts) { // update prefix sum this._lineStarts.changeValue(lineIndex, this._lines[lineIndex].length + this._eol.length); } }; MirrorTextModel.prototype._acceptDeleteRange = function (range) { if (range.startLineNumber === range.endLineNumber) { if (range.startColumn === range.endColumn) { // Nothing to delete return; } // Delete text on the affected line this._setLineText(range.startLineNumber - 1, this._lines[range.startLineNumber - 1].substring(0, range.startColumn - 1) + this._lines[range.startLineNumber - 1].substring(range.endColumn - 1)); return; } // Take remaining text on last line and append it to remaining text on first line this._setLineText(range.startLineNumber - 1, this._lines[range.startLineNumber - 1].substring(0, range.startColumn - 1) + this._lines[range.endLineNumber - 1].substring(range.endColumn - 1)); // Delete middle lines this._lines.splice(range.startLineNumber, range.endLineNumber - range.startLineNumber); if (this._lineStarts) { // update prefix sum this._lineStarts.removeValues(range.startLineNumber, range.endLineNumber - range.startLineNumber); } }; MirrorTextModel.prototype._acceptInsertText = function (position, insertText) { if (insertText.length === 0) { // Nothing to insert return; } var insertLines = insertText.split(/\r\n|\r|\n/); if (insertLines.length === 1) { // Inserting text on one line this._setLineText(position.lineNumber - 1, this._lines[position.lineNumber - 1].substring(0, position.column - 1) + insertLines[0] + this._lines[position.lineNumber - 1].substring(position.column - 1)); return; } // Append overflowing text from first line to the end of text to insert insertLines[insertLines.length - 1] += this._lines[position.lineNumber - 1].substring(position.column - 1); // Delete overflowing text from first line and insert text on first line this._setLineText(position.lineNumber - 1, this._lines[position.lineNumber - 1].substring(0, position.column - 1) + insertLines[0]); // Insert new lines & store lengths var newLengths = new Uint32Array(insertLines.length - 1); for (var i = 1; i < insertLines.length; i++) { this._lines.splice(position.lineNumber + i - 1, 0, insertLines[i]); newLengths[i - 1] = insertLines[i].length + this._eol.length; } if (this._lineStarts) { // update prefix sum this._lineStarts.insertValues(position.lineNumber, newLengths); } }; return MirrorTextModel; }()); export { MirrorTextModel };