matrix-react-sdk
Version:
SDK for matrix.org using React
125 lines (120 loc) • 16.4 kB
JavaScript
"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