1 package com.hughes.android.dictionary.parser.enwiktionary;
3 import java.util.Arrays;
4 import java.util.LinkedHashMap;
5 import java.util.LinkedHashSet;
9 import java.util.logging.Logger;
11 import com.hughes.android.dictionary.engine.EntryTypeName;
12 import com.hughes.android.dictionary.parser.WikiTokenizer;
13 import com.hughes.util.ListUtil;
15 public final class FunctionCallbacksDefault {
17 static final Logger LOG = Logger.getLogger(EnWiktionaryXmlParser.class.getName());
19 static final Map<String,FunctionCallback> DEFAULT = new LinkedHashMap<String, FunctionCallback>();
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);
28 DEFAULT.put("qualifier", new QualifierCallback());
30 callback = new EncodingCallback();
31 Set<String> encodings = new LinkedHashSet<String>(Arrays.asList(
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);
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);
48 DEFAULT.put("l", new l());
49 DEFAULT.put("italbrac", new italbrac());
50 DEFAULT.put("gloss", new gloss());
52 callback = new AppendArg0();
53 DEFAULT.put("term", callback);
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);
61 DEFAULT.put("not used", new not_used());
63 DEFAULT.put("form of", new FormOf());
67 static final class NameAndArgs implements FunctionCallback {
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) {
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);
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);
89 static NameAndArgs NAME_AND_ARGS = new NameAndArgs();
91 // ------------------------------------------------------------------
93 static final class TranslationCallback implements FunctionCallback {
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) {
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);
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.
110 appendAndIndexWikiCallback.dispatch(word, EntryTypeName.WIKTIONARY_TITLE_MULTI);
112 if (gender != null) {
113 appendAndIndexWikiCallback.builder.append(String.format(" {%s}", gender));
115 if (transliteration != null) {
116 appendAndIndexWikiCallback.builder.append(" (tr. ");
117 appendAndIndexWikiCallback.dispatch(transliteration, EntryTypeName.WIKTIONARY_TRANSLITERATION);
118 appendAndIndexWikiCallback.builder.append(")");
125 // ------------------------------------------------------------------
127 static final class QualifierCallback implements FunctionCallback {
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: ");
137 String qualifier = args.get(0);
138 appendAndIndexWikiCallback.builder.append("(");
139 appendAndIndexWikiCallback.dispatch(qualifier, null);
140 appendAndIndexWikiCallback.builder.append(")");
145 // ------------------------------------------------------------------
147 static final class EncodingCallback implements FunctionCallback {
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());
156 final String wikiText = args.get(0);
157 appendAndIndexWikiCallback.dispatch(wikiText, appendAndIndexWikiCallback.entryTypeName);
162 // ------------------------------------------------------------------
164 static final class Gender implements FunctionCallback {
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()) {
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));
178 appendAndIndexWikiCallback.builder.append("}");
183 // ------------------------------------------------------------------
185 static final class l implements FunctionCallback {
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.
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);
201 final String langCode = args.get(0);
202 if ("en".equals(langCode)) {
203 appendAndIndexWikiCallback.dispatch(args.get(1), parser.enIndexBuilder, entryTypeName);
205 appendAndIndexWikiCallback.dispatch(args.get(1), parser.foreignIndexBuilder, entryTypeName);
207 // TODO: transliteration
212 // ------------------------------------------------------------------
214 static final class AppendArg0 implements FunctionCallback {
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()) {
223 appendAndIndexWikiCallback.dispatch(args.get(0), EntryTypeName.WIKTIONARY_TRANSLATION_OTHER_TEXT);
224 // TODO: transliteration
229 // ------------------------------------------------------------------
231 static final class italbrac implements FunctionCallback {
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()) {
240 appendAndIndexWikiCallback.builder.append("[");
241 appendAndIndexWikiCallback.dispatch(args.get(0), EntryTypeName.WIKTIONARY_TRANSLATION_OTHER_TEXT);
242 appendAndIndexWikiCallback.builder.append("]");
247 // ------------------------------------------------------------------
249 static final class gloss implements FunctionCallback {
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()) {
258 appendAndIndexWikiCallback.builder.append("[");
259 appendAndIndexWikiCallback.dispatch(args.get(0), EntryTypeName.WIKTIONARY_TRANSLATION_OTHER_TEXT);
260 appendAndIndexWikiCallback.builder.append("]");
265 // ------------------------------------------------------------------
267 static final class Ignore implements FunctionCallback {
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) {
277 // ------------------------------------------------------------------
279 static final class not_used implements FunctionCallback {
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)");
291 // --------------------------------------------------------------------
292 // --------------------------------------------------------------------
295 static final class FormOf implements FunctionCallback {
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);
305 if (formName == null) {
306 LOG.warning("Missing form name: " + parser.title);
307 formName = "form of";
309 String baseForm = ListUtil.get(args, 1, "");
310 if ("".equals(baseForm)) {
311 baseForm = ListUtil.get(args, 0, null);
312 ListUtil.remove(args, 1, "");
314 ListUtil.remove(args, 0, null);
316 namedArgs.keySet().removeAll(EnWiktionaryXmlParser.USELESS_WIKI_ARGS);
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);
324 // null baseForm happens in Danish.
325 LOG.warning("Null baseform: " + parser.title);
331 static final FormOf FORM_OF = new FormOf();