]> gitweb.fperrin.net Git - Dictionary.git/blob - src/com/hughes/android/dictionary/Language.java
go
[Dictionary.git] / src / com / hughes / android / dictionary / Language.java
1 package com.hughes.android.dictionary;\r
2 \r
3 import java.util.Comparator;\r
4 import java.util.LinkedHashMap;\r
5 import java.util.Map;\r
6 \r
7 import com.hughes.util.StringUtil;\r
8 \r
9 public abstract class Language {\r
10 \r
11   final String symbol;\r
12   final Comparator<String> tokenComparator;\r
13 \r
14   public Language(final String symbol) {\r
15     this.symbol = symbol;\r
16     this.tokenComparator = new Comparator<String>() {\r
17       public int compare(final String s1, final String s2) {\r
18         final String norm1 = normalizeTokenForSort(s1);\r
19         final String norm2 = normalizeTokenForSort(s2);\r
20         final int c = norm1.compareTo(norm2);\r
21         if (c != 0) {\r
22           return c;\r
23         }\r
24         return StringUtil.flipCase(StringUtil.reverse(s1)).compareTo(StringUtil.flipCase(StringUtil.reverse(s2)));\r
25       }};\r
26   }\r
27   \r
28   @Override\r
29   public String toString() {\r
30     return symbol;\r
31   }\r
32 \r
33   abstract String normalizeTokenForSort(final String token);\r
34 \r
35 \r
36   // ----------------------------------------------------------------\r
37   \r
38   static final String normalizeTokenForSort(final String token, final boolean vowelETranslation) {\r
39     final StringBuilder result = new StringBuilder();\r
40     for (int i = 0; i < token.length(); ++i) {\r
41       Character c = token.charAt(i);\r
42       c = Character.toLowerCase(c);\r
43       // only check for lowercase 'e' in subsequent position means don't treat acronyms as umlauted: SAE.\r
44       if (vowelETranslation && (c == 'a' || c == 'o' || c == 'u') && i + 1 < token.length() && token.charAt(i + 1) == 'e') {\r
45         if (c == 'a') {\r
46           result.append('ä');\r
47         } else if (c == 'o') {\r
48           result.append('ö');\r
49         } else if (c == 'u') {\r
50           result.append('ü');\r
51         }\r
52         ++i;\r
53       } else if (c >= 'a' && c <= 'z' || c >= '0' && c <= '9') {\r
54         result.append(c);\r
55       } else if (c == 'ß') {\r
56         result.append("ss");\r
57       } else if (c == 'ä') {\r
58         result.append(c);\r
59       } else if (c == 'ö') {\r
60         result.append(c);\r
61       } else if (c == 'ü') {\r
62         result.append(c);\r
63       }\r
64     }\r
65     return result.toString();\r
66   }\r
67 \r
68   public static final Language EN = new Language("EN") {\r
69     @Override\r
70     public String normalizeTokenForSort(final String token) {\r
71       return Language.normalizeTokenForSort(token, false);\r
72     }\r
73   };\r
74     \r
75   public static final Language DE = new Language("DE") {\r
76     @Override\r
77     String normalizeTokenForSort(final String token) {\r
78       return Language.normalizeTokenForSort(token, true);\r
79     }\r
80   };\r
81 \r
82   // ----------------------------------------------------------------\r
83 \r
84   private static final Map<String, Language> symbolToLangauge = new LinkedHashMap<String, Language>();\r
85 \r
86   static {\r
87     symbolToLangauge.put(EN.symbol, EN);\r
88     symbolToLangauge.put(DE.symbol, DE);\r
89   }\r
90   \r
91   static Language lookup(final String symbol) {\r
92     return symbolToLangauge.get(symbol);\r
93   }\r
94 \r
95 \r
96 }\r