matrix-react-sdk
Version:
SDK for matrix.org using React
77 lines (72 loc) • 9.12 kB
JavaScript
;
Object.defineProperty(exports, "__esModule", {
value: true
});
exports.diffAtCaret = diffAtCaret;
exports.diffDeletion = diffDeletion;
/*
Copyright 2019-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.
*/
function firstDiff(a, b) {
const compareLen = Math.min(a.length, b.length);
for (let i = 0; i < compareLen; ++i) {
if (a[i] !== b[i]) {
return i;
}
}
return compareLen;
}
function diffStringsAtEnd(oldStr, newStr) {
const len = Math.min(oldStr.length, newStr.length);
const startInCommon = oldStr.slice(0, len) === newStr.slice(0, len);
if (startInCommon && oldStr.length > newStr.length) {
return {
removed: oldStr.slice(len),
at: len
};
} else if (startInCommon && oldStr.length < newStr.length) {
return {
added: newStr.slice(len),
at: len
};
} else {
const commonStartLen = firstDiff(oldStr, newStr);
return {
removed: oldStr.slice(commonStartLen),
added: newStr.slice(commonStartLen),
at: commonStartLen
};
}
}
// assumes only characters have been deleted at one location in the string, and none added
function diffDeletion(oldStr, newStr) {
if (oldStr === newStr) {
return {};
}
const firstDiffIdx = firstDiff(oldStr, newStr);
const amount = oldStr.length - newStr.length;
return {
at: firstDiffIdx,
removed: oldStr.slice(firstDiffIdx, firstDiffIdx + amount)
};
}
/**
* Calculates which string was added and removed around the caret position
* @param {String} oldValue the previous value
* @param {String} newValue the new value
* @param {Number} caretPosition the position of the caret after `newValue` was applied.
* @return {object} an object with `at` as the offset where characters were removed and/or added,
* `added` with the added string (if any), and
* `removed` with the removed string (if any)
*/
function diffAtCaret(oldValue, newValue, caretPosition) {
const diffLen = newValue.length - oldValue.length;
const caretPositionBeforeInput = caretPosition - diffLen;
const oldValueBeforeCaret = oldValue.substring(0, caretPositionBeforeInput);
const newValueBeforeCaret = newValue.substring(0, caretPosition);
return diffStringsAtEnd(oldValueBeforeCaret, newValueBeforeCaret);
}
//# sourceMappingURL=data:application/json;charset=utf-8;base64,eyJ2ZXJzaW9uIjozLCJuYW1lcyI6WyJmaXJzdERpZmYiLCJhIiwiYiIsImNvbXBhcmVMZW4iLCJNYXRoIiwibWluIiwibGVuZ3RoIiwiaSIsImRpZmZTdHJpbmdzQXRFbmQiLCJvbGRTdHIiLCJuZXdTdHIiLCJsZW4iLCJzdGFydEluQ29tbW9uIiwic2xpY2UiLCJyZW1vdmVkIiwiYXQiLCJhZGRlZCIsImNvbW1vblN0YXJ0TGVuIiwiZGlmZkRlbGV0aW9uIiwiZmlyc3REaWZmSWR4IiwiYW1vdW50IiwiZGlmZkF0Q2FyZXQiLCJvbGRWYWx1ZSIsIm5ld1ZhbHVlIiwiY2FyZXRQb3NpdGlvbiIsImRpZmZMZW4iLCJjYXJldFBvc2l0aW9uQmVmb3JlSW5wdXQiLCJvbGRWYWx1ZUJlZm9yZUNhcmV0Iiwic3Vic3RyaW5nIiwibmV3VmFsdWVCZWZvcmVDYXJldCJdLCJzb3VyY2VzIjpbIi4uLy4uL3NyYy9lZGl0b3IvZGlmZi50cyJdLCJzb3VyY2VzQ29udGVudCI6WyIvKlxuQ29weXJpZ2h0IDIwMTktMjAyNCBOZXcgVmVjdG9yIEx0ZC5cbkNvcHlyaWdodCAyMDE5IFRoZSBNYXRyaXgub3JnIEZvdW5kYXRpb24gQy5JLkMuXG5cblNQRFgtTGljZW5zZS1JZGVudGlmaWVyOiBBR1BMLTMuMC1vbmx5IE9SIEdQTC0zLjAtb25seVxuUGxlYXNlIHNlZSBMSUNFTlNFIGZpbGVzIGluIHRoZSByZXBvc2l0b3J5IHJvb3QgZm9yIGZ1bGwgZGV0YWlscy5cbiovXG5cbmV4cG9ydCBpbnRlcmZhY2UgSURpZmYge1xuICAgIHJlbW92ZWQ/OiBzdHJpbmc7XG4gICAgYWRkZWQ/OiBzdHJpbmc7XG4gICAgYXQ/OiBudW1iZXI7XG59XG5cbmZ1bmN0aW9uIGZpcnN0RGlmZihhOiBzdHJpbmcsIGI6IHN0cmluZyk6IG51bWJlciB7XG4gICAgY29uc3QgY29tcGFyZUxlbiA9IE1hdGgubWluKGEubGVuZ3RoLCBiLmxlbmd0aCk7XG4gICAgZm9yIChsZXQgaSA9IDA7IGkgPCBjb21wYXJlTGVuOyArK2kpIHtcbiAgICAgICAgaWYgKGFbaV0gIT09IGJbaV0pIHtcbiAgICAgICAgICAgIHJldHVybiBpO1xuICAgICAgICB9XG4gICAgfVxuICAgIHJldHVybiBjb21wYXJlTGVuO1xufVxuXG5mdW5jdGlvbiBkaWZmU3RyaW5nc0F0RW5kKG9sZFN0cjogc3RyaW5nLCBuZXdTdHI6IHN0cmluZyk6IElEaWZmIHtcbiAgICBjb25zdCBsZW4gPSBNYXRoLm1pbihvbGRTdHIubGVuZ3RoLCBuZXdTdHIubGVuZ3RoKTtcbiAgICBjb25zdCBzdGFydEluQ29tbW9uID0gb2xkU3RyLnNsaWNlKDAsIGxlbikgPT09IG5ld1N0ci5zbGljZSgwLCBsZW4pO1xuICAgIGlmIChzdGFydEluQ29tbW9uICYmIG9sZFN0ci5sZW5ndGggPiBuZXdTdHIubGVuZ3RoKSB7XG4gICAgICAgIHJldHVybiB7IHJlbW92ZWQ6IG9sZFN0ci5zbGljZShsZW4pLCBhdDogbGVuIH07XG4gICAgfSBlbHNlIGlmIChzdGFydEluQ29tbW9uICYmIG9sZFN0ci5sZW5ndGggPCBuZXdTdHIubGVuZ3RoKSB7XG4gICAgICAgIHJldHVybiB7IGFkZGVkOiBuZXdTdHIuc2xpY2UobGVuKSwgYXQ6IGxlbiB9O1xuICAgIH0gZWxzZSB7XG4gICAgICAgIGNvbnN0IGNvbW1vblN0YXJ0TGVuID0gZmlyc3REaWZmKG9sZFN0ciwgbmV3U3RyKTtcbiAgICAgICAgcmV0dXJuIHtcbiAgICAgICAgICAgIHJlbW92ZWQ6IG9sZFN0ci5zbGljZShjb21tb25TdGFydExlbiksXG4gICAgICAgICAgICBhZGRlZDogbmV3U3RyLnNsaWNlKGNvbW1vblN0YXJ0TGVuKSxcbiAgICAgICAgICAgIGF0OiBjb21tb25TdGFydExlbixcbiAgICAgICAgfTtcbiAgICB9XG59XG5cbi8vIGFzc3VtZXMgb25seSBjaGFyYWN0ZXJzIGhhdmUgYmVlbiBkZWxldGVkIGF0IG9uZSBsb2NhdGlvbiBpbiB0aGUgc3RyaW5nLCBhbmQgbm9uZSBhZGRlZFxuZXhwb3J0IGZ1bmN0aW9uIGRpZmZEZWxldGlvbihvbGRTdHI6IHN0cmluZywgbmV3U3RyOiBzdHJpbmcpOiBJRGlmZiB7XG4gICAgaWYgKG9sZFN0ciA9PT0gbmV3U3RyKSB7XG4gICAgICAgIHJldHVybiB7fTtcbiAgICB9XG4gICAgY29uc3QgZmlyc3REaWZmSWR4ID0gZmlyc3REaWZmKG9sZFN0ciwgbmV3U3RyKTtcbiAgICBjb25zdCBhbW91bnQgPSBvbGRTdHIubGVuZ3RoIC0gbmV3U3RyLmxlbmd0aDtcbiAgICByZXR1cm4geyBhdDogZmlyc3REaWZmSWR4LCByZW1vdmVkOiBvbGRTdHIuc2xpY2UoZmlyc3REaWZmSWR4LCBmaXJzdERpZmZJZHggKyBhbW91bnQpIH07XG59XG5cbi8qKlxuICogQ2FsY3VsYXRlcyB3aGljaCBzdHJpbmcgd2FzIGFkZGVkIGFuZCByZW1vdmVkIGFyb3VuZCB0aGUgY2FyZXQgcG9zaXRpb25cbiAqIEBwYXJhbSB7U3RyaW5nfSBvbGRWYWx1ZSB0aGUgcHJldmlvdXMgdmFsdWVcbiAqIEBwYXJhbSB7U3RyaW5nfSBuZXdWYWx1ZSB0aGUgbmV3IHZhbHVlXG4gKiBAcGFyYW0ge051bWJlcn0gY2FyZXRQb3NpdGlvbiB0aGUgcG9zaXRpb24gb2YgdGhlIGNhcmV0IGFmdGVyIGBuZXdWYWx1ZWAgd2FzIGFwcGxpZWQuXG4gKiBAcmV0dXJuIHtvYmplY3R9IGFuIG9iamVjdCB3aXRoIGBhdGAgYXMgdGhlIG9mZnNldCB3aGVyZSBjaGFyYWN0ZXJzIHdlcmUgcmVtb3ZlZCBhbmQvb3IgYWRkZWQsXG4gKiAgICAgICAgICAgICAgICAgIGBhZGRlZGAgd2l0aCB0aGUgYWRkZWQgc3RyaW5nIChpZiBhbnkpLCBhbmRcbiAqICAgICAgICAgICAgICAgICAgYHJlbW92ZWRgIHdpdGggdGhlIHJlbW92ZWQgc3RyaW5nIChpZiBhbnkpXG4gKi9cbmV4cG9ydCBmdW5jdGlvbiBkaWZmQXRDYXJldChvbGRWYWx1ZTogc3RyaW5nLCBuZXdWYWx1ZTogc3RyaW5nLCBjYXJldFBvc2l0aW9uOiBudW1iZXIpOiBJRGlmZiB7XG4gICAgY29uc3QgZGlmZkxlbiA9IG5ld1ZhbHVlLmxlbmd0aCAtIG9sZFZhbHVlLmxlbmd0aDtcbiAgICBjb25zdCBjYXJldFBvc2l0aW9uQmVmb3JlSW5wdXQgPSBjYXJldFBvc2l0aW9uIC0gZGlmZkxlbjtcbiAgICBjb25zdCBvbGRWYWx1ZUJlZm9yZUNhcmV0ID0gb2xkVmFsdWUuc3Vic3RyaW5nKDAsIGNhcmV0UG9zaXRpb25CZWZvcmVJbnB1dCk7XG4gICAgY29uc3QgbmV3VmFsdWVCZWZvcmVDYXJldCA9IG5ld1ZhbHVlLnN1YnN0cmluZygwLCBjYXJldFBvc2l0aW9uKTtcbiAgICByZXR1cm4gZGlmZlN0cmluZ3NBdEVuZChvbGRWYWx1ZUJlZm9yZUNhcmV0LCBuZXdWYWx1ZUJlZm9yZUNhcmV0KTtcbn1cbiJdLCJtYXBwaW5ncyI6Ijs7Ozs7OztBQUFBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBOztBQVFBLFNBQVNBLFNBQVNBLENBQUNDLENBQVMsRUFBRUMsQ0FBUyxFQUFVO0VBQzdDLE1BQU1DLFVBQVUsR0FBR0MsSUFBSSxDQUFDQyxHQUFHLENBQUNKLENBQUMsQ0FBQ0ssTUFBTSxFQUFFSixDQUFDLENBQUNJLE1BQU0sQ0FBQztFQUMvQyxLQUFLLElBQUlDLENBQUMsR0FBRyxDQUFDLEVBQUVBLENBQUMsR0FBR0osVUFBVSxFQUFFLEVBQUVJLENBQUMsRUFBRTtJQUNqQyxJQUFJTixDQUFDLENBQUNNLENBQUMsQ0FBQyxLQUFLTCxDQUFDLENBQUNLLENBQUMsQ0FBQyxFQUFFO01BQ2YsT0FBT0EsQ0FBQztJQUNaO0VBQ0o7RUFDQSxPQUFPSixVQUFVO0FBQ3JCO0FBRUEsU0FBU0ssZ0JBQWdCQSxDQUFDQyxNQUFjLEVBQUVDLE1BQWMsRUFBUztFQUM3RCxNQUFNQyxHQUFHLEdBQUdQLElBQUksQ0FBQ0MsR0FBRyxDQUFDSSxNQUFNLENBQUNILE1BQU0sRUFBRUksTUFBTSxDQUFDSixNQUFNLENBQUM7RUFDbEQsTUFBTU0sYUFBYSxHQUFHSCxNQUFNLENBQUNJLEtBQUssQ0FBQyxDQUFDLEVBQUVGLEdBQUcsQ0FBQyxLQUFLRCxNQUFNLENBQUNHLEtBQUssQ0FBQyxDQUFDLEVBQUVGLEdBQUcsQ0FBQztFQUNuRSxJQUFJQyxhQUFhLElBQUlILE1BQU0sQ0FBQ0gsTUFBTSxHQUFHSSxNQUFNLENBQUNKLE1BQU0sRUFBRTtJQUNoRCxPQUFPO01BQUVRLE9BQU8sRUFBRUwsTUFBTSxDQUFDSSxLQUFLLENBQUNGLEdBQUcsQ0FBQztNQUFFSSxFQUFFLEVBQUVKO0lBQUksQ0FBQztFQUNsRCxDQUFDLE1BQU0sSUFBSUMsYUFBYSxJQUFJSCxNQUFNLENBQUNILE1BQU0sR0FBR0ksTUFBTSxDQUFDSixNQUFNLEVBQUU7SUFDdkQsT0FBTztNQUFFVSxLQUFLLEVBQUVOLE1BQU0sQ0FBQ0csS0FBSyxDQUFDRixHQUFHLENBQUM7TUFBRUksRUFBRSxFQUFFSjtJQUFJLENBQUM7RUFDaEQsQ0FBQyxNQUFNO0lBQ0gsTUFBTU0sY0FBYyxHQUFHakIsU0FBUyxDQUFDUyxNQUFNLEVBQUVDLE1BQU0sQ0FBQztJQUNoRCxPQUFPO01BQ0hJLE9BQU8sRUFBRUwsTUFBTSxDQUFDSSxLQUFLLENBQUNJLGNBQWMsQ0FBQztNQUNyQ0QsS0FBSyxFQUFFTixNQUFNLENBQUNHLEtBQUssQ0FBQ0ksY0FBYyxDQUFDO01BQ25DRixFQUFFLEVBQUVFO0lBQ1IsQ0FBQztFQUNMO0FBQ0o7O0FBRUE7QUFDTyxTQUFTQyxZQUFZQSxDQUFDVCxNQUFjLEVBQUVDLE1BQWMsRUFBUztFQUNoRSxJQUFJRCxNQUFNLEtBQUtDLE1BQU0sRUFBRTtJQUNuQixPQUFPLENBQUMsQ0FBQztFQUNiO0VBQ0EsTUFBTVMsWUFBWSxHQUFHbkIsU0FBUyxDQUFDUyxNQUFNLEVBQUVDLE1BQU0sQ0FBQztFQUM5QyxNQUFNVSxNQUFNLEdBQUdYLE1BQU0sQ0FBQ0gsTUFBTSxHQUFHSSxNQUFNLENBQUNKLE1BQU07RUFDNUMsT0FBTztJQUFFUyxFQUFFLEVBQUVJLFlBQVk7SUFBRUwsT0FBTyxFQUFFTCxNQUFNLENBQUNJLEtBQUssQ0FBQ00sWUFBWSxFQUFFQSxZQUFZLEdBQUdDLE1BQU07RUFBRSxDQUFDO0FBQzNGOztBQUVBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNPLFNBQVNDLFdBQVdBLENBQUNDLFFBQWdCLEVBQUVDLFFBQWdCLEVBQUVDLGFBQXFCLEVBQVM7RUFDMUYsTUFBTUMsT0FBTyxHQUFHRixRQUFRLENBQUNqQixNQUFNLEdBQUdnQixRQUFRLENBQUNoQixNQUFNO0VBQ2pELE1BQU1vQix3QkFBd0IsR0FBR0YsYUFBYSxHQUFHQyxPQUFPO0VBQ3hELE1BQU1FLG1CQUFtQixHQUFHTCxRQUFRLENBQUNNLFNBQVMsQ0FBQyxDQUFDLEVBQUVGLHdCQUF3QixDQUFDO0VBQzNFLE1BQU1HLG1CQUFtQixHQUFHTixRQUFRLENBQUNLLFNBQVMsQ0FBQyxDQUFDLEVBQUVKLGFBQWEsQ0FBQztFQUNoRSxPQUFPaEIsZ0JBQWdCLENBQUNtQixtQkFBbUIsRUFBRUUsbUJBQW1CLENBQUM7QUFDckUiLCJpZ25vcmVMaXN0IjpbXX0=