Permalink
Cannot retrieve contributors at this time
136 lines (114 sloc)
3.84 KB
Name already in use
A tag already exists with the provided branch name. Many Git commands accept both tag and branch names, so creating this branch may cause unexpected behavior. Are you sure you want to create this branch?
codeql-action/node_modules/fast-levenshtein/levenshtein.js
Go to fileThis commit does not belong to any branch on this repository, and may belong to a fork outside of the repository.
This file contains bidirectional Unicode text that may be interpreted or compiled differently than what appears below. To review, open the file in an editor that reveals hidden Unicode characters.
Learn more about bidirectional Unicode characters
(function() { | |
'use strict'; | |
var collator; | |
try { | |
collator = (typeof Intl !== "undefined" && typeof Intl.Collator !== "undefined") ? Intl.Collator("generic", { sensitivity: "base" }) : null; | |
} catch (err){ | |
console.log("Collator could not be initialized and wouldn't be used"); | |
} | |
// arrays to re-use | |
var prevRow = [], | |
str2Char = []; | |
/** | |
* Based on the algorithm at http://en.wikipedia.org/wiki/Levenshtein_distance. | |
*/ | |
var Levenshtein = { | |
/** | |
* Calculate levenshtein distance of the two strings. | |
* | |
* @param str1 String the first string. | |
* @param str2 String the second string. | |
* @param [options] Additional options. | |
* @param [options.useCollator] Use `Intl.Collator` for locale-sensitive string comparison. | |
* @return Integer the levenshtein distance (0 and above). | |
*/ | |
get: function(str1, str2, options) { | |
var useCollator = (options && collator && options.useCollator); | |
var str1Len = str1.length, | |
str2Len = str2.length; | |
// base cases | |
if (str1Len === 0) return str2Len; | |
if (str2Len === 0) return str1Len; | |
// two rows | |
var curCol, nextCol, i, j, tmp; | |
// initialise previous row | |
for (i=0; i<str2Len; ++i) { | |
prevRow[i] = i; | |
str2Char[i] = str2.charCodeAt(i); | |
} | |
prevRow[str2Len] = str2Len; | |
var strCmp; | |
if (useCollator) { | |
// calculate current row distance from previous row using collator | |
for (i = 0; i < str1Len; ++i) { | |
nextCol = i + 1; | |
for (j = 0; j < str2Len; ++j) { | |
curCol = nextCol; | |
// substution | |
strCmp = 0 === collator.compare(str1.charAt(i), String.fromCharCode(str2Char[j])); | |
nextCol = prevRow[j] + (strCmp ? 0 : 1); | |
// insertion | |
tmp = curCol + 1; | |
if (nextCol > tmp) { | |
nextCol = tmp; | |
} | |
// deletion | |
tmp = prevRow[j + 1] + 1; | |
if (nextCol > tmp) { | |
nextCol = tmp; | |
} | |
// copy current col value into previous (in preparation for next iteration) | |
prevRow[j] = curCol; | |
} | |
// copy last col value into previous (in preparation for next iteration) | |
prevRow[j] = nextCol; | |
} | |
} | |
else { | |
// calculate current row distance from previous row without collator | |
for (i = 0; i < str1Len; ++i) { | |
nextCol = i + 1; | |
for (j = 0; j < str2Len; ++j) { | |
curCol = nextCol; | |
// substution | |
strCmp = str1.charCodeAt(i) === str2Char[j]; | |
nextCol = prevRow[j] + (strCmp ? 0 : 1); | |
// insertion | |
tmp = curCol + 1; | |
if (nextCol > tmp) { | |
nextCol = tmp; | |
} | |
// deletion | |
tmp = prevRow[j + 1] + 1; | |
if (nextCol > tmp) { | |
nextCol = tmp; | |
} | |
// copy current col value into previous (in preparation for next iteration) | |
prevRow[j] = curCol; | |
} | |
// copy last col value into previous (in preparation for next iteration) | |
prevRow[j] = nextCol; | |
} | |
} | |
return nextCol; | |
} | |
}; | |
// amd | |
if (typeof define !== "undefined" && define !== null && define.amd) { | |
define(function() { | |
return Levenshtein; | |
}); | |
} | |
// commonjs | |
else if (typeof module !== "undefined" && module !== null && typeof exports !== "undefined" && module.exports === exports) { | |
module.exports = Levenshtein; | |
} | |
// web worker | |
else if (typeof self !== "undefined" && typeof self.postMessage === 'function' && typeof self.importScripts === 'function') { | |
self.Levenshtein = Levenshtein; | |
} | |
// browser main thread | |
else if (typeof window !== "undefined" && window !== null) { | |
window.Levenshtein = Levenshtein; | |
} | |
}()); |