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