]> gitweb.fperrin.net Git - DictionaryPC.git/commitdiff
go
authorThad Hughes <thad.hughes@gmail.com>
Sat, 19 Feb 2011 21:00:52 +0000 (13:00 -0800)
committerThad Hughes <thad.hughes@gmail.com>
Tue, 13 Dec 2011 18:39:43 +0000 (10:39 -0800)
src/com/hughes/android/dictionary/engine/DictionaryBuilder.java
src/com/hughes/android/dictionary/engine/DictionaryBuilderMain.java
src/com/hughes/android/dictionary/engine/DictionaryBuilderTest.java
src/com/hughes/android/dictionary/engine/DictionaryTest.java
src/com/hughes/android/dictionary/engine/IndexBuilder.java
src/com/hughes/android/dictionary/parser/DictFileParser.java
src/com/hughes/android/dictionary/parser/EnWiktionaryXmlParser.java
src/com/hughes/android/dictionary/parser/WikiWord.java

index 7ea0d91647a0c0bfa41e70eee792d19aba25445e..a3a08c95f1b8d0080ab38de1e994fc5e4fe40cdd 100644 (file)
@@ -117,6 +117,9 @@ public class DictionaryBuilder {
           fatalError("Must specify human readable name for: " + prefix + "Name");
         }
 
+        final EntrySource entrySource = new EntrySource(dictionaryBuilder.dictionary.sources.size(), inputName, dictionaryBuilder.dictionary.pairEntries.size());
+        System.out.println("");
+        
         String inputFormat = keyValueArgs.remove(prefix + "Format");
         if ("dictcc".equals(inputFormat)) {
           new DictFileParser(charset, false, DictFileParser.TAB, null, dictionaryBuilder, dictionaryBuilder.indexBuilders.toArray(new IndexBuilder[0]), null).parseFile(file);
@@ -135,7 +138,6 @@ public class DictionaryBuilder {
           fatalError("Invalid or missing input format: " + inputFormat);
         }
         
-        final EntrySource entrySource = new EntrySource(dictionaryBuilder.dictionary.sources.size(), inputName);
         dictionaryBuilder.dictionary.sources.add(entrySource);
         System.out.println("Done: " + file + "\n\n");
       }
index 9a60d377f2f8f119f7ed34894c505b67315dbbc0..7438dc2458ff6ac4f75d3a6dca2b43fe3f045c17 100644 (file)
@@ -22,7 +22,19 @@ public class DictionaryBuilderMain extends TestCase {
   
   
   public static void main(final String[] args) throws Exception {
-    
+
+    DictionaryBuilder.main(new String[] {
+        "--dictOut=dictOutputs/DE-EN_chemnitz.quickdic",
+        "--lang1=DE",
+        "--lang2=EN",
+        "--dictInfo=@dictInputs/de-en_chemnitz.info",
+
+        "--input1=dictInputs/de-en_chemnitz.txt",
+        "--input1Name=chemnitz",
+        "--input1Charset=UTF8",
+        "--input1Format=chemnitz",
+    });
+
     Lang[] langs1 = new Lang[] { 
         new Lang("^English$", "EN"),
         new Lang("^German$", "DE"),
@@ -118,7 +130,7 @@ public class DictionaryBuilderMain extends TestCase {
 
       }  // langs2
     }  // langs1
-    
+
     DictionaryBuilder.main(new String[] {
         "--dictOut=dictOutputs/de-en_all.quickdic",
         "--lang1=DE",
@@ -144,18 +156,6 @@ public class DictionaryBuilderMain extends TestCase {
 
     });
 
-    DictionaryBuilder.main(new String[] {
-        "--dictOut=dictOutputs/de-en_chemnitz.quickdic",
-        "--lang1=DE",
-        "--lang2=EN",
-        "--dictInfo=@dictInputs/de-en_chemnitz.info",
-
-        "--input1=dictInputs/de-en_chemnitz.txt",
-        "--input1Name=dictcc",
-        "--input1Charset=UTF8",
-        "--input1Format=chemnitz",
-    });
-
   }
   
 }
index 0a1b479e32f198bb571d235d71a50607d50b9b2f..c5152942e03c8fe8741544bd3fbe6a9421f72103 100644 (file)
@@ -54,7 +54,7 @@ public class DictionaryBuilderTest extends TestCase {
         "--dictInfo=@testdata/de-en_dictInfo.txt",
 
         "--input1=testdata/de-en_chemnitz_100",
-        "--input1Name=dictcc",
+        "--input1Name=chemnitz",
         "--input1Charset=UTF8",
         "--input1Format=chemnitz",
 
index 87103eba3059f5b681dab38ff82dafbcb8d861ee..a462897a91e8ef14e27b315e8ee36b4a2bcd86ef 100644 (file)
@@ -2,20 +2,38 @@ package com.hughes.android.dictionary.engine;
 
 import java.io.IOException;
 import java.io.RandomAccessFile;
-import java.util.ArrayList;
-import java.util.Arrays;
-import java.util.Collections;
-import java.util.List;
 import java.util.concurrent.atomic.AtomicBoolean;
 
 import junit.framework.TestCase;
 
 import com.hughes.android.dictionary.engine.Index.IndexEntry;
-import com.ibm.icu.text.Transliterator;
+import com.hughes.android.dictionary.engine.PairEntry.Row;
 
 
 public class DictionaryTest extends TestCase {
+
+  @Override
+  protected void setUp() {
+    while (!TransliteratorManager.init(null)) {
+      try {
+        Thread.sleep(10);
+      } catch (InterruptedException e) {
+        e.printStackTrace();
+      }
+    }
+  }
+
+  public void testEnItWiktionary() throws IOException {
+    final RandomAccessFile raf = new RandomAccessFile("dictOutputs/EN-IT_enwiktionary.quickdic", "r");
+    final Dictionary dict = new Dictionary(raf);
+    final Index enIndex = dict.indices.get(0);
     
+    final PairEntry.Row row = (Row) enIndex.rows.get(2);
+    assertEquals("z", row.getRawText(false));
+
+    raf.close();
+  }
+
   public void testGermanMetadata() throws IOException {
     final RandomAccessFile raf = new RandomAccessFile("testdata/de-en.quickdic", "r");
     final Dictionary dict = new Dictionary(raf);
@@ -24,6 +42,12 @@ public class DictionaryTest extends TestCase {
     assertEquals("de", deIndex.shortName);
     assertEquals("de->en", deIndex.longName);
     
+    assertEquals(2, dict.sources.size());
+    assertEquals("chemnitz", dict.sources.get(0).name);
+    assertEquals(0, dict.sources.get(0).pairEntryStart);
+    assertEquals("dictcc", dict.sources.get(1).name);
+    assertEquals(113, dict.sources.get(1).pairEntryStart);
+    
     raf.close();
   }
   
@@ -36,7 +60,7 @@ public class DictionaryTest extends TestCase {
       System.out.println("testing: " + indexEntry.token);
       final IndexEntry searchResult = deIndex.findInsertionPoint(indexEntry.token, new AtomicBoolean(
           false));
-      assertEquals(indexEntry.token.toLowerCase(), searchResult.token.toLowerCase());
+      assertEquals("Looked up: " + indexEntry.token, indexEntry.token.toLowerCase(), searchResult.token.toLowerCase());
     }
 
     // TODO: maybe if user types capitalization, use it.
@@ -108,102 +132,6 @@ public class DictionaryTest extends TestCase {
     raf.close();
   }
   
-  public void testGermanSort() {
-    final Transliterator normalizer = Transliterator.createFromRules("", Language.de.getDefaultNormalizerRules(), Transliterator.FORWARD);
-    assertEquals("aüääss", normalizer.transform("aueAeAEß"));
-    final List<String> words = Arrays.asList(
-        "er-ben",
-        "erben",
-        "Erben",
-        "Erbse",
-        "Erbsen",
-        "essen",
-        "Essen",
-        "Grosformat",
-        "Grosformats",
-        "Grossformat",
-        "Großformat",
-        "Grossformats",
-        "Großformats",
-        "Großpoo",
-        "Großpoos",
-        "Hörvermögen",
-        "Hörweite",
-        "hos",
-        "Höschen",
-        "Hostel",
-        "hulle",
-        "Hulle",
-        "huelle",
-        "Huelle",
-        "hülle",
-        "Hülle",
-        "Huellen",
-        "Hüllen",
-        "Hum"
-        );
-    final NormalizeComparator comparator = new NormalizeComparator(normalizer, Language.de.getCollator());
-    assertEquals(1, comparator.compare("hülle", "huelle"));
-    assertEquals(-1, comparator.compare("huelle", "hülle"));
-    
-    assertEquals(-1, comparator.compare("hülle", "Hülle"));
-    
-    assertEquals("hülle", normalizer.transform("Hülle"));
-    assertEquals("hulle", normalizer.transform("Hulle"));
-
-    
-    final List<String> sorted = new ArrayList<String>(words);
-//    Collections.shuffle(shuffled, new Random(0));
-    Collections.sort(sorted, comparator);
-    System.out.println(sorted.toString());
-    for (int i = 0; i < words.size(); ++i) {
-      System.out.println(words.get(i) + "\t" + sorted.get(i));
-      assertEquals(words.get(i), sorted.get(i));
-    }
-  }
-
-  public void testEnglishSort() {
-    final Transliterator normalizer = Transliterator.createFromRules("", Language.en.getDefaultNormalizerRules(), Transliterator.FORWARD);
-
-    final List<String> words = Arrays.asList(
-        "pre-print", 
-        "preppie", 
-        "preppy",
-        "preprocess");
-    
-    final List<String> sorted = new ArrayList<String>(words);
-    final NormalizeComparator comparator = new NormalizeComparator(normalizer, Language.en.getCollator());
-    Collections.sort(sorted, comparator);
-    for (int i = 0; i < words.size(); ++i) {
-      if (i > 0) {
-        assertTrue(comparator.compare(words.get(i-1), words.get(i)) < 0);
-      }
-      System.out.println(words.get(i) + "\t" + sorted.get(i));
-      assertEquals(words.get(i), sorted.get(i));
-    }
-    
-    assertTrue(comparator.compare("pre-print", "preppy") < 0);
-
-  }
-  
-  public void testLanguage() {
-    assertEquals(Language.de, Language.lookup("de"));
-    assertEquals(Language.en, Language.lookup("en"));
-    assertEquals("es", Language.lookup("es").getSymbol());
-  }
-
-  public void testTextNorm() {
-    //final Transliterator transliterator = Transliterator.getInstance("Any-Latin; Upper; Lower; 'oe' > 'o'; NFD; [:Nonspacing Mark:] Remove; NFC", Transliterator.FORWARD);
-    final Transliterator transliterator = Transliterator.createFromRules("", ":: Any-Latin; :: Upper; :: Lower; 'oe' > 'o'; :: NFD; :: [:Nonspacing Mark:] Remove; :: NFC ;", Transliterator.FORWARD);
-    assertEquals("hoschen", transliterator.transliterate("Höschen"));
-    assertEquals("hoschen", transliterator.transliterate("Hoeschen"));
-    assertEquals("grosspoo", transliterator.transliterate("Großpoo"));
-
-    assertEquals("kyanpasu", transliterator.transliterate("キャンパス"));
-    assertEquals("alphabetikos katalogos", transliterator.transliterate("Αλφαβητικός Κατάλογος"));
-    assertEquals("biologiceskom", transliterator.transliterate("биологическом"));
-  }
-
   public void testChemnitz() throws IOException {
     final RandomAccessFile raf = new RandomAccessFile("dictOutputs/de-en_chemnitz.quickdic", "r");
     final Dictionary dict = new Dictionary(raf);
@@ -215,4 +143,5 @@ public class DictionaryTest extends TestCase {
     raf.close();
   }
 
+
 }
index 9721fd3746b265f088d1512537e183ae3991aa6b..4f64fa25258dd835709707aa27cb20e960b3f64d 100644 (file)
@@ -24,7 +24,7 @@ public class IndexBuilder {
   IndexBuilder(final DictionaryBuilder dictionaryBuilder, final String shortName, final String longName, final Language language, final String normalizerRules, final boolean swapPairEntries) {
     this.dictionaryBuilder = dictionaryBuilder;
     index = new Index(dictionaryBuilder.dictionary, shortName, longName, language, normalizerRules, swapPairEntries);
-    tokenToData = new TreeMap<String, TokenData>(new NormalizeComparator(index.normalizer, language.collator));
+    tokenToData = new TreeMap<String, TokenData>(new NormalizeComparator(index.normalizer(), language.getCollator()));
   }
   
   public void build() {
@@ -50,7 +50,8 @@ public class IndexBuilder {
           }
         }
       }
-      index.sortedIndexEntries.add(new Index.IndexEntry(tokenData.token, startRow, numRows));
+      index.sortedIndexEntries.add(new Index.IndexEntry(tokenData.token, index
+          .normalizer().transliterate(tokenData.token), startRow, numRows));
     }
     
     final List<IndexEntry> sortedEntries = new ArrayList<IndexEntry>(index.sortedIndexEntries);
index 2f53fdcf36f130605904c54bcb1a5084cd21ff1b..52a65677071195eebecaff29462cea91f52826c9 100644 (file)
@@ -102,7 +102,7 @@ public class DictFileParser {
       fields[0] = fields[1];
       fields[1] = temp;
     }
-    
+
     final String[][] subfields = new String[2][];
       if (subfieldSplit != null) {
       subfields[0] = subfieldSplit.split(fields[0]);
@@ -116,13 +116,12 @@ public class DictFileParser {
       subfields[1] = new String[] { fields[1] };
     }
     
-    final Pair[] pairs = new Pair[subfields[0].length];
-    for (int i = 0; i < pairs.length; ++i) {
+    final PairEntry pairEntry = new PairEntry();
+    for (int i = 0; i < subfields[0].length; ++i) {
       subfields[0][i] = subfields[0][i].trim();
       subfields[1][i] = subfields[1][i].trim();
-      pairs[i] = new Pair(subfields[0][i], subfields[1][i]);
+      pairEntry.pairs.add(new Pair(subfields[0][i], subfields[1][i]));
     }
-    final PairEntry pairEntry = new PairEntry(pairs);
     final EntryData entryData = new EntryData(dictBuilder.dictionary.pairEntries.size(), pairEntry);
     dictBuilder.dictionary.pairEntries.add(pairEntry);
     
index d5b90067c471774a18ec59992bece5ecc7bda1ce..761c5dc6d6d0319ea2874ba7df366becfd9fa1da 100644 (file)
@@ -201,6 +201,7 @@ public class EnWiktionaryXmlParser extends org.xml.sax.helpers.DefaultHandler im
     
     namedArgs.remove("lang");
     namedArgs.remove("nocat");
+    namedArgs.remove("nocap");
     namedArgs.remove("sc");
 
     // Pronunciation
@@ -212,7 +213,7 @@ public class EnWiktionaryXmlParser extends org.xml.sax.helpers.DefaultHandler im
         return;
       }
       
-      if (name.equals("IPA") || name.equals("SAMPA") || name.equals("X-SAMPA")|| name.equals("enPR")) {
+      if (name.equals("IPA") || name.equals("SAMPA") || name.equals("X-SAMPA") || name.equals("enPR")) {
         namedArgs.remove("lang");
         for (int i = 0; i < 100 && !namedArgs.isEmpty(); ++i) {
           final String pron = namedArgs.remove("" + i);
@@ -323,7 +324,7 @@ public class EnWiktionaryXmlParser extends org.xml.sax.helpers.DefaultHandler im
       assert positionalArgs.size() >= 1 && namedArgs.isEmpty() : positionalArgs.toString() + namedArgs + title;
       
       if (currentPartOfSpeech == null) {
-        assert !currentWord.partsOfSpeech.isEmpty() : title; 
+        assert currentWord != null && !currentWord.partsOfSpeech.isEmpty() : title; 
         System.err.println("Assuming last part of speech for non-nested translation section: " + title);
         currentPartOfSpeech = ListUtil.getLast(currentWord.partsOfSpeech);
       }
index c677d13be37280f454b9e3b548ba285adda8534e..5285c0eb4f300efac0be5a80c65dc3bda2cba5c8 100644 (file)
@@ -125,6 +125,24 @@ public class WikiWord {
      for (final WikiWord.PartOfSpeech partOfSpeech : partsOfSpeech) {
        partOfSpeechToQuickDic(dictBuilder, enIndexBuilder, partOfSpeech);
      }  // PartOfSpeech
+
+     // Pronunciation.
+     if (index != -1) {
+       final PairEntry pronEntry = new PairEntry();
+       for (final Map.Entry<String, StringBuilder> accentToPron : accentToPronunciation.entrySet()) {
+         String accent = accentToPron.getKey();
+         if (accent.length() > 0) {
+           accent = accent + ": ";
+         }         
+         pronEntry.pairs.add(new Pair(accent + accentToPron.getValue(), "", index != 0));
+       }
+       if (pronEntry.pairs.size() > 0) {
+         final EntryData entryData = new EntryData(dictBuilder.dictionary.pairEntries.size(), pronEntry);
+         dictBuilder.dictionary.pairEntries.add(pronEntry);
+         final Set<String> tokens = DictFileParser.tokenize(title, DictFileParser.NON_CHAR);
+         dictBuilder.indexBuilders.get(index).addEntryWithTokens(entryData, tokens, EntryTypeName.WIKTIONARY_PRONUNCIATION);
+       }
+     }
   }
 
 
@@ -145,12 +163,12 @@ public class WikiWord {
        }
      }
      
-     
      if (index != -1) {
        final boolean formOfSwap = index != 0;
        for (final FormOf formOf : partOfSpeech.formOfs) {
          final Pair pair = new Pair(title + ": " + formOf.grammarForm + ": " + formOf.target, "", formOfSwap);
-         final PairEntry pairEntry = new PairEntry(new Pair[] {pair});
+         final PairEntry pairEntry = new PairEntry();
+         pairEntry.pairs.add(pair);
          final EntryData entryData = new EntryData(dictBuilder.dictionary.pairEntries.size(), pairEntry);
          dictBuilder.dictionary.pairEntries.add(pairEntry);
   
@@ -167,8 +185,9 @@ public class WikiWord {
      
        // Meanings.
        for (final Meaning meaning : partOfSpeech.meanings) {
-         final List<Pair> pairs = new ArrayList<PairEntry.Pair>();
-         
+         final PairEntry pairEntry = new PairEntry();
+         final List<Pair> pairs = pairEntry.pairs;
+
          final List<Set<String>> exampleTokens = new ArrayList<Set<String>>();
          exampleTokens.add(new LinkedHashSet<String>());
          exampleTokens.add(new LinkedHashSet<String>());
@@ -200,7 +219,6 @@ public class WikiWord {
          }
 
          // Create EntryData with the PairEntry.
-         final PairEntry pairEntry = new PairEntry(pairs.toArray(new Pair[0]));
          final EntryData entryData = new EntryData(dictBuilder.dictionary.pairEntries.size(), pairEntry);
          dictBuilder.dictionary.pairEntries.add(pairEntry);
 
@@ -241,22 +259,12 @@ public class WikiWord {
        
        final String englishBase = title + " (" + partOfSpeech.name.toLowerCase() + "%s)";
        
-       final StringBuilder englishPron = new StringBuilder();
-       for (final Map.Entry<String, StringBuilder> accentToPron : accentToPronunciation.entrySet()) {
-         englishPron.append("\n");
-         if (accentToPron.getKey().length() > 0) {
-           englishPron.append(accentToPron.getKey()).append(": ");
-         }
-         englishPron.append(accentToPron.getValue());
-       }
-       
        for (final TranslationSense translationSense : partOfSpeech.translationSenses) {
          //System.out.println("    sense: " + translationSense.sense);
          if (translationSense.sense == null) {
            //System.err.println("    null sense: " + title);
          }
          String englishSense = String.format(englishBase, translationSense.sense != null ? (": " + translationSense.sense) : "");
-         englishSense += englishPron.toString();
          
          final StringBuilder[] sideBuilders = new StringBuilder[2];
          final List<Map<EntryTypeName, List<String>>> sideTokens = new ArrayList<Map<EntryTypeName,List<String>>>();
@@ -290,7 +298,8 @@ public class WikiWord {
          // Construct the Translations-based QuickDic entry for this TranslationSense.
          if (sideBuilders[0].length() > 0 && sideBuilders[1].length() > 0) {
            final Pair pair = new Pair(sideBuilders[0].toString(), sideBuilders[1].toString());
-           final PairEntry pairEntry = new PairEntry(new Pair[] { pair });
+           final PairEntry pairEntry = new PairEntry();
+           pairEntry.pairs.add(pair);
            final EntryData entryData = new EntryData(dictBuilder.dictionary.pairEntries.size(), pairEntry);
            dictBuilder.dictionary.pairEntries.add(pairEntry);