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,413 @@
1
+ // CmpStr v3.0.0 dev-1a82e20-250612 by Paul Köhler @komed3 / MIT License
2
+ 'use strict';
3
+
4
+ var DeepMerge = require('../utils/DeepMerge.js');
5
+ var Registry = require('../utils/Registry.js');
6
+ var HashTable = require('../utils/HashTable.js');
7
+ var Profiler = require('../utils/Profiler.js');
8
+
9
+ /**
10
+ * Abstract Phonetic
11
+ * src/phonetic/Phonetic.ts
12
+ *
13
+ * @see https://en.wikipedia.org/wiki/Phonetic_algorithm
14
+ *
15
+ * A phonetic algorithm refers to a method for indexing words according to their
16
+ * pronunciation. When the algorithm relies on orthography, it is significantly
17
+ * influenced by the spelling conventions of the language for which it is intended:
18
+ * since the majority of phonetic algorithms were created for English, they tend
19
+ * to be less effective for indexing words in other languages.
20
+ *
21
+ * Phonetic search has numerous applications, and one of the initial use cases has
22
+ * been in trademark searches to verify that newly registered trademarks do not
23
+ * pose a risk of infringing upon existing trademarks due to their pronunciation.
24
+ *
25
+ * This module provides an abstract class for generating phonetic indices based
26
+ * on mappings and rules. It allows for the implementation of various phonetic
27
+ * algorithms by extending the abstract class.
28
+ *
29
+ * @module Phonetic
30
+ * @author Paul Köhler (komed3)
31
+ * @license MIT
32
+ */
33
+ // Get the singleton profiler instance for performance monitoring
34
+ const profiler = Profiler.Profiler.getInstance();
35
+ /**
36
+ * Abstract class representing a phonetic algorithm.
37
+ *
38
+ * The protected methods `applyRules`, `encode`, `mapChar`, `equalLen`, `word2Chars`,
39
+ * `exitEarly`, `adjustCode`, `loop` and `loopAsync` can be overridden in subclasses
40
+ * to implement specific phonetic algorithms.
41
+ *
42
+ * @abstract
43
+ */
44
+ class Phonetic {
45
+ // Cache for indexed words to avoid redundant calculations
46
+ static cache = new HashTable.HashTable();
47
+ /**
48
+ * Default phonetic options.
49
+ *
50
+ * This object contains default settings for phonetic algorithms,
51
+ * implemented in the subclass.
52
+ */
53
+ static default;
54
+ // Phonetic algorithm name for identification
55
+ algo;
56
+ // Phonetic map and options for the algorithm
57
+ options;
58
+ map;
59
+ /**
60
+ * Static method to clear the cache of indexed words.
61
+ */
62
+ static clear() {
63
+ this.cache.clear();
64
+ }
65
+ /**
66
+ * Constructor for the Phonetic class.
67
+ *
68
+ * Initializes the phonetic algorithm with the specified options and mapping.
69
+ *
70
+ * @param {string} algo - The name of the algorithm (e.g. 'soundex')
71
+ * @param {PhoneticOptions} [opt] - Options for the phonetic algorithm
72
+ * @throws {Error} - If the requested mapping is not declared
73
+ */
74
+ constructor(algo, opt = {}) {
75
+ // Set the options by merging the default options with the provided ones
76
+ this.options = DeepMerge.merge(this.constructor.default ?? {}, opt);
77
+ // Get the mapping based on the provided options
78
+ const map = PhoneticMappingRegistry.get(algo, this.options.map);
79
+ // If the mapping is not defined, throw an error
80
+ if (map === undefined)
81
+ throw new Error(
82
+ `requested mapping <${this.options.map}> is not declared`
83
+ );
84
+ this.algo = algo;
85
+ this.map = map;
86
+ }
87
+ /**
88
+ * Applies phonetic rules to a character in a word context.
89
+ *
90
+ * This method is designed to be generic and efficient for all phonetic algorithms.
91
+ * It checks all rule types (prev, next, prevNot, nextNot, position, etc.) and
92
+ * returns either the appropriate code (string) or undefined.
93
+ *
94
+ * @param {string} char - The current character
95
+ * @param {number} i - The current position within the word
96
+ * @param {string[]} chars - The word as an array of characters
97
+ * @param {number} charLen - The total length of the word
98
+ * @returns {string|undefined} - The rule code or undefined if no rule applies
99
+ */
100
+ applyRules(char, i, chars, charLen) {
101
+ const { ruleset = [] } = this.map;
102
+ // If no rules are provided, return undefined
103
+ if (!ruleset || !ruleset.length) return undefined;
104
+ // Get the surrounding characters
105
+ const prev = chars[i - 1] || '',
106
+ prev2 = chars[i - 2] || '';
107
+ const next = chars[i + 1] || '',
108
+ next2 = chars[i + 2] || '';
109
+ // Iterate over the rules to find a matching rule for the current character
110
+ for (const rule of ruleset) {
111
+ // Skip if the rule does not match the current character
112
+ if (rule.char && rule.char !== char) continue;
113
+ // Position in the word (start, middle, end)
114
+ if (rule.position === 'start' && i !== 0) continue;
115
+ if (rule.position === 'middle' && i > 0 && i < charLen) continue;
116
+ if (rule.position === 'end' && i !== charLen) continue;
117
+ // Previous character(s)
118
+ if (rule.prev && !rule.prev.includes(prev)) continue;
119
+ if (rule.prevNot && rule.prevNot.includes(prev)) continue;
120
+ if (rule.prev2 && !rule.prev2.includes(prev2)) continue;
121
+ if (rule.prev2Not && rule.prev2Not.includes(prev2)) continue;
122
+ // Following character(s)
123
+ if (rule.next && !rule.next.includes(next)) continue;
124
+ if (rule.nextNot && rule.nextNot.includes(next)) continue;
125
+ if (rule.next2 && !rule.next2.includes(next2)) continue;
126
+ if (rule.next2Not && rule.next2Not.includes(next2)) continue;
127
+ // Special case: Beginning of a word (e.g. chars.slice(0, n))
128
+ if (
129
+ rule.leading &&
130
+ !rule.leading.includes(chars.slice(0, rule.leading.length).join(''))
131
+ )
132
+ continue;
133
+ // Special case: end of word (e.g. chars.slice(-n))
134
+ if (
135
+ rule.trailing &&
136
+ !rule.trailing.includes(chars.slice(-rule.trailing.length).join(''))
137
+ )
138
+ continue;
139
+ // Check multiple characters (e.g. bigram/trigram)
140
+ if (rule.match && !rule.match.every((c, j) => chars[i + j] === c))
141
+ continue;
142
+ // If all conditions met, return the rule code
143
+ return rule.code;
144
+ }
145
+ // If no rule matched, return undefined
146
+ return undefined;
147
+ }
148
+ /**
149
+ * Generates the phonetic code for a given word.
150
+ *
151
+ * This method processes the word character by character, applying phonetic rules
152
+ * and mappings to generate a phonetic code.
153
+ *
154
+ * @param {string} word - The input word to be converted into a phonetic code
155
+ * @returns {string} - The generated phonetic code
156
+ */
157
+ encode(word) {
158
+ const { map = {}, ignore = [] } = this.map;
159
+ // Get the characters of the word and its length
160
+ const chars = this.word2Chars(word);
161
+ const charLen = chars.length;
162
+ let code = '',
163
+ lastCode = null;
164
+ // Iterate over each character in the word
165
+ for (let i = 0; i < charLen; i++) {
166
+ const char = chars[i];
167
+ // Skip characters that are in the ignore list
168
+ if (ignore.includes(char)) continue;
169
+ // Convert the character to its phonetic code
170
+ const mapped = this.mapChar(char, i, chars, charLen, lastCode, map);
171
+ // If no code is generated, skip to the next character
172
+ if (mapped === undefined) continue;
173
+ // Append the generated code to the final code
174
+ (code += mapped), (lastCode = mapped);
175
+ // If the code length exceeds the specified limit, exit early
176
+ if (this.exitEarly(code, i)) break;
177
+ }
178
+ // Return the adjusted phonetic code
179
+ return this.adjustCode(code, chars);
180
+ }
181
+ /**
182
+ * Converts a character to its phonetic code based on the mapping and rules.
183
+ *
184
+ * @param {string} char - The current character
185
+ * @param {number} i - The current position within the word
186
+ * @param {string[]} chars - The word as an array of characters
187
+ * @param {number} charLen - The total length of the word
188
+ * @param {string|null} lastCode - The last code generated (to avoid duplicates)
189
+ * @param {Record<string, string>} map - The phonetic mapping
190
+ * @returns {string|undefined} - The phonetic code or undefined if no code applies
191
+ */
192
+ mapChar(char, i, chars, charLen, lastCode, map) {
193
+ const { dedupe = true } = this.options;
194
+ // Apply phonetic rules to the character
195
+ // If no rules apply, use the mapping
196
+ // If the character is not in the mapping, return undefined
197
+ const c =
198
+ this.applyRules(char, i, chars, charLen) ?? map[char] ?? undefined;
199
+ // De-duplicate the code if necessary
200
+ return dedupe && c === lastCode ? undefined : c;
201
+ }
202
+ /**
203
+ * Ensures the phonetic code has a fixed length by padding or truncating.
204
+ *
205
+ * @param {string} input - The input string to be adjusted
206
+ * @returns {string} - The adjusted string with fixed length
207
+ */
208
+ equalLen(input) {
209
+ const { length = -1, pad = '0' } = this.options;
210
+ return length === -1
211
+ ? input
212
+ : (input + pad.repeat(length)).slice(0, length);
213
+ }
214
+ /**
215
+ * Converts a word into an array of characters.
216
+ *
217
+ * @param {string} word - The input word to be converted
218
+ * @returns {string[]} - An array of characters from the input word
219
+ */
220
+ word2Chars(word) {
221
+ return word.toLowerCase().split('');
222
+ }
223
+ /**
224
+ * Determines whether to exit early based on the current phonetic code length.
225
+ *
226
+ * @param {string} code - The current phonetic code
227
+ * @param {number} i - The current index in the word
228
+ * @returns {boolean} - True if the code length exceeds the specified limit, false otherwise
229
+ */
230
+ exitEarly(code, i) {
231
+ const { length = -1 } = this.options;
232
+ return length > 0 && code.length >= length;
233
+ }
234
+ /**
235
+ * Adjusts the phonetic code.
236
+ *
237
+ * @param {string} code - The phonetic code to be adjusted
238
+ * @param {string[]} chars - Characters to be removed from the code
239
+ * @returns {string} - The adjusted phonetic code
240
+ */
241
+ adjustCode(code, chars) {
242
+ return code;
243
+ }
244
+ /**
245
+ * Processes an array of words to generate their phonetic indices.
246
+ *
247
+ * This method iterates over each word, generates its phonetic code,
248
+ * and ensures that the resulting codes are of equal length.
249
+ *
250
+ * @param {string[]} words - An array of words to be processed
251
+ * @returns {string[]} - An array of phonetic indices for the input words
252
+ */
253
+ loop(words) {
254
+ const index = [];
255
+ // Loop over each word in the input array
256
+ for (const word of words) {
257
+ // Generate a cache key based on the algorithm and word
258
+ const key = Phonetic.cache.key(this.algo, [word]);
259
+ // If the key exists in the cache, return the cached result
260
+ // Otherwise, encode the word using the algorithm
261
+ const code =
262
+ Phonetic.cache.get(key || '') ??
263
+ (() => {
264
+ // Get the phonetic code for the word
265
+ const res = this.encode(word);
266
+ // If a key was generated, store the result in the cache
267
+ if (key) Phonetic.cache.set(key, res);
268
+ return res;
269
+ })();
270
+ // If a code is generated, add them to the index
271
+ if (code && code.length) index.push(this.equalLen(code));
272
+ }
273
+ return index;
274
+ }
275
+ /**
276
+ * Asynchronously processes an array of words to generate their phonetic indices.
277
+ *
278
+ * This method iterates over each word, generates its phonetic code asynchronously,
279
+ * and ensures that the resulting codes are of equal length.
280
+ *
281
+ * @param {string[]} words - An array of words to be processed
282
+ * @returns {Promise<string[]>} - A promise that resolves to an array of phonetic indices for the input words
283
+ */
284
+ async loopAsync(words) {
285
+ const index = [];
286
+ // Loop over each word in the input array
287
+ for (const word of words) {
288
+ // Get the phonetic code for the word asynchronously
289
+ const code = await Promise.resolve(this.encode(word));
290
+ // If a code is generated, add them to the index
291
+ if (code && code.length) index.push(this.equalLen(code));
292
+ }
293
+ return index;
294
+ }
295
+ /**
296
+ * Get the name of the phonetic algorithm.
297
+ *
298
+ * @returns {string} - The name of the algorithm
299
+ */
300
+ getAlgoName() {
301
+ return this.algo;
302
+ }
303
+ /**
304
+ * Generates a phonetic index for the given input string.
305
+ *
306
+ * @param {string} input - The input string to be indexed
307
+ * @returns {string[]} - An array of phonetic indices for the input words
308
+ */
309
+ getIndex(input) {
310
+ const { delimiter = ' ' } = this.options;
311
+ // Split the input string by the specified delimiter and loop over it
312
+ return profiler.run(() =>
313
+ this.loop(input.split(delimiter).filter(Boolean)).filter(Boolean)
314
+ );
315
+ }
316
+ /**
317
+ * Asynchronously generates a phonetic index for the given input string.
318
+ *
319
+ * @param {string} input - The input string to be indexed
320
+ * @returns {Promise<string[]>} - A promise that resolves to an array of phonetic indices for the input words
321
+ */
322
+ async getIndexAsync(input) {
323
+ const { delimiter = ' ' } = this.options;
324
+ // Split the input string by the specified delimiter and loop over it asynchronously
325
+ return (
326
+ await profiler.runAsync(
327
+ async () => await this.loopAsync(input.split(delimiter).filter(Boolean))
328
+ )
329
+ ).filter(Boolean);
330
+ }
331
+ }
332
+ /**
333
+ * Phonetic registry service for managing phonetic implementations.
334
+ *
335
+ * This registry allows for dynamic registration and retrieval of phonetic classes,
336
+ * enabling the use of various phonetic algorithms in a consistent manner.
337
+ */
338
+ const PhoneticRegistry = Registry.Registry('phonetic', Phonetic);
339
+ /**
340
+ * Phonetic Mapping Service
341
+ *
342
+ * This service provides a simple interface to manage phonetic mappings across
343
+ * different phonetic algorithms. It allows adding, removing, checking existence,
344
+ * retrieving, and listing phonetic mappings for specified algorithms.
345
+ */
346
+ const PhoneticMappingRegistry = (() => {
347
+ // Create a registry object to hold mappings
348
+ const mappings = Object.create(null);
349
+ // Helper function to retrieve mappings for a specific algorithm
350
+ const maps = (algo) => (mappings[algo] ||= Object.create(null));
351
+ return {
352
+ /**
353
+ * Adds a phonetic mapping for a specific algorithm and ID.
354
+ *
355
+ * @param {string} algo - The phonetic algorithm identifier (e.g., 'soundex', 'metaphone')
356
+ * @param {string} id - The unique identifier for the mapping
357
+ * @param {PhoneticMap} map - The phonetic map to be added, containing rules and mappings
358
+ * @param {boolean} [update=false] - Whether to allow overwriting an existing entry
359
+ * @throws {Error} If the mapping name already exists and update is false
360
+ */
361
+ add(algo, id, map, update = false) {
362
+ const mappings = maps(algo);
363
+ if (!update && id in mappings)
364
+ throw new Error(
365
+ `entry <${id}> already exists / use <update=true> to overwrite`
366
+ );
367
+ mappings[id] = map;
368
+ },
369
+ /**
370
+ * Removes a phonetic mapping for a specific algorithm and ID.
371
+ *
372
+ * @param {string} algo - The phonetic algorithm identifier
373
+ * @param {string} id - The unique identifier for the mapping to be removed
374
+ */
375
+ remove(algo, id) {
376
+ delete maps(algo)[id];
377
+ },
378
+ /**
379
+ * Checks if a phonetic mapping exists for a specific algorithm and ID.
380
+ *
381
+ * @param {string} algo - The phonetic algorithm identifier
382
+ * @param {string} id - The unique identifier for the mapping to check
383
+ * @returns {boolean} - Returns true if the mapping exists, false otherwise
384
+ */
385
+ has(algo, id) {
386
+ return id in maps(algo);
387
+ },
388
+ /**
389
+ * Retrieves a phonetic mapping for a specific algorithm and ID.
390
+ *
391
+ * @param {string} algo - The phonetic algorithm identifier
392
+ * @param {string} id - The unique identifier for the mapping to retrieve
393
+ * @returns {PhoneticMap | undefined} - Returns the phonetic map if found, otherwise undefined
394
+ */
395
+ get(algo, id) {
396
+ return maps(algo)[id];
397
+ },
398
+ /**
399
+ * Lists all phonetic mappings for a specific algorithm.
400
+ *
401
+ * @param {string} algo - The phonetic algorithm identifier
402
+ * @returns {string[]} - Returns an array of mapping IDs for the specified algorithm
403
+ */
404
+ list(algo) {
405
+ return Object.keys(maps(algo));
406
+ }
407
+ };
408
+ })();
409
+
410
+ exports.Phonetic = Phonetic;
411
+ exports.PhoneticMappingRegistry = PhoneticMappingRegistry;
412
+ exports.PhoneticRegistry = PhoneticRegistry;
413
+ //# sourceMappingURL=Phonetic.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"Phonetic.js","sources":["../../../src/phonetic/Phonetic.ts"],"sourcesContent":[null],"names":["Profiler","HashTable","merge","Registry"],"mappings":"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"}
@@ -0,0 +1,135 @@
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
+ * Soundex Phonetic Algorithm
8
+ * src/phonetic/Soudex.ts
9
+ *
10
+ * @see https://en.wikipedia.org/wiki/Soundex
11
+ *
12
+ * Soundex is a phonetic algorithm for indexing names by sound. It is used to
13
+ * encode words into a phonetic representation, allowing for the comparison of
14
+ * words based on their pronunciation rather than their spelling. This works
15
+ * by mapping letters to digits, ignoring certain letters, and applying specific
16
+ * rules to handle character combinations.
17
+ *
18
+ * It is particularly useful for matching names that may be spelled differently
19
+ * but sound similar and commonly used in genealogical research and databases
20
+ * to find similar-sounding names.
21
+ *
22
+ * The Soundex algorithm is not case-sensitive and ignores vowels and certain
23
+ * consonants. It outputs an array of strings that represents the phonetic code
24
+ * of the input, typically limited to the length of four characters.
25
+ *
26
+ * @module Phonetic/Soundex
27
+ * @author Paul Köhler (komed3)
28
+ * @license MIT
29
+ */
30
+ /**
31
+ * Soundex class extends the Phonetic class to implement the Soundex phonetic algorithm.
32
+ */
33
+ class Soundex extends Phonetic.Phonetic {
34
+ // Default options for the Soundex phonetic algorithm
35
+ static default = {
36
+ map: 'en',
37
+ delimiter: ' ',
38
+ length: 4,
39
+ pad: '0',
40
+ dedupe: true
41
+ };
42
+ /**
43
+ * Constructor for the Soundex class.
44
+ *
45
+ * Initializes the Soundex phonetic algorithm with the mapping and options.
46
+ *
47
+ * @param {PhoneticOptions} [opt] - Options for the Soundex phonetic algorithm
48
+ */
49
+ constructor(opt = {}) {
50
+ super('soundex', opt);
51
+ }
52
+ /**
53
+ * Adjusts the phonetic code by removing leading zeros and ensuring the
54
+ * first character is uppercase.
55
+ *
56
+ * @param {string} code - The phonetic code to adjust
57
+ * @param {string[]} chars - The characters used in the phonetic code
58
+ * @returns {string} - The adjusted phonetic code
59
+ */
60
+ adjustCode(code, chars) {
61
+ return chars[0].toUpperCase() + code.slice(1).replaceAll('0', '');
62
+ }
63
+ }
64
+ // Register the Soundex algorithm in the phonetic registry
65
+ Phonetic.PhoneticRegistry.add('soundex', Soundex);
66
+ //Register the Soundex phonetic mapping for English.
67
+ Phonetic.PhoneticMappingRegistry.add('soundex', 'en', {
68
+ map: {
69
+ a: '0',
70
+ e: '0',
71
+ h: '0',
72
+ i: '0',
73
+ o: '0',
74
+ u: '0',
75
+ w: '0',
76
+ y: '0',
77
+ b: '1',
78
+ f: '1',
79
+ p: '1',
80
+ v: '1',
81
+ c: '2',
82
+ g: '2',
83
+ j: '2',
84
+ k: '2',
85
+ q: '2',
86
+ s: '2',
87
+ x: '2',
88
+ z: '2',
89
+ d: '3',
90
+ t: '3',
91
+ l: '4',
92
+ m: '5',
93
+ n: '5',
94
+ r: '6'
95
+ }
96
+ });
97
+ //Register the Soundex phonetic mapping for German.
98
+ Phonetic.PhoneticMappingRegistry.add('soundex', 'de', {
99
+ map: {
100
+ a: '0',
101
+ ä: '0',
102
+ e: '0',
103
+ h: '0',
104
+ i: '0',
105
+ j: '0',
106
+ o: '0',
107
+ ö: '0',
108
+ u: '0',
109
+ ü: '0',
110
+ y: '0',
111
+ b: '1',
112
+ f: '1',
113
+ p: '1',
114
+ v: '1',
115
+ w: '1',
116
+ c: '2',
117
+ g: '2',
118
+ k: '2',
119
+ q: '2',
120
+ s: '2',
121
+ ß: '2',
122
+ x: '2',
123
+ z: '2',
124
+ d: '3',
125
+ t: '3',
126
+ l: '4',
127
+ m: '5',
128
+ n: '5',
129
+ r: '6'
130
+ },
131
+ ruleset: [{ char: 'c', next: ['h'], code: '7' }]
132
+ });
133
+
134
+ exports.Soundex = Soundex;
135
+ //# sourceMappingURL=Soundex.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"Soundex.js","sources":["../../../src/phonetic/Soundex.ts"],"sourcesContent":[null],"names":["Phonetic","PhoneticRegistry","PhoneticMappingRegistry"],"mappings":"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"}