1 package com.hughes.android.dictionary.parser.enwiktionary;
3 import java.util.LinkedHashMap;
7 import com.hughes.android.dictionary.engine.EntryTypeName;
8 import com.hughes.android.dictionary.engine.IndexBuilder;
9 import com.hughes.android.dictionary.engine.IndexedEntry;
10 import com.hughes.android.dictionary.parser.WikiTokenizer;
11 import com.hughes.util.EnumUtil;
13 final class AppendAndIndexWikiCallback implements WikiTokenizer.Callback {
15 final EnWiktionaryXmlParser parser;
16 StringBuilder builder;
17 IndexedEntry indexedEntry;
18 IndexBuilder indexBuilder;
19 final Map<String,FunctionCallback> functionCallbacks = new LinkedHashMap<String, FunctionCallback>();
21 EntryTypeName entryTypeName = null;
23 public AppendAndIndexWikiCallback(final EnWiktionaryXmlParser parser) {
27 public void reset(final StringBuilder builder, final IndexedEntry indexedEntry) {
28 this.builder = builder;
29 this.indexedEntry = indexedEntry;
30 this.indexBuilder = null;
34 public void dispatch(final String wikiText, final IndexBuilder indexBuilder, final EntryTypeName entryTypeName) {
35 final IndexBuilder oldIndexBuilder = this.indexBuilder;
36 final EntryTypeName oldEntryTypeName = this.entryTypeName;
37 this.indexBuilder = indexBuilder;
38 this.entryTypeName = EnumUtil.min(entryTypeName, this.entryTypeName);
39 if (entryTypeName == null) this.entryTypeName = null;
40 WikiTokenizer.dispatch(wikiText, false, this);
41 this.indexBuilder = oldIndexBuilder;
42 this.entryTypeName = oldEntryTypeName;
45 public void dispatch(final String wikiText, final EntryTypeName entryTypeName) {
46 dispatch(wikiText, this.indexBuilder, entryTypeName);
51 public void onPlainText(final String plainText) {
52 // The only non-recursive callback. Just appends to the builder, and indexes.
53 builder.append(plainText);
54 if (indexBuilder != null && entryTypeName != null) {
55 indexBuilder.addEntryWithString(indexedEntry, plainText, entryTypeName);
60 public void onWikiLink(WikiTokenizer wikiTokenizer) {
61 final String text = wikiTokenizer.wikiLinkText();
62 final String link = wikiTokenizer.wikiLinkDest();
64 if (link.contains("#English")) {
65 dispatch(text, parser.enIndexBuilder, EntryTypeName.WIKTIONARY_ENGLISH_DEF_WIKI_LINK);
66 } else if (link.contains("#") && parser.langPattern.matcher(link).find()) {
67 dispatch(text, parser.foreignIndexBuilder, EntryTypeName.WIKTIONARY_ENGLISH_DEF_OTHER_LANG);
68 } else if (link.equals("plural")) {
71 //LOG.warning("Special link: " + englishTokenizer.token());
72 dispatch(text, EntryTypeName.WIKTIONARY_ENGLISH_DEF_WIKI_LINK);
76 final EntryTypeName entryTypeName;
77 switch (parser.state) {
78 case TRANSLATION_LINE:
79 entryTypeName = EntryTypeName.WIKTIONARY_TRANSLATION_WIKI_TEXT;
81 case ENGLISH_DEF_OF_FOREIGN:
82 entryTypeName = EntryTypeName.WIKTIONARY_ENGLISH_DEF_WIKI_LINK;
85 throw new IllegalStateException("Invalid enum value: " + parser.state);
87 dispatch(text, entryTypeName);
92 public void onFunction(
93 final WikiTokenizer wikiTokenizer,
95 final List<String> args,
96 final Map<String, String> namedArgs) {
98 FunctionCallback functionCallback = functionCallbacks.get(name);
99 if (functionCallback == null) {
101 name.equals("form of") ||
102 name.contains("conjugation of") ||
103 name.contains("participle of") ||
104 name.contains("gerund of") ||
105 name.contains("feminine of") ||
106 name.contains("plural of")) {
107 functionCallback = functionCallbacks.get("form of");
110 if (functionCallback == null || !functionCallback.onWikiFunction(wikiTokenizer, name, args, namedArgs, parser, this)) {
111 // Default function handling:
112 namedArgs.keySet().removeAll(EnWiktionaryXmlParser.USELESS_WIKI_ARGS);
113 final boolean single = args.isEmpty() && namedArgs.isEmpty();
114 builder.append(single ? "{" : "{{");
116 final IndexBuilder oldIndexBuilder = indexBuilder;
118 FunctionCallbacksDefault.NAME_AND_ARGS.onWikiFunction(wikiTokenizer, name, args, namedArgs, parser, this);
119 indexBuilder = oldIndexBuilder;
121 builder.append(single ? "}" : "}}");
126 public void onMarkup(WikiTokenizer wikiTokenizer) {
131 public void onComment(WikiTokenizer wikiTokenizer) {
136 public void onNewline(WikiTokenizer wikiTokenizer) {
141 public void onHeading(WikiTokenizer wikiTokenizer) {
146 public void onListItem(WikiTokenizer wikiTokenizer) {