matrix-react-sdk
Version:
SDK for matrix.org using React
199 lines (162 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 _offset = _interopRequireDefault(require("./offset"));
/*
Copyright 2019 The Matrix.org Foundation C.I.C.
Licensed under the Apache License, Version 2.0 (the "License");
you may not use this file except in compliance with the License.
You may obtain a copy of the License at
http://www.apache.org/licenses/LICENSE-2.0
Unless required by applicable law or agreed to in writing, software
distributed under the License is distributed on an "AS IS" BASIS,
WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
See the License for the specific language governing permissions and
limitations under the License.
*/
class DocumentPosition
/*:: implements IPosition*/
{
constructor(index
/*: number*/
, offset
/*: number*/
) {
this.index
/*:: */
= index
/*:: */
;
this.offset
/*:: */
= offset
/*:: */
;
}
compare(otherPos
/*: DocumentPosition*/
) {
if (this.index === otherPos.index) {
return this.offset - otherPos.offset;
} else {
return this.index - otherPos.index;
}
}
iteratePartsBetween(other
/*: DocumentPosition*/
, model
/*: EditorModel*/
, callback
/*: 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
/*: EditorModel*/
, predicate
/*: 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;
}
}
}
backwardsWhile(model
/*: EditorModel*/
, predicate
/*: 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;
}
}
}
asOffset(model
/*: EditorModel*/
) {
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
/*: EditorModel*/
) {
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,eyJ2ZXJzaW9uIjozLCJzb3VyY2VzIjpbIi4uLy4uL3NyYy9lZGl0b3IvcG9zaXRpb24udHMiXSwibmFtZXMiOlsiRG9jdW1lbnRQb3NpdGlvbiIsImNvbnN0cnVjdG9yIiwiaW5kZXgiLCJvZmZzZXQiLCJjb21wYXJlIiwib3RoZXJQb3MiLCJpdGVyYXRlUGFydHNCZXR3ZWVuIiwib3RoZXIiLCJtb2RlbCIsImNhbGxiYWNrIiwic3RhcnRQb3MiLCJlbmRQb3MiLCJwYXJ0cyIsImZpcnN0UGFydCIsInRleHQiLCJsZW5ndGgiLCJpIiwicGFydCIsImxhc3RQYXJ0IiwiZm9yd2FyZHNXaGlsZSIsInByZWRpY2F0ZSIsImJhY2t3YXJkc1doaWxlIiwiYXNPZmZzZXQiLCJEb2N1bWVudE9mZnNldCIsImF0RW5kIiwiaXNBdEVuZCIsImxhc3RQYXJ0SWR4IiwiaXNBdFN0YXJ0Il0sIm1hcHBpbmdzIjoiOzs7Ozs7Ozs7QUFnQkE7O0FBaEJBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQWNlLE1BQU1BO0FBQU47QUFBNEM7QUFDdkRDLEVBQUFBLFdBQVcsQ0FBaUJDO0FBQWpCO0FBQUEsSUFBZ0RDO0FBQWhEO0FBQUEsSUFBZ0U7QUFBQSxTQUEvQ0Q7QUFBK0M7QUFBQSxNQUEvQ0E7QUFBK0M7QUFBQTtBQUFBLFNBQWhCQztBQUFnQjtBQUFBLE1BQWhCQTtBQUFnQjtBQUFBO0FBQzFFOztBQUVEQyxFQUFBQSxPQUFPLENBQUNDO0FBQUQ7QUFBQSxJQUE2QjtBQUNoQyxRQUFJLEtBQUtILEtBQUwsS0FBZUcsUUFBUSxDQUFDSCxLQUE1QixFQUFtQztBQUMvQixhQUFPLEtBQUtDLE1BQUwsR0FBY0UsUUFBUSxDQUFDRixNQUE5QjtBQUNILEtBRkQsTUFFTztBQUNILGFBQU8sS0FBS0QsS0FBTCxHQUFhRyxRQUFRLENBQUNILEtBQTdCO0FBQ0g7QUFDSjs7QUFFREksRUFBQUEsbUJBQW1CLENBQUNDO0FBQUQ7QUFBQSxJQUEw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S0FBS2QsS0FBekIsRUFBZ0MsRUFBRWMsQ0FBbEMsRUFBcUM7QUFDakNiLE1BQUFBLE1BQU0sSUFBSUssS0FBSyxDQUFDSSxLQUFOLENBQVlJLENBQVosRUFBZUYsSUFBZixDQUFvQkMsTUFBOUI7QUFDSDs7QUFDRFosSUFBQUEsTUFBTSxJQUFJLEtBQUtBLE1BQWY7QUFDQSxVQUFNZSxRQUFRLEdBQUdWLEtBQUssQ0FBQ0ksS0FBTixDQUFZLEtBQUtWLEtBQWpCLENBQWpCO0FBQ0EsVUFBTXNCLEtBQUssR0FBRyxDQUFDTixRQUFELElBQWFmLE1BQU0sSUFBSWUsUUFBUSxDQUFDSixJQUFULENBQWNDLE1BQW5ELENBVnlCLENBVWtDOztBQUMzRCxXQUFPLElBQUlRLGVBQUosQ0FBbUJwQixNQUFuQixFQUEyQnFCLEtBQTNCLENBQVA7QUFDSDs7QUFFREMsRUFBQUEsT0FBTyxDQUFDakI7QUFBRDtBQUFBLElBQXFCO0FBQ3hCLFFBQUlBLEtBQUssQ0FBQ0ksS0FBTixDQUFZRyxNQUFaLEtBQXVCLENBQTNCLEVBQThCO0FBQzFCLGFBQU8sSUFBUDtBQUNIOztBQUNELFVBQU1XLFdBQVcsR0FBR2xCLEtBQUssQ0FBQ0ksS0FBTixDQUFZRyxNQUFaLEdBQXFCLENBQXpDO0FBQ0EsVUFBTUcsUUFBUSxHQUFHVixLQUFLLENBQUNJLEtBQU4sQ0FBWWMsV0FBWixDQUFqQjtBQUNBLFdBQU8sS0FBS3hCLEtBQUwsS0FBZXdCLFdBQWYsSUFBOEIsS0FBS3ZCLE1BQUwsS0FBZ0JlLFFBQVEsQ0FBQ0osSUFBVCxDQUFjQyxNQUFuRTtBQUNIOztBQUVEWSxFQUFBQSxTQUFTLEdBQUc7QUFDUixXQUFPLEtBQUt6QixLQUFMLEtBQWUsQ0FBZixJQUFvQixLQUFLQyxNQUFMLEtBQWdCLENBQTNDO0FBQ0g7O0FBMUdzRCIsInNvdXJjZXNDb250ZW50IjpbIi8qXG5Db3B5cmlnaHQgMjAxOSBUaGUgTWF0cml4Lm9yZyBGb3VuZGF0aW9uIEMuSS5DLlxuXG5MaWNlbnNlZCB1bmRlciB0aGUgQXBhY2hlIExpY2Vuc2UsIFZlcnNpb24gMi4wICh0aGUgXCJMaWNlbnNlXCIpO1xueW91IG1heSBub3QgdXNlIHRoaXMgZmlsZSBleGNlcHQgaW4gY29tcGxpYW5jZSB3aXRoIHRoZSBMaWNlbnNlLlxuWW91IG1heSBvYnRhaW4gYSBjb3B5IG9mIHRoZSBMaWNlbnNlIGF0XG5cbiAgICBodHRwOi8vd3d3LmFwYWNoZS5vcmcvbGljZW5zZXMvTElDRU5TRS0yLjBcblxuVW5sZXNzIHJlcXVpcmVkIGJ5IGFwcGxpY2FibGUgbGF3IG9yIGFncmVlZCB0byBpbiB3cml0aW5nLCBzb2Z0d2FyZVxuZGlzdHJpYnV0ZWQgdW5kZXIgdGhlIExpY2Vuc2UgaXMgZGlzdHJpYnV0ZWQgb24gYW4gXCJBUyBJU1wiIEJBU0lTLFxuV0lUSE9VVCBXQVJSQU5USUVTIE9SIENPTkRJVElPTlMgT0YgQU5ZIEtJTkQsIGVpdGhlciBleHByZXNzIG9yIGltcGxpZWQuXG5TZWUgdGhlIExpY2Vuc2UgZm9yIHRoZSBzcGVjaWZpYyBsYW5ndWFnZSBnb3Zlcm5pbmcgcGVybWlzc2lvbnMgYW5kXG5saW1pdGF0aW9ucyB1bmRlciB0aGUgTGljZW5zZS5cbiovXG5cbmltcG9ydCBEb2N1bWVudE9mZnNldCBmcm9tIFwiLi9vZmZzZXRcIjtcbmltcG9ydCBFZGl0b3JNb2RlbCBmcm9tIFwiLi9tb2RlbFwiO1xuaW1wb3J0IHtQYXJ0fSBmcm9tIFwiLi9wYXJ0c1wiO1xuXG5leHBvcnQgaW50ZXJmYWNlIElQb3NpdGlvbiB7XG4gICAgaW5kZXg6IG51bWJlcjtcbiAgICBvZmZzZXQ6IG51bWJlcjtcbn1cblxudHlwZSBDYWxsYmFjayA9IChwYXJ0OiBQYXJ0LCBzdGFydElkeDogbnVtYmVyLCBlbmRJZHg6IG51bWJlcikgPT4gdm9pZDtcbmV4cG9ydCB0eXBlIFByZWRpY2F0ZSA9IChpbmRleDogbnVtYmVyLCBvZmZzZXQ6IG51bWJlciwgcGFydDogUGFydCkgPT4gYm9vbGVhbjtcblxuZXhwb3J0IGRlZmF1bHQgY2xhc3MgRG9jdW1lbnRQb3NpdGlvbiBpbXBsZW1lbnRzIElQb3NpdGlvbiB7XG4gICAgY29uc3RydWN0b3IocHVibGljIHJlYWRvbmx5IGluZGV4OiBudW1iZXIsIHB1YmxpYyByZWFkb25seSBvZmZzZXQ6IG51bWJlcikge1xuICAgIH1cblxuICAgIGNvbXBhcmUob3RoZXJQb3M6IERvY3VtZW50UG9zaXRpb24pIHtcbiAgICAgICAgaWYgKHRoaXMuaW5kZXggPT09IG90aGVyUG9zLmluZGV4KSB7XG4gICAgICAgICAgICByZXR1cm4gdGhpcy5vZmZzZXQgLSBvdGhlclBvcy5vZmZzZXQ7XG4gICAgICAgIH0gZWxzZSB7XG4gICAgICAgICAgICByZXR1cm4gdGhpcy5pbmRleCAtIG90aGVyUG9zLmluZGV4O1xuICAgICAgICB9XG4gICAgfVxuXG4gICAgaXRlcmF0ZVBhcnRzQmV0d2VlbihvdGhlcjogRG9jdW1lbnRQb3NpdGlvbiwgbW9kZWw6IEVkaXRvck1vZGVsLCBjYWxsYmFjazogQ2FsbGJhY2spIHtcbiAgICAgICAgaWYgKHRoaXMuaW5kZXggPT09IC0xIHx8IG90aGVyLmluZGV4ID09PSAtMSkge1xuICAgICAgICAgICAgcmV0dXJuO1xuICAgICAgICB9XG4gICAgICAgIGNvbnN0IFtzdGFydFBvcywgZW5kUG9zXSA9IHRoaXMuY29tcGFyZShvdGhlcikgPCAwID8gW3RoaXMsIG90aGVyXSA6IFtvdGhlciwgdGhpc107XG4gICAgICAgIGlmIChzdGFydFBvcy5pbmRleCA9PT0gZW5kUG9zLmluZGV4KSB7XG4gICAgICAgICAgICBjYWxsYmFjayhtb2RlbC5wYXJ0c1t0aGlzLmluZGV4XSwgc3RhcnRQb3Mub2Zmc2V0LCBlbmRQb3Mub2Zmc2V0KTtcbiAgICAgICAgfSBlbHNlIHtcbiAgICAgICAgICAgIGNvbnN0IGZpcnN0UGFydCA9IG1vZGVsLnBhcnRzW3N0YXJ0UG9zLmluZGV4XTtcbiAgICAgICAgICAgIGNhbGxiYWNrKGZpcnN0UGFydCwgc3RhcnRQb3Mub2Zmc2V0LCBmaXJzdFBhcnQudGV4dC5sZW5ndGgpO1xuICAgICAgICAgICAgZm9yIChsZXQgaSA9IHN0YXJ0UG9zLmluZGV4ICsgMTsgaSA8IGVuZFBvcy5pbmRleDsgKytpKSB7XG4gICAgICAgICAgICAgICAgY29uc3QgcGFydCA9IG1vZGVsLnBhcnRzW2ldO1xuICAgICAgICAgICAgICAgIGNhbGxiYWNrKHBhcnQsIDAsIHBhcnQudGV4dC5sZW5ndGgpO1xuICAgICAgICAgICAgfVxuICAgICAgICAgICAgY29uc3QgbGFzdFBhcnQgPSBtb2RlbC5wYXJ0c1tlbmRQb3MuaW5kZXhdO1xuICAgICAgICAgICAgY2FsbGJhY2sobGFzdFBhcnQsIDAsIGVuZFBvcy5vZmZzZXQpO1xuICAgICAgICB9XG4gICAgfVxuXG4gICAgZm9yd2FyZHNXaGlsZShtb2RlbDogRWRpdG9yTW9kZWwsIHByZWRpY2F0ZTogUHJlZGljYXRlKSB7XG4gICAgICAgIGlmICh0aGlzLmluZGV4ID09PSAtMSkge1xuICAgICAgICAgICAgcmV0dXJuIHRoaXM7XG4gICAgICAgIH1cblxuICAgICAgICBsZXQge2luZGV4LCBvZmZzZXR9ID0gdGhpcztcbiAgICAgICAgY29uc3Qge3BhcnRzfSA9IG1vZGVsO1xuICAgICAgICB3aGlsZSAoaW5kZXggPCBwYXJ0cy5sZW5ndGgpIHtcbiAgICAgICAgICAgIGNvbnN0IHBhcnQgPSBwYXJ0c1tpbmRleF07XG4gICAgICAgICAgICB3aGlsZSAob2Zmc2V0IDwgcGFydC50ZXh0Lmxlbmd0aCkge1xuICAgICAgICAgICAgICAgIGlmICghcHJlZGljYXRlKGluZGV4LCBvZmZzZXQsIHBhcnQpKSB7XG4gICAgICAgICAgICAgICAgICAgIHJldHVybiBuZXcgRG9jdW1lbnRQb3NpdGlvbihpbmRleCwgb2Zmc2V0KTtcbiAgICAgICAgICAgICAgICB9XG4gICAgICAgICAgICAgICAgb2Zmc2V0ICs9IDE7XG4gICAgICAgICAgICB9XG4gICAgICAgICAgICAvLyBlbmQgcmVhY2hlZFxuICAgICAgICAgICAgaWYgKGluZGV4ID09PSAocGFydHMubGVuZ3RoIC0gMSkpIHtcbiAgICAgICAgICAgICAgICByZXR1cm4gbmV3IERvY3VtZW50UG9zaXRpb24oaW5kZXgsIG9mZnNldCk7XG4gICAgICAgICAgICB9IGVsc2Uge1xuICAgICAgICAgICAgICAgIGluZGV4ICs9IDE7XG4gICAgICAgICAgICAgICAgb2Zmc2V0ID0gMDtcbiAgICAgICAgICAgIH1cbiAgICAgICAgfVxuICAgIH1cblxuICAgIGJhY2t3YXJkc1doaWxlKG1vZGVsOiBFZGl0b3JNb2RlbCwgcHJlZGljYXRlOiBQcmVkaWNhdGUpIHtcbiAgICAgICAgaWYgKHRoaXMuaW5kZXggPT09IC0xKSB7XG4gICAgICAgICAgICByZXR1cm4gdGhpcztcbiAgICAgICAgfVxuXG4gICAgICAgIGxldCB7aW5kZXgsIG9mZnNldH0gPSB0aGlzO1xuICAgICAgICBjb25zdCBwYXJ0cyA9IG1vZGVsLnBhcnRzO1xuICAgICAgICB3aGlsZSAoaW5kZXggPj0gMCkge1xuICAgICAgICAgICAgY29uc3QgcGFydCA9IHBhcnRzW2luZGV4XTtcbiAgICAgICAgICAgIHdoaWxlIChvZmZzZXQgPiAwKSB7XG4gICAgICAgICAgICAgICAgaWYgKCFwcmVkaWNhdGUoaW5kZXgsIG9mZnNldCAtIDEsIHBhcnQpKSB7XG4gICAgICAgICAgICAgICAgICAgIHJldHVybiBuZXcgRG9jdW1lbnRQb3NpdGlvbihpbmRleCwgb2Zmc2V0KTtcbiAgICAgICAgICAgICAgICB9XG4gICAgICAgICAgICAgICAgb2Zmc2V0IC09IDE7XG4gICAgICAgICAgICB9XG4gICAgICAgICAgICAvLyBzdGFydCByZWFjaGVkXG4gICAgICAgICAgICBpZiAoaW5kZXggPT09IDApIHtcbiAgICAgICAgICAgICAgICByZXR1cm4gbmV3IERvY3VtZW50UG9zaXRpb24oaW5kZXgsIG9mZnNldCk7XG4gICAgICAgICAgICB9IGVsc2Uge1xuICAgICAgICAgICAgICAgIGluZGV4IC09IDE7XG4gICAgICAgICAgICAgICAgb2Zmc2V0ID0gcGFydHNbaW5kZXhdLnRleHQubGVuZ3RoO1xuICAgICAgICAgICAgfVxuICAgICAgICB9XG4gICAgfVxuXG4gICAgYXNPZmZzZXQobW9kZWw6IEVkaXRvck1vZGVsKSB7XG4gICAgICAgIGlmICh0aGlzLmluZGV4ID09PSAtMSkge1xuICAgICAgICAgICAgcmV0dXJuIG5ldyBEb2N1bWVudE9mZnNldCgwLCB0cnVlKTtcbiAgICAgICAgfVxuICAgICAgICBsZXQgb2Zmc2V0ID0gMDtcbiAgICAgICAgZm9yIChsZXQgaSA9IDA7IGkgPCB0aGlzLmluZGV4OyArK2kpIHtcbiAgICAgICAgICAgIG9mZnNldCArPSBtb2RlbC5wYXJ0c1tpXS50ZXh0Lmxlbmd0aDtcbiAgICAgICAgfVxuICAgICAgICBvZmZzZXQgKz0gdGhpcy5vZmZzZXQ7XG4gICAgICAgIGNvbnN0IGxhc3RQYXJ0ID0gbW9kZWwucGFydHNbdGhpcy5pbmRleF07XG4gICAgICAgIGNvbnN0IGF0RW5kID0gIWxhc3RQYXJ0IHx8IG9mZnNldCA+PSBsYXN0UGFydC50ZXh0Lmxlbmd0aDsgLy8gaWYgbm8gbGFzdCBwYXJ0LCB3ZSdyZSBhdCB0aGUgZW5kXG4gICAgICAgIHJldHVybiBuZXcgRG9jdW1lbnRPZmZzZXQob2Zmc2V0LCBhdEVuZCk7XG4gICAgfVxuXG4gICAgaXNBdEVuZChtb2RlbDogRWRpdG9yTW9kZWwpIHtcbiAgICAgICAgaWYgKG1vZGVsLnBhcnRzLmxlbmd0aCA9PT0gMCkge1xuICAgICAgICAgICAgcmV0dXJuIHRydWU7XG4gICAgICAgIH1cbiAgICAgICAgY29uc3QgbGFzdFBhcnRJZHggPSBtb2RlbC5wYXJ0cy5sZW5ndGggLSAxO1xuICAgICAgICBjb25zdCBsYXN0UGFydCA9IG1vZGVsLnBhcnRzW2xhc3RQYXJ0SWR4XTtcbiAgICAgICAgcmV0dXJuIHRoaXMuaW5kZXggPT09IGxhc3RQYXJ0SWR4ICYmIHRoaXMub2Zmc2V0ID09PSBsYXN0UGFydC50ZXh0Lmxlbmd0aDtcbiAgICB9XG5cbiAgICBpc0F0U3RhcnQoKSB7XG4gICAgICAgIHJldHVybiB0aGlzLmluZGV4ID09PSAwICYmIHRoaXMub2Zmc2V0ID09PSAwO1xuICAgIH1cbn1cbiJdfQ==