]> gitweb.fperrin.net Git - DictionaryPC.git/blob - src/com/hughes/android/dictionary/parser/enwiktionary/AppendAndIndexWikiCallback.java
Fixing goldens after refactoring.
[DictionaryPC.git] / src / com / hughes / android / dictionary / parser / enwiktionary / AppendAndIndexWikiCallback.java
1 package com.hughes.android.dictionary.parser.enwiktionary;
2
3 import java.util.LinkedHashMap;
4 import java.util.List;
5 import java.util.Map;
6
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;
12
13 final class AppendAndIndexWikiCallback implements WikiTokenizer.Callback {
14
15   final EnWiktionaryXmlParser parser;
16   StringBuilder builder;
17   IndexedEntry indexedEntry;
18   IndexBuilder indexBuilder;
19   final Map<String,FunctionCallback> functionCallbacks = new LinkedHashMap<String, FunctionCallback>();
20   
21   EntryTypeName entryTypeName = null;
22   
23   public AppendAndIndexWikiCallback(final EnWiktionaryXmlParser parser) {
24     this.parser = parser;
25   }
26   
27   public void reset(final StringBuilder builder, final IndexedEntry indexedEntry) {
28     this.builder = builder;
29     this.indexedEntry = indexedEntry;
30     this.indexBuilder = null;
31     entryTypeName = null;
32   }
33   
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;
43   }
44   
45   public void dispatch(final String wikiText, final EntryTypeName entryTypeName) {
46     dispatch(wikiText, this.indexBuilder, entryTypeName);
47   }
48
49   
50   @Override
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);
56     }
57   }
58
59   @Override
60   public void onWikiLink(WikiTokenizer wikiTokenizer) {
61     final String text = wikiTokenizer.wikiLinkText();
62     final String link = wikiTokenizer.wikiLinkDest();
63     if (link != null) {
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")) {
69         builder.append(text);
70       } else {
71         //LOG.warning("Special link: " + englishTokenizer.token());
72         dispatch(text, EntryTypeName.WIKTIONARY_ENGLISH_DEF_WIKI_LINK);
73       }
74     } else {
75       // link == null
76       final EntryTypeName entryTypeName;
77       switch (parser.state) {
78       case TRANSLATION_LINE:
79         entryTypeName = EntryTypeName.WIKTIONARY_TRANSLATION_WIKI_TEXT;
80         break;
81       case ENGLISH_DEF_OF_FOREIGN:
82         entryTypeName = EntryTypeName.WIKTIONARY_ENGLISH_DEF_WIKI_LINK;
83         break;
84         default:
85           throw new IllegalStateException("Invalid enum value: " + parser.state);
86       }
87       dispatch(text, entryTypeName);
88     }
89   }
90
91   @Override
92   public void onFunction(
93       final WikiTokenizer wikiTokenizer,
94       final String name,
95       final List<String> args, 
96       final Map<String, String> namedArgs) {
97     
98     FunctionCallback functionCallback = functionCallbacks.get(name);
99     if (functionCallback == null) {
100       if (
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");
108       }
109     }
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 ? "{" : "{{");
115
116       final IndexBuilder oldIndexBuilder = indexBuilder;
117       indexBuilder = null;
118       FunctionCallbacksDefault.NAME_AND_ARGS.onWikiFunction(wikiTokenizer, name, args, namedArgs, parser, this);
119       indexBuilder = oldIndexBuilder;
120
121       builder.append(single ? "}" : "}}");
122     }
123   }
124
125   @Override
126   public void onMarkup(WikiTokenizer wikiTokenizer) {
127     // Do nothing.
128   }
129
130   @Override
131   public void onComment(WikiTokenizer wikiTokenizer) {
132     // Do nothing.
133   }
134
135   @Override
136   public void onNewline(WikiTokenizer wikiTokenizer) {
137     assert false;
138   }
139
140   @Override
141   public void onHeading(WikiTokenizer wikiTokenizer) {
142     assert false;
143   }
144
145   @Override
146   public void onListItem(WikiTokenizer wikiTokenizer) {
147     assert false;
148   }
149
150 }