]> gitweb.fperrin.net Git - DictionaryPC.git/blobdiff - src/com/hughes/android/dictionary/parser/wiktionary/EnFunctionCallbacks.java
Update to latest wiktionaries, update unit tests, der-top/mid/bottom.
[DictionaryPC.git] / src / com / hughes / android / dictionary / parser / wiktionary / EnFunctionCallbacks.java
index 60de2fc82c6c1c1e9ff481ae48aa1843f907d128..41ee89f735b28e2dd34293142be10b3cbc3f9641 100644 (file)
@@ -21,7 +21,9 @@ import com.hughes.android.dictionary.parser.wiktionary.AbstractWiktionaryParser.
 import com.hughes.android.dictionary.parser.wiktionary.AbstractWiktionaryParser.NameAndArgs;
 import com.hughes.util.ListUtil;
 import com.hughes.util.MapUtil;
+import com.hughes.util.StringUtil;
 
+import java.util.ArrayList;
 import java.util.Arrays;
 import java.util.LinkedHashMap;
 import java.util.LinkedHashSet;
@@ -42,6 +44,9 @@ class EnFunctionCallbacks {
       callbacks.put("p", callback);
       callbacks.put("g", callback);
       
+      callbacks.put("etyl", new etyl<T>());
+      callbacks.put("term", new term<T>());
+      
       callback = new EncodingCallback<T>();
       Set<String> encodings = new LinkedHashSet<String>(Arrays.asList(
           "IPA", "IPAchar",  // Not really encodings, but it works.
@@ -66,7 +71,17 @@ class EnFunctionCallbacks {
       callbacks.put("zh-attention", callback);
       callbacks.put("top2", callback);
       callbacks.put("mid2", callback);
+      callbacks.put("top3", callback);
+      callbacks.put("mid3", callback);
       callbacks.put("bottom", callback);
+      callbacks.put("rel-mid", callback);
+      callbacks.put("rel-mid3", callback);
+      callbacks.put("rel-mid4", callback);
+      callbacks.put("rel-bottom", callback);
+      callbacks.put("der-top", callback);
+      callbacks.put("der-mid", callback);
+      callbacks.put("der-mid3", callback);
+      callbacks.put("der-bottom", callback);
       
       callback = new AppendName<T>();
       callbacks.put("...", callback);
@@ -601,6 +616,99 @@ class EnFunctionCallbacks {
     }
   }
   
+  static final class etyl<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 T parser,
+          final AppendAndIndexWikiCallback<T> appendAndIndexWikiCallback) {
+        final String langCode = ListUtil.get(args, 0);
+        if (langCode == null) {
+            return false;
+        }
+        String langName = WiktionaryLangs.getEnglishName(langCode);
+        if (langName != null) {
+            appendAndIndexWikiCallback.dispatch(langName, null);
+        } else {
+            appendAndIndexWikiCallback.dispatch("lang:" + langCode, null);
+        }
+        return true;
+      }
+  }
+
+  static final class term<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 T parser,
+          final AppendAndIndexWikiCallback<T> appendAndIndexWikiCallback) {
+        namedArgs.remove("sc");
+        
+        // Main text.
+        final String lang = namedArgs.remove("lang");
+        String head = ListUtil.get(args, 0);
+        String display = ListUtil.get(args, 1);
+        if (StringUtil.isNullOrEmpty(head) && StringUtil.isNullOrEmpty(display)) {
+            head = display = parser.title;
+        }
+        if (StringUtil.isNullOrEmpty(head)) {
+            // Dispatches formatted wiki text.
+            appendAndIndexWikiCallback.dispatch(display, null);
+        } else {
+            if (StringUtil.isNullOrEmpty(display)) {
+                display = head;
+            }
+            appendAndIndexWikiCallback.dispatch(String.format("[[%s|%s]]", display, head), null);
+        }
+        
+        // Stuff in ()s.
+        final String tr = namedArgs.remove("tr");
+        final String pos = namedArgs.remove("pos");
+        String gloss = ListUtil.get(args, 2);
+        String literally = namedArgs.remove("lit");
+        if (!StringUtil.isNullOrEmpty(gloss)) {
+            gloss = String.format("\"%s\"", gloss);
+        }
+        if (!StringUtil.isNullOrEmpty(literally)) {
+            literally = String.format("literally %s", literally);
+        }
+        final List<String> inParens = new ArrayList<String>(Arrays.asList(tr, pos, gloss, literally));
+        cleanList(inParens);
+        appendCommaSeparatedList(appendAndIndexWikiCallback, inParens);
+        
+        if (tr != null) {
+            parser.addLinkToCurrentEntry(tr, lang, EntryTypeName.WIKTIONARY_MENTIONED);
+        }
+        return namedArgs.isEmpty();
+      }
+
+    private void appendCommaSeparatedList(
+            final AppendAndIndexWikiCallback<T> appendAndIndexWikiCallback,
+            final List<String> inParens) {
+        if (!inParens.isEmpty()) {
+            appendAndIndexWikiCallback.dispatch(" (", null);
+            for (int i = 0; i < inParens.size(); ++i) {
+                if (i > 0) {
+                    appendAndIndexWikiCallback.dispatch(", ", null);
+                }
+                appendAndIndexWikiCallback.dispatch(inParens.get(i), null);
+            }
+            appendAndIndexWikiCallback.dispatch(")", null);
+        }
+    }
+
+  }
+
+  private static void cleanList(List<String> asList) {
+      int pos;
+      while ((pos = asList.indexOf("")) != -1) {
+          asList.remove(pos);
+      }
+      while ((pos = asList.indexOf(null)) != -1) {
+          asList.remove(pos);
+      }
+  }
+
 
   static {
     DEFAULT.put("it-noun", new it_noun());
@@ -659,49 +767,6 @@ class EnFunctionCallbacks {
   // Italian stuff
   // -----------------------------------------------------------------------
   
-  static void passThroughOrFillIn(final Map<String,String> namedArgs, final String key, final String fillIn, final boolean quoteToEmpty) {
-      final String value = namedArgs.get(key);
-      if (quoteToEmpty && "''".equals(value)) {
-          namedArgs.put(key, "");
-          return;
-      }
-      if (value == null || value.equals("")) {
-          namedArgs.put(key, fillIn);
-      }
-  }
-  
-  static final List<String> it_number_s_p = Arrays.asList("s", "p");
-  static final List<String> it_person_1_2_3 = Arrays.asList("1", "2", "3");
-  static final List<String> it_reflexive_pronouns = Arrays.asList("mi ", "ti ", "si ", "ci ", "vi ", "si ");
-  static final List<String> it_empty = Arrays.asList("", "", "", "", "", "");
-  static void it_conj_passMood(final Map<String,String> namedArgs, final String moodName, final boolean quoteToEmpty, final String root, final List<String> suffixes) {
-      assert suffixes.size() == 6;
-      int i = 0;
-      for (final String number : it_number_s_p) {
-          for (final String person : it_person_1_2_3) {
-              passThroughOrFillIn(namedArgs, String.format("%s%s%s", moodName, person, number), root + suffixes.get(i), quoteToEmpty);
-              ++i;
-          }
-      }
-  }
-
-  private static <T extends AbstractWiktionaryParser> void outputKeyVariations(AppendAndIndexWikiCallback<T> appendAndIndexWikiCallback,
-        final StringBuilder builder, final String keyBase, Map<String, String> namedArgs, boolean isForm) {
-    for (int suffix = 0; suffix <= 4; ++suffix) {
-        final String key = suffix == 0 ? keyBase : keyBase + suffix;
-        final String val = namedArgs.remove(key);
-        if (val != null) {
-            if (suffix > 0) {
-                builder.append(", ");
-            }
-            appendAndIndexWikiCallback.dispatch(val, null);
-            if (isForm) {
-                appendAndIndexWikiCallback.parser.addLinkToCurrentEntry(val, EntryTypeName.WIKTIONARY_INFLECTED_FORM_MULTI);
-            }
-        }
-    }
-  }
-
 static final class it_conj_are<T extends AbstractWiktionaryParser> implements FunctionCallback<T> {
     final it_conj<T> dest;
     it_conj_are(it_conj<T> dest) {
@@ -1112,4 +1177,49 @@ static final class it_conj_are<T extends AbstractWiktionaryParser> implements Fu
             builder.append("</tr>\n");
         }
     }
+  
+  static void passThroughOrFillIn(final Map<String,String> namedArgs, final String key, final String fillIn, final boolean quoteToEmpty) {
+      final String value = namedArgs.get(key);
+      if (quoteToEmpty && "''".equals(value)) {
+          namedArgs.put(key, "");
+          return;
+      }
+      if (value == null || value.equals("")) {
+          namedArgs.put(key, fillIn);
+      }
+  }
+  
+  static final List<String> it_number_s_p = Arrays.asList("s", "p");
+  static final List<String> it_person_1_2_3 = Arrays.asList("1", "2", "3");
+  static final List<String> it_reflexive_pronouns = Arrays.asList("mi ", "ti ", "si ", "ci ", "vi ", "si ");
+  static final List<String> it_empty = Arrays.asList("", "", "", "", "", "");
+  static void it_conj_passMood(final Map<String,String> namedArgs, final String moodName, final boolean quoteToEmpty, final String root, final List<String> suffixes) {
+      assert suffixes.size() == 6;
+      int i = 0;
+      for (final String number : it_number_s_p) {
+          for (final String person : it_person_1_2_3) {
+              passThroughOrFillIn(namedArgs, String.format("%s%s%s", moodName, person, number), root + suffixes.get(i), quoteToEmpty);
+              ++i;
+          }
+      }
+  }
+
+  private static <T extends AbstractWiktionaryParser> void outputKeyVariations(AppendAndIndexWikiCallback<T> appendAndIndexWikiCallback,
+        final StringBuilder builder, final String keyBase, Map<String, String> namedArgs, boolean isForm) {
+    for (int suffix = 0; suffix <= 4; ++suffix) {
+        final String key = suffix == 0 ? keyBase : keyBase + suffix;
+        final String val = namedArgs.remove(key);
+        if (val != null && !val.trim().equals("")) {
+            if (suffix > 0) {
+                builder.append(", ");
+            }
+            appendAndIndexWikiCallback.dispatch(val, null);
+            if (isForm) {
+                appendAndIndexWikiCallback.parser.addLinkToCurrentEntry(val, null, EntryTypeName.WIKTIONARY_INFLECTED_FORM_MULTI);
+            }
+        }
+    }
+  }
+
+
 }
\ No newline at end of file