1 package com.hughes.android.dictionary.parser.enwiktionary;
3 import java.util.ArrayList;
4 import java.util.LinkedHashMap;
8 import com.hughes.android.dictionary.engine.EntryTypeName;
9 import com.hughes.android.dictionary.engine.IndexBuilder;
10 import com.hughes.android.dictionary.engine.IndexedEntry;
11 import com.hughes.android.dictionary.parser.WikiTokenizer;
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 = entryTypeName;
39 WikiTokenizer.dispatch(wikiText, false, this);
40 this.indexBuilder = oldIndexBuilder;
41 this.entryTypeName = oldEntryTypeName;
44 public void dispatch(final String wikiText, final EntryTypeName entryTypeName) {
45 dispatch(wikiText, this.indexBuilder, entryTypeName);
50 public void onPlainText(final String plainText) {
51 // The only non-recursive callback. Just appends to the builder, and indexes.
52 builder.append(plainText);
53 if (indexBuilder != null && entryTypeName != null) {
54 indexBuilder.addEntryWithString(indexedEntry, plainText, entryTypeName);
59 public void onWikiLink(WikiTokenizer wikiTokenizer) {
60 final String wikiText = wikiTokenizer.wikiLinkText();
62 final String linkDest = wikiTokenizer.wikiLinkDest();
63 if (linkDest != null) {
64 System.out.println("linkDest: " + linkDest);
65 // TODO: Check for English before appending.
66 // TODO: Could also index under link dest, too.
68 dispatch(wikiText, EntryTypeName.WIKTIONARY_TRANSLATION_WIKI_TEXT);
72 public void onFunction(
73 final WikiTokenizer wikiTokenizer,
75 final List<String> args,
76 final Map<String, String> namedArgs) {
78 final FunctionCallback functionCallback = functionCallbacks.get(name);
79 if (functionCallback == null || !functionCallback.onWikiFunction(wikiTokenizer, name, args, namedArgs, parser, this)) {
80 // Default function handling:
81 final IndexBuilder oldIndexBuilder = indexBuilder;
83 builder.append("{{").append(name);
84 for (int i = 0; i < args.size(); ++i) {
86 WikiTokenizer.dispatch(args.get(i), false, this);
88 for (final Map.Entry<String, String> entry : namedArgs.entrySet()) {
90 WikiTokenizer.dispatch(entry.getKey(), false, this);
92 WikiTokenizer.dispatch(entry.getValue(), false, this);
95 indexBuilder = oldIndexBuilder;
100 public void onMarkup(WikiTokenizer wikiTokenizer) {
105 public void onComment(WikiTokenizer wikiTokenizer) {
110 public void onNewline(WikiTokenizer wikiTokenizer) {
115 public void onHeading(WikiTokenizer wikiTokenizer) {
120 public void onListItem(WikiTokenizer wikiTokenizer) {