]> gitweb.fperrin.net Git - DictionaryPC.git/blob - src/com/hughes/android/dictionary/parser/enwiktionary/AppendAndIndexWikiCallback.java
78c0fb3df19432459c323c3b004bd1c185215461
[DictionaryPC.git] / src / com / hughes / android / dictionary / parser / enwiktionary / AppendAndIndexWikiCallback.java
1 // Copyright 2012 Google Inc. All Rights Reserved.
2 //
3 // Licensed under the Apache License, Version 2.0 (the "License");
4 // you may not use this file except in compliance with the License.
5 // You may obtain a copy of the License at
6 //
7 //     http://www.apache.org/licenses/LICENSE-2.0
8 //
9 // Unless required by applicable law or agreed to in writing, software
10 // distributed under the License is distributed on an "AS IS" BASIS,
11 // WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
12 // See the License for the specific language governing permissions and
13 // limitations under the License.
14
15 package com.hughes.android.dictionary.parser.enwiktionary;
16
17 import java.util.LinkedHashMap;
18 import java.util.List;
19 import java.util.Map;
20
21 import com.hughes.android.dictionary.engine.EntryTypeName;
22 import com.hughes.android.dictionary.engine.IndexBuilder;
23 import com.hughes.android.dictionary.engine.IndexedEntry;
24 import com.hughes.android.dictionary.parser.WikiTokenizer;
25 import com.hughes.util.EnumUtil;
26
27 final class AppendAndIndexWikiCallback implements WikiTokenizer.Callback {
28
29   final EnWiktionaryXmlParser parser;
30   StringBuilder builder;
31   IndexedEntry indexedEntry;
32   IndexBuilder indexBuilder;
33   final Map<String,FunctionCallback> functionCallbacks = new LinkedHashMap<String, FunctionCallback>();
34   
35   boolean entryTypeNameSticks = false;
36   EntryTypeName entryTypeName = null;
37   
38   public AppendAndIndexWikiCallback(final EnWiktionaryXmlParser parser) {
39     this.parser = parser;
40   }
41   
42   public void reset(final StringBuilder builder, final IndexedEntry indexedEntry) {
43     this.builder = builder;
44     this.indexedEntry = indexedEntry;
45     this.indexBuilder = null;
46     entryTypeName = null;
47     entryTypeNameSticks = false;
48   }
49   
50   public void dispatch(final String wikiText, final IndexBuilder indexBuilder, final EntryTypeName entryTypeName) {
51     final IndexBuilder oldIndexBuilder = this.indexBuilder;
52     final EntryTypeName oldEntryTypeName = this.entryTypeName;
53     this.indexBuilder = indexBuilder;
54     if (!entryTypeNameSticks) {
55       this.entryTypeName = EnumUtil.min(entryTypeName, this.entryTypeName);
56     }
57     if (entryTypeName == null) this.entryTypeName = null;
58     WikiTokenizer.dispatch(wikiText, false, this);
59     this.indexBuilder = oldIndexBuilder;
60     this.entryTypeName = oldEntryTypeName;
61   }
62   
63   public void dispatch(final String wikiText, final EntryTypeName entryTypeName) {
64     dispatch(wikiText, this.indexBuilder, entryTypeName);
65   }
66
67   
68   @Override
69   public void onPlainText(final String plainText) {
70     // The only non-recursive callback.  Just appends to the builder, and indexes.
71     builder.append(plainText);
72     if (indexBuilder != null && entryTypeName != null && indexedEntry != null) {
73       indexBuilder.addEntryWithString(indexedEntry, plainText, entryTypeName);
74     }
75   }
76
77   @Override
78   public void onWikiLink(WikiTokenizer wikiTokenizer) {
79     final String text = wikiTokenizer.wikiLinkText();
80     final String link = wikiTokenizer.wikiLinkDest();
81     if (link != null) {
82       if (link.contains("#English")) {
83         dispatch(text, parser.enIndexBuilder, EntryTypeName.WIKTIONARY_ENGLISH_DEF_WIKI_LINK);
84       } else if (link.contains("#") && parser.langPattern.matcher(link).find()) {
85         dispatch(text, parser.foreignIndexBuilder, EntryTypeName.WIKTIONARY_ENGLISH_DEF_OTHER_LANG);
86       } else if (link.equals("plural")) {
87         builder.append(text);
88       } else {
89         //LOG.warning("Special link: " + englishTokenizer.token());
90         dispatch(text, EntryTypeName.WIKTIONARY_ENGLISH_DEF_WIKI_LINK);
91       }
92     } else {
93       // link == null
94       final EntryTypeName entryTypeName;
95       switch (parser.state) {
96       case TRANSLATION_LINE:
97         entryTypeName = EntryTypeName.WIKTIONARY_TRANSLATION_WIKI_TEXT;
98         break;
99       case ENGLISH_DEF_OF_FOREIGN:
100         entryTypeName = EntryTypeName.WIKTIONARY_ENGLISH_DEF_WIKI_LINK;
101         break;
102         default:
103           throw new IllegalStateException("Invalid enum value: " + parser.state);
104       }
105       dispatch(text, entryTypeName);
106     }
107   }
108
109   @Override
110   public void onFunction(
111       final WikiTokenizer wikiTokenizer,
112       final String name,
113       final List<String> args, 
114       final Map<String, String> namedArgs) {
115     
116     FunctionCallback functionCallback = functionCallbacks.get(name);
117     if (functionCallback == null) {
118       if (
119           name.equals("form of") || // TODO: switch to contains
120           name.contains("conjugation of") || 
121           name.contains("participle of") || 
122           name.contains("gerund of") || 
123           name.contains("feminine of") || 
124           name.contains("plural of")) {
125         functionCallback = functionCallbacks.get("form of");
126       }
127     }
128     if (functionCallback == null || !functionCallback.onWikiFunction(wikiTokenizer, name, args, namedArgs, parser, this)) {
129       // Default function handling:
130       namedArgs.keySet().removeAll(EnWiktionaryXmlParser.USELESS_WIKI_ARGS);
131       final boolean single = args.isEmpty() && namedArgs.isEmpty();
132       builder.append(single ? "{" : "{{");
133
134       final IndexBuilder oldIndexBuilder = indexBuilder;
135       indexBuilder = null;
136       FunctionCallbacksDefault.NAME_AND_ARGS.onWikiFunction(wikiTokenizer, name, args, namedArgs, parser, this);
137       indexBuilder = oldIndexBuilder;
138
139       builder.append(single ? "}" : "}}");
140     }
141   }
142
143   @Override
144   public void onHtml(WikiTokenizer wikiTokenizer) {
145     // Unindexed for now.
146     builder.append(wikiTokenizer.token());
147   }
148
149   @Override
150   public void onMarkup(WikiTokenizer wikiTokenizer) {
151     // Do nothing.
152   }
153
154   @Override
155   public void onComment(WikiTokenizer wikiTokenizer) {
156     // Do nothing.
157   }
158
159   @Override
160   public void onNewline(WikiTokenizer wikiTokenizer) {
161     assert false;
162   }
163
164   @Override
165   public void onHeading(WikiTokenizer wikiTokenizer) {
166     assert false;
167   }
168
169   @Override
170   public void onListItem(WikiTokenizer wikiTokenizer) {
171     assert false;
172   }
173
174 }