]> gitweb.fperrin.net Git - DictionaryPC.git/blob - src/com/hughes/android/dictionary/parser/enwiktionary/FunctionCallbacksDefault.java
Fixing goldens after refactoring.
[DictionaryPC.git] / src / com / hughes / android / dictionary / parser / enwiktionary / FunctionCallbacksDefault.java
1 package com.hughes.android.dictionary.parser.enwiktionary;
2
3 import java.util.Arrays;
4 import java.util.LinkedHashMap;
5 import java.util.LinkedHashSet;
6 import java.util.List;
7 import java.util.Map;
8 import java.util.Set;
9 import java.util.logging.Logger;
10
11 import com.hughes.android.dictionary.engine.EntryTypeName;
12 import com.hughes.android.dictionary.parser.WikiTokenizer;
13 import com.hughes.util.ListUtil;
14
15 public final class FunctionCallbacksDefault {
16   
17   static final Logger LOG = Logger.getLogger(EnWiktionaryXmlParser.class.getName());
18   
19   static final Map<String,FunctionCallback> DEFAULT = new LinkedHashMap<String, FunctionCallback>();
20   static {
21     FunctionCallback callback = new TranslationCallback();
22     DEFAULT.put("t", callback);
23     DEFAULT.put("t+", callback);
24     DEFAULT.put("t-", callback);
25     DEFAULT.put("tø", callback);
26     DEFAULT.put("apdx-t", callback);
27     
28     DEFAULT.put("qualifier", new QualifierCallback());
29
30     callback = new EncodingCallback();
31     Set<String> encodings = new LinkedHashSet<String>(Arrays.asList(
32         "zh-ts", "zh-tsp",
33         "sd-Arab", "ku-Arab", "Arab", "unicode", "Laoo", "ur-Arab", "Thai", 
34         "fa-Arab", "Khmr", "Cyrl", "IPAchar", "ug-Arab", "ko-inline", 
35         "Jpan", "Kore", "Hebr", "rfscript", "Beng", "Mong", "Knda", "Cyrs",
36         "yue-tsj", "Mlym", "Tfng", "Grek", "yue-yue-j"));
37     for (final String encoding : encodings) {
38       DEFAULT.put(encoding, callback);
39     }
40     
41     callback = new Gender();
42     DEFAULT.put("m", callback);
43     DEFAULT.put("f", callback);
44     DEFAULT.put("n", callback);
45     DEFAULT.put("p", callback);
46     DEFAULT.put("g", callback);
47
48     DEFAULT.put("l", new l());
49     DEFAULT.put("italbrac", new italbrac());
50     DEFAULT.put("gloss", new gloss());
51
52     callback = new AppendArg0();
53     DEFAULT.put("term", callback);
54
55     callback = new Ignore();
56     DEFAULT.put("trreq", callback);
57     DEFAULT.put("t-image", callback);
58     DEFAULT.put("defn", callback);
59     DEFAULT.put("rfdef", callback);
60
61     DEFAULT.put("not used", new not_used());
62     
63     DEFAULT.put("form of", new FormOf());
64   }
65
66   
67   static final class NameAndArgs implements FunctionCallback {
68     @Override
69     public boolean onWikiFunction(final WikiTokenizer wikiTokenizer, final String name, final List<String> args,
70         final Map<String, String> namedArgs, final EnWiktionaryXmlParser parser,
71         final AppendAndIndexWikiCallback appendAndIndexWikiCallback) {
72       
73       appendAndIndexWikiCallback.builder.append(name);
74       for (int i = 0; i < args.size(); ++i) {
75         if (args.get(i).length() > 0) {
76           appendAndIndexWikiCallback.builder.append("|");
77           appendAndIndexWikiCallback.dispatch(args.get(i), null, null);
78         }
79       }
80       for (final Map.Entry<String, String> entry : namedArgs.entrySet()) {
81         appendAndIndexWikiCallback.builder.append("|");
82         appendAndIndexWikiCallback.dispatch(entry.getKey(), null, null);
83         appendAndIndexWikiCallback.builder.append("=");
84         appendAndIndexWikiCallback.dispatch(entry.getValue(), null, null);
85       }
86       return true;
87     }
88   }
89   static NameAndArgs NAME_AND_ARGS = new NameAndArgs();
90
91   // ------------------------------------------------------------------
92
93   static final class TranslationCallback implements FunctionCallback {
94     @Override
95     public boolean onWikiFunction(final WikiTokenizer wikiTokenizer, final String name, final List<String> args,
96         final Map<String, String> namedArgs, final EnWiktionaryXmlParser parser,
97         final AppendAndIndexWikiCallback appendAndIndexWikiCallback) {
98
99       final String transliteration = namedArgs.remove("tr");
100       namedArgs.keySet().removeAll(EnWiktionaryXmlParser.USELESS_WIKI_ARGS);
101       if (args.size() < 2) {
102         LOG.warning("{{t...}} with wrong args: title=" + parser.title);
103         return false;
104       }
105       final String langCode = ListUtil.get(args, 0);
106       final String word = ListUtil.get(args, 1);
107       final String gender = ListUtil.get(args, 2);
108       // TODO: deal with second (and third...) gender, and alt.
109       
110       appendAndIndexWikiCallback.dispatch(word, EntryTypeName.WIKTIONARY_TITLE_MULTI);
111       
112       if (gender != null) {
113         appendAndIndexWikiCallback.builder.append(String.format(" {%s}", gender));
114       }
115       if (transliteration != null) {
116         appendAndIndexWikiCallback.builder.append(" (tr. ");
117         appendAndIndexWikiCallback.dispatch(transliteration, EntryTypeName.WIKTIONARY_TRANSLITERATION);
118         appendAndIndexWikiCallback.builder.append(")");
119       }
120       return true;
121     }
122     
123   }
124
125   // ------------------------------------------------------------------
126   
127   static final class QualifierCallback implements FunctionCallback {
128     @Override
129     public boolean onWikiFunction(final WikiTokenizer wikiTokenizer, final String name, final List<String> args,
130         final Map<String, String> namedArgs,
131         final EnWiktionaryXmlParser parser,
132         final AppendAndIndexWikiCallback appendAndIndexWikiCallback) {
133       if (args.size() != 1 || !namedArgs.isEmpty()) {
134         LOG.warning("weird qualifier: ");
135         return false;
136       }
137       String qualifier = args.get(0);
138       appendAndIndexWikiCallback.builder.append("(");
139       appendAndIndexWikiCallback.dispatch(qualifier, null);
140       appendAndIndexWikiCallback.builder.append(")");
141       return true;
142     }
143   }
144
145   // ------------------------------------------------------------------
146   
147   static final class EncodingCallback implements FunctionCallback {
148     @Override
149     public boolean onWikiFunction(final WikiTokenizer wikiTokenizer, final String name, final List<String> args,
150         final Map<String, String> namedArgs,
151         final EnWiktionaryXmlParser parser,
152         final AppendAndIndexWikiCallback appendAndIndexWikiCallback) {
153       if (args.size() != 1 || !namedArgs.isEmpty()) {
154         LOG.warning("weird encoding: " + wikiTokenizer.token());
155       }
156       final String wikiText = args.get(0);
157       appendAndIndexWikiCallback.dispatch(wikiText, appendAndIndexWikiCallback.entryTypeName);
158       return true;
159     }
160   }
161
162   // ------------------------------------------------------------------
163   
164   static final class Gender implements FunctionCallback {
165     @Override
166     public boolean onWikiFunction(final WikiTokenizer wikiTokenizer, final String name, final List<String> args,
167         final Map<String, String> namedArgs,
168         final EnWiktionaryXmlParser parser,
169         final AppendAndIndexWikiCallback appendAndIndexWikiCallback) {
170       if (!namedArgs.isEmpty()) {
171         return false;
172       }
173       appendAndIndexWikiCallback.builder.append("{");
174       appendAndIndexWikiCallback.builder.append(name);
175       for (int i = 0; i < args.size(); ++i) {
176         appendAndIndexWikiCallback.builder.append("|").append(args.get(i));
177       }
178       appendAndIndexWikiCallback.builder.append("}");
179       return true;
180     }
181   }
182
183   // ------------------------------------------------------------------
184   
185   static final class l implements FunctionCallback {
186     @Override
187     public boolean onWikiFunction(final WikiTokenizer wikiTokenizer, final String name, final List<String> args,
188         final Map<String, String> namedArgs,
189         final EnWiktionaryXmlParser parser,
190         final AppendAndIndexWikiCallback appendAndIndexWikiCallback) {
191       // TODO: rewrite this!
192       // encodes text in various langs.
193       // lang is arg 0.
194       // 
195       final EntryTypeName entryTypeName;
196       switch (parser.state) {
197       case TRANSLATION_LINE: entryTypeName = EntryTypeName.WIKTIONARY_TRANSLATION_OTHER_TEXT; break;
198       case ENGLISH_DEF_OF_FOREIGN: entryTypeName = EntryTypeName.WIKTIONARY_ENGLISH_DEF_WIKI_LINK; break;
199       default: throw new IllegalStateException("Invalid enum value: " + parser.state);
200       }
201       final String langCode = args.get(0);
202       if ("en".equals(langCode)) {
203         appendAndIndexWikiCallback.dispatch(args.get(1), parser.enIndexBuilder, entryTypeName);
204       } else {
205         appendAndIndexWikiCallback.dispatch(args.get(1), parser.foreignIndexBuilder, entryTypeName);
206       }
207       // TODO: transliteration
208       return true;
209     }
210   }
211
212   // ------------------------------------------------------------------
213   
214   static final class AppendArg0 implements FunctionCallback {
215     @Override
216     public boolean onWikiFunction(final WikiTokenizer wikiTokenizer, final String name, final List<String> args,
217         final Map<String, String> namedArgs,
218         final EnWiktionaryXmlParser parser,
219         final AppendAndIndexWikiCallback appendAndIndexWikiCallback) {
220       if (args.size() != 1 || !namedArgs.isEmpty()) {
221         return false;
222       }
223       appendAndIndexWikiCallback.dispatch(args.get(0), EntryTypeName.WIKTIONARY_TRANSLATION_OTHER_TEXT);
224       // TODO: transliteration
225       return true;
226     }
227   }
228
229   // ------------------------------------------------------------------
230   
231   static final class italbrac implements FunctionCallback {
232     @Override
233     public boolean onWikiFunction(final WikiTokenizer wikiTokenizer, final String name, final List<String> args,
234         final Map<String, String> namedArgs,
235         final EnWiktionaryXmlParser parser,
236         final AppendAndIndexWikiCallback appendAndIndexWikiCallback) {
237       if (args.size() != 1 || !namedArgs.isEmpty()) {
238         return false;
239       }
240       appendAndIndexWikiCallback.builder.append("[");
241       appendAndIndexWikiCallback.dispatch(args.get(0), EntryTypeName.WIKTIONARY_TRANSLATION_OTHER_TEXT);
242       appendAndIndexWikiCallback.builder.append("]");
243       return true;
244     }
245   }
246
247   // ------------------------------------------------------------------
248   
249   static final class gloss implements FunctionCallback {
250     @Override
251     public boolean onWikiFunction(final WikiTokenizer wikiTokenizer, final String name, final List<String> args,
252         final Map<String, String> namedArgs,
253         final EnWiktionaryXmlParser parser,
254         final AppendAndIndexWikiCallback appendAndIndexWikiCallback) {
255       if (args.size() != 1 || !namedArgs.isEmpty()) {
256         return false;
257       }
258       appendAndIndexWikiCallback.builder.append("[");
259       appendAndIndexWikiCallback.dispatch(args.get(0), EntryTypeName.WIKTIONARY_TRANSLATION_OTHER_TEXT);
260       appendAndIndexWikiCallback.builder.append("]");
261       return true;
262     }
263   }
264   
265   // ------------------------------------------------------------------
266   
267   static final class Ignore implements FunctionCallback {
268     @Override
269     public boolean onWikiFunction(final WikiTokenizer wikiTokenizer, final String name, final List<String> args,
270         final Map<String, String> namedArgs,
271         final EnWiktionaryXmlParser parser,
272         final AppendAndIndexWikiCallback appendAndIndexWikiCallback) {
273       return true;
274     }
275   }
276
277   // ------------------------------------------------------------------
278   
279   static final class not_used implements FunctionCallback {
280     @Override
281     public boolean onWikiFunction(final WikiTokenizer wikiTokenizer, final String name, final List<String> args,
282         final Map<String, String> namedArgs,
283         final EnWiktionaryXmlParser parser,
284         final AppendAndIndexWikiCallback appendAndIndexWikiCallback) {
285       appendAndIndexWikiCallback.builder.append("(not used)");
286       return true;
287     }
288   }
289
290   
291   // --------------------------------------------------------------------
292   // --------------------------------------------------------------------
293   
294
295   static final class FormOf implements FunctionCallback {
296     @Override
297     public boolean onWikiFunction(final WikiTokenizer wikiTokenizer, final String name, final List<String> args,
298         final Map<String, String> namedArgs,
299         final EnWiktionaryXmlParser parser,
300         final AppendAndIndexWikiCallback appendAndIndexWikiCallback) {
301       String formName = name;
302       if (name.equals("form of")) {
303         formName = ListUtil.remove(args, 0, null);
304       }
305       if (formName == null) {
306         LOG.warning("Missing form name: " + parser.title);
307         formName = "form of";
308       }
309       String baseForm = ListUtil.get(args, 1, "");
310       if ("".equals(baseForm)) {
311         baseForm = ListUtil.get(args, 0, null);
312         ListUtil.remove(args, 1, "");
313       } else {
314         ListUtil.remove(args, 0, null);
315       }
316       namedArgs.keySet().removeAll(EnWiktionaryXmlParser.USELESS_WIKI_ARGS);
317       
318       appendAndIndexWikiCallback.builder.append("{");
319       NAME_AND_ARGS.onWikiFunction(wikiTokenizer, formName, args, namedArgs, parser, appendAndIndexWikiCallback);
320       appendAndIndexWikiCallback.builder.append("}");
321       if (baseForm != null && appendAndIndexWikiCallback.indexedEntry != null) {
322         parser.foreignIndexBuilder.addEntryWithString(appendAndIndexWikiCallback.indexedEntry, baseForm, EntryTypeName.WIKTIONARY_BASE_FORM_MULTI);
323       } else {
324         // null baseForm happens in Danish.
325         LOG.warning("Null baseform: " + parser.title);
326       }
327       return true;
328     }
329   }
330   
331   static final FormOf FORM_OF = new FormOf();
332
333 }