]> gitweb.fperrin.net Git - DictionaryPC.git/blob - src/com/hughes/android/dictionary/parser/wiktionary/WholeSectionToHtmlParser.java
57f04e138aa2e5cb42d0d34406a32c0dfff7ad02
[DictionaryPC.git] / src / com / hughes / android / dictionary / parser / wiktionary / WholeSectionToHtmlParser.java
1
2 package com.hughes.android.dictionary.parser.wiktionary;
3
4 import com.hughes.android.dictionary.engine.HtmlEntry;
5 import com.hughes.android.dictionary.engine.IndexBuilder;
6 import com.hughes.android.dictionary.engine.IndexBuilder.TokenData;
7 import com.hughes.android.dictionary.engine.IndexedEntry;
8 import com.hughes.android.dictionary.parser.WikiTokenizer;
9
10 import org.apache.commons.lang3.StringEscapeUtils;
11
12 import java.util.ArrayList;
13 import java.util.List;
14 import java.util.Map;
15 import java.util.regex.Pattern;
16
17 public class WholeSectionToHtmlParser extends AbstractWiktionaryParser {
18
19     public static final String NAME = "WholeSectionToHtmlParser";
20     public static final Pattern skipSections = Pattern.compile(".*Translations.*");
21
22     final IndexBuilder titleIndexBuilder;
23
24     public WholeSectionToHtmlParser(final IndexBuilder titleIndexBuilder) {
25         this.titleIndexBuilder = titleIndexBuilder;
26
27     }
28
29     @Override
30     void parseSection(String heading, String text) {
31         HtmlEntry htmlEntry = new HtmlEntry(entrySource, StringEscapeUtils.escapeHtml3(title));
32         IndexedEntry indexedEntry = new IndexedEntry(htmlEntry);
33
34         final AppendAndIndexWikiCallback<WholeSectionToHtmlParser> callback = new AppendCallback(
35                 this);
36
37         callback.builder = new StringBuilder();
38         callback.indexedEntry = indexedEntry;
39         callback.dispatch(text, null);
40
41         htmlEntry.html = callback.builder.toString();
42         indexedEntry.isValid = true;
43
44         final TokenData tokenData = titleIndexBuilder.getOrCreateTokenData(title);
45
46         htmlEntry.addToDictionary(titleIndexBuilder.index.dict);
47         tokenData.htmlEntries.add(htmlEntry);
48         // titleIndexBuilder.addEntryWithString(indexedEntry, title,
49         // EntryTypeName.WIKTIONARY_TITLE_MULTI_DETAIL);
50     }
51
52     @Override
53     void removeUselessArgs(Map<String, String> namedArgs) {
54     }
55
56     class AppendCallback extends AppendAndIndexWikiCallback<WholeSectionToHtmlParser> {
57         public AppendCallback(WholeSectionToHtmlParser parser) {
58             super(parser);
59         }
60
61         @Override
62         public void onPlainText(String plainText) {
63             super.onPlainText(StringEscapeUtils.escapeHtml3(plainText));
64         }
65
66         @Override
67         public void onWikiLink(WikiTokenizer wikiTokenizer) {
68             super.onWikiLink(wikiTokenizer);
69         }
70
71         @Override
72         public void onFunction(WikiTokenizer wikiTokenizer, String name,
73                 List<String> args, Map<String, String> namedArgs) {
74             super.onFunction(wikiTokenizer, name, args, namedArgs);
75         }
76
77         @Override
78         public void onHtml(WikiTokenizer wikiTokenizer) {
79             super.onHtml(wikiTokenizer);
80         }
81
82         @Override
83         public void onNewline(WikiTokenizer wikiTokenizer) {
84         }
85
86         @Override
87         public void onHeading(WikiTokenizer wikiTokenizer) {
88             final String headingText = wikiTokenizer.headingWikiText();
89             final int depth = wikiTokenizer.headingDepth();
90             if (skipSections.matcher(headingText).matches()) {
91                 while ((wikiTokenizer = wikiTokenizer.nextToken()) != null) {
92                     if (wikiTokenizer.isHeading() && wikiTokenizer.headingDepth() <= depth) {
93                         wikiTokenizer.returnToLineStart();
94                         return;
95                     }
96                 }
97                 return;
98             }
99             builder.append(String.format("\n<h%d>", depth));
100             dispatch(headingText, null);
101             builder.append(String.format("</h%d>\n", depth));
102         }
103
104         final List<Character> listPrefixStack = new ArrayList<Character>();
105
106         @Override
107         public void onListItem(WikiTokenizer wikiTokenizer) {
108             if (builder.length() != 0 && builder.charAt(builder.length() - 1) != '\n') {
109                 builder.append("\n");
110             }
111             final String prefix = wikiTokenizer.listItemPrefix();
112             while (listPrefixStack.size() < prefix.length()) {
113                 builder.append(String.format("<%s>",
114                         WikiTokenizer.getListTag(prefix.charAt(listPrefixStack.size()))));
115                 listPrefixStack.add(prefix.charAt(listPrefixStack.size()));
116             }
117             builder.append("<li>");
118             dispatch(wikiTokenizer.listItemWikiText(), null);
119             builder.append("</li>\n");
120
121             WikiTokenizer nextToken = wikiTokenizer.nextToken();
122             boolean returnToLineStart = false;
123             if (nextToken != null && nextToken.isNewline()) {
124                 nextToken = nextToken.nextToken();
125                 returnToLineStart = true;
126             }
127             final String nextListHeader;
128             if (nextToken == null || !nextToken.isListItem()) {
129                 nextListHeader = "";
130             } else {
131                 nextListHeader = nextToken.listItemPrefix();
132             }
133             if (returnToLineStart) {
134                 wikiTokenizer.returnToLineStart();
135             }
136             while (listPrefixStack.size() > nextListHeader.length()) {
137                 final char prefixChar = listPrefixStack.remove(listPrefixStack.size() - 1);
138                 builder.append(String.format("</%s>\n", WikiTokenizer.getListTag(prefixChar)));
139             }
140         }
141
142         boolean boldOn = false;
143         boolean italicOn = false;
144
145         @Override
146         public void onMarkup(WikiTokenizer wikiTokenizer) {
147             if ("'''".equals(wikiTokenizer.token())) {
148                 if (!boldOn) {
149                     builder.append("<b>");
150                 } else {
151                     builder.append("</b>");
152                 }
153                 boldOn = !boldOn;
154             } else if ("''".equals(wikiTokenizer.token())) {
155                 if (!italicOn) {
156                     builder.append("<em>");
157                 } else {
158                     builder.append("</em>");
159                 }
160                 italicOn = !italicOn;
161             } else {
162                 assert false;
163             }
164         }
165
166     }
167
168 }