@launchmenu/core
Version:
An environment for visual keyboard controlled applets
101 lines • 7.36 kB
JavaScript
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,eyJ2ZXJzaW9uIjozLCJmaWxlIjoibWVyZ2VIaWdobGlnaHROb2Rlcy5qcyIsInNvdXJjZVJvb3QiOiIiLCJzb3VyY2VzIjpbIi4uLy4uLy4uLy4uL3NyYy90ZXh0RmllbGRzL3N5bnRheC91dGlscy9tZXJnZUhpZ2hsaWdodE5vZGVzLnRzIl0sIm5hbWVzIjpbXSwibWFwcGluZ3MiOiI7OztBQUNBLGlFQUEwRDtBQUUxRCx1Q0FBdUM7QUFDdkM7Ozs7O0dBS0c7QUFDSCxTQUFnQixtQkFBbUIsQ0FDL0IsT0FBeUIsRUFDekIsT0FBeUI7SUFFekIsSUFBSSxHQUFHLEdBQXFCLEVBQUUsQ0FBQztJQUUvQixJQUFJLEVBQUUsR0FBRyxDQUFDLENBQUM7SUFDWCxJQUFJLEVBQUUsR0FBRyxDQUFDLENBQUM7SUFDWCxJQUFJLE1BQU0sR0FBRyxPQUFPLENBQUMsRUFBRSxDQUFDLENBQUM7SUFDekIsSUFBSSxNQUFNLEdBQUcsT0FBTyxDQUFDLEVBQUUsQ0FBQyxDQUFDO0lBRXpCLG9EQUFvRDtJQUNwRCxPQUFPLE1BQU0sSUFBSSxNQUFNLEVBQUU7UUFDckIsSUFBSSxNQUFNLENBQUMsR0FBRyxHQUFHLE1BQU0sQ0FBQyxLQUFLLEVBQUU7WUFDM0IsaUVBQWlFO1lBQ2pFLEdBQUcsQ0FBQyxJQUFJLENBQUMsTUFBTSxDQUFDLENBQUM7WUFDakIsTUFBTSxHQUFHLE9BQU8sQ0FBQyxFQUFFLEVBQUUsQ0FBQyxDQUFDO1NBQzFCO2FBQU0sSUFBSSxNQUFNLENBQUMsR0FBRyxJQUFJLE1BQU0sQ0FBQyxLQUFLLEVBQUU7WUFDbkMsbUVBQW1FO1lBQ25FLEdBQUcsQ0FBQyxJQUFJLENBQUMsTUFBTSxDQUFDLENBQUM7WUFDakIsTUFBTSxHQUFHLE9BQU8sQ0FBQyxFQUFFLEVBQUUsQ0FBQyxDQUFDO1NBQzFCO2FBQU0sSUFBSSxNQUFNLENBQUMsR0FBRyxJQUFJLE1BQU0sQ0FBQyxLQUFLLEVBQUU7WUFDbkMsMkZBQTJGO1lBQzNGLElBQUksTUFBTSxDQUFDLEdBQUcsSUFBSSxNQUFNLENBQUMsS0FBSyxFQUFF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
;