1 // Copyright 2012 Google Inc. All Rights Reserved.
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
7 // http://www.apache.org/licenses/LICENSE-2.0
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.
15 package com.hughes.android.dictionary.parser.enwiktionary;
17 import java.util.LinkedHashMap;
18 import java.util.List;
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;
27 final class AppendAndIndexWikiCallback implements WikiTokenizer.Callback {
29 final EnWiktionaryXmlParser parser;
30 StringBuilder builder;
31 IndexedEntry indexedEntry;
32 IndexBuilder indexBuilder;
33 final Map<String,FunctionCallback> functionCallbacks = new LinkedHashMap<String, FunctionCallback>();
35 boolean entryTypeNameSticks = false;
36 EntryTypeName entryTypeName = null;
38 public AppendAndIndexWikiCallback(final EnWiktionaryXmlParser parser) {
42 public void reset(final StringBuilder builder, final IndexedEntry indexedEntry) {
43 this.builder = builder;
44 this.indexedEntry = indexedEntry;
45 this.indexBuilder = null;
47 entryTypeNameSticks = false;
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);
57 if (entryTypeName == null) this.entryTypeName = null;
58 WikiTokenizer.dispatch(wikiText, false, this);
59 this.indexBuilder = oldIndexBuilder;
60 this.entryTypeName = oldEntryTypeName;
63 public void dispatch(final String wikiText, final EntryTypeName entryTypeName) {
64 dispatch(wikiText, this.indexBuilder, entryTypeName);
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);
78 public void onWikiLink(WikiTokenizer wikiTokenizer) {
79 final String text = wikiTokenizer.wikiLinkText();
80 final String link = wikiTokenizer.wikiLinkDest();
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")) {
89 //LOG.warning("Special link: " + englishTokenizer.token());
90 dispatch(text, EntryTypeName.WIKTIONARY_ENGLISH_DEF_WIKI_LINK);
94 final EntryTypeName entryTypeName;
95 switch (parser.state) {
96 case TRANSLATION_LINE:
97 entryTypeName = EntryTypeName.WIKTIONARY_TRANSLATION_WIKI_TEXT;
99 case ENGLISH_DEF_OF_FOREIGN:
100 entryTypeName = EntryTypeName.WIKTIONARY_ENGLISH_DEF_WIKI_LINK;
103 throw new IllegalStateException("Invalid enum value: " + parser.state);
105 dispatch(text, entryTypeName);
110 public void onFunction(
111 final WikiTokenizer wikiTokenizer,
113 final List<String> args,
114 final Map<String, String> namedArgs) {
116 FunctionCallback functionCallback = functionCallbacks.get(name);
117 if (functionCallback == null) {
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");
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 ? "{" : "{{");
134 final IndexBuilder oldIndexBuilder = indexBuilder;
136 FunctionCallbacksDefault.NAME_AND_ARGS.onWikiFunction(wikiTokenizer, name, args, namedArgs, parser, this);
137 indexBuilder = oldIndexBuilder;
139 builder.append(single ? "}" : "}}");
144 public void onHtml(WikiTokenizer wikiTokenizer) {
145 // Unindexed for now.
146 builder.append(wikiTokenizer.token());
150 public void onMarkup(WikiTokenizer wikiTokenizer) {
155 public void onComment(WikiTokenizer wikiTokenizer) {
160 public void onNewline(WikiTokenizer wikiTokenizer) {
165 public void onHeading(WikiTokenizer wikiTokenizer) {
170 public void onListItem(WikiTokenizer wikiTokenizer) {