cockatoo.js
Version:
Fuzzy search library based based on Damerau Levenshtein distance algorithm for Node.js
94 lines (93 loc) • 3.09 kB
JavaScript
;
Object.defineProperty(exports, "__esModule", { value: true });
function getCompleteness(search, pattern, score) {
if (pattern) {
var completeness = search.length / pattern.length;
completeness > 1 ? completeness = 1 : null;
return completeness * score;
}
else {
return 0;
}
}
exports.getCompleteness = getCompleteness;
function applySensitiveness(text, options) {
if (text) {
var result = text;
if (!options.accentSensitive) {
result = removeAccents(result);
}
if (!options.caseSensitive) {
result = result.toLowerCase();
}
return result;
}
else {
return undefined;
}
}
exports.applySensitiveness = applySensitiveness;
function removeAccents(text) {
return text
.normalize('NFD')
.replace(/[\u0300-\u036f]/g, '');
}
exports.removeAccents = removeAccents;
function orderMatches(matches) {
return matches.sort(function (a, b) {
var dif = getMaxScoreDif(a, b);
if (dif === 0) {
dif = getMinScoreDif(a, b);
}
if (dif === 0) {
dif = getTokenCompletenessDif(a, b);
}
if (dif === 0) {
dif = getCompletenessDif(a, b);
}
if (dif === 0) {
dif = getTokenMatchesDif(a, b);
}
return dif;
});
}
exports.orderMatches = orderMatches;
function getMaxScoreDif(a, b) {
return Math.max(b.score, b.tokenScore || 0) - Math.max(a.score, a.tokenScore || 0);
}
exports.getMaxScoreDif = getMaxScoreDif;
function getMinScoreDif(a, b) {
return Math.min(b.score, b.tokenScore || 100) - Math.min(a.score, a.tokenScore || 100);
}
exports.getMinScoreDif = getMinScoreDif;
function getCompletenessDif(a, b) {
return b.completeness - a.completeness;
}
exports.getCompletenessDif = getCompletenessDif;
function getTokenCompletenessDif(a, b) {
if (a.tokenMatches && b.tokenMatches) {
var aTokenCompleteness = 0;
for (var _i = 0, _a = a.tokenMatches; _i < _a.length; _i++) {
var tokenMatch = _a[_i];
aTokenCompleteness += tokenMatch.completeness * tokenMatch.patternToken.length;
}
aTokenCompleteness /= a.tokenMatches.reduce(function (prev, curr) {
return prev + curr.patternToken.length;
}, 0);
var bTokenCompleteness = 0;
for (var _b = 0, _c = b.tokenMatches; _b < _c.length; _b++) {
var tokenMatch = _c[_b];
bTokenCompleteness += tokenMatch.completeness * tokenMatch.patternToken.length;
}
bTokenCompleteness /= b.tokenMatches.reduce(function (prev, curr) {
return prev + curr.patternToken.length;
}, 0);
return bTokenCompleteness - aTokenCompleteness;
}
return 0;
}
exports.getTokenCompletenessDif = getTokenCompletenessDif;
function getTokenMatchesDif(a, b) {
return (b.tokenMatches && b.tokenMatches.length || 1) - (a.tokenMatches && a.tokenMatches.length || 1);
}
exports.getTokenMatchesDif = getTokenMatchesDif;