]> gitweb.fperrin.net Git - DictionaryPC.git/commitdiff
More languages, simpler splitter.
authorThad Hughes <thad.hughes@gmail.com>
Fri, 30 Dec 2011 02:25:29 +0000 (18:25 -0800)
committerThad Hughes <thad.hughes@gmail.com>
Fri, 30 Dec 2011 02:25:29 +0000 (18:25 -0800)
src/com/hughes/android/dictionary/engine/WiktionarySplitter.java
src/com/hughes/android/dictionary/parser/EnWiktionaryXmlParser.java
src/com/hughes/android/dictionary/parser/WikiFunctionCallback.java
todo.txt

index ee9b6301e00447099de850ad51d5896a2fbda092..26287009d8ca6c6b24f84923d3db858a7d9d31a1 100644 (file)
@@ -22,6 +22,7 @@ import java.io.IOException;
 import java.util.ArrayList;
 import java.util.Arrays;
 import java.util.List;
+import java.util.Map;
 import java.util.regex.Matcher;
 import java.util.regex.Pattern;
 
@@ -80,54 +81,9 @@ public class WiktionarySplitter extends org.xml.sax.helpers.DefaultHandler {
     }
 
     if (selectors.isEmpty()) {
-      selectors.addAll(Arrays.asList(
-          new Selector("data/inputs/enWikiSplit/AF.data", ".*[Aa]frikaans.*"),
-          new Selector("data/inputs/enWikiSplit/AR.data", ".*[Aa]rabic.*"),
-          new Selector("data/inputs/enWikiSplit/HY.data", ".*[Aa]rmenian.*"),
-          new Selector("data/inputs/enWikiSplit/HR.data", ".*[Cc]roatian.*"),
-          new Selector("data/inputs/enWikiSplit/CS.data", ".*[Cc]zech.*"),
-          new Selector("data/inputs/enWikiSplit/ZH.data", ".*[Cc]hinese.*|.*[Mm]andarin.*|.*Cantonese.*"),
-          new Selector("data/inputs/enWikiSplit/DA.data", ".*[Dd]anish.*"),
-          new Selector("data/inputs/enWikiSplit/NL.data", ".*[Dd]utch.*"),
-          new Selector("data/inputs/enWikiSplit/EN.data", ".*[Ee]nglish.*"),
-          new Selector("data/inputs/enWikiSplit/FI.data", ".*[Ff]innish.*"),
-          new Selector("data/inputs/enWikiSplit/FR.data", ".*[Ff]rench.*"),
-          new Selector("data/inputs/enWikiSplit/DE.data", ".*[Gg]erman.*"),
-          new Selector("data/inputs/enWikiSplit/EL.data", ".*[Gg]reek.*"),
-          new Selector("data/inputs/enWikiSplit/haw.data", ".*[Hh]awaiian.*"),
-          new Selector("data/inputs/enWikiSplit/HE.data", ".*[Hh]ebrew.*"),
-          new Selector("data/inputs/enWikiSplit/HI.data", ".*[Hh]indi.*"),
-          new Selector("data/inputs/enWikiSplit/IS.data", ".*[Ii]celandic.*"),
-          new Selector("data/inputs/enWikiSplit/GA.data", ".*[Ii]rish.*"),
-          new Selector("data/inputs/enWikiSplit/IT.data", ".*[Ii]talian.*"),
-          new Selector("data/inputs/enWikiSplit/LT.data", ".*[Ll]ithuanian.*"),
-          new Selector("data/inputs/enWikiSplit/JA.data", ".*[Jj]apanese.*"),
-          new Selector("data/inputs/enWikiSplit/KO.data", ".*[Kk]orean.*"),
-          new Selector("data/inputs/enWikiSplit/KU.data", ".*[Kk]urdish.*"),
-          new Selector("data/inputs/enWikiSplit/MS.data", ".*[Mm]alay.*"),
-          new Selector("data/inputs/enWikiSplit/MI.data", ".*[Mm]aori.*"),
-          new Selector("data/inputs/enWikiSplit/MN.data", ".*[Mm]ongolian.*"),
-          new Selector("data/inputs/enWikiSplit/NO.data", ".*[Nn]orwegian.*"),
-          new Selector("data/inputs/enWikiSplit/FA.data", ".*[Pp]ersian.*"),
-          new Selector("data/inputs/enWikiSplit/PT.data", ".*[Pp]ortuguese.*"),
-          new Selector("data/inputs/enWikiSplit/PL.data", ".*[Pp]olish.*"),
-          new Selector("data/inputs/enWikiSplit/RO.data", ".*[Rr]omanian.*"),
-          new Selector("data/inputs/enWikiSplit/RU.data", ".*[Rr]ussian.*"),
-          new Selector("data/inputs/enWikiSplit/SA.data", ".*[Ss]anskrit.*"),
-          new Selector("data/inputs/enWikiSplit/SR.data", ".*[Ss]erbian.*"),
-          new Selector("data/inputs/enWikiSplit/SO.data", ".*[Ss]omali.*"),
-          new Selector("data/inputs/enWikiSplit/ES.data", ".*[Ss]panish.*"),
-          new Selector("data/inputs/enWikiSplit/SV.data", ".*[Ss]wedish.*"),
-          new Selector("data/inputs/enWikiSplit/TG.data", ".*[Tt]ajik.*"),
-          new Selector("data/inputs/enWikiSplit/TH.data", ".*[Tt]hai.*"),
-          new Selector("data/inputs/enWikiSplit/BO.data", ".*[Tt]ibetan.*"),
-          new Selector("data/inputs/enWikiSplit/TR.data", ".*[Tt]urkish.*"),
-          new Selector("data/inputs/enWikiSplit/UK.data", ".*[Uu]krainian.*"),
-          new Selector("data/inputs/enWikiSplit/VI.data", ".*[Vv]ietnamese.*"),
-          new Selector("data/inputs/enWikiSplit/CI.data", ".*[Ww]elsh.*"),
-          new Selector("data/inputs/enWikiSplit/YI.data", ".*[Yy]iddish.*"),
-          new Selector("data/inputs/enWikiSplit/ZU.data", ".*[Zz]ulu.*")
-          ));
+      for (final Map.Entry<String, String> entry : Language.isoCodeToWikiName.entrySet()) {
+        selectors.add(new Selector(String.format("data/inputs/enWikiSplit/%s.data", entry.getKey()), entry.getValue()));
+      }
     }
     
     // Do it.
index e3c7d2a85951d29f3a5c12d2455e93aee447f669..b9dbc7d038951ad0ac503ac6a3ea44163718562a 100644 (file)
@@ -254,7 +254,7 @@ public class EnWiktionaryXmlParser {
         
       } else if (wikiTokenizer.remainderStartsWith("''See''")) {
         wikiTokenizer.nextLine();
-        LOG.fine("Skipping line: " + wikiTokenizer.token());
+        LOG.fine("Skipping See line: " + wikiTokenizer.token());
       } else if (wikiTokenizer.isWikiLink()) {
         final String wikiLink = wikiTokenizer.wikiLinkText();
         if (wikiLink.contains(":") && wikiLink.contains(title)) {
@@ -287,24 +287,28 @@ public class EnWiktionaryXmlParser {
   }
   
   
-  static final class Callback implements WikiTokenizer.Callback {
-    public Callback(IndexedEntry indexedEntry, IndexBuilder defaultIndexBuilder,
-        StringBuilder builder, Map<String, WikiFunctionCallback> functionCallbacks) {
+  static final class AppendAndIndexCallback implements WikiTokenizer.Callback {
+    public AppendAndIndexCallback(
+        final StringBuilder builder, 
+        final IndexedEntry indexedEntry,
+        final IndexBuilder defaultIndexBuilder,
+        final Map<String, WikiFunctionCallback> functionCallbacks) {
       this.indexedEntry = indexedEntry;
       this.defaultIndexBuilder = defaultIndexBuilder;
       this.builder = builder;
       this.functionCallbacks = functionCallbacks;
     }
 
-    final IndexedEntry indexedEntry;
-    final IndexBuilder defaultIndexBuilder;
     final StringBuilder builder;
+    final IndexedEntry indexedEntry;
+    IndexBuilder defaultIndexBuilder;
     final Map<String,WikiFunctionCallback> functionCallbacks;
     
     // TODO: the classes of text are wrong....
     
     @Override
     public void onPlainText(WikiTokenizer wikiTokenizer) {
+      // The only non-recursive callback.  Just appends to the builder, and
       final String plainText = wikiTokenizer.token(); 
       builder.append(plainText);
       defaultIndexBuilder.addEntryWithString(indexedEntry, plainText, EntryTypeName.WIKTIONARY_TRANSLATION_OTHER_TEXT);
@@ -319,8 +323,22 @@ public class EnWiktionaryXmlParser {
     }
 
     @Override
-    public void onFunction(String functionName,
-        List<String> functionPositionArgs, Map<String, String> functionNamedArgs) {
+    public void onFunction(final String name,
+        final List<String> args, final Map<String, String> namedArgs) {
+      final WikiFunctionCallback functionCallback = functionCallbacks.get(name);
+      if (functionCallback != null) {
+        // Dispatch the handling elsewhere.
+        functionCallback.onWikiFunction(name, args, namedArgs);
+      } else {
+        // Default function handling:
+        for (int i = 0; i < args.size(); ++i) {
+          args.set(i, WikiTokenizer.toPlainText(args.get(i)));
+        }
+        for (final Map.Entry<String, String> entry : namedArgs.entrySet()) {
+          entry.setValue(WikiTokenizer.toPlainText(entry.getValue()));
+        }
+        WikiTokenizer.appendFunction(builder, name, args, namedArgs);
+      }
     }
 
     @Override
index 6043323eaf60a20d7a596a5cc4dfa4f9847d9fa7..5ae62d42dce9c5e00f6c35b6c76983e1482da5c4 100644 (file)
@@ -1,5 +1,10 @@
 package com.hughes.android.dictionary.parser;
 
+import java.util.List;
+import java.util.Map;
+
 public interface WikiFunctionCallback {
+  
+  void onWikiFunction(final String name, final List<String> args, final Map<String,String> namedArgs);
 
 }
index 465de4f97a5aa80c2893893c743f875ffea5caed..7adfe5cf173691a2e968d4267337500a93f76274 100644 (file)
--- a/todo.txt
+++ b/todo.txt
@@ -1,4 +1,11 @@
+For next release:
+refactor wiki parsing.
 random word jump
+multiword find.
+dictionary update.
+{{Arab}}
+???italian verbs
+
 pronunciation
 synonyms
 move dict to top of list when downloaded