fast-levenshtein-umd

A UMD build of fast-levenshtein

Ovu skriptu ne treba izravno instalirati. To je biblioteka za druge skripte koje se uključuju u meta direktivu // @require https://update.greasyfork.org/scripts/525938/1532043/fast-levenshtein-umd.js

  1. (function (global, factory) {
  2. typeof exports === 'object' && typeof module !== 'undefined' ? module.exports = factory() :
  3. typeof define === 'function' && define.amd ? define(factory) :
  4. (global = typeof globalThis !== 'undefined' ? globalThis : global || self, global.Levenshtein = factory());
  5. })(this, (function () { 'use strict';
  6. const peq = new Uint32Array(0x10000);
  7. const myers_32 = (a, b) => {
  8. const n = a.length;
  9. const m = b.length;
  10. const lst = 1 << (n - 1);
  11. let pv = -1;
  12. let mv = 0;
  13. let sc = n;
  14. let i = n;
  15. while (i--) {
  16. peq[a.charCodeAt(i)] |= 1 << i;
  17. }
  18. for (i = 0; i < m; i++) {
  19. let eq = peq[b.charCodeAt(i)];
  20. const xv = eq | mv;
  21. eq |= ((eq & pv) + pv) ^ pv;
  22. mv |= ~(eq | pv);
  23. pv &= eq;
  24. if (mv & lst) sc++;
  25. if (pv & lst) sc--;
  26. mv = (mv << 1) | 1;
  27. pv = (pv << 1) | ~(xv | mv);
  28. mv &= xv;
  29. }
  30. i = n;
  31. while (i--) {
  32. peq[a.charCodeAt(i)] = 0;
  33. }
  34. return sc;
  35. };
  36. const myers_x = (b, a) => {
  37. const n = a.length;
  38. const m = b.length;
  39. const mhc = [];
  40. const phc = [];
  41. const hsize = Math.ceil(n / 32);
  42. const vsize = Math.ceil(m / 32);
  43. for (let i = 0; i < hsize; i++) {
  44. phc[i] = -1;
  45. mhc[i] = 0;
  46. }
  47. let j = 0;
  48. for (; j < vsize - 1; j++) {
  49. let mv = 0;
  50. let pv = -1;
  51. const start = j * 32;
  52. const vlen = Math.min(32, m) + start;
  53. for (let k = start; k < vlen; k++) {
  54. peq[b.charCodeAt(k)] |= 1 << k;
  55. }
  56. for (let i = 0; i < n; i++) {
  57. const eq = peq[a.charCodeAt(i)];
  58. const pb = (phc[(i / 32) | 0] >>> i) & 1;
  59. const mb = (mhc[(i / 32) | 0] >>> i) & 1;
  60. const xv = eq | mv;
  61. const xh = ((((eq | mb) & pv) + pv) ^ pv) | eq | mb;
  62. let ph = mv | ~(xh | pv);
  63. let mh = pv & xh;
  64. if ((ph >>> 31) ^ pb) {
  65. phc[(i / 32) | 0] ^= 1 << i;
  66. }
  67. if ((mh >>> 31) ^ mb) {
  68. mhc[(i / 32) | 0] ^= 1 << i;
  69. }
  70. ph = (ph << 1) | pb;
  71. mh = (mh << 1) | mb;
  72. pv = mh | ~(xv | ph);
  73. mv = ph & xv;
  74. }
  75. for (let k = start; k < vlen; k++) {
  76. peq[b.charCodeAt(k)] = 0;
  77. }
  78. }
  79. let mv = 0;
  80. let pv = -1;
  81. const start = j * 32;
  82. const vlen = Math.min(32, m - start) + start;
  83. for (let k = start; k < vlen; k++) {
  84. peq[b.charCodeAt(k)] |= 1 << k;
  85. }
  86. let score = m;
  87. for (let i = 0; i < n; i++) {
  88. const eq = peq[a.charCodeAt(i)];
  89. const pb = (phc[(i / 32) | 0] >>> i) & 1;
  90. const mb = (mhc[(i / 32) | 0] >>> i) & 1;
  91. const xv = eq | mv;
  92. const xh = ((((eq | mb) & pv) + pv) ^ pv) | eq | mb;
  93. let ph = mv | ~(xh | pv);
  94. let mh = pv & xh;
  95. score += (ph >>> (m - 1)) & 1;
  96. score -= (mh >>> (m - 1)) & 1;
  97. if ((ph >>> 31) ^ pb) {
  98. phc[(i / 32) | 0] ^= 1 << i;
  99. }
  100. if ((mh >>> 31) ^ mb) {
  101. mhc[(i / 32) | 0] ^= 1 << i;
  102. }
  103. ph = (ph << 1) | pb;
  104. mh = (mh << 1) | mb;
  105. pv = mh | ~(xv | ph);
  106. mv = ph & xv;
  107. }
  108. for (let k = start; k < vlen; k++) {
  109. peq[b.charCodeAt(k)] = 0;
  110. }
  111. return score;
  112. };
  113. const distance = (a, b) => {
  114. if (a.length < b.length) {
  115. const tmp = b;
  116. b = a;
  117. a = tmp;
  118. }
  119. if (b.length === 0) return a.length;
  120. if (a.length <= 32) return myers_32(a, b);
  121. return myers_x(a, b);
  122. };
  123. const collator = Intl.Collator("generic", { sensitivity: "base" });
  124. const prevRow = [];
  125. const str2Char = [];
  126. const Levenshtein = {
  127. get(str1, str2, options={useCollator:false}) {
  128. const useCollator = (options && collator && options.useCollator);
  129. if (useCollator) {
  130. const str1Len = str1.length;
  131. const str2Len = str2.length;
  132. if (str1Len === 0) return str2Len;
  133. if (str2Len === 0) return str1Len;
  134. for (i=0; i<str2Len; ++i) {
  135. prevRow[i] = i;
  136. str2Char[i] = str2.charCodeAt(i);
  137. }
  138. prevRow[str2Len] = str2Len;
  139. var strCmp;
  140. for (let i = 0; i < str1Len; ++i) {
  141. let nextCol = i + 1;
  142. for (let j = 0; j < str2Len; ++j) {
  143. let curCol = nextCol;
  144. strCmp = 0 === collator.compare(str1.charAt(i), String.fromCharCode(str2Char[j]));
  145. nextCol = prevRow[j] + (strCmp ? 0 : 1);
  146. let tmp = curCol + 1;
  147. if (nextCol > tmp) {
  148. nextCol = tmp;
  149. }
  150. tmp = prevRow[j + 1] + 1;
  151. if (nextCol > tmp) {
  152. nextCol = tmp;
  153. }
  154. prevRow[j] = curCol;
  155. }
  156. prevRow[j] = nextCol;
  157. }
  158. return nextCol;
  159. }
  160. return distance(str1, str2);
  161. }
  162. };
  163. return Levenshtein;
  164. }));