UNPKG

matrix-react-sdk

Version:
125 lines (120 loc) 16.4 kB
"use strict"; var _interopRequireDefault = require("@babel/runtime/helpers/interopRequireDefault"); Object.defineProperty(exports, "__esModule", { value: true }); exports.default = void 0; var _defineProperty2 = _interopRequireDefault(require("@babel/runtime/helpers/defineProperty")); /* Copyright 2024 New Vector Ltd. Copyright 2019 The Matrix.org Foundation C.I.C. SPDX-License-Identifier: AGPL-3.0-only OR GPL-3.0-only Please see LICENSE files in the repository root for full details. */ const whitespacePredicate = (index, offset, part) => { return part.text[offset].trim() === ""; }; class Range { constructor(model, positionA, positionB = positionA) { (0, _defineProperty2.default)(this, "_start", void 0); (0, _defineProperty2.default)(this, "_end", void 0); (0, _defineProperty2.default)(this, "_lastStart", void 0); (0, _defineProperty2.default)(this, "_initializedEmpty", void 0); this.model = model; const bIsLarger = positionA.compare(positionB) < 0; this._start = bIsLarger ? positionA : positionB; this._end = bIsLarger ? positionB : positionA; this._lastStart = this._start; this._initializedEmpty = this._start.index === this._end.index && this._start.offset == this._end.offset; } moveStartForwards(delta) { this._start = this._start.forwardsWhile(this.model, () => { delta -= 1; return delta >= 0; }); } wasInitializedEmpty() { return this._initializedEmpty; } setWasEmpty(value) { this._initializedEmpty = value; } getLastStartingPosition() { return this._lastStart; } setLastStartingPosition(position) { this._lastStart = position; } moveEndBackwards(delta) { this._end = this._end.backwardsWhile(this.model, () => { delta -= 1; return delta >= 0; }); } trim() { if (this.text.trim() === "") { this._start = this._end; return; } this._start = this._start.forwardsWhile(this.model, whitespacePredicate); this._end = this._end.backwardsWhile(this.model, whitespacePredicate); } expandBackwardsWhile(predicate) { this._start = this._start.backwardsWhile(this.model, predicate); } expandForwardsWhile(predicate) { this._end = this._end.forwardsWhile(this.model, predicate); } get text() { let text = ""; this._start.iteratePartsBetween(this._end, this.model, (part, startIdx, endIdx) => { const t = part.text.substring(startIdx, endIdx); text = text + t; }); return text; } /** * Splits the model at the range boundaries and replaces with the given parts. * Should be run inside a `model.transform()` callback. * @param {Part[]} parts the parts to replace the range with * @return {Number} the net amount of characters added, can be negative. */ replace(parts) { const newLength = parts.reduce((sum, part) => sum + part.text.length, 0); let oldLength = 0; this._start.iteratePartsBetween(this._end, this.model, (part, startIdx, endIdx) => { oldLength += endIdx - startIdx; }); this.model.replaceRange(this._start, this._end, parts); return newLength - oldLength; } /** * Returns a copy of the (partial) parts within the range. * For partial parts, only the text is adjusted to the part that intersects with the range. */ get parts() { const parts = []; this._start.iteratePartsBetween(this._end, this.model, (part, startIdx, endIdx) => { const serializedPart = part.serialize(); serializedPart.text = part.text.substring(startIdx, endIdx); const newPart = this.model.partCreator.deserializePart(serializedPart); if (newPart) parts.push(newPart); }); return parts; } get length() { let len = 0; this._start.iteratePartsBetween(this._end, this.model, (part, startIdx, endIdx) => { len += endIdx - startIdx; }); return len; } get start() { return this._start; } get end() { return this._end; } } exports.default = Range; //# sourceMappingURL=data:application/json;charset=utf-8;base64,eyJ2ZXJzaW9uIjozLCJuYW1lcyI6WyJ3aGl0ZXNwYWNlUHJlZGljYXRlIiwiaW5kZXgiLCJvZmZzZXQiLCJwYXJ0IiwidGV4dCIsInRyaW0iLCJSYW5nZSIsImNvbnN0cnVjdG9yIiwibW9kZWwiLCJwb3NpdGlvbkEiLCJwb3NpdGlvbkIiLCJfZGVmaW5lUHJvcGVydHkyIiwiZGVmYXVsdCIsImJJc0xhcmdlciIsImNvbXBhcmUiLCJfc3RhcnQiLCJfZW5kIiwiX2xhc3RTdGFydCIsIl9pbml0aWFsaXplZEVtcHR5IiwibW92ZVN0YXJ0Rm9yd2FyZHMiLCJkZWx0YSIsImZvcndhcmRzV2hpbGUiLCJ3YXNJbml0aWFsaXplZEVtcHR5Iiwic2V0V2FzRW1wdHkiLCJ2YWx1ZSIsImdldExhc3RTdGFydGluZ1Bvc2l0aW9uIiwic2V0TGFzdFN0YXJ0aW5nUG9zaXRpb24iLCJwb3NpdGlvbiIsIm1vdmVFbmRCYWNrd2FyZHMiLCJiYWNrd2FyZHNXaGlsZSIsImV4cGFuZEJhY2t3YXJkc1doaWxlIiwicHJlZGljYXRlIiwiZXhwYW5kRm9yd2FyZHNXaGlsZSIsIml0ZXJhdGVQYXJ0c0JldHdlZW4iLCJzdGFydElkeCIsImVuZElkeCIsInQiLCJzdWJzdHJpbmciLCJyZXBsYWNlIiwicGFydHMiLCJuZXdMZW5ndGgiLCJyZWR1Y2UiLCJzdW0iLCJsZW5ndGgiLCJvbGRMZW5ndGgiLCJyZXBsYWNlUmFuZ2UiLCJzZXJpYWxpemVkUGFydCIsInNlcmlhbGl6ZSIsIm5ld1BhcnQiLCJwYXJ0Q3JlYXRvciIsImRlc2VyaWFsaXplUGFydCIsInB1c2giLCJsZW4iLCJzdGFydCIsImVuZCIsImV4cG9ydHMiXSwic291cmNlcyI6WyIuLi8uLi9zcmMvZWRpdG9yL3JhbmdlLnRzIl0sInNvdXJjZXNDb250ZW50IjpbIi8qXG5Db3B5cmlnaHQgMjAyNCBOZXcgVmVjdG9yIEx0ZC5cbkNvcHlyaWdodCAyMDE5IFRoZSBNYXRyaXgub3JnIEZvdW5kYXRpb24gQy5JLkMuXG5cblNQRFgtTGljZW5zZS1JZGVudGlmaWVyOiBBR1BMLTMuMC1vbmx5IE9SIEdQTC0zLjAtb25seVxuUGxlYXNlIHNlZSBMSUNFTlNFIGZpbGVzIGluIHRoZSByZXBvc2l0b3J5IHJvb3QgZm9yIGZ1bGwgZGV0YWlscy5cbiovXG5cbmltcG9ydCBFZGl0b3JNb2RlbCBmcm9tIFwiLi9tb2RlbFwiO1xuaW1wb3J0IERvY3VtZW50UG9zaXRpb24sIHsgUHJlZGljYXRlIH0gZnJvbSBcIi4vcG9zaXRpb25cIjtcbmltcG9ydCB7IFBhcnQgfSBmcm9tIFwiLi9wYXJ0c1wiO1xuXG5jb25zdCB3aGl0ZXNwYWNlUHJlZGljYXRlOiBQcmVkaWNhdGUgPSAoaW5kZXgsIG9mZnNldCwgcGFydCkgPT4ge1xuICAgIHJldHVybiBwYXJ0LnRleHRbb2Zmc2V0XS50cmltKCkgPT09IFwiXCI7XG59O1xuXG5leHBvcnQgZGVmYXVsdCBjbGFzcyBSYW5nZSB7XG4gICAgcHJpdmF0ZSBfc3RhcnQ6IERvY3VtZW50UG9zaXRpb247XG4gICAgcHJpdmF0ZSBfZW5kOiBEb2N1bWVudFBvc2l0aW9uO1xuICAgIHByaXZhdGUgX2xhc3RTdGFydDogRG9jdW1lbnRQb3NpdGlvbjtcbiAgICBwcml2YXRlIF9pbml0aWFsaXplZEVtcHR5OiBib29sZWFuO1xuXG4gICAgcHVibGljIGNvbnN0cnVjdG9yKFxuICAgICAgICBwdWJsaWMgcmVhZG9ubHkgbW9kZWw6IEVkaXRvck1vZGVsLFxuICAgICAgICBwb3NpdGlvbkE6IERvY3VtZW50UG9zaXRpb24sXG4gICAgICAgIHBvc2l0aW9uQiA9IHBvc2l0aW9uQSxcbiAgICApIHtcbiAgICAgICAgY29uc3QgYklzTGFyZ2VyID0gcG9zaXRpb25BLmNvbXBhcmUocG9zaXRpb25CKSA8IDA7XG4gICAgICAgIHRoaXMuX3N0YXJ0ID0gYklzTGFyZ2VyID8gcG9zaXRpb25BIDogcG9zaXRpb25CO1xuICAgICAgICB0aGlzLl9lbmQgPSBiSXNMYXJnZXIgPyBwb3NpdGlvbkIgOiBwb3NpdGlvbkE7XG4gICAgICAgIHRoaXMuX2xhc3RTdGFydCA9IHRoaXMuX3N0YXJ0O1xuICAgICAgICB0aGlzLl9pbml0aWFsaXplZEVtcHR5ID0gdGhpcy5fc3RhcnQuaW5kZXggPT09IHRoaXMuX2VuZC5pbmRleCAmJiB0aGlzLl9zdGFydC5vZmZzZXQgPT0gdGhpcy5fZW5kLm9mZnNldDtcbiAgICB9XG5cbiAgICBwdWJsaWMgbW92ZVN0YXJ0Rm9yd2FyZHMoZGVsdGE6IG51bWJlcik6IHZvaWQge1xuICAgICAgICB0aGlzLl9zdGFydCA9IHRoaXMuX3N0YXJ0LmZvcndhcmRzV2hpbGUodGhpcy5tb2RlbCwgKCkgPT4ge1xuICAgICAgICAgICAgZGVsdGEgLT0gMTtcbiAgICAgICAgICAgIHJldHVybiBkZWx0YSA+PSAwO1xuICAgICAgICB9KTtcbiAgICB9XG5cbiAgICBwdWJsaWMgd2FzSW5pdGlhbGl6ZWRFbXB0eSgpOiBib29sZWFuIHtcbiAgICAgICAgcmV0dXJuIHRoaXMuX2luaXRpYWxpemVkRW1wdHk7XG4gICAgfVxuXG4gICAgcHVibGljIHNldFdhc0VtcHR5KHZhbHVlOiBib29sZWFuKTogdm9pZCB7XG4gICAgICAgIHRoaXMuX2luaXRpYWxpemVkRW1wdHkgPSB2YWx1ZTtcbiAgICB9XG5cbiAgICBwdWJsaWMgZ2V0TGFzdFN0YXJ0aW5nUG9zaXRpb24oKTogRG9jdW1lbnRQb3NpdGlvbiB7XG4gICAgICAgIHJldHVybiB0aGlzLl9sYXN0U3RhcnQ7XG4gICAgfVxuXG4gICAgcHVibGljIHNldExhc3RTdGFydGluZ1Bvc2l0aW9uKHBvc2l0aW9uOiBEb2N1bWVudFBvc2l0aW9uKTogdm9pZCB7XG4gICAgICAgIHRoaXMuX2xhc3RTdGFydCA9IHBvc2l0aW9uO1xuICAgIH1cblxuICAgIHB1YmxpYyBtb3ZlRW5kQmFja3dhcmRzKGRlbHRhOiBudW1iZXIpOiB2b2lkIHtcbiAgICAgICAgdGhpcy5fZW5kID0gdGhpcy5fZW5kLmJhY2t3YXJkc1doaWxlKHRoaXMubW9kZWwsICgpID0+IHtcbiAgICAgICAgICAgIGRlbHRhIC09IDE7XG4gICAgICAgICAgICByZXR1cm4gZGVsdGEgPj0gMDtcbiAgICAgICAgfSk7XG4gICAgfVxuXG4gICAgcHVibGljIHRyaW0oKTogdm9pZCB7XG4gICAgICAgIGlmICh0aGlzLnRleHQudHJpbSgpID09PSBcIlwiKSB7XG4gICAgICAgICAgICB0aGlzLl9zdGFydCA9IHRoaXMuX2VuZDtcbiAgICAgICAgICAgIHJldHVybjtcbiAgICAgICAgfVxuICAgICAgICB0aGlzLl9zdGFydCA9IHRoaXMuX3N0YXJ0LmZvcndhcmRzV2hpbGUodGhpcy5tb2RlbCwgd2hpdGVzcGFjZVByZWRpY2F0ZSk7XG4gICAgICAgIHRoaXMuX2VuZCA9IHRoaXMuX2VuZC5iYWNrd2FyZHNXaGlsZSh0aGlzLm1vZGVsLCB3aGl0ZXNwYWNlUHJlZGljYXRlKTtcbiAgICB9XG5cbiAgICBwdWJsaWMgZXhwYW5kQmFja3dhcmRzV2hpbGUocHJlZGljYXRlOiBQcmVkaWNhdGUpOiB2b2lkIHtcbiAgICAgICAgdGhpcy5fc3RhcnQgPSB0aGlzLl9zdGFydC5iYWNrd2FyZHNXaGlsZSh0aGlzLm1vZGVsLCBwcmVkaWNhdGUpO1xuICAgIH1cblxuICAgIHB1YmxpYyBleHBhbmRGb3J3YXJkc1doaWxlKHByZWRpY2F0ZTogUHJlZGljYXRlKTogdm9pZCB7XG4gICAgICAgIHRoaXMuX2VuZCA9IHRoaXMuX2VuZC5mb3J3YXJkc1doaWxlKHRoaXMubW9kZWwsIHByZWRpY2F0ZSk7XG4gICAgfVxuXG4gICAgcHVibGljIGdldCB0ZXh0KCk6IHN0cmluZyB7XG4gICAgICAgIGxldCB0ZXh0ID0gXCJcIjtcbiAgICAgICAgdGhpcy5fc3RhcnQuaXRlcmF0ZVBhcnRzQmV0d2Vlbih0aGlzLl9lbmQsIHRoaXMubW9kZWwsIChwYXJ0LCBzdGFydElkeCwgZW5kSWR4KSA9PiB7XG4gICAgICAgICAgICBjb25zdCB0ID0gcGFydC50ZXh0LnN1YnN0cmluZyhzdGFydElkeCwgZW5kSWR4KTtcbiAgICAgICAgICAgIHRleHQgPSB0ZXh0ICsgdDtcbiAgICAgICAgfSk7XG4gICAgICAgIHJldHVybiB0ZXh0O1xuICAgIH1cblxuICAgIC8qKlxuICAgICAqIFNwbGl0cyB0aGUgbW9kZWwgYXQgdGhlIHJhbmdlIGJvdW5kYXJpZXMgYW5kIHJlcGxhY2VzIHdpdGggdGhlIGdpdmVuIHBhcnRzLlxuICAgICAqIFNob3VsZCBiZSBydW4gaW5zaWRlIGEgYG1vZGVsLnRyYW5zZm9ybSgpYCBjYWxsYmFjay5cbiAgICAgKiBAcGFyYW0ge1BhcnRbXX0gcGFydHMgdGhlIHBhcnRzIHRvIHJlcGxhY2UgdGhlIHJhbmdlIHdpdGhcbiAgICAgKiBAcmV0dXJuIHtOdW1iZXJ9IHRoZSBuZXQgYW1vdW50IG9mIGNoYXJhY3RlcnMgYWRkZWQsIGNhbiBiZSBuZWdhdGl2ZS5cbiAgICAgKi9cbiAgICBwdWJsaWMgcmVwbGFjZShwYXJ0czogUGFydFtdKTogbnVtYmVyIHtcbiAgICAgICAgY29uc3QgbmV3TGVuZ3RoID0gcGFydHMucmVkdWNlKChzdW0sIHBhcnQpID0+IHN1bSArIHBhcnQudGV4dC5sZW5ndGgsIDApO1xuICAgICAgICBsZXQgb2xkTGVuZ3RoID0gMDtcbiAgICAgICAgdGhpcy5fc3RhcnQuaXRlcmF0ZVBhcnRzQmV0d2Vlbih0aGlzLl9lbmQsIHRoaXMubW9kZWwsIChwYXJ0LCBzdGFydElkeCwgZW5kSWR4KSA9PiB7XG4gICAgICAgICAgICBvbGRMZW5ndGggKz0gZW5kSWR4IC0gc3RhcnRJZHg7XG4gICAgICAgIH0pO1xuICAgICAgICB0aGlzLm1vZGVsLnJlcGxhY2VSYW5nZSh0aGlzLl9zdGFydCwgdGhpcy5fZW5kLCBwYXJ0cyk7XG4gICAgICAgIHJldHVybiBuZXdMZW5ndGggLSBvbGRMZW5ndGg7XG4gICAgfVxuXG4gICAgLyoqXG4gICAgICogUmV0dXJucyBhIGNvcHkgb2YgdGhlIChwYXJ0aWFsKSBwYXJ0cyB3aXRoaW4gdGhlIHJhbmdlLlxuICAgICAqIEZvciBwYXJ0aWFsIHBhcnRzLCBvbmx5IHRoZSB0ZXh0IGlzIGFkanVzdGVkIHRvIHRoZSBwYXJ0IHRoYXQgaW50ZXJzZWN0cyB3aXRoIHRoZSByYW5nZS5cbiAgICAgKi9cbiAgICBwdWJsaWMgZ2V0IHBhcnRzKCk6IFBhcnRbXSB7XG4gICAgICAgIGNvbnN0IHBhcnRzOiBQYXJ0W10gPSBbXTtcbiAgICAgICAgdGhpcy5fc3RhcnQuaXRlcmF0ZVBhcnRzQmV0d2Vlbih0aGlzLl9lbmQsIHRoaXMubW9kZWwsIChwYXJ0LCBzdGFydElkeCwgZW5kSWR4KSA9PiB7XG4gICAgICAgICAgICBjb25zdCBzZXJpYWxpemVkUGFydCA9IHBhcnQuc2VyaWFsaXplKCk7XG4gICAgICAgICAgICBzZXJpYWxpemVkUGFydC50ZXh0ID0gcGFydC50ZXh0LnN1YnN0cmluZyhzdGFydElkeCwgZW5kSWR4KTtcbiAgICAgICAgICAgIGNvbnN0IG5ld1BhcnQgPSB0aGlzLm1vZGVsLnBhcnRDcmVhdG9yLmRlc2VyaWFsaXplUGFydChzZXJpYWxpemVkUGFydCk7XG4gICAgICAgICAgICBpZiAobmV3UGFydCkgcGFydHMucHVzaChuZXdQYXJ0KTtcbiAgICAgICAgfSk7XG4gICAgICAgIHJldHVybiBwYXJ0cztcbiAgICB9XG5cbiAgICBwdWJsaWMgZ2V0IGxlbmd0aCgpOiBudW1iZXIge1xuICAgICAgICBsZXQgbGVuID0gMDtcbiAgICAgICAgdGhpcy5fc3RhcnQuaXRlcmF0ZVBhcnRzQmV0d2Vlbih0aGlzLl9lbmQsIHRoaXMubW9kZWwsIChwYXJ0LCBzdGFydElkeCwgZW5kSWR4KSA9PiB7XG4gICAgICAgICAgICBsZW4gKz0gZW5kSWR4IC0gc3RhcnRJZHg7XG4gICAgICAgIH0pO1xuICAgICAgICByZXR1cm4gbGVuO1xuICAgIH1cblxuICAgIHB1YmxpYyBnZXQgc3RhcnQoKTogRG9jdW1lbnRQb3NpdGlvbiB7XG4gICAgICAgIHJldHVybiB0aGlzLl9zdGFydDtcbiAgICB9XG5cbiAgICBwdWJsaWMgZ2V0IGVuZCgpOiBEb2N1bWVudFBvc2l0aW9uIHtcbiAgICAgICAgcmV0dXJuIHRoaXMuX2VuZDtcbiAgICB9XG59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S0FBSztNQUMvRVMsU0FBUyxJQUFJVCxNQUFNLEdBQUdELFFBQVE7SUFDbEMsQ0FBQyxDQUFDO0lBQ0YsSUFBSSxDQUFDMUIsS0FBSyxDQUFDcUMsWUFBWSxDQUFDLElBQUksQ0FBQzlCLE1BQU0sRUFBRSxJQUFJLENBQUNDLElBQUksRUFBRXVCLEtBQUssQ0FBQztJQUN0RCxPQUFPQyxTQUFTLEdBQUdJLFNBQVM7RUFDaEM7O0VBRUE7QUFDSjtBQUNBO0FBQ0E7RUFDSSxJQUFXTCxLQUFLQSxDQUFBLEVBQVc7SUFDdkIsTUFBTUEsS0FBYSxHQUFHLEVBQUU7SUFDeEIsSUFBSSxDQUFDeEIsTUFBTSxDQUFDa0IsbUJBQW1CLENBQUMsSUFBSSxDQUFDakIsSUFBSSxFQUFFLElBQUksQ0FBQ1IsS0FBSyxFQUFFLENBQUNMLElBQUksRUFBRStCLFFBQVEsRUFBRUMsTUFBTSxLQUFLO01BQy9FLE1BQU1XLGNBQWMsR0FBRzNDLElBQUksQ0FBQzRDLFNBQVMsQ0FBQyxDQUFDO01BQ3ZDRCxjQUFjLENBQUMxQyxJQUFJLEdBQUdELElBQUksQ0FBQ0MsSUFBSSxDQUFDaUMsU0FBUyxDQUFDSCxRQUFRLEVBQUVDLE1BQU0sQ0FBQztNQUMzRCxNQUFNYSxPQUFPLEdBQUcsSUFBSSxDQUFDeEMsS0FBSyxDQUFDeUMsV0FBVyxDQUFDQyxlQUFlLENBQUNKLGNBQWMsQ0FBQztNQUN0RSxJQUFJRSxPQUFPLEVBQUVULEtBQUssQ0FBQ1ksSUFBSSxDQUFDSCxPQUFPLENBQUM7SUFDcEMsQ0FBQyxDQUFDO0lBQ0YsT0FBT1QsS0FBSztFQUNoQjtFQUVBLElBQVdJLE1BQU1BLENBQUEsRUFBVztJQUN4QixJQUFJUyxHQUFHLEdBQUcsQ0FBQztJQUNYLElBQUksQ0FBQ3JDLE1BQU0sQ0FBQ2tCLG1CQUFtQixDQUFDLElBQUksQ0FBQ2pCLElBQUksRUFBRSxJQUFJLENBQUNSLEtBQUssRUFBRSxDQUFDTCxJQUFJLEVBQUUrQixRQUFRLEVBQUVDLE1BQU0sS0FBSztNQUMvRWlCLEdBQUcsSUFBSWpCLE1BQU0sR0FBR0QsUUFBUTtJQUM1QixDQUFDLENBQUM7SUFDRixPQUFPa0IsR0FBRztFQUNkO0VBRUEsSUFBV0MsS0FBS0EsQ0FBQSxFQUFxQjtJQUNqQyxPQUFPLElBQUksQ0FBQ3RDLE1BQU07RUFDdEI7RUFFQSxJQUFXdUMsR0FBR0EsQ0FBQSxFQUFxQjtJQUMvQixPQUFPLElBQUksQ0FBQ3RDLElBQUk7RUFDcEI7QUFDSjtBQUFDdUMsT0FBQSxDQUFBM0MsT0FBQSxHQUFBTixLQUFBIiwiaWdub3JlTGlzdCI6W119