UNPKG

matrix-react-sdk

Version:
77 lines (72 loc) 9.12 kB
"use strict"; 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=