UNPKG

@launchmenu/core

Version:

An environment for visual keyboard controlled applets

101 lines 7.36 kB
"use strict"; Object.defineProperty(exports, "__esModule", { value: true }); exports.mergeHighlightNodes = void 0; const addHighlightNodeTags_1 = require("./addHighlightNodeTags"); // TODO: write some unit tests for this /** * Merges the tags of 2 collections of nodes, assumes these are nodes for the same input text * @param targets The nodes to add the tags to * @param sources The nodes to take the tags from * @returns The resulting collection of nodes */ function mergeHighlightNodes(targets, sources) { let out = []; let ti = 0; let si = 0; let source = sources[si]; let target = targets[ti]; // Check whether to split any nodes and add the tags while (source && target) { if (target.end < source.start) { // This target isn't affected by the source, just add it as it is out.push(target); target = targets[++ti]; } else if (source.end <= target.start) { // The source is fully in front of the target, just add it as it is out.push(source); source = sources[++si]; } else if (source.end == source.start) { // If the source is an empty range, either merge with another empty range, or insert before if (target.end == target.start) { out.push(mergeNodes(target, source)); target = targets[++ti]; } else out.push(source); source = sources[++si]; } else { // The source and target overlap // Split off section of the node before the range if (target.start < source.start) { const [beforeRange, inRange] = addHighlightNodeTags_1.splitHighlightNode(target, source.start); if (inRange) { out.push(beforeRange); target = inRange; } } // Split off section of the node after the range let overlap; if (target.end > source.end) { const [inRange, afterRange] = addHighlightNodeTags_1.splitHighlightNode(target, source.end); if (afterRange) { overlap = inRange; target = afterRange; } } if (!overlap) { overlap = target; target = targets[++ti]; } // Add the new node to the tag out.push(mergeNodes(overlap, source)); // Split off any part of the source that overlaps with this node const [sourceOverlap, sourceAfterOverlap] = addHighlightNodeTags_1.splitHighlightNode(source, overlap.end); if (sourceAfterOverlap) { source = sourceAfterOverlap; } else { source = sources[++si]; } } } // Add any remaining nodes, which don't require merging while (target) { out.push(target); target = targets[++ti]; } while (source) { out.push(source); source = sources[++si]; } // Return the result return out; } exports.mergeHighlightNodes = mergeHighlightNodes; /** * Merges the data of 2 highlight nodes * @param target The node to merge the data of the source into * @param source The data to be merged (excludes selection) * @returns The merged data */ function mergeNodes(target, source) { return { ...target, tags: [...target.tags, ...source.tags], style: target.style || source.style ? { ...target.style, ...source.style } : undefined, }; } //# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoibWVyZ2VIaWdobGlnaHROb2Rlcy5qcyIsInNvdXJjZVJvb3QiOiIiLCJzb3VyY2VzIjpbIi4uLy4uLy4uLy4uL3NyYy90ZXh0RmllbGRzL3N5bnRheC91dGlscy9tZXJnZUhpZ2hsaWdodE5vZGVzLnRzIl0sIm5hbWVzIjpbXSwibWFwcGluZ3MiOiI7OztBQUNBLGlFQUEwRDtBQUUxRCx1Q0FBdUM7QUFDdkM7Ozs7O0dBS0c7QUFDSCxTQUFnQixtQkFBbUIsQ0FDL0IsT0FBeUIsRUFDekIsT0FBeUI7SUFFekIsSUFBSSxHQUFHLEdBQXFCLEVBQUUsQ0FBQztJQUUvQixJQUFJLEVBQUUsR0FBRyxDQUFDLENBQUM7SUFDWCxJQUFJLEVBQUUsR0FBRyxDQUFDLENBQUM7SUFDWCxJQUFJLE1BQU0sR0FBRyxPQUFPLENBQUMsRUFBRSxDQUFDLENBQUM7SUFDekIsSUFBSSxNQUFNLEdBQUcsT0FBTyxDQUFDLEVBQUUsQ0FBQyxDQUFDO0lBRXpCLG9EQUFvRDtJQUNwRCxPQUFPLE1BQU0sSUFBSSxNQUFNLEVBQUU7UUFDckIsSUFBSSxNQUFNLENBQUMsR0FBRyxHQUFHLE1BQU0sQ0FBQyxLQUFLLEVBQUU7WUFDM0IsaUVBQWlFO1lBQ2pFLEdBQUcsQ0FBQyxJQUFJLENBQUMsTUFBTSxDQUFDLENBQUM7WUFDakIsTUFBTSxHQUFHLE9BQU8sQ0FBQyxFQUFFLEVBQUUsQ0FBQyxDQUFDO1NBQzFCO2FBQU0sSUFBSSxNQUFNLENBQUMsR0FBRyxJQUFJLE1BQU0sQ0FBQyxLQUFLLEVBQUU7WUFDbkMsbUVBQW1FO1lBQ25FLEdBQUcsQ0FBQyxJQUFJLENBQUMsTUFBTSxDQUFDLENBQUM7WUFDakIsTUFBTSxHQUFHLE9BQU8sQ0FBQyxFQUFFLEVBQUUsQ0FBQyxDQUFDO1NBQzFCO2FBQU0sSUFBSSxNQUFNLENBQUMsR0FBRyxJQUFJLE1BQU0sQ0FBQyxLQUFLLEVBQUU7WUFDbkMsMkZBQTJGO1lBQzNGLElBQUksTUFBTSxDQUFDLEdBQUcsSUFBSSxNQUFNLENBQUMsS0FBSyxFQUFFO2dCQUM1QixHQUFHLENBQUMsSUFBSSxDQUFDLFVBQVUsQ0FBQyxNQUFNLEVBQUUsTUFBTSxDQUFDLENBQUMsQ0FBQztnQkFDckMsTUFBTSxHQUFHLE9BQU8sQ0FBQyxFQUFFLEVBQUUsQ0FBQyxDQUFDO2FBQzFCOztnQkFBTSxHQUFHLENBQUMsSUFBSSxDQUFDLE1BQU0sQ0FBQyxDQUFDO1lBQ3hCLE1BQU0sR0FBRyxPQUFPLENBQUMsRUFBRSxFQUFFLENBQUMsQ0FBQztTQUMxQjthQUFNO1lBQ0gsZ0NBQWdDO1lBRWhDLGlEQUFpRDtZQUNqRCxJQUFJLE1BQU0sQ0FBQyxLQUFLLEdBQUcsTUFBTSxDQUFDLEtBQUssRUFBRTtnQkFDN0IsTUFBTSxDQUFDLFdBQVcsRUFBRSxPQUFPLENBQUMsR0FBRyx5Q0FBa0IsQ0FBQyxNQUFNLEVBQUUsTUFBTSxDQUFDLEtBQUssQ0FBQyxDQUFDO2dCQUN4RSxJQUFJLE9BQU8sRUFBRTtvQkFDVCxHQUFHLENBQUMsSUFBSSxDQUFDLFdBQVcsQ0FBQyxDQUFDO29CQUN0QixNQUFNLEdBQUcsT0FBTyxDQUFDO2lCQUNwQjthQUNKO1lBRUQsZ0RBQWdEO1lBQ2hELElBQUksT0FBbUMsQ0FBQztZQUN4QyxJQUFJLE1BQU0sQ0FBQyxHQUFHLEdBQUcsTUFBTSxDQUFDLEdBQUcsRUFBRTtnQkFDekIsTUFBTSxDQUFDLE9BQU8sRUFBRSxVQUFVLENBQUMsR0FBRyx5Q0FBa0IsQ0FBQyxNQUFNLEVBQUUsTUFBTSxDQUFDLEdBQUcsQ0FBQyxDQUFDO2dCQUNyRSxJQUFJLFVBQVUsRUFBRTtvQkFDWixPQUFPLEdBQUcsT0FBTyxDQUFDO29CQUNsQixNQUFNLEdBQUcsVUFBVSxDQUFDO2lCQUN2QjthQUNKO1lBQ0QsSUFBSSxDQUFDLE9BQU8sRUFBRTtnQkFDVixPQUFPLEdBQUcsTUFBTSxDQUFDO2dCQUNqQixNQUFNLEdBQUcsT0FBTyxDQUFDLEVBQUUsRUFBRSxDQUFDLENBQUM7YUFDMUI7WUFFRCw4QkFBOEI7WUFDOUIsR0FBRyxDQUFDLElBQUksQ0FBQyxVQUFVLENBQUMsT0FBTyxFQUFFLE1BQU0sQ0FBQyxDQUFDLENBQUM7WUFFdEMsZ0VBQWdFO1lBQ2hFLE1BQU0sQ0FBQyxhQUFhLEVBQUUsa0JBQWtCLENBQUMsR0FBRyx5Q0FBa0IsQ0FDMUQsTUFBTSxFQUNOLE9BQU8sQ0FBQyxHQUFHLENBQ2QsQ0FBQztZQUNGLElBQUksa0JBQWtCLEVBQUU7Z0JBQ3BCLE1BQU0sR0FBRyxrQkFBa0IsQ0FBQzthQUMvQjtpQkFBTTtnQkFDSCxNQUFNLEdBQUcsT0FBTyxDQUFDLEVBQUUsRUFBRSxDQUFDLENBQUM7YUFDMUI7U0FDSjtLQUNKO0lBRUQsdURBQXVEO0lBQ3ZELE9BQU8sTUFBTSxFQUFFO1FBQ1gsR0FBRyxDQUFDLElBQUksQ0FBQyxNQUFNLENBQUMsQ0FBQztRQUNqQixNQUFNLEdBQUcsT0FBTyxDQUFDLEVBQUUsRUFBRSxDQUFDLENBQUM7S0FDMUI7SUFDRCxPQUFPLE1BQU0sRUFBRTtRQUNYLEdBQUcsQ0FBQyxJQUFJLENBQUMsTUFBTSxDQUFDLENBQUM7UUFDakIsTUFBTSxHQUFHLE9BQU8sQ0FBQyxFQUFFLEVBQUUsQ0FBQyxDQUFDO0tBQzFCO0lBRUQsb0JBQW9CO0lBQ3BCLE9BQU8sR0FBRyxDQUFDO0FBQ2YsQ0FBQztBQWxGRCxrREFrRkM7QUFFRDs7Ozs7R0FLRztBQUNILFNBQVMsVUFBVSxDQUFDLE1BQXNCLEVBQUUsTUFBc0I7SUFDOUQsT0FBTztRQUNILEdBQUcsTUFBTTtRQUNULElBQUksRUFBRSxDQUFDLEdBQUcsTUFBTSxDQUFDLElBQUksRUFBRSxHQUFHLE1BQU0sQ0FBQyxJQUFJLENBQUM7UUFDdEMsS0FBSyxFQUNELE1BQU0sQ0FBQyxLQUFLLElBQUksTUFBTSxDQUFDLEtBQUssQ0FBQyxDQUFDLENBQUMsRUFBQyxHQUFHLE1BQU0sQ0FBQyxLQUFLLEVBQUUsR0FBRyxNQUFNLENBQUMsS0FBSyxFQUFDLENBQUMsQ0FBQyxDQUFDLFNBQVM7S0FDcEYsQ0FBQztBQUNOLENBQUMifQ==