package com.hughes.android.dictionary.parser.enwiktionary;
-import java.util.ArrayList;
import java.util.LinkedHashMap;
import java.util.List;
import java.util.Map;
import com.hughes.android.dictionary.engine.IndexBuilder;
import com.hughes.android.dictionary.engine.IndexedEntry;
import com.hughes.android.dictionary.parser.WikiTokenizer;
+import com.hughes.util.EnumUtil;
final class AppendAndIndexWikiCallback implements WikiTokenizer.Callback {
final IndexBuilder oldIndexBuilder = this.indexBuilder;
final EntryTypeName oldEntryTypeName = this.entryTypeName;
this.indexBuilder = indexBuilder;
- this.entryTypeName = entryTypeName;
+ this.entryTypeName = EnumUtil.min(entryTypeName, this.entryTypeName);
+ if (entryTypeName == null) this.entryTypeName = null;
WikiTokenizer.dispatch(wikiText, false, this);
this.indexBuilder = oldIndexBuilder;
this.entryTypeName = oldEntryTypeName;
@Override
public void onWikiLink(WikiTokenizer wikiTokenizer) {
- final String wikiText = wikiTokenizer.wikiLinkText();
-
- final String linkDest = wikiTokenizer.wikiLinkDest();
- if (linkDest != null) {
- System.out.println("linkDest: " + linkDest);
- // TODO: Check for English before appending.
- // TODO: Could also index under link dest, too.
+ final String text = wikiTokenizer.wikiLinkText();
+ final String link = wikiTokenizer.wikiLinkDest();
+ if (link != null) {
+ if (link.contains("#English")) {
+ dispatch(text, parser.enIndexBuilder, EntryTypeName.WIKTIONARY_ENGLISH_DEF_WIKI_LINK);
+ } else if (link.contains("#") && parser.langPattern.matcher(link).find()) {
+ dispatch(text, parser.foreignIndexBuilder, EntryTypeName.WIKTIONARY_ENGLISH_DEF_OTHER_LANG);
+ } else if (link.equals("plural")) {
+ builder.append(text);
+ } else {
+ //LOG.warning("Special link: " + englishTokenizer.token());
+ dispatch(text, EntryTypeName.WIKTIONARY_ENGLISH_DEF_WIKI_LINK);
+ }
+ } else {
+ // link == null
+ final EntryTypeName entryTypeName;
+ switch (parser.state) {
+ case TRANSLATION_LINE:
+ entryTypeName = EntryTypeName.WIKTIONARY_TRANSLATION_WIKI_TEXT;
+ break;
+ case ENGLISH_DEF_OF_FOREIGN:
+ entryTypeName = EntryTypeName.WIKTIONARY_ENGLISH_DEF_WIKI_LINK;
+ break;
+ default:
+ throw new IllegalStateException("Invalid enum value: " + parser.state);
+ }
+ dispatch(text, entryTypeName);
}
- dispatch(wikiText, EntryTypeName.WIKTIONARY_TRANSLATION_WIKI_TEXT);
}
@Override
final List<String> args,
final Map<String, String> namedArgs) {
- final FunctionCallback functionCallback = functionCallbacks.get(name);
+ FunctionCallback functionCallback = functionCallbacks.get(name);
+ if (functionCallback == null) {
+ if (
+ name.equals("form of") ||
+ name.contains("conjugation of") ||
+ name.contains("participle of") ||
+ name.contains("gerund of") ||
+ name.contains("feminine of") ||
+ name.contains("plural of")) {
+ functionCallback = functionCallbacks.get("form of");
+ }
+ }
if (functionCallback == null || !functionCallback.onWikiFunction(wikiTokenizer, name, args, namedArgs, parser, this)) {
// Default function handling:
+ namedArgs.keySet().removeAll(EnWiktionaryXmlParser.USELESS_WIKI_ARGS);
+ final boolean single = args.isEmpty() && namedArgs.isEmpty();
+ builder.append(single ? "{" : "{{");
+
final IndexBuilder oldIndexBuilder = indexBuilder;
indexBuilder = null;
- builder.append("{{").append(name);
- for (int i = 0; i < args.size(); ++i) {
- builder.append("|");
- WikiTokenizer.dispatch(args.get(i), false, this);
- }
- for (final Map.Entry<String, String> entry : namedArgs.entrySet()) {
- builder.append("|");
- WikiTokenizer.dispatch(entry.getKey(), false, this);
- builder.append("=");
- WikiTokenizer.dispatch(entry.getValue(), false, this);
- }
- builder.append("}}");
+ FunctionCallbacksDefault.NAME_AND_ARGS.onWikiFunction(wikiTokenizer, name, args, namedArgs, parser, this);
indexBuilder = oldIndexBuilder;
+
+ builder.append(single ? "}" : "}}");
}
}