]> gitweb.fperrin.net Git - DictionaryPC.git/blobdiff - src/com/hughes/android/dictionary/parser/wiktionary/EnFunctionCallbacks.java
Expand italian test to get verb conjuations.
[DictionaryPC.git] / src / com / hughes / android / dictionary / parser / wiktionary / EnFunctionCallbacks.java
index 4d11824b1e37a6208b9bb4bf5cd323e46dc04b74..4de32bc0503e1d9bd69bc74860519d89c0b779dd 100644 (file)
@@ -32,50 +32,68 @@ import com.hughes.util.ListUtil;
 class EnFunctionCallbacks {
   
   static final Map<String,FunctionCallback<EnParser>> DEFAULT = new LinkedHashMap<String, FunctionCallback<EnParser>>();
+
+  static final Map<String,FunctionCallback<AbstractWiktionaryParser>> DEFAULT_GENERIC = new LinkedHashMap<String, FunctionCallback<AbstractWiktionaryParser>>();
+  static {
+      FunctionCallback<AbstractWiktionaryParser> callback = new TranslationCallback<AbstractWiktionaryParser>();
+      DEFAULT_GENERIC.put("t", callback);
+  }
   
+  static <T extends AbstractWiktionaryParser> void addGenericCallbacks(Map<String, FunctionCallback<T>> callbacks) {
+      FunctionCallback<T> callback = new Gender<T>();
+      callbacks.put("m", callback);
+      callbacks.put("f", callback);
+      callbacks.put("n", callback);
+      callbacks.put("p", callback);
+      callbacks.put("g", callback);
+      
+      callback = new EncodingCallback<T>();
+      Set<String> encodings = new LinkedHashSet<String>(Arrays.asList(
+          "zh-ts", "zh-tsp",
+          "sd-Arab", "ku-Arab", "Arab", "unicode", "Laoo", "ur-Arab", "Thai", 
+          "fa-Arab", "Khmr", "Cyrl", "IPAchar", "ug-Arab", "ko-inline", 
+          "Jpan", "Kore", "Hebr", "rfscript", "Beng", "Mong", "Knda", "Cyrs",
+          "yue-tsj", "Mlym", "Tfng", "Grek", "yue-yue-j"));
+      for (final String encoding : encodings) {
+          callbacks.put(encoding, callback);
+      }
+      
+      callback = new Ignore<T>();
+      callbacks.put("trreq", callback);
+      callbacks.put("t-image", callback);
+      callbacks.put("defn", callback);
+      callbacks.put("rfdef", callback);
+      callbacks.put("rfdate", callback);
+      callbacks.put("rfex", callback);
+      callbacks.put("rfquote", callback);
+      callbacks.put("attention", callback);
+      callbacks.put("zh-attention", callback);
+      
+      callback = new AppendName<T>();
+      callbacks.put("...", callback);
+      
+      callbacks.put("qualifier", new QualifierCallback<T>());
+      callbacks.put("italbrac", new italbrac<T>());
+      callbacks.put("gloss", new gloss<T>());
+      callbacks.put("not used", new not_used<T>());
+      callbacks.put("wikipedia", new wikipedia<T>());
+  }
+
   static {
-    FunctionCallback<EnParser> callback = new TranslationCallback();
+    addGenericCallbacks(DEFAULT);
+      
+    FunctionCallback<EnParser> callback = new TranslationCallback<EnParser>();
     DEFAULT.put("t", callback);
     DEFAULT.put("t+", callback);
     DEFAULT.put("t-", callback);
     DEFAULT.put("tø", callback);
     DEFAULT.put("apdx-t", callback);
     
-    callback = new EncodingCallback();
-    Set<String> encodings = new LinkedHashSet<String>(Arrays.asList(
-        "zh-ts", "zh-tsp",
-        "sd-Arab", "ku-Arab", "Arab", "unicode", "Laoo", "ur-Arab", "Thai", 
-        "fa-Arab", "Khmr", "Cyrl", "IPAchar", "ug-Arab", "ko-inline", 
-        "Jpan", "Kore", "Hebr", "rfscript", "Beng", "Mong", "Knda", "Cyrs",
-        "yue-tsj", "Mlym", "Tfng", "Grek", "yue-yue-j"));
-    for (final String encoding : encodings) {
-      DEFAULT.put(encoding, callback);
-    }
-    
     callback = new l_term();
     DEFAULT.put("l", callback);
     DEFAULT.put("term", callback);
 
-    callback = new Gender();
-    DEFAULT.put("m", callback);
-    DEFAULT.put("f", callback);
-    DEFAULT.put("n", callback);
-    DEFAULT.put("p", callback);
-    DEFAULT.put("g", callback);
-    
-    callback = new AppendArg0();
-
-    callback = new Ignore();
-    DEFAULT.put("trreq", callback);
-    DEFAULT.put("t-image", callback);
-    DEFAULT.put("defn", callback);
-    DEFAULT.put("rfdef", callback);
-    DEFAULT.put("rfdate", callback);
-    DEFAULT.put("rfex", callback);
-    DEFAULT.put("rfquote", callback);
-    DEFAULT.put("attention", callback);
-    DEFAULT.put("zh-attention", callback);
-
+    //callback = new AppendArg0();
 
     callback = new FormOf();
     DEFAULT.put("form of", callback);
@@ -96,32 +114,25 @@ class EnFunctionCallbacks {
     callback = new InflOrHead();
     DEFAULT.put("infl", callback);
     DEFAULT.put("head", callback);
-    
-    callback = new AppendName();
-    DEFAULT.put("...", callback);
-    
-    DEFAULT.put("qualifier", new QualifierCallback());
-    DEFAULT.put("italbrac", new italbrac());
-    DEFAULT.put("gloss", new gloss());
-    DEFAULT.put("not used", new not_used());
-    DEFAULT.put("wikipedia", new wikipedia());
   }
   
   static final NameAndArgs<EnParser> NAME_AND_ARGS = new NameAndArgs<EnParser>();
 
   // ------------------------------------------------------------------
 
-  static final class TranslationCallback implements FunctionCallback<EnParser> {
+  static final class TranslationCallback<T extends AbstractWiktionaryParser> implements FunctionCallback<T> {
     @Override
     public boolean onWikiFunction(final WikiTokenizer wikiTokenizer, final String name, final List<String> args,
-        final Map<String, String> namedArgs, final EnParser parser,
-        final AppendAndIndexWikiCallback<EnParser> appendAndIndexWikiCallback) {
+        final Map<String, String> namedArgs, final T parser,
+        final AppendAndIndexWikiCallback<T> appendAndIndexWikiCallback) {
 
       final String transliteration = namedArgs.remove("tr");
       final String alt = namedArgs.remove("alt");
       namedArgs.keySet().removeAll(EnParser.USELESS_WIKI_ARGS);
       if (args.size() < 2) {
-        EnParser.LOG.warning("{{t...}} with wrong args: title=" + parser.title);
+        if (!name.equals("ttbc")) {
+          EnParser.LOG.warning("{{t...}} with wrong args: title=" + parser.title + ", " + wikiTokenizer.token());
+        }
         return false;
       }
       final String langCode = ListUtil.get(args, 0);
@@ -171,12 +182,12 @@ class EnFunctionCallbacks {
 
   // ------------------------------------------------------------------
   
-  static final class QualifierCallback implements FunctionCallback<EnParser> {
+  static final class QualifierCallback<T extends AbstractWiktionaryParser> implements FunctionCallback<T> {
     @Override
     public boolean onWikiFunction(final WikiTokenizer wikiTokenizer, final String name, final List<String> args,
         final Map<String, String> namedArgs,
-        final EnParser parser,
-        final AppendAndIndexWikiCallback<EnParser> appendAndIndexWikiCallback) {
+        final T parser,
+        final AppendAndIndexWikiCallback<T> appendAndIndexWikiCallback) {
       if (args.size() != 1 || !namedArgs.isEmpty()) {
         EnParser.LOG.warning("weird qualifier: ");
         return false;
@@ -191,12 +202,12 @@ class EnFunctionCallbacks {
 
   // ------------------------------------------------------------------
   
-  static final class EncodingCallback implements FunctionCallback<EnParser> {
+  static final class EncodingCallback<T extends AbstractWiktionaryParser> implements FunctionCallback<T> {
     @Override
     public boolean onWikiFunction(final WikiTokenizer wikiTokenizer, final String name, final List<String> args,
         final Map<String, String> namedArgs,
-        final EnParser parser,
-        final AppendAndIndexWikiCallback<EnParser> appendAndIndexWikiCallback) {
+        final T parser,
+        final AppendAndIndexWikiCallback<T> appendAndIndexWikiCallback) {
       if (!namedArgs.isEmpty()) {
         EnParser.LOG.warning("weird encoding: " + wikiTokenizer.token());
       }
@@ -222,12 +233,12 @@ class EnFunctionCallbacks {
 
   // ------------------------------------------------------------------
   
-  static final class Gender implements FunctionCallback<EnParser> {
+  static final class Gender<T extends AbstractWiktionaryParser> implements FunctionCallback<T> {
     @Override
     public boolean onWikiFunction(final WikiTokenizer wikiTokenizer, final String name, final List<String> args,
         final Map<String, String> namedArgs,
-        final EnParser parser,
-        final AppendAndIndexWikiCallback<EnParser> appendAndIndexWikiCallback) {
+        final T parser,
+        final AppendAndIndexWikiCallback<T> appendAndIndexWikiCallback) {
       if (!namedArgs.isEmpty()) {
         return false;
       }
@@ -310,7 +321,7 @@ class EnFunctionCallbacks {
 
   // ------------------------------------------------------------------
   
-  static final class AppendArg0 implements FunctionCallback<EnParser> {
+  static final class AppendArg0<T extends AbstractWiktionaryParser> implements FunctionCallback<EnParser> {
     @Override
     public boolean onWikiFunction(final WikiTokenizer wikiTokenizer, final String name, final List<String> args,
         final Map<String, String> namedArgs,
@@ -335,12 +346,12 @@ class EnFunctionCallbacks {
 
   // ------------------------------------------------------------------
   
-  static final class italbrac implements FunctionCallback<EnParser> {
+  static final class italbrac<T extends AbstractWiktionaryParser> implements FunctionCallback<T> {
     @Override
     public boolean onWikiFunction(final WikiTokenizer wikiTokenizer, final String name, final List<String> args,
         final Map<String, String> namedArgs,
-        final EnParser parser,
-        final AppendAndIndexWikiCallback<EnParser> appendAndIndexWikiCallback) {
+        final T parser,
+        final AppendAndIndexWikiCallback<T> appendAndIndexWikiCallback) {
       if (args.size() != 1 || !namedArgs.isEmpty()) {
         return false;
       }
@@ -353,12 +364,12 @@ class EnFunctionCallbacks {
 
   // ------------------------------------------------------------------
   
-  static final class gloss implements FunctionCallback<EnParser> {
+  static final class gloss<T extends AbstractWiktionaryParser> implements FunctionCallback<T> {
     @Override
     public boolean onWikiFunction(final WikiTokenizer wikiTokenizer, final String name, final List<String> args,
         final Map<String, String> namedArgs,
-        final EnParser parser,
-        final AppendAndIndexWikiCallback<EnParser> appendAndIndexWikiCallback) {
+        final T parser,
+        final AppendAndIndexWikiCallback<T> appendAndIndexWikiCallback) {
       if (args.size() != 1 || !namedArgs.isEmpty()) {
         return false;
       }
@@ -371,24 +382,24 @@ class EnFunctionCallbacks {
   
   // ------------------------------------------------------------------
   
-  static final class Ignore implements FunctionCallback<EnParser> {
+  static final class Ignore<T extends AbstractWiktionaryParser> implements FunctionCallback<T> {
     @Override
     public boolean onWikiFunction(final WikiTokenizer wikiTokenizer, final String name, final List<String> args,
         final Map<String, String> namedArgs,
-        final EnParser parser,
-        final AppendAndIndexWikiCallback<EnParser> appendAndIndexWikiCallback) {
+        final T parser,
+        final AppendAndIndexWikiCallback<T> appendAndIndexWikiCallback) {
       return true;
     }
   }
 
   // ------------------------------------------------------------------
   
-  static final class not_used implements FunctionCallback<EnParser> {
+  static final class not_used<T extends AbstractWiktionaryParser> implements FunctionCallback<T> {
     @Override
     public boolean onWikiFunction(final WikiTokenizer wikiTokenizer, final String name, final List<String> args,
         final Map<String, String> namedArgs,
-        final EnParser parser,
-        final AppendAndIndexWikiCallback<EnParser> appendAndIndexWikiCallback) {
+        final T parser,
+        final AppendAndIndexWikiCallback<T> appendAndIndexWikiCallback) {
       appendAndIndexWikiCallback.builder.append("(not used)");
       return true;
     }
@@ -397,12 +408,12 @@ class EnFunctionCallbacks {
 
   // ------------------------------------------------------------------
   
-  static final class AppendName implements FunctionCallback<EnParser> {
+  static final class AppendName<T extends AbstractWiktionaryParser> implements FunctionCallback<T> {
     @Override
     public boolean onWikiFunction(final WikiTokenizer wikiTokenizer, final String name, final List<String> args,
         final Map<String, String> namedArgs,
-        final EnParser parser,
-        final AppendAndIndexWikiCallback<EnParser> appendAndIndexWikiCallback) {
+        final T parser,
+        final AppendAndIndexWikiCallback<T> appendAndIndexWikiCallback) {
       if (!args.isEmpty() || !namedArgs.isEmpty()) {
         return false;
       }
@@ -458,12 +469,12 @@ class EnFunctionCallbacks {
   // --------------------------------------------------------------------
   // --------------------------------------------------------------------
   
-  static final class wikipedia implements FunctionCallback<EnParser> {
+  static final class wikipedia<T extends AbstractWiktionaryParser> implements FunctionCallback<T> {
     @Override
     public boolean onWikiFunction(final WikiTokenizer wikiTokenizer, final String name, final List<String> args,
         final Map<String, String> namedArgs,
-        final EnParser parser,
-        final AppendAndIndexWikiCallback<EnParser> appendAndIndexWikiCallback) {
+        final T parser,
+        final AppendAndIndexWikiCallback<T> appendAndIndexWikiCallback) {
       namedArgs.remove("lang");
       if (args.size() > 1 || !namedArgs.isEmpty()) {
         // Unindexed!
@@ -483,6 +494,8 @@ class EnFunctionCallbacks {
         final EnParser parser,
         final AppendAndIndexWikiCallback<EnParser> appendAndIndexWikiCallback) {
       // See: http://en.wiktionary.org/wiki/Template:infl
+      // TODO: Actually these functions should start a new WordPOS:
+      // See: http://en.wiktionary.org/wiki/quattro
       final String langCode = ListUtil.get(args, 0);
       String head = namedArgs.remove("head");
       if (head == null) {
@@ -491,7 +504,6 @@ class EnFunctionCallbacks {
       if (head == null) {
         head = parser.title;
       }
-      parser.titleAppended = true;
       
       namedArgs.keySet().removeAll(EnParser.USELESS_WIKI_ARGS);
 
@@ -503,7 +515,11 @@ class EnFunctionCallbacks {
       final String g2 = namedArgs.remove("g2");
       final String g3 = namedArgs.remove("g3");
 
-      appendAndIndexWikiCallback.dispatch(head, EntryTypeName.WIKTIONARY_TITLE_MULTI);
+      // We might have already taken care of this in a generic way...
+      if (!parser.titleAppended) {
+        appendAndIndexWikiCallback.dispatch(head, EntryTypeName.WIKTIONARY_TITLE_MULTI);
+        parser.titleAppended = true;
+      }
 
       if (g != null) {
         appendAndIndexWikiCallback.builder.append(" {").append(g);
@@ -591,5 +607,9 @@ class EnFunctionCallbacks {
       return false;
     }
   }
+  
+  // -----------------------------------------------------------------------
+  // Italian stuff
+  // -----------------------------------------------------------------------
 
   }
\ No newline at end of file