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