From: Thad Hughes Date: Fri, 23 Jul 2010 21:21:07 +0000 (-0700) Subject: go X-Git-Url: http://gitweb.fperrin.net/?p=Dictionary.git;a=commitdiff_plain;h=3f7c2b6aef9ede05120637caa2525f3f60a61ba2 go --- diff --git a/.classpath b/.classpath index 6468843..b198e6b 100644 --- a/.classpath +++ b/.classpath @@ -4,6 +4,6 @@ - + diff --git a/AndroidManifest.xml b/AndroidManifest.xml index 8c2d063..5bff2e3 100644 --- a/AndroidManifest.xml +++ b/AndroidManifest.xml @@ -3,8 +3,14 @@ + android:versionCode="8" + android:versionName="1.8"> + + + + + + @@ -15,6 +21,11 @@ + + + + + \ No newline at end of file diff --git a/default.properties b/default.properties index 19c9665..a1ef8e9 100644 --- a/default.properties +++ b/default.properties @@ -10,4 +10,4 @@ # Indicates whether an apk should be generated for each density. split.density=false # Project target. -target=android-4 +target=android-3 diff --git a/res/values-de/strings.xml b/res/values-de/strings.xml index a8d07b5..a9b4a7a 100755 --- a/res/values-de/strings.xml +++ b/res/values-de/strings.xml @@ -14,9 +14,7 @@ Fehler bei Wortliste hinzufugen: %s - Thad Hughes Wenn QuickDic dir gefällt, würde ich gern von dir hören. Bitte schicke Bemerkungen, Aufforderungen, oder Programmfehler an: - thad.hughes+quickdic@gmail.com Wörterbuch Info: Kein Wörterbuch geöffnet. wordListFile Wortliste Datei Die Datei, in der neue Worte hinzugefügt werden. - /sdcard/wordList.txt + /sdcard/quickdic/wordList.txt saveOnlyFirstSubentry Save only first sub-entry @@ -57,11 +55,11 @@ Einträgezahl: %d\n dictFile Wörterbuch Datei Die Datei, die das Wörterbuch enthält (und worein das Wörterbuch heruntergeladen wird). - /sdcard/de-en.dict + /sdcard/quickdic/de-en.dict dictFetchUrl Wörterbuch URL Das URL, wovon das Wörterbuch heruntergeladen wird. - http://www.stanford.edu/~egirard/dict/de-en.dict + http://www.stanford.edu/~egirard/dict/de-en_2.0.dict diff --git a/res/values/strings.xml b/res/values/strings.xml index ada99cb..3b2e929 100644 --- a/res/values/strings.xml +++ b/res/values/strings.xml @@ -14,10 +14,10 @@ Failure adding to word list: %s - QuickDic 1.8 + QuickDic 2.0 Thad Hughes If you\'re using QuickDic, I\'d love to hear from you. Please send comments, suggestions, bug reports, or just a quick hello to: - thad.hughes+quickdic@gmail.com + thad.hughes\+quickdic@gmail.com Current dictionary info: No dictionary loaded. { - private static final String VERSION_CODE = "DictionaryVersion=1.5"; + private static final String VERSION_CODE = "DictionaryVersion=2.0"; - static final RAFSerializer ENTRY_SERIALIZER = new RAFSerializableSerializer( - Entry.RAF_FACTORY); + static final RAFSerializer ENTRY_SERIALIZER = new RAFSerializableSerializer( + SimpleEntry.RAF_FACTORY); static final RAFSerializer ROW_SERIALIZER = new RAFSerializableSerializer( Row.RAF_FACTORY); static final RAFSerializer INDEX_ENTRY_SERIALIZER = new RAFSerializableSerializer( IndexEntry.RAF_FACTORY); final String dictionaryInfo; + final List sources; final List entries; final LanguageData[] languageDatas = new LanguageData[2]; public Dictionary(final String dictionaryInfo, final Language language0, final Language language1) { this.dictionaryInfo = dictionaryInfo; - languageDatas[0] = new LanguageData(this, language0, Entry.LANG1); - languageDatas[1] = new LanguageData(this, language1, Entry.LANG2); + sources = new ArrayList(); + languageDatas[0] = new LanguageData(this, language0, SimpleEntry.LANG1); + languageDatas[1] = new LanguageData(this, language1, SimpleEntry.LANG2); entries = new ArrayList(); } public Dictionary(final RandomAccessFile raf) throws IOException { dictionaryInfo = raf.readUTF(); + sources = new ArrayList(FileList.create(raf, RAFSerializer.STRING, raf.getFilePointer())); entries = CachingList.create(FileList.create(raf, ENTRY_SERIALIZER, raf .getFilePointer()), 10000); - languageDatas[0] = new LanguageData(this, raf, Entry.LANG1); - languageDatas[1] = new LanguageData(this, raf, Entry.LANG2); - if (!VERSION_CODE.equals(raf.readUTF())) { - throw new IOException("Invalid dictionary version, expected: " + VERSION_CODE); + languageDatas[0] = new LanguageData(this, raf, SimpleEntry.LANG1); + languageDatas[1] = new LanguageData(this, raf, SimpleEntry.LANG2); + final String version = raf.readUTF(); + if (!VERSION_CODE.equals(version)) { + throw new IOException("Invalid dictionary version, found " + version + ", expected: " + VERSION_CODE); } } public void write(RandomAccessFile raf) throws IOException { raf.writeUTF(dictionaryInfo); + FileList.write(raf, sources, RAFSerializer.STRING); FileList.write(raf, entries, ENTRY_SERIALIZER); languageDatas[0].write(raf); languageDatas[1].write(raf); diff --git a/src/com/hughes/android/dictionary/DictionaryActivity.java b/src/com/hughes/android/dictionary/DictionaryActivity.java index 05f292a..e8d188f 100644 --- a/src/com/hughes/android/dictionary/DictionaryActivity.java +++ b/src/com/hughes/android/dictionary/DictionaryActivity.java @@ -212,8 +212,8 @@ public class DictionaryActivity extends ListActivity { throw new Exception(e); } - final byte lang = prefs.getInt(PREF_DICT_ACTIVE_LANG, Entry.LANG1) == Entry.LANG1 ? Entry.LANG1 - : Entry.LANG2; + final byte lang = prefs.getInt(PREF_DICT_ACTIVE_LANG, SimpleEntry.LANG1) == SimpleEntry.LANG1 ? SimpleEntry.LANG1 + : SimpleEntry.LANG2; languageList = new LanguageListAdapter(dictionary.languageDatas[lang]); setListAdapter(languageList); @@ -350,7 +350,7 @@ public class DictionaryActivity extends ListActivity { @Override public boolean onPrepareOptionsMenu(final Menu menu) { switchLanguageMenuItem.setTitle(getString(R.string.switchToLanguage, - dictionary.languageDatas[Entry + dictionary.languageDatas[SimpleEntry .otherLang(languageList.languageData.lang)].language.symbol)); return super.onPrepareOptionsMenu(menu); } @@ -592,7 +592,7 @@ public class DictionaryActivity extends ListActivity { // Entry row(s). final TableLayout result = new TableLayout(parent.getContext()); - final Entry entry = dictionary.entries.get(row.getIndex()); + final SimpleEntry entry = dictionary.entries.get(row.getIndex()); final int rowCount = entry.getRowCount(); for (int r = 0; r < rowCount; ++r) { final TableRow tableRow = new TableRow(result.getContext()); @@ -604,13 +604,13 @@ public class DictionaryActivity extends ListActivity { if (r > 0) { final TextView spacer = new TextView(tableRow.getContext()); - spacer.setText(r == 0 ? "• " : " • "); + spacer.setText(r == 0 ? "� " : " � "); tableRow.addView(spacer); } tableRow.addView(column1, layoutParams); if (r > 0) { final TextView spacer = new TextView(tableRow.getContext()); - spacer.setText(r == 0 ? "• " : " • "); + spacer.setText(r == 0 ? "� " : " � "); tableRow.addView(spacer); } tableRow.addView(column2, layoutParams); @@ -632,7 +632,7 @@ public class DictionaryActivity extends ListActivity { } column2.setText( - entry.getAllText(Entry.otherLang(languageData.lang))[r], + entry.getAllText(SimpleEntry.otherLang(languageData.lang))[r], TextView.BufferType.NORMAL); result.addView(tableRow); diff --git a/src/com/hughes/android/dictionary/DictionaryActivityTest.java b/src/com/hughes/android/dictionary/DictionaryActivityTest.java index ea6b692..1ac9e8b 100755 --- a/src/com/hughes/android/dictionary/DictionaryActivityTest.java +++ b/src/com/hughes/android/dictionary/DictionaryActivityTest.java @@ -43,10 +43,10 @@ public class DictionaryActivityTest extends ActivityInstrumentationTestCase2 { - - static final byte LANG1 = 0; - static final byte LANG2 = 1; - - static final Pattern lineSplitPattern = Pattern.compile("\\s::\\s"); - static final Pattern sublineSplitPattern = Pattern.compile("\\s\\|\\s"); - - final String[] lang1; - final String[] lang2; - -// public Entry(final String lang1, final String lang2) { -// this.lang1 = new String[] {lang1}; -// this.lang2 = new String[] {lang2}; -// } - - Entry(final String[] lang1, final String[] lang2) { - this.lang1 = lang1; - this.lang2 = lang2; - } - - public static final RAFFactory RAF_FACTORY = new RAFFactory() { - public Entry create(RandomAccessFile raf) throws IOException { - final int rows = raf.readByte(); - final String[] lang1 = new String[rows]; - final String[] lang2 = new String[rows]; - for (int i = 0; i < lang1.length; ++i) { - lang1[i] = raf.readUTF(); - lang2[i] = raf.readUTF(); - } - return new Entry(lang1, lang2); - }}; - public void write(RandomAccessFile raf) throws IOException { - assert lang1.length == (byte) lang1.length; - raf.writeByte(lang1.length); - for (int i = 0; i < lang1.length; ++i) { - raf.writeUTF(lang1[i]); - raf.writeUTF(lang2[i]); - } - } - - @Override - public boolean equals(Object o) { - if (!(o instanceof Entry)) { - return false; - } - final Entry that = (Entry) o; - return Arrays.deepEquals(this.lang1, that.lang1) && Arrays.deepEquals(this.lang2, that.lang2); - } - - @Override - public int hashCode() { - return Arrays.deepHashCode(lang1) + Arrays.deepHashCode(lang2); - } - - @Override - public String toString() { - return getRawText(false); - } - - public int getRowCount() { - assert lang1.length == lang2.length; - return lang1.length; - } - - String[] getAllText(final byte lang) { - if (lang == LANG1) { - return lang1; - } - assert lang == LANG2; - return lang2; - } - - String getRawText(boolean onlyFirstSubentry) { - final StringBuilder result = new StringBuilder(); - for (int i = 0; i < (onlyFirstSubentry ? 1 : lang1.length); ++i) { - result.append(i == 0 ? "" : " | ").append(lang1[i]); - } - result.append("\t"); - for (int i = 0; i < (onlyFirstSubentry ? 1 : lang2.length); ++i) { - result.append(i == 0 ? "" : " | ").append(lang2[i]); - } - return result.toString(); - } - - static byte otherLang(final byte lang) { - assert lang == LANG1 || lang == LANG2; - return lang == LANG1 ? LANG2 : LANG1; - } - -/* -Lu Letter, Uppercase -Ll Letter, Lowercase -Lt Letter, Titlecase -Lm Letter, Modifier -Lo Letter, Other -Mn Mark, Nonspacing -Mc Mark, Spacing Combining -Me Mark, Enclosing -Nd Number, Decimal Digit -Nl Number, Letter -No Number, Other -Pc Punctuation, Connector -Pd Punctuation, Dash -Ps Punctuation, Open -Pe Punctuation, Close -Pi Punctuation, Initial quote (may behave like Ps or Pe depending on usage) -Pf Punctuation, Final quote (may behave like Ps or Pe depending on usage) -Po Punctuation, Other -Sm Symbol, Math -Sc Symbol, Currency -Sk Symbol, Modifier -So Symbol, Other -Zs Separator, Space -Zl Separator, Line -Zp Separator, Paragraph -*/ - - static Pattern htmlDecimalCode = Pattern.compile("&#([0-9]+);"); - static Pattern htmlCode = Pattern.compile("&#[^;]+;"); - - static Entry parseFromLine(String line, final boolean hasMultipleSubentries) { - - line = line.replaceAll("<", "<"); - line = line.replaceAll(">", ">"); - Matcher matcher; - while ((matcher = htmlDecimalCode.matcher(line)).find()) { - final int intVal = Integer.parseInt(matcher.group(1)); - final String charCode = "" + ((char) intVal); - System.out.println("Replacing " + matcher.group() + " with " + charCode); - line = matcher.replaceAll(charCode); - } - if ((matcher = htmlCode.matcher(line)).find()) { - System.err.println("HTML code: " + matcher.group()); - } - - final String[] parts = lineSplitPattern.split(line); - if (parts.length != 2) { - System.err.println("Entry:" + "Invalid line: " + line); - return null; - } - if (!hasMultipleSubentries) { - return new Entry(new String[] {parts[0].trim()}, new String[] {parts[1].trim()}); - } - - final String[] lang1 = sublineSplitPattern.split(" " + parts[0].trim() + " "); - final String[] lang2 = sublineSplitPattern.split(" " + parts[1].trim() + " "); - if (lang1.length != lang2.length) { - System.err.println("Entry:" + "Invalid subline: " + line); - return null; - } - for (int i = 0; i < lang1.length; ++i) { - lang1[i] = lang1[i].trim(); - lang2[i] = lang2[i].trim(); - } - return new Entry(lang1, lang2); - } - - static final Map bracketToClose = new LinkedHashMap(); - static { - bracketToClose.put("\"", "\""); - bracketToClose.put(" '", "' "); - } - - // This used to be called WHITESPACE. - static final Pattern NON_TOKEN_CHAR = Pattern.compile("\\s+"); - - public Set getIndexableTokens(final byte lang) { - final Set result = new LinkedHashSet(); - String text = " "; - for (final String subentry : getAllText(lang)) { - text += subentry + " "; - } - - text = text.replaceAll("fig\\.", " "); - text = text.replaceAll("\\{[^\\}]+}", " "); - text = text.replaceAll("\"-", "-"); - text = text.replaceAll("-\"", "-"); - text = text.replaceAll("[\"/\\()<>\\[\\],;?!.]", " "); - text = text.replaceAll("[-:] ", " "); - text = text.replaceAll(" [-:]", " "); - - // Now be really conservative about what we allow inside a token: - // See: http://unicode.org/Public/UNIDATA/UCD.html#General_Category_Values - text = text.replaceAll("[^-:\\p{L}\\p{N}\\p{S}]", " "); - result.addAll(Arrays.asList(NON_TOKEN_CHAR.split(text))); - - text = text.replaceAll("[-]", " "); - result.addAll(Arrays.asList(NON_TOKEN_CHAR.split(text))); - - final Set result2 = new LinkedHashSet(); - for (final String token : result) { - if (isIndexable(token)) { - result2.add(token); - } - } - return result2; - } - - static boolean isIndexable(final String text) { - // Does it have an alpha-numeric anywhere? - return text.matches(".*\\w.*"); - } - - static List getTextInside(final String text, final String start, final String end) { - final List result = new ArrayList(); - int startPos = 0; - while ((startPos = text.indexOf(start)) != -1) { - final int endPos = text.indexOf(end, startPos + 1); - result.add(text.substring(startPos + 1, endPos)); - startPos = endPos + 1; - } - return result; - } - -} \ No newline at end of file +package com.hughes.android.dictionary; + +import java.io.IOException; +import java.io.RandomAccessFile; + +import com.hughes.util.raf.RAFFactory; +import com.hughes.util.raf.RAFSerializable; + +public abstract class Entry implements RAFSerializable { + + public static final RAFFactory RAF_FACTORY = new RAFFactory() { + public Entry create(RandomAccessFile raf) throws IOException { + final byte type = raf.readByte(); + switch (type) { + case 0: + return SimpleEntry.RAF_FACTORY.create(raf); + } + throw new RuntimeException("Invalid entry type: " + type); + }}; + + +} diff --git a/src/com/hughes/android/dictionary/Language.java b/src/com/hughes/android/dictionary/Language.java index 0c4b2c5..0f53d7f 100755 --- a/src/com/hughes/android/dictionary/Language.java +++ b/src/com/hughes/android/dictionary/Language.java @@ -9,6 +9,9 @@ import com.ibm.icu.text.Collator; public class Language { + static final Map symbolToLangauge = new LinkedHashMap(); + + final String symbol; final Locale locale; @@ -18,8 +21,8 @@ public class Language { private Collator findCollator; final Comparator findComparator; - public Language(final String symbol, final Locale locale) { - this.symbol = symbol; + public Language(final Locale locale) { + this.symbol = locale.getLanguage(); this.locale = locale; this.sortComparator = new Comparator() { @@ -33,7 +36,8 @@ public class Language { return getFindCollator().compare(textNorm(s1), textNorm(s2)); } }; - + + symbolToLangauge.put(symbol.toLowerCase(), this); } public String textNorm(final String s) { @@ -42,6 +46,10 @@ public class Language { @Override public String toString() { + return locale.toString(); + } + + public String getSymbol() { return symbol; } @@ -65,9 +73,11 @@ public class Language { // ---------------------------------------------------------------- - public static final Language EN = new Language("EN", Locale.ENGLISH); + public static final Language en = new Language(Locale.ENGLISH); + public static final Language fr = new Language(Locale.FRENCH); + public static final Language it = new Language(Locale.ITALIAN); - public static final Language DE = new Language("DE", Locale.GERMAN) { + public static final Language de = new Language(Locale.GERMAN) { @Override public String textNorm(String token) { boolean sub = false; @@ -82,28 +92,29 @@ public class Language { if (!sub) { return token; } - token = token.replaceAll("ae", "ä"); - token = token.replaceAll("oe", "ö"); - token = token.replaceAll("ue", "ü"); - - token = token.replaceAll("Ae", "Ä"); - token = token.replaceAll("Oe", "Ö"); - token = token.replaceAll("Ue", "Ü"); - return token; + token = token.replaceAll("ae", "ä"); + token = token.replaceAll("oe", "ö"); + token = token.replaceAll("ue", "ü"); + + token = token.replaceAll("Ae", "Ä"); + token = token.replaceAll("Oe", "Ö"); + token = token.replaceAll("Ue", "Ü"); + return token; } }; - - // ---------------------------------------------------------------- - - private static final Map symbolToLangauge = new LinkedHashMap(); - + static { - symbolToLangauge.put(EN.symbol, EN); - symbolToLangauge.put(DE.symbol, DE); + for (final String lang : Locale.getISOLanguages()) { + if (lookup(lang) == null) { + new Language(new Locale(lang)); + } + } } + // ---------------------------------------------------------------- + static Language lookup(final String symbol) { - return symbolToLangauge.get(symbol); + return symbolToLangauge.get(symbol.toLowerCase()); } }