UNPKG

matrix-react-sdk

Version:
129 lines (126 loc) 15.5 kB
"use strict"; var _interopRequireDefault = require("@babel/runtime/helpers/interopRequireDefault"); Object.defineProperty(exports, "__esModule", { value: true }); exports.default = void 0; var _offset = _interopRequireDefault(require("./offset")); /* 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. */ class DocumentPosition { constructor(index, offset) { this.index = index; this.offset = offset; } compare(otherPos) { if (this.index === otherPos.index) { return this.offset - otherPos.offset; } else { return this.index - otherPos.index; } } iteratePartsBetween(other, model, callback) { if (this.index === -1 || other.index === -1) { return; } const [startPos, endPos] = this.compare(other) < 0 ? [this, other] : [other, this]; if (startPos.index === endPos.index) { callback(model.parts[this.index], startPos.offset, endPos.offset); } else { const firstPart = model.parts[startPos.index]; callback(firstPart, startPos.offset, firstPart.text.length); for (let i = startPos.index + 1; i < endPos.index; ++i) { const part = model.parts[i]; callback(part, 0, part.text.length); } const lastPart = model.parts[endPos.index]; callback(lastPart, 0, endPos.offset); } } forwardsWhile(model, predicate) { if (this.index === -1) { return this; } let { index, offset } = this; const { parts } = model; while (index < parts.length) { const part = parts[index]; while (offset < part.text.length) { if (!predicate(index, offset, part)) { return new DocumentPosition(index, offset); } offset += 1; } // end reached if (index === parts.length - 1) { return new DocumentPosition(index, offset); } else { index += 1; offset = 0; } } return this; // impossible but Typescript doesn't believe us } backwardsWhile(model, predicate) { if (this.index === -1) { return this; } let { index, offset } = this; const parts = model.parts; while (index >= 0) { const part = parts[index]; while (offset > 0) { if (!predicate(index, offset - 1, part)) { return new DocumentPosition(index, offset); } offset -= 1; } // start reached if (index === 0) { return new DocumentPosition(index, offset); } else { index -= 1; offset = parts[index].text.length; } } return this; // impossible but Typescript doesn't believe us } asOffset(model) { if (this.index === -1) { return new _offset.default(0, true); } let offset = 0; for (let i = 0; i < this.index; ++i) { offset += model.parts[i].text.length; } offset += this.offset; const lastPart = model.parts[this.index]; const atEnd = !lastPart || offset >= lastPart.text.length; // if no last part, we're at the end return new _offset.default(offset, atEnd); } isAtEnd(model) { if (model.parts.length === 0) { return true; } const lastPartIdx = model.parts.length - 1; const lastPart = model.parts[lastPartIdx]; return this.index === lastPartIdx && this.offset === lastPart.text.length; } isAtStart() { return this.index === 0 && this.offset === 0; } } exports.default = DocumentPosition; //# sourceMappingURL=data:application/json;charset=utf-8;base64,eyJ2ZXJzaW9uIjozLCJuYW1lcyI6WyJfb2Zmc2V0IiwiX2ludGVyb3BSZXF1aXJlRGVmYXVsdCIsInJlcXVpcmUiLCJEb2N1bWVudFBvc2l0aW9uIiwiY29uc3RydWN0b3IiLCJpbmRleCIsIm9mZnNldCIsImNvbXBhcmUiLCJvdGhlclBvcyIsIml0ZXJhdGVQYXJ0c0JldHdlZW4iLCJvdGhlciIsIm1vZGVsIiwiY2FsbGJhY2siLCJzdGFydFBvcyIsImVuZFBvcyIsInBhcnRzIiwiZmlyc3RQYXJ0IiwidGV4dCIsImxlbmd0aCIsImkiLCJwYXJ0IiwibGFzdFBhcnQiLCJmb3J3YXJkc1doaWxlIiwicHJlZGljYXRlIiwiYmFja3dhcmRzV2hpbGUiLCJhc09mZnNldCIsIkRvY3VtZW50T2Zmc2V0IiwiYXRFbmQiLCJpc0F0RW5kIiwibGFzdFBhcnRJZHgiLCJpc0F0U3RhcnQiLCJleHBvcnRzIiwiZGVmYXVsdCJdLCJzb3VyY2VzIjpbIi4uLy4uL3NyYy9lZGl0b3IvcG9zaXRpb24udHMiXSwic291cmNlc0NvbnRlbnQiOlsiLypcbkNvcHlyaWdodCAyMDI0IE5ldyBWZWN0b3IgTHRkLlxuQ29weXJpZ2h0IDIwMTkgVGhlIE1hdHJpeC5vcmcgRm91bmRhdGlvbiBDLkkuQy5cblxuU1BEWC1MaWNlbnNlLUlkZW50aWZpZXI6IEFHUEwtMy4wLW9ubHkgT1IgR1BMLTMuMC1vbmx5XG5QbGVhc2Ugc2VlIExJQ0VOU0UgZmlsZXMgaW4gdGhlIHJlcG9zaXRvcnkgcm9vdCBmb3IgZnVsbCBkZXRhaWxzLlxuKi9cblxuaW1wb3J0IERvY3VtZW50T2Zmc2V0IGZyb20gXCIuL29mZnNldFwiO1xuaW1wb3J0IEVkaXRvck1vZGVsIGZyb20gXCIuL21vZGVsXCI7XG5pbXBvcnQgeyBQYXJ0IH0gZnJvbSBcIi4vcGFydHNcIjtcblxuZXhwb3J0IGludGVyZmFjZSBJUG9zaXRpb24ge1xuICAgIGluZGV4OiBudW1iZXI7XG4gICAgb2Zmc2V0OiBudW1iZXI7XG59XG5cbnR5cGUgQ2FsbGJhY2sgPSAocGFydDogUGFydCwgc3RhcnRJZHg6IG51bWJlciwgZW5kSWR4OiBudW1iZXIpID0+IHZvaWQ7XG5leHBvcnQgdHlwZSBQcmVkaWNhdGUgPSAoaW5kZXg6IG51bWJlciwgb2Zmc2V0OiBudW1iZXIsIHBhcnQ6IFBhcnQpID0+IGJvb2xlYW47XG5cbmV4cG9ydCBkZWZhdWx0IGNsYXNzIERvY3VtZW50UG9zaXRpb24gaW1wbGVtZW50cyBJUG9zaXRpb24ge1xuICAgIHB1YmxpYyBjb25zdHJ1Y3RvcihcbiAgICAgICAgcHVibGljIHJlYWRvbmx5IGluZGV4OiBudW1iZXIsXG4gICAgICAgIHB1YmxpYyByZWFkb25seSBvZmZzZXQ6IG51bWJlcixcbiAgICApIHt9XG5cbiAgICBwdWJsaWMgY29tcGFyZShvdGhlclBvczogRG9jdW1lbnRQb3NpdGlvbik6IG51bWJlciB7XG4gICAgICAgIGlmICh0aGlzLmluZGV4ID09PSBvdGhlclBvcy5pbmRleCkge1xuICAgICAgICAgICAgcmV0dXJuIHRoaXMub2Zmc2V0IC0gb3RoZXJQb3Mub2Zmc2V0O1xuICAgICAgICB9IGVsc2Uge1xuICAgICAgICAgICAgcmV0dXJuIHRoaXMuaW5kZXggLSBvdGhlclBvcy5pbmRleDtcbiAgICAgICAgfVxuICAgIH1cblxuICAgIHB1YmxpYyBpdGVyYXRlUGFydHNCZXR3ZWVuKG90aGVyOiBEb2N1bWVudFBvc2l0aW9uLCBtb2RlbDogRWRpdG9yTW9kZWwsIGNhbGxiYWNrOiBDYWxsYmFjayk6IHZvaWQge1xuICAgICAgICBpZiAodGhpcy5pbmRleCA9PT0gLTEgfHwgb3RoZXIuaW5kZXggPT09IC0xKSB7XG4gICAgICAgICAgICByZXR1cm47XG4gICAgICAgIH1cbiAgICAgICAgY29uc3QgW3N0YXJ0UG9zLCBlbmRQb3NdID0gdGhpcy5jb21wYXJlKG90aGVyKSA8IDAgPyBbdGhpcywgb3RoZXJdIDogW290aGVyLCB0aGlzXTtcbiAgICAgICAgaWYgKHN0YXJ0UG9zLmluZGV4ID09PSBlbmRQb3MuaW5kZXgpIHtcbiAgICAgICAgICAgIGNhbGxiYWNrKG1vZGVsLnBhcnRzW3RoaXMuaW5kZXhdLCBzdGFydFBvcy5vZmZzZXQsIGVuZFBvcy5vZmZzZXQpO1xuICAgICAgICB9IGVsc2Uge1xuICAgICAgICAgICAgY29uc3QgZmlyc3RQYXJ0ID0gbW9kZWwucGFydHNbc3RhcnRQb3MuaW5kZXhdO1xuICAgICAgICAgICAgY2FsbGJhY2soZmlyc3RQYXJ0LCBzdGFydFBvcy5vZmZzZXQsIGZpcnN0UGFydC50ZXh0Lmxlbmd0aCk7XG4gICAgICAgICAgICBmb3IgKGxldCBpID0gc3RhcnRQb3MuaW5kZXggKyAxOyBpIDwgZW5kUG9zLmluZGV4OyArK2kpIHtcbiAgICAgICAgICAgICAgICBjb25zdCBwYXJ0ID0gbW9kZWwucGFydHNbaV07XG4gICAgICAgICAgICAgICAgY2FsbGJhY2socGFydCwgMCwgcGFydC50ZXh0Lmxlbmd0aCk7XG4gICAgICAgICAgICB9XG4gICAgICAgICAgICBjb25zdCBsYXN0UGFydCA9IG1vZGVsLnBhcnRzW2VuZFBvcy5pbmRleF07XG4gICAgICAgICAgICBjYWxsYmFjayhsYXN0UGFydCwgMCwgZW5kUG9zLm9mZnNldCk7XG4gICAgICAgIH1cbiAgICB9XG5cbiAgICBwdWJsaWMgZm9yd2FyZHNXaGlsZShtb2RlbDogRWRpdG9yTW9kZWwsIHByZWRpY2F0ZTogUHJlZGljYXRlKTogRG9jdW1lbnRQb3NpdGlvbiB7XG4gICAgICAgIGlmICh0aGlzLmluZGV4ID09PSAtMSkge1xuICAgICAgICAgICAgcmV0dXJuIHRoaXM7XG4gICAgICAgIH1cblxuICAgICAgICBsZXQgeyBpbmRleCwgb2Zmc2V0IH0gPSB0aGlzO1xuICAgICAgICBjb25zdCB7IHBhcnRzIH0gPSBtb2RlbDtcbiAgICAgICAgd2hpbGUgKGluZGV4IDwgcGFydHMubGVuZ3RoKSB7XG4gICAgICAgICAgICBjb25zdCBwYXJ0ID0gcGFydHNbaW5kZXhdO1xuICAgICAgICAgICAgd2hpbGUgKG9mZnNldCA8IHBhcnQudGV4dC5sZW5ndGgpIHtcbiAgICAgICAgICAgICAgICBpZiAoIXByZWRpY2F0ZShpbmRleCwgb2Zmc2V0LCBwYXJ0KSkge1xuICAgICAgICAgICAgICAgICAgICByZXR1cm4gbmV3IERvY3VtZW50UG9zaXRpb24oaW5kZXgsIG9mZnNldCk7XG4gICAgICAgICAgICAgICAgfVxuICAgICAgICAgICAgICAgIG9mZnNldCArPSAxO1xuICAgICAgICAgICAgfVxuICAgICAgICAgICAgLy8gZW5kIHJlYWNoZWRcbiAgICAgICAgICAgIGlmIChpbmRleCA9PT0gcGFydHMubGVuZ3RoIC0gMSkge1xuICAgICAgICAgICAgICAgIHJldHVybiBuZXcgRG9jdW1lbnRQb3NpdGlvbihpbmRleCwgb2Zmc2V0KTtcbiAgICAgICAgICAgIH0gZWxzZSB7XG4gICAgICAgICAgICAgICAgaW5kZXggKz0gMTtcbiAgICAgICAgICAgICAgICBvZmZzZXQgPSAwO1xuICAgICAgICAgICAgfVxuICAgICAgICB9XG5cbiAgICAgICAgcmV0dXJuIHRoaXM7IC8vIGltcG9zc2libGUgYnV0IFR5cGVzY3JpcHQgZG9lc24ndCBiZWxpZXZlIHVzXG4gICAgfVxuXG4gICAgcHVibGljIGJhY2t3YXJkc1doaWxlKG1vZGVsOiBFZGl0b3JNb2RlbCwgcHJlZGljYXRlOiBQcmVkaWNhdGUpOiBEb2N1bWVudFBvc2l0aW9uIHtcbiAgICAgICAgaWYgKHRoaXMuaW5kZXggPT09IC0xKSB7XG4gICAgICAgICAgICByZXR1cm4gdGhpcztcbiAgICAgICAgfVxuXG4gICAgICAgIGxldCB7IGluZGV4LCBvZmZzZXQgfSA9IHRoaXM7XG4gICAgICAgIGNvbnN0IHBhcnRzID0gbW9kZWwucGFydHM7XG4gICAgICAgIHdoaWxlIChpbmRleCA+PSAwKSB7XG4gICAgICAgICAgICBjb25zdCBwYXJ0ID0gcGFydHNbaW5kZXhdO1xuICAgICAgICAgICAgd2hpbGUgKG9mZnNldCA+IDApIHtcbiAgICAgICAgICAgICAgICBpZiAoIXByZWRpY2F0ZShpbmRleCwgb2Zmc2V0IC0gMSwgcGFydCkpIHtcbiAgICAgICAgICAgICAgICAgICAgcmV0dXJuIG5ldyBEb2N1bWVudFBvc2l0aW9uKGluZGV4LCBvZmZzZXQpO1xuICAgICAgICAgICAgICAgIH1cbiAgICAgICAgICAgICAgICBvZmZzZXQgLT0gMTtcbiAgICAgICAgICAgIH1cbiAgICAgICAgICAgIC8vIHN0YXJ0IHJlYWNoZWRcbiAgICAgICAgICAgIGlmIChpbmRleCA9PT0gMCkge1xuICAgICAgICAgICAgICAgIHJldHVybiBuZXcgRG9jdW1lbnRQb3NpdGlvbihpbmRleCwgb2Zmc2V0KTtcbiAgICAgICAgICAgIH0gZWxzZSB7XG4gICAgICAgICAgICAgICAgaW5kZXggLT0gMTtcbiAgICAgICAgICAgICAgICBvZmZzZXQgPSBwYXJ0c1tpbmRleF0udGV4dC5sZW5ndGg7XG4gICAgICAgICAgICB9XG4gICAgICAgIH1cblxuICAgICAgICByZXR1cm4gdGhpczsgLy8gaW1wb3NzaWJsZSBidXQgVHlwZXNjcmlwdCBkb2Vzbid0IGJlbGlldmUgdXNcbiAgICB9XG5cbiAgICBwdWJsaWMgYXNPZmZzZXQobW9kZWw6IEVkaXRvck1vZGVsKTogRG9jdW1lbnRPZmZzZXQge1xuICAgICAgICBpZiAodGhpcy5pbmRleCA9PT0gLTEpIHtcbiAgICAgICAgICAgIHJldHVybiBuZXcgRG9jdW1lbnRPZmZzZXQoMCwgdHJ1ZSk7XG4gICAgICAgIH1cbiAgICAgICAgbGV0IG9mZnNldCA9IDA7XG4gICAgICAgIGZvciAobGV0IGkgPSAwOyBpIDwgdGhpcy5pbmRleDsgKytpKSB7XG4gICAgICAgICAgICBvZmZzZXQgKz0gbW9kZWwucGFydHNbaV0udGV4dC5sZW5ndGg7XG4gICAgICAgIH1cbiAgICAgICAgb2Zmc2V0ICs9IHRoaXMub2Zmc2V0O1xuICAgICAgICBjb25zdCBsYXN0UGFydCA9IG1vZGVsLnBhcnRzW3RoaXMuaW5kZXhdO1xuICAgICAgICBjb25zdCBhdEVuZCA9ICFsYXN0UGFydCB8fCBvZmZzZXQgPj0gbGFzdFBhcnQudGV4dC5sZW5ndGg7IC8vIGlmIG5vIGxhc3QgcGFydCwgd2UncmUgYXQgdGhlIGVuZFxuICAgICAgICByZXR1cm4gbmV3IERvY3VtZW50T2Zmc2V0KG9mZnNldCwgYXRFbmQpO1xuICAgIH1cblxuICAgIHB1YmxpYyBpc0F0RW5kKG1vZGVsOiBFZGl0b3JNb2RlbCk6IGJvb2xlYW4ge1xuICAgICAgICBpZiAobW9kZWwucGFydHMubGVuZ3RoID09PSAwKSB7XG4gICAgICAgICAgICByZXR1cm4gdHJ1ZTtcbiAgICAgICAgfVxuICAgICAgICBjb25zdCBsYXN0UGFydElkeCA9IG1vZGVsLnBhcnRzLmxlbmd0aCAtIDE7XG4gICAgICAgIGNvbnN0IGxhc3RQYXJ0ID0gbW9kZWwucGFydHNbbGFzdFBhcnRJZHhdO1xuICAgICAgICByZXR1cm4gdGhpcy5pbmRleCA9PT0gbGFzdFBhcnRJZHggJiYgdGhpcy5vZmZzZXQgPT09IGxhc3RQYXJ0LnRleHQubGVuZ3RoO1xuICAgIH1cblxuICAgIHB1YmxpYyBpc0F0U3RhcnQoKTogYm9vbGVhbiB7XG4gICAgICAgIHJldHVybiB0aGlzLmluZGV4ID09PSAwICYmIHRoaXMub2Zmc2V0ID09PSAwO1xuICAgIH1cbn1cbiJdLCJtYXBwaW5ncyI6Ijs7Ozs7OztBQVFBLElBQUFBLE9BQUEsR0FBQUMsc0JBQUEsQ0FBQUMsT0FBQTtBQVJBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBOztBQWNlLE1BQU1DLGdCQUFnQixDQUFzQjtFQUNoREMsV0FBV0EsQ0FDRUMsS0FBYSxFQUNiQyxNQUFjLEVBQ2hDO0lBQUEsS0FGa0JELEtBQWEsR0FBYkEsS0FBYTtJQUFBLEtBQ2JDLE1BQWMsR0FBZEEsTUFBYztFQUMvQjtFQUVJQyxPQUFPQSxDQUFDQyxRQUEwQixFQUFVO0lBQy9DLElBQUksSUFBSSxDQUFDSCxLQUFLLEtBQUtHLFFBQVEsQ0FBQ0gsS0FBSyxFQUFFO01BQy9CLE9BQU8sSUFBSSxDQUFDQyxNQUFNLEdBQUdFLFFBQVEsQ0FBQ0YsTUFBTTtJQUN4QyxDQUFDLE1BQU07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