X-Git-Url: http://gitweb.fperrin.net/?a=blobdiff_plain;f=src%2Fcom%2Fhughes%2Fandroid%2Fdictionary%2Fparser%2Fwiktionary%2FEnFunctionCallbacks.java;h=9a7d748ee12c768c346b538aa866a940932702c3;hb=58fd4402729f38bf4408e8fef487a9bc359e45a0;hp=955e957536c5614d4bf83b4ff9bed7e1cd001758;hpb=972c207ed3b98a7bee6b472db1d94391f4dbf24f;p=DictionaryPC.git diff --git a/src/com/hughes/android/dictionary/parser/wiktionary/EnFunctionCallbacks.java b/src/com/hughes/android/dictionary/parser/wiktionary/EnFunctionCallbacks.java index 955e957..9a7d748 100644 --- a/src/com/hughes/android/dictionary/parser/wiktionary/EnFunctionCallbacks.java +++ b/src/com/hughes/android/dictionary/parser/wiktionary/EnFunctionCallbacks.java @@ -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()); + callbacks.put("term", new term()); + callback = new EncodingCallback(); Set encodings = new LinkedHashSet(Arrays.asList( "IPA", "IPAchar", // Not really encodings, but it works. @@ -64,6 +69,19 @@ class EnFunctionCallbacks { callbacks.put("rfquote", callback); callbacks.put("attention", callback); 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(); callbacks.put("...", callback); @@ -214,13 +232,17 @@ class EnFunctionCallbacks { final Map namedArgs, final T parser, final AppendAndIndexWikiCallback appendAndIndexWikiCallback) { - if (args.size() != 1 || !namedArgs.isEmpty()) { - EnParser.LOG.warning("weird qualifier: "); + if (!namedArgs.isEmpty()) { + EnParser.LOG.warning("weird qualifier: " + wikiTokenizer.token()); return false; } - String qualifier = args.get(0); appendAndIndexWikiCallback.builder.append("("); - appendAndIndexWikiCallback.dispatch(qualifier, null); + for (int i = 0; i < args.size(); ++i) { + appendAndIndexWikiCallback.dispatch(args.get(i), null); + if (i > 0) { + appendAndIndexWikiCallback.builder.append(", "); + } + } appendAndIndexWikiCallback.builder.append(")"); return true; } @@ -234,6 +256,7 @@ class EnFunctionCallbacks { final Map namedArgs, final T parser, final AppendAndIndexWikiCallback appendAndIndexWikiCallback) { + namedArgs.remove("lang"); if (!namedArgs.isEmpty()) { EnParser.LOG.warning("weird encoding: " + wikiTokenizer.token()); return false; @@ -597,6 +620,99 @@ class EnFunctionCallbacks { } } + static final class etyl implements FunctionCallback { + @Override + public boolean onWikiFunction(final WikiTokenizer wikiTokenizer, final String name, final List args, + final Map namedArgs, + final T parser, + final AppendAndIndexWikiCallback 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 implements FunctionCallback { + @Override + public boolean onWikiFunction(final WikiTokenizer wikiTokenizer, final String name, final List args, + final Map namedArgs, + final T parser, + final AppendAndIndexWikiCallback 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 inParens = new ArrayList(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 appendAndIndexWikiCallback, + final List 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 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()); @@ -617,6 +733,18 @@ class EnFunctionCallbacks { appendAndIndexWikiCallback.builder.append(" {").append(gender).append("}, "); appendAndIndexWikiCallback.dispatch(plural, null, null); appendAndIndexWikiCallback.builder.append(" {pl}"); + final String f = namedArgs.remove("f"); + if (f != null) { + appendAndIndexWikiCallback.builder.append(", "); + appendAndIndexWikiCallback.dispatch(f, null, null); + appendAndIndexWikiCallback.builder.append(" {f}"); + } + final String m = namedArgs.remove("f"); + if (m != null) { + appendAndIndexWikiCallback.builder.append(", "); + appendAndIndexWikiCallback.dispatch(m, null, null); + appendAndIndexWikiCallback.builder.append(" {m}"); + } parser.wordForms.add(singular); parser.wordForms.add(plural); if (!namedArgs.isEmpty() || args.size() > 4) { @@ -643,49 +771,6 @@ class EnFunctionCallbacks { // Italian stuff // ----------------------------------------------------------------------- - static void passThroughOrFillIn(final Map 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 it_number_s_p = Arrays.asList("s", "p"); - static final List it_person_1_2_3 = Arrays.asList("1", "2", "3"); - static final List it_reflexive_pronouns = Arrays.asList("mi ", "ti ", "si ", "ci ", "vi ", "si "); - static final List it_empty = Arrays.asList("", "", "", "", "", ""); - static void it_conj_passMood(final Map namedArgs, final String moodName, final boolean quoteToEmpty, final String root, final List 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 void outputKeyVariations(AppendAndIndexWikiCallback appendAndIndexWikiCallback, - final StringBuilder builder, final String keyBase, Map 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 implements FunctionCallback { final it_conj dest; it_conj_are(it_conj dest) { @@ -1060,7 +1145,14 @@ static final class it_conj_are implements Fu if (!namedArgs.isEmpty()) { System.err.println("NON-EMPTY namedArgs: " + namedArgs); - assert false; + if ("muovesse".equals(namedArgs.get("impsib3s2"))) { + return false; + } + if ("percuotesse".equals(namedArgs.get("impsib3s2"))) { + return false; + } + // Too many to deal with: + //assert false; return false; } @@ -1089,4 +1181,49 @@ static final class it_conj_are implements Fu builder.append("\n"); } } + + static void passThroughOrFillIn(final Map 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 it_number_s_p = Arrays.asList("s", "p"); + static final List it_person_1_2_3 = Arrays.asList("1", "2", "3"); + static final List it_reflexive_pronouns = Arrays.asList("mi ", "ti ", "si ", "ci ", "vi ", "si "); + static final List it_empty = Arrays.asList("", "", "", "", "", ""); + static void it_conj_passMood(final Map namedArgs, final String moodName, final boolean quoteToEmpty, final String root, final List 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 void outputKeyVariations(AppendAndIndexWikiCallback appendAndIndexWikiCallback, + final StringBuilder builder, final String keyBase, Map 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