diff --git a/src/core/diff/strategies/search-replace.ts b/src/core/diff/strategies/search-replace.ts index 959f949..a9bf467 100644 --- a/src/core/diff/strategies/search-replace.ts +++ b/src/core/diff/strategies/search-replace.ts @@ -1,37 +1,9 @@ import { DiffStrategy, DiffResult } from "../types" import { addLineNumbers, everyLineHasLineNumbers, stripLineNumbers } from "../../../integrations/misc/extract-text" +import { distance } from "fastest-levenshtein" const BUFFER_LINES = 20 // Number of extra context lines to show before and after matches -function levenshteinDistance(a: string, b: string): number { - const matrix: number[][] = [] - - // Initialize matrix - for (let i = 0; i <= a.length; i++) { - matrix[i] = [i] - } - for (let j = 0; j <= b.length; j++) { - matrix[0][j] = j - } - - // Fill matrix - for (let i = 1; i <= a.length; i++) { - for (let j = 1; j <= b.length; j++) { - if (a[i - 1] === b[j - 1]) { - matrix[i][j] = matrix[i - 1][j - 1] - } else { - matrix[i][j] = Math.min( - matrix[i - 1][j - 1] + 1, // substitution - matrix[i][j - 1] + 1, // insertion - matrix[i - 1][j] + 1, // deletion - ) - } - } - } - - return matrix[a.length][b.length] -} - function getSimilarity(original: string, search: string): number { if (search === "") { return 1 @@ -47,12 +19,12 @@ function getSimilarity(original: string, search: string): number { return 1 } - // Calculate Levenshtein distance - const distance = levenshteinDistance(normalizedOriginal, normalizedSearch) + // Calculate Levenshtein distance using fastest-levenshtein's distance function + const dist = distance(normalizedOriginal, normalizedSearch) - // Calculate similarity ratio (0 to 1, where 1 is exact match) + // Calculate similarity ratio (0 to 1, where 1 is an exact match) const maxLength = Math.max(normalizedOriginal.length, normalizedSearch.length) - return 1 - distance / maxLength + return 1 - dist / maxLength } export class SearchReplaceDiffStrategy implements DiffStrategy {