UNPKG

fuzzy-rater

Version:

Tooling for fuzzily rating text according to some query

164 lines 13 kB
"use strict"; Object.defineProperty(exports, "__esModule", { value: true }); exports.splitGroup = exports.addAlterationData = void 0; /** * Adds the alteration data to the given collection of match groups * @param groups The groups to add the data to * @param alterations The alteration data to be added * @param queryWord The query word that these alterations are for * @returns The groups with the new alterations added */ function addAlterationData(groups, alterations, queryWord) { const bestStartIndex = queryWord.matchedIndex == -1 ? Infinity : queryWord.matchedIndex; let bestGroupFound = false; let prevQueryIndex = 0; // Deep copy the group data, and track the current one to consider (orGroup) groups = groups.map(group => ({ ...group, relations: group.relations.map(relation => ({ ...relation })), })); let orGroup = groups.shift(); const newGroups = []; let newGroup; let newRelationData; let prevGroupData = { type: "", orGroup, }; alterations.forEach(({ type, target, query }) => { var _a, _b; // Keep track of whether the best group was found already, so we don't mark multiple matches as the best if (prevQueryIndex > query.index && target.index > bestStartIndex) bestGroupFound = true; prevQueryIndex = query.index; // Find the original group for this text range, with relations to inherit while (orGroup && (orGroup.range.start == orGroup.range.end ? // If the group is an empty group, we should continue if this data contains no empty group orGroup.range.end < target.index + target.character.length : // If the group is not empty, we should continue if we reached the end orGroup.range.end <= target.index)) { orGroup = groups.shift(); if (orGroup && orGroup.range.start == orGroup.range.end && target.character.length) { // Make sure empty groups are still stored newGroups.push(orGroup); } } // If the group or match type changed, create a new group if (prevGroupData.type != type || prevGroupData.orGroup != orGroup) { // Split the original group if needed if (orGroup && orGroup.range.start < target.index) { const [firstHalf, secondHalf] = splitGroup(orGroup, target.index); if (firstHalf) { // Update the relations that were already used orGroup.relations.forEach((relation, i) => { relation.range = firstHalf.relations[i].range; }); } if (secondHalf) orGroup = secondHalf; } // Create the new relation and group data newRelationData = type != "ignore" ? { type, range: { start: query.index, end: query.index + query.character.length, text: query.character, }, word: queryWord, partOfBestOrder: !bestGroupFound && target.index >= bestStartIndex, } : undefined; newGroup = { range: { start: target.index, end: target.index + target.character.length, text: target.character, }, relations: newRelationData ? [...((_a = orGroup === null || orGroup === void 0 ? void 0 : orGroup.relations) !== null && _a !== void 0 ? _a : []), newRelationData] : (_b = orGroup === null || orGroup === void 0 ? void 0 : orGroup.relations) !== null && _b !== void 0 ? _b : [], }; prevGroupData = { type, orGroup, }; newGroups.push(newGroup); } else { // Update the group data if (newRelationData) { newRelationData.range.end = query.index + query.character.length; newRelationData.range.text += query.character; } if (newGroup) { newGroup.range.end = target.index + target.character.length; newGroup.range.text += target.character; } } }); return newGroups; } exports.addAlterationData = addAlterationData; /** * Splits a match group in half, at the given location * @param group The group to be split * @param index The index to split it at * @returns The split group */ function splitGroup(group, index) { if (index < group.range.start) return [undefined, group]; if (index > group.range.end) return [group, undefined]; const trim = index - group.range.start; const first = { range: { start: group.range.start, end: index, text: group.range.text.substring(0, trim), }, relations: group.relations.map(relation => { if (relation.type == "match" || relation.type == "replace") { const start = relation.range.start; return { ...relation, range: { start, end: start + trim, text: relation.range.text.substring(0, trim), }, }; } return relation; }), }; const second = { range: { start: index, end: group.range.end, text: group.range.text.substring(trim), }, relations: group.relations.map(relation => { if (relation.type == "match" || relation.type == "replace") { return { ...relation, range: { start: relation.range.start + trim, end: relation.range.end, text: relation.range.text.substring(trim), }, }; } return relation; }), }; return [first, second]; } exports.splitGroup = splitGroup; //# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoiYWRkQWx0ZXJhdGlvbkRhdGEuanMiLCJzb3VyY2VSb290IjoiIiwic291cmNlcyI6WyIuLi8uLi9zcmMvZnV6enlSYXRlL2FkZEFsdGVyYXRpb25EYXRhLnRzIl0sIm5hbWVzIjpbXSwibWFwcGluZ3MiOiI7OztBQUlBOzs7Ozs7R0FNRztBQUNILFNBQWdCLGlCQUFpQixDQUM3QixNQUFxQixFQUNyQixXQUE4QixFQUM5QixTQUFxQjtJQUVyQixNQUFNLGNBQWMsR0FDaEIsU0FBUyxDQUFDLFlBQVksSUFBSSxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsUUFBUSxDQUFDLENBQUMsQ0FBQyxTQUFTLENBQUMsWUFBWSxDQUFDO0lBQ3JFLElBQUksY0FBYyxHQUFHLEtBQUssQ0FBQztJQUMzQixJQUFJLGNBQWMsR0FBRyxDQUFDLENBQUM7SUFFdkIsNEVBQTRFO0lBQzVFLE1BQU0sR0FBRyxNQUFNLENBQUMsR0FBRyxDQUFDLEtBQUssQ0FBQyxFQUFFLENBQUMsQ0FBQztRQUMxQixHQUFHLEtBQUs7UUFDUixTQUFTLEVBQUUsS0FBSyxDQUFDLFNBQVMsQ0FBQyxHQUFHLENBQUMsUUFBUSxDQUFDLEVBQUUsQ0FBQyxDQUFDLEVBQUMsR0FBRyxRQUFRLEVBQUMsQ0FBQyxDQUFDO0tBQzlELENBQUMsQ0FBQyxDQUFDO0lBQ0osSUFBSSxPQUFPLEdBQUcsTUFBTSxDQUFDLEtBQUssRUFBRSxDQUFDO0lBRTdCLE1BQU0sU0FBUyxHQUFHLEVBQW1CLENBQUM7SUFDdEMsSUFBSSxRQUFpQyxDQUFDO0lBQ3RDLElBQUksZUFBb0QsQ0FBQztJQUN6RCxJQUFJLGFBQWEsR0FBRztRQUNoQixJQUFJLEVBQUUsRUFBRTtRQUNSLE9BQU87S0FDVixDQUFDO0lBQ0YsV0FBVyxDQUFDLE9BQU8sQ0FBQyxDQUFDLEVBQUMsSUFBSSxFQUFFLE1BQU0sRUFBRSxLQUFLLEVBQUMsRUFBRSxFQUFFOztRQUMxQyx3R0FBd0c7UUFDeEcsSUFBSSxjQUFjLEdBQUcsS0FBSyxDQUFDLEtBQUssSUFB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