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