1 package com.hughes.android.dictionary;
\r
3 import java.util.Comparator;
\r
4 import java.util.LinkedHashMap;
\r
5 import java.util.Map;
\r
7 import com.hughes.util.StringUtil;
\r
9 public abstract class Language {
\r
11 final String symbol;
\r
12 final Comparator<String> tokenComparator;
\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
24 return StringUtil.flipCase(StringUtil.reverse(s1)).compareTo(StringUtil.flipCase(StringUtil.reverse(s2)));
\r
29 public String toString() {
\r
33 abstract String normalizeTokenForSort(final String token);
\r
36 // ----------------------------------------------------------------
\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
47 } else if (c == 'o') {
\r
49 } else if (c == 'u') {
\r
53 } else if (c >= 'a' && c <= 'z' || c >= '0' && c <= '9') {
\r
55 } else if (c == 'ß') {
\r
56 result.append("ss");
\r
57 } else if (c == 'ä') {
\r
59 } else if (c == 'ö') {
\r
61 } else if (c == 'ü') {
\r
65 return result.toString();
\r
68 public static final Language EN = new Language("EN") {
\r
70 public String normalizeTokenForSort(final String token) {
\r
71 return Language.normalizeTokenForSort(token, false);
\r
75 public static final Language DE = new Language("DE") {
\r
77 String normalizeTokenForSort(final String token) {
\r
78 return Language.normalizeTokenForSort(token, true);
\r
82 // ----------------------------------------------------------------
\r
84 private static final Map<String, Language> symbolToLangauge = new LinkedHashMap<String, Language>();
\r
87 symbolToLangauge.put(EN.symbol, EN);
\r
88 symbolToLangauge.put(DE.symbol, DE);
\r
91 static Language lookup(final String symbol) {
\r
92 return symbolToLangauge.get(symbol);
\r