Initial revision
[old-projects.git] / ekit / com / swabunga / spell / engine / DoubleMeta.java
CommitLineData
6dd70280
JL
1/* This class is based on Lawrence Phillips original c++ code for this class.\r\r
2 * Found here: http://aspell.sourceforge.net/metaphone/\r\r
3 *\r\r
4 */\r\r
5\r\r
6\r\r
7package com.swabunga.spell.engine;\r\r
8\r\r
9\r\r
10/**\r\r
11 * Double Meta class\r\r
12 * <p>\r\r
13 * Things that were changed:\r\r
14 * The alternate flag could be set to true but was never checked so why bother with it. REMOVED\r\r
15 * Why was this class serializable?\r\r
16 * The primary, in, length and last variables could be initialized and local to the\r\r
17 * process method and references passed arround the appropriate methods. As such there are\r\r
18 * no class variables and this class becomes firstly threadsafe and secondly could be static final.\r\r
19 * The function call SlavoGermaic was called repeatedly in the process function, it is now only called once.\r\r
20 *\r\r
21 */\r\r
22class DoubleMeta implements Transformator{\r\r
23\r\r
24 private static final String[] myList = {\r\r
25 "GN", "KN", "PN", "WR", "PS", ""\r\r
26 };\r\r
27 private static final String[] list1 = {\r\r
28 "ACH", ""\r\r
29 };\r\r
30 private static final String[] list2 = {\r\r
31 "BACHER", "MACHER", ""\r\r
32 };\r\r
33 private static final String[] list3 = {\r\r
34 "CAESAR", ""\r\r
35 };\r\r
36 private static final String[] list4 = {\r\r
37 "CHIA", ""\r\r
38 };\r\r
39 private static final String[] list5 = {\r\r
40 "CH", ""\r\r
41 };\r\r
42 private static final String[] list6 = {\r\r
43 "CHAE", ""\r\r
44 };\r\r
45 private static final String[] list7 = {\r\r
46 "HARAC", "HARIS", ""\r\r
47 };\r\r
48 private static final String[] list8 = {\r\r
49 "HOR", "HYM", "HIA", "HEM", ""\r\r
50 };\r\r
51 private static final String[] list9 = {\r\r
52 "CHORE", ""\r\r
53 };\r\r
54 private static final String[] list10 = {\r\r
55 "VAN ", "VON ", ""\r\r
56 };\r\r
57 private static final String[] list11 = {\r\r
58 "SCH", ""\r\r
59 };\r\r
60 private static final String[] list12 = {\r\r
61 "ORCHES", "ARCHIT", "ORCHID", ""\r\r
62 };\r\r
63 private static final String[] list13 = {\r\r
64 "T", "S", ""\r\r
65 };\r\r
66 private static final String[] list14 = {\r\r
67 "A", "O", "U", "E", ""\r\r
68 };\r\r
69 private static final String[] list15 = {\r\r
70 "L", "R", "N", "M", "B", "H", "F", "V", "W", " ", ""\r\r
71 };\r\r
72 private static final String[] list16 = {\r\r
73 "MC", ""\r\r
74 };\r\r
75 private static final String[] list17 = {\r\r
76 "CZ", ""\r\r
77 };\r\r
78 private static final String[] list18 = {\r\r
79 "WICZ", ""\r\r
80 };\r\r
81 private static final String[] list19 = {\r\r
82 "CIA", ""\r\r
83 };\r\r
84 private static final String[] list20 = {\r\r
85 "CC", ""\r\r
86 };\r\r
87 private static final String[] list21 = {\r\r
88 "I", "E", "H", ""\r\r
89 };\r\r
90 private static final String[] list22 = {\r\r
91 "HU", ""\r\r
92 };\r\r
93 private static final String[] list23 = {\r\r
94 "UCCEE", "UCCES", ""\r\r
95 };\r\r
96 private static final String[] list24 = {\r\r
97 "CK", "CG", "CQ", ""\r\r
98 };\r\r
99 private static final String[] list25 = {\r\r
100 "CI", "CE", "CY", ""\r\r
101 };\r\r
102 private static final String[] list26 = {\r\r
103 "CIO", "CIE", "CIA", ""\r\r
104 };\r\r
105 private static final String[] list27 = {\r\r
106 " C", " Q", " G", ""\r\r
107 };\r\r
108 private static final String[] list28 = {\r\r
109 "C", "K", "Q", ""\r\r
110 };\r\r
111 private static final String[] list29 = {\r\r
112 "CE", "CI", ""\r\r
113 };\r\r
114 private static final String[] list30 = {\r\r
115 "DG", ""\r\r
116 };\r\r
117 private static final String[] list31 = {\r\r
118 "I", "E", "Y", ""\r\r
119 };\r\r
120 private static final String[] list32 = {\r\r
121 "DT", "DD", ""\r\r
122 };\r\r
123 private static final String[] list33 = {\r\r
124 "B", "H", "D", ""\r\r
125 };\r\r
126 private static final String[] list34 = {\r\r
127 "B", "H", "D", ""\r\r
128 };\r\r
129 private static final String[] list35 = {\r\r
130 "B", "H", ""\r\r
131 };\r\r
132 private static final String[] list36 = {\r\r
133 "C", "G", "L", "R", "T", ""\r\r
134 };\r\r
135 private static final String[] list37 = {\r\r
136 "EY", ""\r\r
137 };\r\r
138 private static final String[] list38 = {\r\r
139 "LI", ""\r\r
140 };\r\r
141 private static final String[] list39 = {\r\r
142 "ES", "EP", "EB", "EL", "EY", "IB", "IL", "IN", "IE", "EI", "ER",\r\r
143 ""\r\r
144 };\r\r
145 private static final String[] list40 = {\r\r
146 "ER", ""\r\r
147 };\r\r
148 private static final String[] list41 = {\r\r
149 "DANGER", "RANGER", "MANGER", ""\r\r
150 };\r\r
151 private static final String[] list42 = {\r\r
152 "E", "I", ""\r\r
153 };\r\r
154 private static final String[] list43 = {\r\r
155 "RGY", "OGY", ""\r\r
156 };\r\r
157 private static final String[] list44 = {\r\r
158 "E", "I", "Y", ""\r\r
159 };\r\r
160 private static final String[] list45 = {\r\r
161 "AGGI", "OGGI", ""\r\r
162 };\r\r
163 private static final String[] list46 = {\r\r
164 "VAN ", "VON ", ""\r\r
165 };\r\r
166 private static final String[] list47 = {\r\r
167 "SCH", ""\r\r
168 };\r\r
169 private static final String[] list48 = {\r\r
170 "ET", ""\r\r
171 };\r\r
172 private static final String[] list49 = {\r\r
173 "IER ", ""\r\r
174 };\r\r
175 private static final String[] list50 = {\r\r
176 "JOSE", ""\r\r
177 };\r\r
178 private static final String[] list51 = {\r\r
179 "SAN ", ""\r\r
180 };\r\r
181 private static final String[] list52 = {\r\r
182 "SAN ", ""\r\r
183 };\r\r
184 private static final String[] list53 = {\r\r
185 "JOSE", ""\r\r
186 };\r\r
187 private static final String[] list54 = {\r\r
188 "L", "T", "K", "S", "N", "M", "B", "Z", ""\r\r
189 };\r\r
190 private static final String[] list55 = {\r\r
191 "S", "K", "L", ""\r\r
192 };\r\r
193 private static final String[] list56 = {\r\r
194 "ILLO", "ILLA", "ALLE", ""\r\r
195 };\r\r
196 private static final String[] list57 = {\r\r
197 "AS", "OS", ""\r\r
198 };\r\r
199 private static final String[] list58 = {\r\r
200 "A", "O", ""\r\r
201 };\r\r
202 private static final String[] list59 = {\r\r
203 "ALLE", ""\r\r
204 };\r\r
205 private static final String[] list60 = {\r\r
206 "UMB", ""\r\r
207 };\r\r
208 private static final String[] list61 = {\r\r
209 "ER", ""\r\r
210 };\r\r
211 private static final String[] list62 = {\r\r
212 "P", "B", ""\r\r
213 };\r\r
214 private static final String[] list63 = {\r\r
215 "IE", ""\r\r
216 };\r\r
217 private static final String[] list64 = {\r\r
218 "ME", "MA", ""\r\r
219 };\r\r
220 private static final String[] list65 = {\r\r
221 "ISL", "YSL", ""\r\r
222 };\r\r
223 private static final String[] list66 = {\r\r
224 "SUGAR", ""\r\r
225 };\r\r
226 private static final String[] list67 = {\r\r
227 "SH", ""\r\r
228 };\r\r
229 private static final String[] list68 = {\r\r
230 "HEIM", "HOEK", "HOLM", "HOLZ", ""\r\r
231 };\r\r
232 private static final String[] list69 = {\r\r
233 "SIO", "SIA", ""\r\r
234 };\r\r
235 private static final String[] list70 = {\r\r
236 "SIAN", ""\r\r
237 };\r\r
238 private static final String[] list71 = {\r\r
239 "M", "N", "L", "W", ""\r\r
240 };\r\r
241 private static final String[] list72 = {\r\r
242 "Z", ""\r\r
243 };\r\r
244 private static final String[] list73 = {\r\r
245 "Z", ""\r\r
246 };\r\r
247 private static final String[] list74 = {\r\r
248 "SC", ""\r\r
249 };\r\r
250 private static final String[] list75 = {\r\r
251 "OO", "ER", "EN", "UY", "ED", "EM", ""\r\r
252 };\r\r
253 private static final String[] list76 = {\r\r
254 "ER", "EN", ""\r\r
255 };\r\r
256 private static final String[] list77 = {\r\r
257 "I", "E", "Y", ""\r\r
258 };\r\r
259 private static final String[] list78 = {\r\r
260 "AI", "OI", ""\r\r
261 };\r\r
262 private static final String[] list79 = {\r\r
263 "S", "Z", ""\r\r
264 };\r\r
265 private static final String[] list80 = {\r\r
266 "TION", ""\r\r
267 };\r\r
268 private static final String[] list81 = {\r\r
269 "TIA", "TCH", ""\r\r
270 };\r\r
271 private static final String[] list82 = {\r\r
272 "TH", ""\r\r
273 };\r\r
274 private static final String[] list83 = {\r\r
275 "TTH", ""\r\r
276 };\r\r
277 private static final String[] list84 = {\r\r
278 "OM", "AM", ""\r\r
279 };\r\r
280 private static final String[] list85 = {\r\r
281 "VAN ", "VON ", ""\r\r
282 };\r\r
283 private static final String[] list86 = {\r\r
284 "SCH", ""\r\r
285 };\r\r
286 private static final String[] list87 = {\r\r
287 "T", "D", ""\r\r
288 };\r\r
289 private static final String[] list88 = {\r\r
290 "WR", ""\r\r
291 };\r\r
292 private static final String[] list89 = {\r\r
293 "WH", ""\r\r
294 };\r\r
295 private static final String[] list90 = {\r\r
296 "EWSKI", "EWSKY", "OWSKI", "OWSKY", ""\r\r
297 };\r\r
298 private static final String[] list91 = {\r\r
299 "SCH", ""\r\r
300 };\r\r
301 private static final String[] list92 = {\r\r
302 "WICZ", "WITZ", ""\r\r
303 };\r\r
304 private static final String[] list93 = {\r\r
305 "IAU", "EAU", ""\r\r
306 };\r\r
307 private static final String[] list94 = {\r\r
308 "AU", "OU", ""\r\r
309 };\r\r
310 private static final String[] list95 = {\r\r
311 "C", "X", ""\r\r
312 };\r\r
313 private static final String[] list96 = {\r\r
314 "ZO", "ZI", "ZA", ""\r\r
315 };\r\r
316\r\r
317 /**\r\r
318 * put your documentation comment here\r\r
319 * @return\r\r
320 */\r\r
321 private final static boolean SlavoGermanic (String in) {\r\r
322 if ((in.indexOf("W") > -1) || (in.indexOf("K") > -1) || (in.indexOf("CZ") > -1)\r\r
323 || (in.indexOf("WITZ") > -1))\r\r
324 return true;\r\r
325 return false;\r\r
326 }\r\r
327\r\r
328 /**\r\r
329 * put your documentation comment here\r\r
330 * @param main\r\r
331 */\r\r
332 private final static void MetaphAdd (StringBuffer primary, String main) {\r\r
333 if (main != null) {\r\r
334 primary.append(main);\r\r
335 }\r\r
336 }\r\r
337\r\r
338 private final static void MetaphAdd (StringBuffer primary, char main) {\r\r
339 primary.append(main);\r\r
340 } \r\r
341 \r\r
342 /**\r\r
343 * put your documentation comment here\r\r
344 * @param at\r\r
345 * @return\r\r
346 */\r\r
347 private final static boolean isVowel (String in, int at, int length) {\r\r
348 if ((at < 0) || (at >= length))\r\r
349 return false;\r\r
350 char it = in.charAt(at);\r\r
351 if ((it == 'A') || (it == 'E') || (it == 'I') || (it == 'O') || (it ==\r\r
352 'U') || (it == 'Y'))\r\r
353 return true;\r\r
354 return false;\r\r
355 }\r\r
356\r\r
357 /**\r\r
358 * put your documentation comment here\r\r
359 * @param string\r\r
360 * @param start\r\r
361 * @param length\r\r
362 * @param list\r\r
363 * @return\r\r
364 */\r\r
365 private final static boolean stringAt (String string, int start, int length, String[] list) {\r\r
366 if ((start < 0) || (start >= string.length()) || list.length == 0 )\r\r
367 return false;\r\r
368 String substr = string.substring(start, start + length);\r\r
369 for (int i = 0; i < list.length; i++) {\r\r
370 if (list[i].equals(substr))\r\r
371 return true;\r\r
372 }\r\r
373 return false;\r\r
374 }\r\r
375\r\r
376 /**\r\r
377 * put your documentation comment here\r\r
378 * @param word The word to process.\r\r
379 * @return\r\r
380 */\r\r
381 public final String transform (String word) {\r\r
382 StringBuffer primary = new StringBuffer( word.length() + 5 );\r\r
383 String in = word.toUpperCase() + " ";\r\r
384 int current = 0;\r\r
385 int length = in.length();\r\r
386 if (length < 1)\r\r
387 return "";\r\r
388 int last = length - 1;\r\r
389 boolean isSlavoGermaic = SlavoGermanic(in);\r\r
390 if (stringAt(in, 0, 2, myList))\r\r
391 current += 1;\r\r
392 if (in.charAt(0) == 'X') {\r\r
393 MetaphAdd(primary, 'S');\r\r
394 current += 1;\r\r
395 }\r\r
396 while (current < length ) {\r\r
397 switch (in.charAt(current)) {\r\r
398 case 'A':case 'E':case 'I':case 'O':case 'U':case 'Y':\r\r
399 if (current == 0)\r\r
400 MetaphAdd(primary, 'A');\r\r
401 current += 1;\r\r
402 break;\r\r
403 case 'B':\r\r
404 MetaphAdd(primary, 'P');\r\r
405 if (in.charAt(current + 1) == 'B')\r\r
406 current += 2;\r\r
407 else\r\r
408 current += 1;\r\r
409 break;\r\r
410 case 'Ç':\r\r
411 MetaphAdd(primary, 'S');\r\r
412 current += 1;\r\r
413 break;\r\r
414 case 'C':\r\r
415 if ((current > 1) && !isVowel(in, current - 2, length) && stringAt(in, (current\r\r
416 - 1), 3, list1) && (in.charAt(current + 2) != 'I') && (in.charAt(\r\r
417 current + 2) != 'E') || stringAt(in, (current - 2), 6, list2)) {\r\r
418 MetaphAdd(primary, 'K');\r\r
419 current += 2;\r\r
420 break;\r\r
421 }\r\r
422 if ((current == 0) && stringAt(in, current, 6, list3)) {\r\r
423 MetaphAdd(primary, 'S');\r\r
424 current += 2;\r\r
425 break;\r\r
426 }\r\r
427 if (stringAt(in, current, 4, list4)) {\r\r
428 MetaphAdd(primary, 'K');\r\r
429 current += 2;\r\r
430 break;\r\r
431 }\r\r
432 if (stringAt(in, current, 2, list5)) {\r\r
433 if ((current > 0) && stringAt(in, current, 4, list6)) {\r\r
434 MetaphAdd(primary, 'K' );\r\r
435 current += 2;\r\r
436 break;\r\r
437 }\r\r
438 if ((current == 0) && stringAt(in, (current + 1), 5, list7) ||\r\r
439 stringAt(in, current + 1, 3, list8) && !stringAt(in, 0, 5,\r\r
440 list9)) {\r\r
441 MetaphAdd(primary, 'K' );\r\r
442 current += 2;\r\r
443 break;\r\r
444 }\r\r
445 if (stringAt(in, 0, 4, list10) || stringAt(in, 0, 3, list11) ||\r\r
446 stringAt(in, current - 2, 6, list12) || stringAt(in, current\r\r
447 + 2, 1, list13) || (stringAt(in, current - 1, 1, list14) ||\r\r
448 (current == 0)) && stringAt(in, current + 2, 1, list15)) {\r\r
449 MetaphAdd(primary, 'K');\r\r
450 }\r\r
451 else {\r\r
452 if (current > 0) {\r\r
453 if (stringAt(in, 0, 2, list16))\r\r
454 MetaphAdd(primary, 'K');\r\r
455 else\r\r
456 MetaphAdd(primary, 'X');\r\r
457 }\r\r
458 else {\r\r
459 MetaphAdd(primary, 'X');\r\r
460 }\r\r
461 }\r\r
462 current += 2;\r\r
463 break;\r\r
464 }\r\r
465 if (stringAt(in, current, 2, list17) && !stringAt(in, current, 4,\r\r
466 list18)) {\r\r
467 MetaphAdd(primary, 'S');\r\r
468 current += 2;\r\r
469 break;\r\r
470 }\r\r
471 if (stringAt(in, current, 2, list19)) {\r\r
472 MetaphAdd(primary, 'X');\r\r
473 current += 2;\r\r
474 break;\r\r
475 }\r\r
476 if (stringAt(in, current, 2, list20) && !((current == 1) && in.charAt(0)\r\r
477 == 'M')) {\r\r
478 if (stringAt(in, current + 2, 1, list21) && !stringAt(in, current\r\r
479 + 2, 2, list22)) {\r\r
480 if (((current == 1) && (in.charAt(current - 1) == 'A')) || stringAt(in,\r\r
481 (current - 1), 5, list23))\r\r
482 MetaphAdd(primary, "KS");\r\r
483 else\r\r
484 MetaphAdd(primary, 'X');\r\r
485 current += 3;\r\r
486 break;\r\r
487 }\r\r
488 else {\r\r
489 MetaphAdd(primary, 'K');\r\r
490 current += 2;\r\r
491 break;\r\r
492 }\r\r
493 }\r\r
494 if (stringAt(in, current, 2, list24)) {\r\r
495 MetaphAdd(primary, 'K');\r\r
496 current += 2;\r\r
497 break;\r\r
498 }\r\r
499 else if (stringAt(in, current, 2, list25)) {\r\r
500 MetaphAdd(primary, 'S');\r\r
501 current += 2;\r\r
502 break;\r\r
503 }\r\r
504 \r\r
505 MetaphAdd(primary, 'K');\r\r
506 if (stringAt(in, current + 1, 2, list27))\r\r
507 current += 3;\r\r
508 else if (stringAt(in, current + 1, 1, list28) && !stringAt(in, current\r\r
509 + 1, 2, list29))\r\r
510 current += 2;\r\r
511 else\r\r
512 current += 1;\r\r
513 break;\r\r
514 case 'D':\r\r
515 if (stringAt(in, current, 2, list30)) {\r\r
516 if (stringAt(in, current + 2, 1, list31)) {\r\r
517 MetaphAdd(primary, 'J');\r\r
518 current += 3;\r\r
519 break;\r\r
520 }\r\r
521 else {\r\r
522 MetaphAdd(primary, "TK");\r\r
523 current += 2;\r\r
524 break;\r\r
525 }\r\r
526 }\r\r
527 MetaphAdd(primary, 'T');\r\r
528 if (stringAt(in, current, 2, list32)) {\r\r
529 current += 2;\r\r
530 } else {\r\r
531 current += 1;\r\r
532 }\r\r
533 break;\r\r
534 case 'F':\r\r
535 if (in.charAt(current + 1) == 'F')\r\r
536 current += 2;\r\r
537 else\r\r
538 current += 1;\r\r
539 MetaphAdd(primary, 'F');\r\r
540 break;\r\r
541 case 'G':\r\r
542 if (in.charAt(current + 1) == 'H') {\r\r
543 if ((current > 0) && !isVowel(in, current - 1, length)) {\r\r
544 MetaphAdd(primary, 'K');\r\r
545 current += 2;\r\r
546 break;\r\r
547 }\r\r
548 if (current < 3) {\r\r
549 if (current == 0) {\r\r
550 if (in.charAt(current + 2) == 'I')\r\r
551 MetaphAdd(primary, 'J');\r\r
552 else\r\r
553 MetaphAdd(primary, 'K');\r\r
554 current += 2;\r\r
555 break;\r\r
556 }\r\r
557 }\r\r
558 if ((current > 1) && stringAt(in, current - 2, 1, list33) || ((current > 2)\r\r
559 && stringAt(in, current - 3, 1, list34)) || ((current > 3) &&\r\r
560 stringAt(in, current - 4, 1, list35))) {\r\r
561 current += 2;\r\r
562 break;\r\r
563 }\r\r
564 else {\r\r
565 if ((current > 2) && (in.charAt(current - 1) == 'U') && stringAt(in,\r\r
566 current - 3, 1, list36)) {\r\r
567 MetaphAdd(primary, 'F');\r\r
568 }\r\r
569 else {\r\r
570 if ((current > 0) && (in.charAt(current - 1) != 'I'))\r\r
571 MetaphAdd(primary, 'K');\r\r
572 }\r\r
573 current += 2;\r\r
574 break;\r\r
575 }\r\r
576 }\r\r
577 if (in.charAt(current + 1) == 'N') {\r\r
578 if ((current == 1) && isVowel(in, 0, length) && !isSlavoGermaic) {\r\r
579 MetaphAdd(primary, "KN");\r\r
580 }\r\r
581 else {\r\r
582 if (!stringAt(in, current + 2, 2, list37) && (in.charAt(current\r\r
583 + 1) != 'Y') && !isSlavoGermaic) {\r\r
584 MetaphAdd(primary, "N");\r\r
585 }\r\r
586 else {\r\r
587 MetaphAdd(primary, "KN");\r\r
588 }\r\r
589 }\r\r
590 current += 2;\r\r
591 break;\r\r
592 }\r\r
593 if (stringAt(in, current + 1, 2, list38) && !isSlavoGermaic) {\r\r
594 MetaphAdd(primary, "KL");\r\r
595 current += 2;\r\r
596 break;\r\r
597 }\r\r
598 if ((current == 0) && ((in.charAt(current + 1) == 'Y') || stringAt(in,\r\r
599 current + 1, 2, list39))) {\r\r
600 MetaphAdd(primary, 'K');\r\r
601 current += 2;\r\r
602 break;\r\r
603 }\r\r
604 if ((stringAt(in, current + 1, 2, list40) || (in.charAt(current +\r\r
605 1) == 'Y')) && !stringAt(in, 0, 6, list41) && !stringAt(in, current\r\r
606 - 1, 1, list42) && !stringAt(in, current - 1, 3, list43)) {\r\r
607 MetaphAdd(primary, 'K');\r\r
608 current += 2;\r\r
609 break;\r\r
610 }\r\r
611 if (stringAt(in, current + 1, 1, list44) || stringAt(in, current -\r\r
612 1, 4, list45)) {\r\r
613 if (stringAt(in, 0, 4, list46) || stringAt(in, 0, 3, list47) ||\r\r
614 stringAt(in, current + 1, 2, list48)) {\r\r
615 MetaphAdd(primary, 'K');\r\r
616 }\r\r
617 else {\r\r
618 MetaphAdd(primary, 'J');\r\r
619 }\r\r
620 current += 2;\r\r
621 break;\r\r
622 }\r\r
623 if (in.charAt(current + 1) == 'G')\r\r
624 current += 2;\r\r
625 else\r\r
626 current += 1;\r\r
627 MetaphAdd(primary, 'K');\r\r
628 break;\r\r
629 case 'H':\r\r
630 if (((current == 0) || isVowel(in, current - 1, length)) && isVowel(in, current +\r\r
631 1, length)) {\r\r
632 MetaphAdd(primary, 'H');\r\r
633 current += 2;\r\r
634 }\r\r
635 else {\r\r
636 current += 1;\r\r
637 }\r\r
638 break;\r\r
639 case 'J':\r\r
640 if (stringAt(in, current, 4, list50) || stringAt(in, 0, 4, list51)) {\r\r
641 if ((current == 0) && (in.charAt(current + 4) == ' ') || stringAt(in,\r\r
642 0, 4, list52)) {\r\r
643 MetaphAdd(primary, 'H');\r\r
644 }\r\r
645 else {\r\r
646 MetaphAdd(primary, 'J');\r\r
647 }\r\r
648 current += 1;\r\r
649 break;\r\r
650 }\r\r
651 if ((current == 0) && !stringAt(in, current, 4, list53)) {\r\r
652 MetaphAdd(primary, 'J');\r\r
653 }\r\r
654 else {\r\r
655 if (isVowel(in, current - 1, length) && !isSlavoGermaic && ((in.charAt(current\r\r
656 + 1) == 'A') || in.charAt(current + 1) == 'O')) {\r\r
657 MetaphAdd(primary, 'J' );\r\r
658 }\r\r
659 else {\r\r
660 if (current == last) {\r\r
661 MetaphAdd(primary, 'J' );\r\r
662 }\r\r
663 else {\r\r
664 if (!stringAt(in, current + 1, 1, list54) && !stringAt(in,\r\r
665 current - 1, 1, list55)) {\r\r
666 MetaphAdd(primary, 'J');\r\r
667 }\r\r
668 }\r\r
669 }\r\r
670 }\r\r
671 if (in.charAt(current + 1) == 'J')\r\r
672 current += 2;\r\r
673 else\r\r
674 current += 1;\r\r
675 break;\r\r
676 case 'K':\r\r
677 if (in.charAt(current + 1) == 'K')\r\r
678 current += 2;\r\r
679 else\r\r
680 current += 1;\r\r
681 MetaphAdd(primary, 'K');\r\r
682 break;\r\r
683 case 'L':\r\r
684 if (in.charAt(current + 1) == 'L') {\r\r
685 if (((current == (length - 3)) && stringAt(in, current - 1, 4,\r\r
686 list56)) || ((stringAt(in, last - 1, 2, list57) || stringAt(in,\r\r
687 last, 1, list58)) && stringAt(in, current - 1, 4, list59))) {\r\r
688 MetaphAdd(primary, 'L' );\r\r
689 current += 2;\r\r
690 break;\r\r
691 }\r\r
692 current += 2;\r\r
693 }\r\r
694 else\r\r
695 current += 1;\r\r
696 MetaphAdd(primary, 'L');\r\r
697 break;\r\r
698 case 'M':\r\r
699 if ((stringAt(in, current - 1, 3, list60) && (((current + 1) == last)\r\r
700 || stringAt(in, current + 2, 2, list61))) || (in.charAt(current\r\r
701 + 1) == 'M'))\r\r
702 current += 2;\r\r
703 else\r\r
704 current += 1;\r\r
705 MetaphAdd(primary, 'M');\r\r
706 break;\r\r
707 case 'N':\r\r
708 if (in.charAt(current + 1) == 'N')\r\r
709 current += 2;\r\r
710 else\r\r
711 current += 1;\r\r
712 MetaphAdd(primary, 'N');\r\r
713 break;\r\r
714 case 'Ñ':\r\r
715 current += 1;\r\r
716 MetaphAdd(primary, 'N');\r\r
717 break;\r\r
718 case 'P':\r\r
719 if (in.charAt(current + 1) == 'N') {\r\r
720 MetaphAdd(primary, 'F');\r\r
721 current += 2;\r\r
722 break;\r\r
723 }\r\r
724 if (stringAt(in, current + 1, 1, list62))\r\r
725 current += 2;\r\r
726 else\r\r
727 current += 1;\r\r
728 MetaphAdd(primary, 'P');\r\r
729 break;\r\r
730 case 'Q':\r\r
731 if (in.charAt(current + 1) == 'Q')\r\r
732 current += 2;\r\r
733 else\r\r
734 current += 1;\r\r
735 MetaphAdd(primary, 'K');\r\r
736 break;\r\r
737 case 'R':\r\r
738 if ((current == last) && !isSlavoGermaic && stringAt(in, current\r\r
739 - 2, 2, list63) && !stringAt(in, current - 4, 2, list64)) {\r\r
740// MetaphAdd(primary, "");\r\r
741 } else\r\r
742 MetaphAdd(primary, 'R');\r\r
743 if (in.charAt(current + 1) == 'R')\r\r
744 current += 2;\r\r
745 else\r\r
746 current += 1;\r\r
747 break;\r\r
748 case 'S':\r\r
749 if (stringAt(in, current - 1, 3, list65)) {\r\r
750 current += 1;\r\r
751 break;\r\r
752 }\r\r
753 if ((current == 0) && stringAt(in, current, 5, list66)) {\r\r
754 MetaphAdd(primary, 'X');\r\r
755 current += 1;\r\r
756 break;\r\r
757 }\r\r
758 if (stringAt(in, current, 2, list67)) {\r\r
759 if (stringAt(in, current + 1, 4, list68))\r\r
760 MetaphAdd(primary, 'S');\r\r
761 else\r\r
762 MetaphAdd(primary, 'X');\r\r
763 current += 2;\r\r
764 break;\r\r
765 }\r\r
766 if (stringAt(in, current, 3, list69) || stringAt(in, current, 4,\r\r
767 list70)) {\r\r
768 MetaphAdd(primary, 'S');\r\r
769 current += 3;\r\r
770 break;\r\r
771 }\r\r
772 if (((current == 0) && stringAt(in, current + 1, 1, list71)) || stringAt(in,\r\r
773 current + 1, 1, list72)) {\r\r
774 MetaphAdd(primary, 'S');\r\r
775 if (stringAt(in, current + 1, 1, list73))\r\r
776 current += 2;\r\r
777 else\r\r
778 current += 1;\r\r
779 break;\r\r
780 }\r\r
781 if (stringAt(in, current, 2, list74)) {\r\r
782 if (in.charAt(current + 2) == 'H')\r\r
783 if (stringAt(in, current + 3, 2, list75)) {\r\r
784 if (stringAt(in, current + 3, 2, list76)) {\r\r
785 MetaphAdd(primary, "X");\r\r
786 }\r\r
787 else {\r\r
788 MetaphAdd(primary, "SK");\r\r
789 }\r\r
790 current += 3;\r\r
791 break;\r\r
792 }\r\r
793 else {\r\r
794 MetaphAdd(primary, 'X');\r\r
795 current += 3;\r\r
796 break;\r\r
797 }\r\r
798 if (stringAt(in, current + 2, 1, list77)) {\r\r
799 MetaphAdd(primary, 'S');\r\r
800 current += 3;\r\r
801 break;\r\r
802 }\r\r
803 MetaphAdd(primary, "SK");\r\r
804 current += 3;\r\r
805 break;\r\r
806 }\r\r
807 if ((current == last) && stringAt(in, current - 2, 2, list78)) {\r\r
808 //MetaphAdd(primary, "");\r\r
809 } else\r\r
810 MetaphAdd(primary, 'S');\r\r
811 if (stringAt(in, current + 1, 1, list79))\r\r
812 current += 2;\r\r
813 else\r\r
814 current += 1;\r\r
815 break;\r\r
816 case 'T':\r\r
817 if (stringAt(in, current, 4, list80)) {\r\r
818 MetaphAdd(primary, 'X');\r\r
819 current += 3;\r\r
820 break;\r\r
821 }\r\r
822 if (stringAt(in, current, 3, list81)) {\r\r
823 MetaphAdd(primary, 'X');\r\r
824 current += 3;\r\r
825 break;\r\r
826 }\r\r
827 if (stringAt(in, current, 2, list82) || stringAt(in, current, 3,\r\r
828 list83)) {\r\r
829 if (stringAt(in, (current + 2), 2, list84) || stringAt(in, 0, 4,\r\r
830 list85) || stringAt(in, 0, 3, list86)) {\r\r
831 MetaphAdd(primary, 'T');\r\r
832 }\r\r
833 else {\r\r
834 MetaphAdd(primary, '0');\r\r
835 }\r\r
836 current += 2;\r\r
837 break;\r\r
838 }\r\r
839 if (stringAt(in, current + 1, 1, list87)) {\r\r
840 current += 2;\r\r
841 }\r\r
842 else\r\r
843 current += 1;\r\r
844 MetaphAdd(primary, 'T');\r\r
845 break;\r\r
846 case 'V':\r\r
847 if (in.charAt(current + 1) == 'V')\r\r
848 current += 2;\r\r
849 else\r\r
850 current += 1;\r\r
851 MetaphAdd(primary, 'F');\r\r
852 break;\r\r
853 case 'W':\r\r
854 if (stringAt(in, current, 2, list88)) {\r\r
855 MetaphAdd(primary, 'R');\r\r
856 current += 2;\r\r
857 break;\r\r
858 }\r\r
859 if ((current == 0) && (isVowel(in, current + 1, length) || stringAt(in, current,\r\r
860 2, list89))) {\r\r
861 MetaphAdd(primary, 'A');\r\r
862 }\r\r
863 if (((current == last) && isVowel(in, current - 1, length)) || stringAt(in, current\r\r
864 - 1, 5, list90) || stringAt(in, 0, 3, list91)) {\r\r
865 MetaphAdd(primary, 'F');\r\r
866 current += 1;\r\r
867 break;\r\r
868 }\r\r
869 if (stringAt(in, current, 4, list92)) {\r\r
870 MetaphAdd(primary, "TS");\r\r
871 current += 4;\r\r
872 break;\r\r
873 }\r\r
874 current += 1;\r\r
875 break;\r\r
876 case 'X':\r\r
877 if (!((current == last) && (stringAt(in, current - 3, 3, list93) ||\r\r
878 stringAt(in, current - 2, 2, list94))))\r\r
879 MetaphAdd(primary, "KS");\r\r
880 if (stringAt(in, current + 1, 1, list95))\r\r
881 current += 2;\r\r
882 else\r\r
883 current += 1;\r\r
884 break;\r\r
885 case 'Z':\r\r
886 if (in.charAt(current + 1) == 'H') {\r\r
887 MetaphAdd(primary, 'J');\r\r
888 current += 2;\r\r
889 break;\r\r
890 } \r\r
891 else {\r\r
892 MetaphAdd(primary, 'S');\r\r
893 }\r\r
894 if (in.charAt(current + 1) == 'Z')\r\r
895 current += 2;\r\r
896 else\r\r
897 current += 1;\r\r
898 break;\r\r
899 default:\r\r
900 current += 1;\r\r
901 }\r\r
902 }\r\r
903 return primary.toString();\r\r
904 }\r\r
905}\r\r
906\r\r
907\r\r
908\r\r