cmpstr 2.0.2 → 3.0.0

This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
Files changed (172) hide show
  1. package/LICENSE +21 -21
  2. package/README.md +75 -499
  3. package/dist/CmpStr.esm.js +4863 -0
  4. package/dist/CmpStr.esm.js.map +1 -0
  5. package/dist/CmpStr.esm.min.js +8 -0
  6. package/dist/CmpStr.esm.min.js.map +1 -0
  7. package/dist/CmpStr.umd.js +4875 -0
  8. package/dist/CmpStr.umd.js.map +1 -0
  9. package/dist/CmpStr.umd.min.js +8 -0
  10. package/dist/CmpStr.umd.min.js.map +1 -0
  11. package/dist/cjs/CmpStr.js +663 -0
  12. package/dist/cjs/CmpStr.js.map +1 -0
  13. package/dist/cjs/CmpStrAsync.js +336 -0
  14. package/dist/cjs/CmpStrAsync.js.map +1 -0
  15. package/dist/cjs/index.js +15 -0
  16. package/dist/cjs/index.js.map +1 -0
  17. package/dist/cjs/metric/Cosine.js +101 -0
  18. package/dist/cjs/metric/Cosine.js.map +1 -0
  19. package/dist/cjs/metric/DamerauLevenshtein.js +110 -0
  20. package/dist/cjs/metric/DamerauLevenshtein.js.map +1 -0
  21. package/dist/cjs/metric/DiceSorensen.js +91 -0
  22. package/dist/cjs/metric/DiceSorensen.js.map +1 -0
  23. package/dist/cjs/metric/Hamming.js +82 -0
  24. package/dist/cjs/metric/Hamming.js.map +1 -0
  25. package/dist/cjs/metric/Jaccard.js +76 -0
  26. package/dist/cjs/metric/Jaccard.js.map +1 -0
  27. package/dist/cjs/metric/JaroWinkler.js +114 -0
  28. package/dist/cjs/metric/JaroWinkler.js.map +1 -0
  29. package/dist/cjs/metric/LCS.js +89 -0
  30. package/dist/cjs/metric/LCS.js.map +1 -0
  31. package/dist/cjs/metric/Levenshtein.js +94 -0
  32. package/dist/cjs/metric/Levenshtein.js.map +1 -0
  33. package/dist/cjs/metric/Metric.js +445 -0
  34. package/dist/cjs/metric/Metric.js.map +1 -0
  35. package/dist/cjs/metric/NeedlemanWunsch.js +95 -0
  36. package/dist/cjs/metric/NeedlemanWunsch.js.map +1 -0
  37. package/dist/cjs/metric/SmithWaterman.js +98 -0
  38. package/dist/cjs/metric/SmithWaterman.js.map +1 -0
  39. package/dist/cjs/metric/qGram.js +91 -0
  40. package/dist/cjs/metric/qGram.js.map +1 -0
  41. package/dist/cjs/phonetic/Cologne.js +112 -0
  42. package/dist/cjs/phonetic/Cologne.js.map +1 -0
  43. package/dist/cjs/phonetic/Metaphone.js +172 -0
  44. package/dist/cjs/phonetic/Metaphone.js.map +1 -0
  45. package/dist/cjs/phonetic/Phonetic.js +413 -0
  46. package/dist/cjs/phonetic/Phonetic.js.map +1 -0
  47. package/dist/cjs/phonetic/Soundex.js +135 -0
  48. package/dist/cjs/phonetic/Soundex.js.map +1 -0
  49. package/dist/cjs/utils/DeepMerge.js +144 -0
  50. package/dist/cjs/utils/DeepMerge.js.map +1 -0
  51. package/dist/cjs/utils/DiffChecker.js +500 -0
  52. package/dist/cjs/utils/DiffChecker.js.map +1 -0
  53. package/dist/cjs/utils/Filter.js +189 -0
  54. package/dist/cjs/utils/Filter.js.map +1 -0
  55. package/dist/cjs/utils/HashTable.js +175 -0
  56. package/dist/cjs/utils/HashTable.js.map +1 -0
  57. package/dist/cjs/utils/Normalizer.js +144 -0
  58. package/dist/cjs/utils/Normalizer.js.map +1 -0
  59. package/dist/cjs/utils/Pool.js +196 -0
  60. package/dist/cjs/utils/Pool.js.map +1 -0
  61. package/dist/cjs/utils/Profiler.js +229 -0
  62. package/dist/cjs/utils/Profiler.js.map +1 -0
  63. package/dist/cjs/utils/Registry.js +148 -0
  64. package/dist/cjs/utils/Registry.js.map +1 -0
  65. package/dist/cjs/utils/TextAnalyzer.js +358 -0
  66. package/dist/cjs/utils/TextAnalyzer.js.map +1 -0
  67. package/dist/esm/CmpStr.js +662 -0
  68. package/dist/esm/CmpStr.js.map +1 -0
  69. package/dist/esm/CmpStrAsync.js +331 -0
  70. package/dist/esm/CmpStrAsync.js.map +1 -0
  71. package/dist/esm/index.js +7 -0
  72. package/dist/esm/index.js.map +1 -0
  73. package/dist/esm/metric/Cosine.js +99 -0
  74. package/dist/esm/metric/Cosine.js.map +1 -0
  75. package/dist/esm/metric/DamerauLevenshtein.js +108 -0
  76. package/dist/esm/metric/DamerauLevenshtein.js.map +1 -0
  77. package/dist/esm/metric/DiceSorensen.js +89 -0
  78. package/dist/esm/metric/DiceSorensen.js.map +1 -0
  79. package/dist/esm/metric/Hamming.js +77 -0
  80. package/dist/esm/metric/Hamming.js.map +1 -0
  81. package/dist/esm/metric/Jaccard.js +74 -0
  82. package/dist/esm/metric/Jaccard.js.map +1 -0
  83. package/dist/esm/metric/JaroWinkler.js +112 -0
  84. package/dist/esm/metric/JaroWinkler.js.map +1 -0
  85. package/dist/esm/metric/LCS.js +87 -0
  86. package/dist/esm/metric/LCS.js.map +1 -0
  87. package/dist/esm/metric/Levenshtein.js +92 -0
  88. package/dist/esm/metric/Levenshtein.js.map +1 -0
  89. package/dist/esm/metric/Metric.js +442 -0
  90. package/dist/esm/metric/Metric.js.map +1 -0
  91. package/dist/esm/metric/NeedlemanWunsch.js +93 -0
  92. package/dist/esm/metric/NeedlemanWunsch.js.map +1 -0
  93. package/dist/esm/metric/SmithWaterman.js +96 -0
  94. package/dist/esm/metric/SmithWaterman.js.map +1 -0
  95. package/dist/esm/metric/qGram.js +89 -0
  96. package/dist/esm/metric/qGram.js.map +1 -0
  97. package/dist/esm/phonetic/Cologne.js +114 -0
  98. package/dist/esm/phonetic/Cologne.js.map +1 -0
  99. package/dist/esm/phonetic/Metaphone.js +174 -0
  100. package/dist/esm/phonetic/Metaphone.js.map +1 -0
  101. package/dist/esm/phonetic/Phonetic.js +409 -0
  102. package/dist/esm/phonetic/Phonetic.js.map +1 -0
  103. package/dist/esm/phonetic/Soundex.js +137 -0
  104. package/dist/esm/phonetic/Soundex.js.map +1 -0
  105. package/dist/esm/utils/DeepMerge.js +139 -0
  106. package/dist/esm/utils/DeepMerge.js.map +1 -0
  107. package/dist/esm/utils/DiffChecker.js +498 -0
  108. package/dist/esm/utils/DiffChecker.js.map +1 -0
  109. package/dist/esm/utils/Filter.js +187 -0
  110. package/dist/esm/utils/Filter.js.map +1 -0
  111. package/dist/esm/utils/HashTable.js +173 -0
  112. package/dist/esm/utils/HashTable.js.map +1 -0
  113. package/dist/esm/utils/Normalizer.js +142 -0
  114. package/dist/esm/utils/Normalizer.js.map +1 -0
  115. package/dist/esm/utils/Pool.js +194 -0
  116. package/dist/esm/utils/Pool.js.map +1 -0
  117. package/dist/esm/utils/Profiler.js +227 -0
  118. package/dist/esm/utils/Profiler.js.map +1 -0
  119. package/dist/esm/utils/Registry.js +142 -0
  120. package/dist/esm/utils/Registry.js.map +1 -0
  121. package/dist/esm/utils/TextAnalyzer.js +356 -0
  122. package/dist/esm/utils/TextAnalyzer.js.map +1 -0
  123. package/dist/types/CmpStr.d.ts +472 -0
  124. package/dist/types/CmpStrAsync.d.ts +233 -0
  125. package/dist/types/index.d.ts +51 -0
  126. package/dist/types/metric/Cosine.d.ts +57 -0
  127. package/dist/types/metric/DamerauLevenshtein.d.ts +50 -0
  128. package/dist/types/metric/DiceSorensen.d.ts +57 -0
  129. package/dist/types/metric/Hamming.d.ts +49 -0
  130. package/dist/types/metric/Jaccard.d.ts +48 -0
  131. package/dist/types/metric/JaroWinkler.d.ts +50 -0
  132. package/dist/types/metric/LCS.d.ts +50 -0
  133. package/dist/types/metric/Levenshtein.d.ts +50 -0
  134. package/dist/types/metric/Metric.d.ts +261 -0
  135. package/dist/types/metric/NeedlemanWunsch.d.ts +47 -0
  136. package/dist/types/metric/SmithWaterman.d.ts +48 -0
  137. package/dist/types/metric/index.d.ts +41 -0
  138. package/dist/types/metric/qGram.d.ts +56 -0
  139. package/dist/types/phonetic/Cologne.d.ts +46 -0
  140. package/dist/types/phonetic/Metaphone.d.ts +50 -0
  141. package/dist/types/phonetic/Phonetic.d.ts +189 -0
  142. package/dist/types/phonetic/Soundex.d.ts +49 -0
  143. package/dist/types/phonetic/index.d.ts +30 -0
  144. package/dist/types/utils/DeepMerge.d.ts +70 -0
  145. package/dist/types/utils/DiffChecker.d.ts +137 -0
  146. package/dist/types/utils/Filter.d.ts +97 -0
  147. package/dist/types/utils/HashTable.d.ts +86 -0
  148. package/dist/types/utils/Normalizer.d.ts +76 -0
  149. package/dist/types/utils/Pool.d.ts +63 -0
  150. package/dist/types/utils/Profiler.d.ts +129 -0
  151. package/dist/types/utils/Registry.d.ts +57 -0
  152. package/dist/types/utils/TextAnalyzer.d.ts +199 -0
  153. package/dist/types/utils/Types.d.ts +313 -0
  154. package/package.json +62 -49
  155. package/src/CmpStr.d.ts +0 -70
  156. package/src/CmpStr.js +0 -912
  157. package/src/CmpStrAsync.d.ts +0 -19
  158. package/src/CmpStrAsync.js +0 -204
  159. package/src/algorithms/cosine.js +0 -86
  160. package/src/algorithms/damerau.js +0 -78
  161. package/src/algorithms/dice.js +0 -65
  162. package/src/algorithms/hamming.js +0 -44
  163. package/src/algorithms/jaccard.js +0 -34
  164. package/src/algorithms/jaroWinkler.js +0 -106
  165. package/src/algorithms/lcs.js +0 -58
  166. package/src/algorithms/levenshtein.js +0 -70
  167. package/src/algorithms/needlemanWunsch.js +0 -72
  168. package/src/algorithms/qGram.js +0 -63
  169. package/src/algorithms/smithWaterman.js +0 -78
  170. package/src/algorithms/soundex.js +0 -152
  171. package/src/index.d.ts +0 -3
  172. package/src/index.js +0 -47
@@ -0,0 +1,95 @@
1
+ // CmpStr v3.0.0 dev-1a82e20-250612 by Paul Köhler @komed3 / MIT License
2
+ 'use strict';
3
+
4
+ var Metric = require('./Metric.js');
5
+ var Pool = require('../utils/Pool.js');
6
+
7
+ /**
8
+ * Needleman-Wunsch Algorithm
9
+ * src/metric/NeedlemanWunsch.ts
10
+ *
11
+ * @see https://en.wikipedia.org/wiki/Needleman%E2%80%93Wunsch_algorithm
12
+ *
13
+ * The Needleman-Wunsch algorithm performs global alignment, aligning two strings
14
+ * entirely, including gaps. It is commonly used in bioinformatics for sequence
15
+ * alignment.
16
+ *
17
+ * @module Metric/NeedlemanWunsch
18
+ * @author Paul Köhler (komed3)
19
+ * @license MIT
20
+ */
21
+ /**
22
+ * NeedlemanWunschDistance class extends the Metric class to implement the Needleman-Wunsch algorithm.
23
+ */
24
+ class NeedlemanWunschDistance extends Metric.Metric {
25
+ /**
26
+ * Constructor for the NeedlemanWunsch class.
27
+ *
28
+ * Initializes the Needleman-Wunsch metric with two input strings or
29
+ * arrays of strings and optional options.
30
+ *
31
+ * @param {MetricInput} a - First input string or array of strings
32
+ * @param {MetricInput} b - Second input string or array of strings
33
+ * @param {MetricOptions} [opt] - Options for the metric computation
34
+ */
35
+ constructor(a, b, opt = {}) {
36
+ // Call the parent Metric constructor with the metric name and inputs
37
+ // Metric is symmetrical
38
+ super('needlemanWunsch', a, b, opt, true);
39
+ }
40
+ /**
41
+ * Calculates the Needleman-Wunsch global alignment score between two strings.
42
+ *
43
+ * @param {string} a - First string
44
+ * @param {string} b - Second string
45
+ * @param {number} m - Length of the first string
46
+ * @param {number} n - Length of the second string
47
+ * @param {number} maxLen - Maximum length of the strings
48
+ * @return {MetricCompute<NeedlemanRaw>} - Object containing the similarity result and raw score
49
+ */
50
+ compute(a, b, m, n, maxLen) {
51
+ // Scoring parameters (can be customized via options if needed)
52
+ const { match = 1, mismatch = -1, gap = -1 } = this.options;
53
+ // Get two reusable arrays from the Pool for the DP rows
54
+ const len = m + 1;
55
+ const [prev, curr] = Pool.Pool.acquireMany('uint16', [len, len]);
56
+ // Initialize the first row (gap penalties)
57
+ prev[0] = 0;
58
+ for (let i = 1; i <= m; i++) prev[i] = prev[i - 1] + gap;
59
+ // Fill the DP matrix row by row (over the longer string)
60
+ for (let j = 1; j <= n; j++) {
61
+ curr[0] = prev[0] + gap;
62
+ // Get the character code of the current character in b
63
+ const cb = b.charCodeAt(j - 1);
64
+ for (let i = 1; i <= m; i++) {
65
+ // Score for match / mismatch
66
+ const score = a.charCodeAt(i - 1) === cb ? match : mismatch;
67
+ // Calculate the maximum score for current cell
68
+ curr[i] = Math.max(
69
+ prev[i - 1] + score, // Diagonal (match/mismatch)
70
+ prev[i] + gap, // Up (gap)
71
+ curr[i - 1] + gap // Left (gap)
72
+ );
73
+ }
74
+ // Copy current row to previous for next iteration
75
+ prev.set(curr);
76
+ }
77
+ // The last value in prev is the Needleman-Wunsch score
78
+ const score = prev[m];
79
+ // Release arrays back to the pool
80
+ Pool.Pool.release('uint16', prev, len);
81
+ Pool.Pool.release('uint16', curr, len);
82
+ // Use the maximum possible score for the longer string (global alignment)
83
+ const denum = maxLen * match;
84
+ // Return the result as a MetricCompute object
85
+ return {
86
+ res: denum === 0 ? 0 : Metric.Metric.clamp(score / denum),
87
+ raw: { score, denum }
88
+ };
89
+ }
90
+ }
91
+ // Register the Needleman-Wunsch algorithm in the metric registry
92
+ Metric.MetricRegistry.add('needlemanWunsch', NeedlemanWunschDistance);
93
+
94
+ exports.NeedlemanWunschDistance = NeedlemanWunschDistance;
95
+ //# sourceMappingURL=NeedlemanWunsch.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"NeedlemanWunsch.js","sources":["../../../src/metric/NeedlemanWunsch.ts"],"sourcesContent":[null],"names":["Metric","Pool","MetricRegistry"],"mappings":";;;;;;AAAA,CAAA,CAAA;;;;;;;;;;;;;AAaG,CAAA,CAAA;AAaH,CAAA,CAAA;;AAEG,CAAA,CAAA;AACG,CAAO,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAwB,CAAQA,CAAAA,CAAAA,CAAAA,CAAAA,CAAAA,CAAAA,CAAAA,CAAAA,CAAAA,CAAAA,CAAAA,CAAAA,CAAAA,CAAAA,CAAAA,CAAAA,CAAAA,CAAAA,CAAAA,CAAAA,CAAoB,CAAA;AAE7D,CAAA,CAAA,CAAA,CAAA;;;;;;;;;AASG,CAAA,CAAA,CAAA,CAAA;AACH,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAc,CAAc,CAAA,CAAE,CAAc,CAAE,CAAA,CAAA,CAAA,EAAqB,CAAA,CAAA,CAAA,CAAE,CAAA,CAAA;;;CAIjE,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAK,CAAG,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAiB,CAAE,CAAA,CAAC,CAAE,CAAA,CAAC,CAAE,CAAA,CAAA,CAAA,CAAG,CAAE,CAAA,CAAA,CAAA,CAAA,CAAI,CAAE;;AAIhD,CAAA,CAAA,CAAA,CAAA;;;;;;;;;AASG,CAAA,CAAA,CAAA,CAAA;CACgB,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAO,CACtB,CAAS,CAAE,CAAA,CAAS,CAAE,CAAA,CAAS,CAAE,CAAA,CAAS,CAC1C,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAc,CAAA,CAAA;;AAId,CAAA,CAAA,CAAA,CAAA,MAAM,CAAE,CAAA,CAAA,CAAA,CAAA,CAAA,CAAK,CAAG,CAAA,CAAA,CAAC,EAAE,CAAQ,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAG,CAAE,CAAA,CAAA,CAAE,GAAG,CAAG,CAAA,CAAA,CAAA,CAAE,EAAE,CAAG,CAAA,CAAA,CAAA,CAAA,CAAA,CAAI,CAAC,CAAO,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA;;AAG3D,CAAA,CAAA,CAAA,CAAA,CAAM,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAG,CAAW,CAAA,CAAA,CAAC,GAAG,CAAC;AACzB,CAAA,CAAA,CAAA,CAAA,MAAM,CAAE,CAAA,CAAA,CAAA,CAAI,EAAE,CAAI,CAAA,CAAA,CAAA,CAAE,GAAGC,CAAI,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAC,CAAW,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAE,QAAQ,CAAE,CAAA,CAAE,GAAG,CAAE,CAAA,CAAA,CAAA,CAAG,CAAE,CAAE;;AAGjE,CAAA,CAAA,CAAA,CAAA,CAAI,CAAA,CAAA,CAAA,CAAE,CAAC,CAAE,GAAG,CAAC;CAAE,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAM,CAAI,CAAA,CAAA,CAAA,CAAC,CAAG,CAAA,CAAA,CAAC,CAAE,CAAA,CAAC,CAAI,CAAA,CAAA,CAAA,CAAC,CAAE,CAAA,CAAC,CAAE,CAAA,CAAG,CAAA,CAAI,CAAA,CAAA,CAAA,CAAE,CAAC,CAAE,CAAG,CAAA,CAAA,CAAA,CAAA,CAAA,CAAI,CAAE,CAAC,CAAG,CAAA,CAAA,CAAC,CAAE,CAAA,CAAA,CAAG,CAAG,CAAA,CAAA;;AAG7E,CAAA,CAAA,CAAA,CAAA,CAAM,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAI,CAAC,CAAA,CAAA,CAAG,CAAC,CAAA,CAAE,CAAC,CAAA,CAAA,CAAA,CAAI,CAAC,CAAA,CAAE,CAAC,CAAA,CAAE,CAAG,CAAA;CAE3B,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAI,CAAE,CAAC,CAAE,CAAA,CAAA,CAAG,IAAI,CAAE,CAAC,CAAE,CAAA,CAAA,CAAG,CAAG,CAAA,CAAA;;CAG3B,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAM,CAAE,CAAA,CAAA,CAAA,CAAW,CAAC,CAAC,UAAU,CAAE,CAAC,CAAG,CAAA,CAAA,CAAC,CAAE;AAExC,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAM,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAI,CAAC,CAAA,CAAA,CAAG,CAAC,CAAA,CAAE,CAAC,CAAA,CAAA,CAAA,CAAI,CAAC,CAAA,CAAE,CAAC,CAAA,CAAE,CAAG,CAAA;;QAG3B,MAAM,CAAK,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAW,CAAC,CAAC,UAAU,CAAE,CAAC,CAAG,CAAA,CAAA,CAAC,CAAE,CAAK,CAAA,CAAA,CAAA,CAAA,CAAA,CAAE,CAAG,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAK,GAAG,CAAQ,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA;;AAGrE,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,IAAI,CAAE,CAAC,CAAE,CAAA,CAAA,CAAG,IAAI,CAAC,CAAA,CAAA,CAAG;UAChB,CAAA,CAAA,CAAA,CAAI,CAAE,CAAC,CAAA,CAAA,CAAG,CAAC,CAAE,GAAG,CAAK,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA;AACrB,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAI,CAAA,CAAA,CAAA,CAAE,CAAC,CAAE,GAAG,CAAG,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA;UACf,IAAI,CAAE,CAAC,GAAG,CAAC,CAAE,GAAG,CAAG,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA;CACtB,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA;;;AAKL,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAI,CAAA,CAAA,CAAA,CAAC,CAAG,CAAA,CAAA,CAAE,IAAI,CAAE;;;AAKpB,CAAA,CAAA,CAAA,CAAA,MAAM,CAAK,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAW,CAAI,CAAA,CAAA,CAAA,CAAE,CAAC,CAAE;;CAG/BA,CAAAA,CAAAA,CAAAA,CAAAA,CAAAA,CAAAA,CAAAA,CAAAA,CAAAA,CAAAA,CAAAA,CAAI,CAAC,CAAO,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAE,QAAQ,CAAE,CAAA,CAAA,CAAA,CAAA,CAAI,CAAE,CAAA,CAAA,CAAA,CAAG,CAAE;CACnCA,CAAAA,CAAAA,CAAAA,CAAAA,CAAAA,CAAAA,CAAAA,CAAAA,CAAAA,CAAAA,CAAAA,CAAI,CAAC,CAAO,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAE,QAAQ,CAAE,CAAA,CAAA,CAAA,CAAA,CAAI,CAAE,CAAA,CAAA,CAAA,CAAG,CAAE;;AAGnC,CAAA,CAAA,CAAA,CAAA,CAAM,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAK,CAAW,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAM,GAAG,CAAK,CAAA,CAAA,CAAA,CAAA;;IAGpC,CAAO,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA;AACH,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAG,CAAA,CAAA,CAAA,CAAE,CAAK,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAK,CAAC,CAAG,CAAA,CAAA,CAAC,CAAGD,CAAAA,CAAAA,CAAAA,CAAAA,CAAAA,CAAAA,CAAAA,CAAAA,CAAAA,CAAAA,CAAAA,CAAAA,CAAAA,CAAAA,CAAM,CAAC,CAAK,CAAA,CAAA,CAAA,CAAA,CAAE,CAAK,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAG,KAAK,CAAE;AACpD,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAG,CAAA,CAAA,CAAA,CAAE,CAAE,CAAA,CAAA,CAAA,CAAA,CAAA,CAAK,EAAE,CAAK,CAAA,CAAA,CAAA,CAAA,CAAA;CACtB,CAAA,CAAA,CAAA,CAAA;;AAIR;AAED,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA;AACAE,CAAAA,CAAAA,CAAAA,CAAAA,CAAAA,CAAAA,CAAAA,CAAAA,CAAAA,CAAAA,CAAAA,CAAAA,CAAAA,CAAAA,CAAAA,CAAAA,CAAAA,CAAAA,CAAAA,CAAAA,CAAc,CAAC,CAAG,CAAA,CAAA,CAAE,CAAiB,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAE,uBAAuB,CAAE;;;"}
@@ -0,0 +1,98 @@
1
+ // CmpStr v3.0.0 dev-1a82e20-250612 by Paul Köhler @komed3 / MIT License
2
+ 'use strict';
3
+
4
+ var Metric = require('./Metric.js');
5
+ var Pool = require('../utils/Pool.js');
6
+
7
+ /**
8
+ * Smith-Waterman Algorithm
9
+ * src/metric/SmithWaterman.ts
10
+ *
11
+ * @see https://en.wikipedia.org/wiki/Smith%E2%80%93Waterman_algorithm
12
+ *
13
+ * The Smith-Waterman algorithm performs local alignment, finding the best matching
14
+ * subsequence between two strings. It is commonly used in bioinformatics for local
15
+ * sequence alignment. Instead of looking at the entire sequence, the Smith–Waterman
16
+ * algorithm compares segments of all possible lengths and optimizes the similarity
17
+ * measure.
18
+ *
19
+ * @module Metric/SmithWatermanDistance
20
+ * @author Paul Köhler (komed3)
21
+ * @license MIT
22
+ */
23
+ /**
24
+ * SmithWatermanDistance class extends the Metric class to implement the Smith-Waterman algorithm.
25
+ */
26
+ class SmithWatermanDistance extends Metric.Metric {
27
+ /**
28
+ * Constructor for the SmithWaterman class.
29
+ *
30
+ * Initializes the Smith-Waterman metric with two input strings or
31
+ * arrays of strings and optional options.
32
+ *
33
+ * @param {MetricInput} a - First input string or array of strings
34
+ * @param {MetricInput} b - Second input string or array of strings
35
+ * @param {MetricOptions} [opt] - Options for the metric computation
36
+ */
37
+ constructor(a, b, opt = {}) {
38
+ // Call the parent Metric constructor with the metric name and inputs
39
+ // Metric is symmetrical
40
+ super('smithWaterman', a, b, opt, true);
41
+ }
42
+ /**
43
+ * Calculates the Smith-Waterman local alignment score between two strings.
44
+ *
45
+ * @param {string} a - First string
46
+ * @param {string} b - Second string
47
+ * @param {number} m - Length of the first string
48
+ * @param {number} n - Length of the second string
49
+ * @return {MetricCompute<SmithWatermanRaw>} - Object containing the similarity result and raw score
50
+ */
51
+ compute(a, b, m, n) {
52
+ // Scoring parameters (can be customized via options if needed)
53
+ const { match = 2, mismatch = -1, gap = -2 } = this.options;
54
+ // Get two reusable arrays from the Pool for the DP rows
55
+ const len = m + 1;
56
+ const [prev, curr] = Pool.Pool.acquireMany('uint16', [len, len]);
57
+ // Initialize the first row to zeros (Smith-Waterman local alignment)
58
+ for (let i = 0; i <= m; i++) prev[i] = 0;
59
+ let maxScore = 0;
60
+ // Fill the DP matrix row by row (over the longer string)
61
+ for (let j = 1; j <= n; j++) {
62
+ // First column always zero
63
+ curr[0] = 0;
64
+ // Get the character code of the current character in b
65
+ const cb = b.charCodeAt(j - 1);
66
+ for (let i = 1; i <= m; i++) {
67
+ // Score for match / mismatch
68
+ const score = a.charCodeAt(i - 1) === cb ? match : mismatch;
69
+ // Calculate the maximum score for current cell
70
+ curr[i] = Math.max(
71
+ 0,
72
+ prev[i - 1] + score, // Diagonal (match/mismatch)
73
+ prev[i] + gap, // Up (gap)
74
+ curr[i - 1] + gap // Left (gap)
75
+ );
76
+ // Track the maximum score in the matrix
77
+ if (curr[i] > maxScore) maxScore = curr[i];
78
+ }
79
+ // Copy current row to previous for next iteration
80
+ prev.set(curr);
81
+ }
82
+ // Release arrays back to the pool
83
+ Pool.Pool.release('uint16', prev, len);
84
+ Pool.Pool.release('uint16', curr, len);
85
+ // Use the maximum possible score for the shorter string (local alignment)
86
+ const denum = Math.min(m * match, n * match);
87
+ // Return the result as a MetricCompute object
88
+ return {
89
+ res: denum === 0 ? 0 : Metric.Metric.clamp(maxScore / denum),
90
+ raw: { score: maxScore, denum }
91
+ };
92
+ }
93
+ }
94
+ // Register the Smith-Waterman algorithm in the metric registry
95
+ Metric.MetricRegistry.add('smithWaterman', SmithWatermanDistance);
96
+
97
+ exports.SmithWatermanDistance = SmithWatermanDistance;
98
+ //# sourceMappingURL=SmithWaterman.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"SmithWaterman.js","sources":["../../../src/metric/SmithWaterman.ts"],"sourcesContent":[null],"names":["Metric","Pool","MetricRegistry"],"mappings":"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"}
@@ -0,0 +1,91 @@
1
+ // CmpStr v3.0.0 dev-1a82e20-250612 by Paul Köhler @komed3 / MIT License
2
+ 'use strict';
3
+
4
+ var Metric = require('./Metric.js');
5
+ var Pool = require('../utils/Pool.js');
6
+
7
+ /**
8
+ * q-Gram Similarity
9
+ * src/metric/QGram.ts
10
+ *
11
+ * @see https://en.wikipedia.org/wiki/Q-gram
12
+ *
13
+ * Q-gram similarity is a string-matching algorithm that compares two strings by
14
+ * breaking them into substrings (q-grams) of length Q. The similarity is computed
15
+ * as the size of the intersection of q-gram sets divided by the size of the larger
16
+ * set.
17
+ *
18
+ * This metric is widely used in approximate string matching, information retrieval,
19
+ * and computational linguistics.
20
+ *
21
+ * @module Metric/QGramSimilarity
22
+ * @author Paul Köhler (komed3)
23
+ * @license MIT
24
+ */
25
+ /**
26
+ * QGramSimilarity class extends the Metric class to implement the q-Gram similarity algorithm.
27
+ */
28
+ class QGramSimilarity extends Metric.Metric {
29
+ /**
30
+ * Constructor for the QGramSimilarity class.
31
+ *
32
+ * Initializes the q-Gram similarity metric with two input strings or
33
+ * arrays of strings and optional options.
34
+ *
35
+ * @param {MetricInput} a - First input string or array of strings
36
+ * @param {MetricInput} b - Second input string or array of strings
37
+ * @param {MetricOptions} [opt] - Options for the metric computation
38
+ */
39
+ constructor(a, b, opt = {}) {
40
+ // Call the parent Metric constructor with the metric name and inputs
41
+ // Metric is symmetrical
42
+ super('qgram', a, b, opt, true);
43
+ }
44
+ /**
45
+ * Converts a string into a set of q-grams (substrings of length q).
46
+ *
47
+ * @param {string} str - The input string
48
+ * @param {number} q - The length of each q-gram
49
+ * @return {Set<string>} - Set of q-grams
50
+ */
51
+ _qGrams(str, q) {
52
+ const len = Math.max(0, str.length - q + 1);
53
+ const grams = Pool.Pool.acquire('set', len);
54
+ for (let i = 0; i < len; i++) grams.add(str.slice(i, i + q));
55
+ return grams;
56
+ }
57
+ /**
58
+ * Calculates the q-Gram similarity between two strings.
59
+ *
60
+ * @param {string} a - First string
61
+ * @param {string} b - Second string
62
+ * @return {MetricCompute<QGramRaw>} - Object containing the similarity result and raw values
63
+ */
64
+ compute(a, b) {
65
+ // Get q from options or use default "2"
66
+ const { q = 2 } = this.options;
67
+ // Generate q-gram sets for both strings
68
+ const setA = this._qGrams(a, q);
69
+ const setB = this._qGrams(b, q);
70
+ // Calculate intersection size
71
+ let intersection = 0;
72
+ for (const gram of setA) if (setB.has(gram)) intersection++;
73
+ // Calculate the size of the larger set
74
+ const sizeA = setA.size,
75
+ sizeB = setB.size;
76
+ const size = Math.max(sizeA, sizeB);
77
+ // Release sets back to the pool
78
+ Pool.Pool.release('set', setA, sizeA);
79
+ Pool.Pool.release('set', setB, sizeB);
80
+ // Return the result as a MetricCompute object
81
+ return {
82
+ res: size === 0 ? 1 : Metric.Metric.clamp(intersection / size),
83
+ raw: { intersection, size }
84
+ };
85
+ }
86
+ }
87
+ // Register the q-Gram similariry in the metric registry
88
+ Metric.MetricRegistry.add('qGram', QGramSimilarity);
89
+
90
+ exports.QGramSimilarity = QGramSimilarity;
91
+ //# sourceMappingURL=qGram.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"qGram.js","sources":["../../../src/metric/qGram.ts"],"sourcesContent":[null],"names":["Metric","Pool","MetricRegistry"],"mappings":"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"}
@@ -0,0 +1,112 @@
1
+ // CmpStr v3.0.0 dev-1a82e20-250612 by Paul Köhler @komed3 / MIT License
2
+ 'use strict';
3
+
4
+ var Phonetic = require('./Phonetic.js');
5
+
6
+ /**
7
+ * Cologne Phonetic Algorithm
8
+ * src/phonetic/Cologne.ts
9
+ *
10
+ * @see https://en.wikipedia.org/wiki/Cologne_phonetics
11
+ *
12
+ * Cologne phonetics, also known as `Kölner Phonetik` or the `Cologne process`,
13
+ * is a phonetic algorithm that assigns a sequence of digits, referred to as the
14
+ * phonetic code, to words. The purpose of this method is to ensure that words
15
+ * with identical sounds receive the same code. This algorithm can facilitate a
16
+ * similarity search among words.
17
+ *
18
+ * Cologne phonetics is associated with the well-known Soundex phonetic algorithm,
19
+ * yet it is specifically optimized for the German language. This algorithm was
20
+ * introduced by Hans Joachim Postel in 1969.
21
+ *
22
+ * The Cologne phonetic algorithm works by mapping letters to digits, ignoring
23
+ * certain letters, and applying specific rules to handle character combinations.
24
+ *
25
+ * @module Phonetic/Cologne
26
+ * @author Paul Köhler (komed3)
27
+ * @license MIT
28
+ */
29
+ /**
30
+ * Cologne class extends the Phonetic class to implement the Cologne phonetic algorithm.
31
+ */
32
+ class Cologne extends Phonetic.Phonetic {
33
+ // Default options for the Cologne phonetic algorithm
34
+ static default = { map: 'default', delimiter: ' ', length: -1, dedupe: true };
35
+ /**
36
+ * Constructor for the Cologne class.
37
+ *
38
+ * Initializes the Cologne phonetic algorithm with the mapping and options.
39
+ *
40
+ * @param {PhoneticOptions} [opt] - Options for the Cologne phonetic algorithm
41
+ */
42
+ constructor(opt = {}) {
43
+ super('cologne', opt);
44
+ }
45
+ /**
46
+ * Adjusts the phonetic code by removing all '0's except the first character.
47
+ *
48
+ * @param {string} code - The phonetic code to adjust
49
+ * @returns {string} - The adjusted phonetic code
50
+ */
51
+ adjustCode(code) {
52
+ return code.slice(0, 1) + code.slice(1).replaceAll('0', '');
53
+ }
54
+ }
55
+ // Register the Cologne algorithm in the phonetic registry
56
+ Phonetic.PhoneticRegistry.add('cologne', Cologne);
57
+ // Register the Cologne phonetic mapping
58
+ Phonetic.PhoneticMappingRegistry.add('cologne', 'default', {
59
+ map: {
60
+ a: '0',
61
+ ä: '0',
62
+ e: '0',
63
+ i: '0',
64
+ j: '0',
65
+ o: '0',
66
+ ö: '0',
67
+ u: '0',
68
+ ü: '0',
69
+ y: '0',
70
+ b: '1',
71
+ p: '1',
72
+ d: '2',
73
+ t: '2',
74
+ f: '3',
75
+ v: '3',
76
+ w: '3',
77
+ g: '4',
78
+ k: '4',
79
+ q: '4',
80
+ l: '5',
81
+ m: '6',
82
+ n: '6',
83
+ r: '7',
84
+ c: '8',
85
+ s: '8',
86
+ ß: '8',
87
+ z: '8',
88
+ x: '48'
89
+ },
90
+ ignore: ['h'],
91
+ ruleset: [
92
+ { char: 'p', next: ['h'], code: '3' },
93
+ {
94
+ char: 'c',
95
+ position: 'start',
96
+ next: ['a', 'h', 'k', 'l', 'o', 'q', 'r', 'u', 'x'],
97
+ code: '4'
98
+ },
99
+ {
100
+ char: 'c',
101
+ next: ['a', 'h', 'k', 'o', 'q', 'u', 'x'],
102
+ prevNot: ['s', 'z'],
103
+ code: '4'
104
+ },
105
+ { char: 'd', next: ['c', 's', 'z'], code: '8' },
106
+ { char: 't', next: ['c', 's', 'z'], code: '8' },
107
+ { char: 'x', prev: ['c', 'k', 'q'], code: '8' }
108
+ ]
109
+ });
110
+
111
+ exports.Cologne = Cologne;
112
+ //# sourceMappingURL=Cologne.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"Cologne.js","sources":["../../../src/phonetic/Cologne.ts"],"sourcesContent":[null],"names":["Phonetic","PhoneticRegistry","PhoneticMappingRegistry"],"mappings":";;;;;AAAA,CAAA,CAAA;;;;;;;;;;;;;;;;;;;;;;AAsBG,CAAA,CAAA;AAOH,CAAA,CAAA;;AAEG,CAAA,CAAA;AACG,CAAO,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAQ,CAAQA,CAAAA,CAAAA,CAAAA,CAAAA,CAAAA,CAAAA,CAAAA,CAAAA,CAAAA,CAAAA,CAAAA,CAAAA,CAAAA,CAAAA,CAAAA,CAAAA,CAAAA,CAAAA,CAAAA,CAAAA,CAAAA,CAAAA,CAAAA,CAAAA,CAAQ,CAAA;;CAGvB,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAgB,OAAO,CAAoB,CAAA,CAAA,CACjD,CAAA,CAAG,CAAA,CAAA,CAAA,CAAE,CAAS,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAE,CAAS,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAE,CAAG,CAAA,CAAA,CAAA,CAAE,CAAM,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAE,CAAE,CAAA,CAAA,CAAE,MAAM,CAAE,CAAA,CAAA,CAAA,CAAA,EACvD,CAAA;AAED,CAAA,CAAA,CAAA,CAAA;;;;;;AAMG,CAAA,CAAA,CAAA,CAAA;EACH,CAAc,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAuB,CAAE,CAAA,CAAA,CAAA;AAAK,IAAA,CAAA,CAAA,CAAA,CAAA,CAAK,CAAG,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAS,CAAE,CAAA,CAAA,CAAA,CAAG,CAAE;AAAA,EAAA;AAEpE,CAAA,CAAA,CAAA,CAAA;;;;;AAKG,CAAA,CAAA,CAAA,CAAA;AACgB,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAU,CAAG,CAAA,CAAA,CAAA,CAAY,CAAA,CAAA;CAExC,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAO,IAAI,CAAC,CAAA,CAAA,CAAA,CAAA,CAAK,CAAE,CAAC,CAAA,CAAE,CAAC,CAAE,CAAG,CAAA,CAAA,CAAA,CAAA,CAAA,CAAI,CAAC,CAAK,CAAA,CAAA,CAAA,CAAA,CAAE,CAAC,CAAE,CAAC,UAAU,CAAE,CAAA,CAAA,CAAG,CAAE,CAAA,CAAA,CAAE,CAAE;;;AAMzE,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA;AACAC,CAAAA,CAAAA,CAAAA,CAAAA,CAAAA,CAAAA,CAAAA,CAAAA,CAAAA,CAAAA,CAAAA,CAAAA,CAAAA,CAAAA,CAAAA,CAAAA,CAAAA,CAAAA,CAAAA,CAAAA,CAAAA,CAAAA,CAAAA,CAAAA,CAAgB,CAAC,CAAG,CAAA,CAAA,CAAE,CAAS,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAE,OAAO,CAAE;AAE1C,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA;AACAC,CAAAA,CAAAA,CAAAA,CAAAA,CAAAA,CAAAA,CAAAA,CAAAA,CAAAA,CAAAA,CAAAA,CAAAA,CAAAA,CAAAA,CAAAA,CAAAA,CAAAA,CAAAA,CAAAA,CAAAA,CAAAA,CAAAA,CAAAA,CAAAA,CAAAA,CAAAA,CAAAA,CAAAA,CAAAA,CAAAA,CAAAA,CAAuB,CAAC,CAAG,CAAA,CAAA,CAAE,CAAS,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAE,SAAS,CAAE,CAAA;AAC/C,CAAA,CAAA,GAAG,CAAE,CAAA;AACD,CAAA,CAAA,CAAA,CAAA,CAAC,CAAE,CAAA,CAAA,CAAA,CAAG;AAAE,IAAA,CAAC,EAAE,CAAG,CAAA,CAAA;AAAA,IAAE,CAAC,CAAA,CAAE,GAAG;AAAE,IAAA,CAAC,EAAE,CAAG,CAAA,CAAA;AAAA,IAAE,CAAC,CAAE,CAAA,CAAA,CAAA,CAAG;AAAE,IAAA,CAAC,EAAE,CAAG,CAAA,CAAA;AAAA,IAAE,CAAC,CAAA,CAAE,GAAG;AAAE,IAAA,CAAC,CAAE,CAAA,CAAA,CAAA,CAAG;IAAE,CAAC,CAAA,CAAE,GAAG;AAAE,IAAA,CAAC,EAAE,CAAG,CAAA,CAAA;AAC9E,CAAA,CAAA,CAAA,CAAA,CAAC,CAAE,CAAA,CAAA,CAAA,CAAG;AAAE,IAAA,CAAC,EAAE,CAAG,CAAA,CAAA;AAAA,IAAE,CAAC,CAAA,CAAE,GAAG;AAAE,IAAA,CAAC,EAAE,CAAG,CAAA,CAAA;AAAA,IAAE,CAAC,CAAE,CAAA,CAAA,CAAA,CAAG;AAAE,IAAA,CAAC,EAAE,CAAG,CAAA,CAAA;AAAA,IAAE,CAAC,CAAA,CAAE,GAAG;AAAE,IAAA,CAAC,CAAE,CAAA,CAAA,CAAA,CAAG;IAAE,CAAC,CAAA,CAAE,GAAG;AAAE,IAAA,CAAC,EAAE,CAAG,CAAA,CAAA;AAC9E,CAAA,CAAA,CAAA,CAAA,CAAC,CAAA,CAAE,CAAG,CAAA,CAAA;AAAA,IAAE,CAAC,CAAE,CAAA,CAAA,CAAA,CAAG;AAAE,IAAA,CAAC,CAAE,CAAA,CAAA,CAAA,CAAG;AAAE,IAAA,CAAC,EAAE,CAAG,CAAA,CAAA;AAAA,IAAE,CAAC,CAAA,CAAE,CAAG,CAAA,CAAA;AAAA,IAAE,CAAC,CAAA,CAAE,GAAG;AAAE,IAAA,CAAC,CAAE,CAAA,CAAA,CAAA,CAAG;IAAE,CAAC,CAAA,CAAE,CAAG,CAAA,CAAA;AAAA,IAAE,CAAC,CAAE,CAAA,CAAA,CAAA,CAAA;AACtE,CAAA,CAAA,CAAA;EACD,CAAM,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAE,CAAE,CAAA,CAAA,CAAG,CAAE;AACf,CAAA,CAAA,OAAO,CAAE,CAAA;AACL,CAAA,CAAA,CAAA,CAAA,CAAE,CAAA,CAAA,CAAA,CAAA,CAAI,CAAE,CAAA,CAAA,CAAA,CAAG,EAAE,CAAI,CAAA,CAAA,CAAA,CAAA,CAAE,CAAE,CAAA,CAAA,CAAG,CAAE,CAAA,CAAE,CAAI,CAAA,CAAA,CAAA,CAAA,CAAE,GAAG,CAAE,CAAA;AACvC,CAAA,CAAA,CAAA;AAAA,CAAA,CAAA,CAAA,CAAE,EAAA,CAAA,CAAA,CAAA,CAAI,CAAE,CAAA,CAAA,CAAA,CAAG;MAAE,CAAQ,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAE,CAAO,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA;AAAA,MAAE,IAAI,CAAE,CAAA,CAAE,CAAG,CAAA,CAAA,CAAA,CAAE,GAAG,CAAE,CAAA,CAAA,CAAA,CAAG,CAAE,CAAA,CAAA,CAAA,CAAG,CAAE,CAAA,CAAA,CAAA,CAAG,CAAE,CAAA,CAAA,CAAA,CAAG,EAAE,CAAG,CAAA,CAAA,CAAA,CAAE,CAAG,CAAA,CAAA,CAAA,CAAE,GAAG,CAAE;AAAA,MAAE,CAAI,CAAA,CAAA,CAAA,CAAA,CAAE;AAAG,IAAE,CAAA;AAClG,CAAA,CAAA,CAAA;AAAA,CAAA,CAAA,CAAA,CAAE,EAAA,CAAA,CAAA,CAAA,CAAI,CAAE,CAAA,CAAA,CAAA,CAAG;MAAE,CAAI,CAAA,CAAA,CAAA,CAAA,CAAE,CAAE,CAAA,CAAA,CAAG,EAAE,CAAG,CAAA,CAAA,CAAA,CAAE,CAAG,CAAA,CAAA,CAAA,CAAE,GAAG,CAAE,CAAA,CAAA,CAAA,CAAG,CAAE,CAAA,CAAA,CAAA,CAAG,CAAE,CAAA,CAAA,CAAA,CAAG,CAAE;AAAA,MAAE,OAAO,CAAE,CAAA,CAAE,CAAG,CAAA,CAAA,CAAA,CAAE,GAAG,CAAE;AAAA,MAAE,CAAI,CAAA,CAAA,CAAA,CAAA,CAAE;AACvF,CAAA,CAAA,CAAA;AAAA,CAAA,CAAA,CAAA,CAAA,EAAE,CAAI,CAAA,CAAA,CAAA,CAAA,CAAE,GAAG,CAAE,CAAA,CAAA,CAAA,CAAA,CAAI,EAAE,CAAE,CAAA,CAAA,CAAG,CAAE,CAAA,CAAA,CAAA,CAAG,EAAE,CAAG,CAAA,CAAA,CAAE,EAAE,CAAI,CAAA,CAAA,CAAA,CAAA,CAAE,GAAG,CAAE,CAAA;AACjD,CAAA,CAAA,CAAA,CAAA,EAAE,CAAI,CAAA,CAAA,CAAA,CAAA,CAAE,GAAG,CAAE,CAAA,CAAA,CAAA,CAAA,CAAI,EAAE,CAAE,CAAA,CAAA,CAAG,CAAE,CAAA,CAAA,CAAA,CAAG,EAAE,CAAG,CAAA,CAAA,CAAE,EAAE,CAAI,CAAA,CAAA,CAAA,CAAA,CAAE,GAAG,CAAE,CAAA;AACjD,CAAA,CAAA,CAAA,CAAA,EAAE,CAAI,CAAA,CAAA,CAAA,CAAA,CAAE,CAAG,CAAA,CAAA,CAAA,CAAE,IAAI,CAAE,CAAA,CAAE,CAAG,CAAA,CAAA,CAAA,CAAE,GAAG,CAAE,CAAA,CAAA,CAAA,CAAG,CAAE,CAAE,CAAA,CAAA,CAAA,CAAA,CAAI,EAAE,CAAG,CAAA,CAAA,CAAA;AAClD,CAAA,CAAA;AACJ,CAAA,CAAE;;;"}
@@ -0,0 +1,172 @@
1
+ // CmpStr v3.0.0 dev-1a82e20-250612 by Paul Köhler @komed3 / MIT License
2
+ 'use strict';
3
+
4
+ var Phonetic = require('./Phonetic.js');
5
+
6
+ /**
7
+ * Metaphone Phonetic Algorithm
8
+ * src/phonetic/Metaphone.ts
9
+ *
10
+ * @see https://en.wikipedia.org/wiki/Metaphone
11
+ *
12
+ * Metaphone is a phonetic algorithm for indexing words by their English pronunciation.
13
+ * It encodes words into a string of consonant symbols, allowing for the comparison of
14
+ * words based on their pronunciation rather than their spelling. Metaphone is more
15
+ * accurate than Soundex for English and is widely used in search, spell-checking,
16
+ * and fuzzy matching.
17
+ *
18
+ * This implementation uses a mapping and a comprehensive ruleset to efficiently
19
+ * transform input words into their Metaphone code. The algorithm drops or transforms
20
+ * letters according to context-sensitive rules, and only retains vowels at the start.
21
+ *
22
+ * @module Phonetic/Metaphone
23
+ * @author Paul Köhler (komed3)
24
+ * @license MIT
25
+ */
26
+ /**
27
+ * Metaphone class extends the Phonetic class to implement the Metaphone phonetic algorithm.
28
+ */
29
+ class Metaphone extends Phonetic.Phonetic {
30
+ // Default options for the Metaphone phonetic algorithm
31
+ static default = {
32
+ map: 'en90',
33
+ delimiter: ' ',
34
+ length: -1,
35
+ pad: '',
36
+ dedupe: false
37
+ };
38
+ /**
39
+ * Constructor for the Metaphone class.
40
+ *
41
+ * Initializes the Metaphone phonetic algorithm with the mapping and options.
42
+ *
43
+ * @param {PhoneticOptions} [opt] - Options for the Metaphone phonetic algorithm
44
+ */
45
+ constructor(opt = {}) {
46
+ super('metaphone', opt);
47
+ }
48
+ /**
49
+ * Generates the Metaphone code for a given word.
50
+ *
51
+ * @param {string} word - The input word to be converted into a Metaphone code
52
+ * @returns {string} - The generated Metaphone code
53
+ */
54
+ encode(word) {
55
+ // Remove duplicate adjacent letters except for C
56
+ word = word.replace(/([A-BD-Z])\1+/gi, (m, c) => (c === 'C' ? m : c));
57
+ // Use the base implementation for rule/mapping application
58
+ return super.encode(word);
59
+ }
60
+ /**
61
+ * Adjusts the Metaphone code by removing vowels except for the first letter.
62
+ *
63
+ * @param {string} code - The Metaphone code to be adjusted
64
+ * @returns {string} - The adjusted Metaphone code
65
+ */
66
+ adjustCode(code) {
67
+ // Remove vowels except for the first letter
68
+ return code.slice(0, 1) + code.slice(1).replace(/[AEIOU]/g, '');
69
+ }
70
+ }
71
+ // Register the Metaphone algorithm in the phonetic registry
72
+ Phonetic.PhoneticRegistry.add('metaphone', Metaphone);
73
+ /**
74
+ * Register the Metaphone phonetic mapping for English.
75
+ *
76
+ * This version is based on the original BASIC implementation from 1990,
77
+ * written by Lawrence Philips.
78
+ *
79
+ * @see https://gist.github.com/Rostepher/b688f709587ac145a0b3
80
+ */
81
+ Phonetic.PhoneticMappingRegistry.add('metaphone', 'en90', {
82
+ map: {
83
+ a: 'A',
84
+ b: 'B',
85
+ c: 'K',
86
+ d: 'T',
87
+ e: 'E',
88
+ f: 'F',
89
+ g: 'K',
90
+ h: 'H',
91
+ i: 'I',
92
+ j: 'J',
93
+ k: 'K',
94
+ l: 'L',
95
+ m: 'M',
96
+ n: 'N',
97
+ o: 'O',
98
+ p: 'P',
99
+ q: 'K',
100
+ r: 'R',
101
+ s: 'S',
102
+ t: 'T',
103
+ u: 'U',
104
+ v: 'F',
105
+ w: 'W',
106
+ x: 'KS',
107
+ y: 'Y',
108
+ z: 'S'
109
+ },
110
+ ruleset: [
111
+ // Drop the first letter if the string begins with `AE`, `GN`, `KN`, `PN` or `WR`
112
+ { char: 'a', position: 'start', next: ['e'], code: '' },
113
+ { char: 'g', position: 'start', next: ['n'], code: '' },
114
+ { char: 'k', position: 'start', next: ['n'], code: '' },
115
+ { char: 'p', position: 'start', next: ['n'], code: '' },
116
+ { char: 'w', position: 'start', next: ['r'], code: '' },
117
+ // Drop `B` if after `M` at the end of the string
118
+ { char: 'b', position: 'end', prev: ['m'], code: '' },
119
+ // `C` transforms into `X` if followed by `H` or `IA`
120
+ { char: 'c', next: ['h'], prevNot: ['s'], code: 'X' },
121
+ { char: 'c', next: ['i'], next2: ['a'], code: 'X' },
122
+ // `C` transforms into `S` if followed by `E`, `I` or `Y`
123
+ { char: 'c', next: ['e', 'i', 'y'], code: 'S' },
124
+ // `D` transforms into `J` if followed by `GE`, `GI` or `GY`
125
+ { char: 'd', next: ['g'], next2: ['e', 'i', 'y'], code: 'J' },
126
+ // Drop `G` if followed by `H` and `H` is not at the end or before a vowel
127
+ {
128
+ char: 'g',
129
+ next: ['h'],
130
+ next2Not: ['', 'a', 'e', 'i', 'o', 'u'],
131
+ code: ''
132
+ },
133
+ // Drop `G` if followed by `N` or `NED` and is at the end of the string
134
+ { char: 'g', trailing: 'n', code: '' },
135
+ { char: 'g', trailing: 'ned', code: '' },
136
+ // `G` transforms into `J` if before `E`, `I` or `Y` and is not a `GG`
137
+ { char: 'g', next: ['e', 'i', 'y'], prevNot: ['g'], code: 'J' },
138
+ // Drop `H` if after a vowel and not before a vowel
139
+ {
140
+ char: 'h',
141
+ prev: ['a', 'e', 'i', 'o', 'u'],
142
+ nextNot: ['a', 'e', 'i', 'o', 'u'],
143
+ code: ''
144
+ },
145
+ // Drop `H` if after `C`, `G`, `P`, `S` or `T`
146
+ { char: 'h', prev: ['c', 'g', 'p', 's', 't'], code: '' },
147
+ // Drop `K` if after `C`
148
+ { char: 'k', prev: ['c'], code: '' },
149
+ // `PH` transforms into `F`
150
+ { char: 'p', next: ['h'], code: 'F' },
151
+ // `S` transforms into `X` if followed by `H`, `IA` or `IO`
152
+ { char: 's', next: ['h'], code: 'X' },
153
+ { char: 's', next: ['i'], next2: ['a', 'o'], code: 'X' },
154
+ // `T` transforms into `X` if followed by `IA` or `IO`
155
+ { char: 't', next: ['i'], next2: ['a', 'o'], code: 'X' },
156
+ // `TH` transforms into `0` (zero)
157
+ { char: 't', next: ['h'], code: '0' },
158
+ // Drop `T` if followed by `CH`
159
+ { char: 't', next: ['c'], next2: ['h'], code: '' },
160
+ // Drop `W` if not followed by a vowel
161
+ { char: 'w', nextNot: ['a', 'e', 'i', 'o', 'u'], code: '' },
162
+ // `WH` transforms into `W` if at the beginning of the string
163
+ { char: 'h', leading: 'w', code: '' },
164
+ // `X` transforms into `S` if at the beginning
165
+ { char: 'x', position: 'start', code: 'S' },
166
+ // Drop `Y` if not followed by a vowel
167
+ { char: 'y', nextNot: ['a', 'e', 'i', 'o', 'u'], code: '' }
168
+ ]
169
+ });
170
+
171
+ exports.Metaphone = Metaphone;
172
+ //# sourceMappingURL=Metaphone.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"Metaphone.js","sources":["../../../src/phonetic/Metaphone.ts"],"sourcesContent":[null],"names":["Phonetic","PhoneticRegistry","PhoneticMappingRegistry"],"mappings":"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"}