fuzzy-rater
Version:
Tooling for fuzzily rating text according to some query
164 lines • 13 kB
JavaScript
;
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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