UNPKG

@mintlify/common

Version:

Commonly shared code within Mintlify

57 lines (56 loc) 2.16 kB
export function computeLevenshteinDistance(a, b) { if (a.length === 0) return b.length; if (b.length === 0) return a.length; const matrix = []; for (let i = 0; i <= b.length; i++) { matrix[i] = [i]; } for (let j = 0; j <= a.length; j++) { matrix[0][j] = j; } for (let i = 1; i <= b.length; i++) { for (let j = 1; j <= a.length; j++) { if (b.charAt(i - 1) === a.charAt(j - 1)) { matrix[i][j] = matrix[i - 1][j - 1]; } else { matrix[i][j] = Math.min(matrix[i - 1][j - 1] + 1, matrix[i][j - 1] + 1, matrix[i - 1][j] + 1); } } } return matrix[b.length][a.length]; } export function computeStringSimilarity(a, b) { if (a.length === 0 && b.length === 0) return 1; if (a.length === 0 || b.length === 0) return 0; const distance = computeLevenshteinDistance(a, b); const maxLength = Math.max(a.length, b.length); return 1 - distance / maxLength; } export function findBestMatch(content, target, options) { var _a, _b; const minSimilarity = (_a = options === null || options === void 0 ? void 0 : options.minSimilarity) !== null && _a !== void 0 ? _a : 0.85; const windowSize = (_b = options === null || options === void 0 ? void 0 : options.windowSize) !== null && _b !== void 0 ? _b : Math.ceil(target.length * 1.5); if (content.length === 0 || target.length === 0) return null; let bestMatch = null; const minLen = Math.ceil(target.length * 0.5); for (let i = 0; i <= content.length - minLen; i++) { for (let len = minLen; len <= Math.min(windowSize, content.length - i); len++) { const candidate = content.slice(i, i + len); const similarity = computeStringSimilarity(candidate, target); if (similarity >= minSimilarity && (!bestMatch || similarity > bestMatch.similarity)) { bestMatch = { similarity, startIndex: i, endIndex: i + len, }; } } } return bestMatch; }