]> gitweb.fperrin.net Git - DictionaryPC.git/blob - src/com/hughes/android/dictionary/engine/WiktionarySplitter.java
go
[DictionaryPC.git] / src / com / hughes / android / dictionary / engine / WiktionarySplitter.java
1 package com.hughes.android.dictionary.engine;
2
3 import java.io.BufferedOutputStream;
4 import java.io.DataOutputStream;
5 import java.io.File;
6 import java.io.FileOutputStream;
7 import java.io.IOException;
8 import java.util.ArrayList;
9 import java.util.Arrays;
10 import java.util.List;
11 import java.util.regex.Matcher;
12 import java.util.regex.Pattern;
13
14 import javax.xml.parsers.ParserConfigurationException;
15 import javax.xml.parsers.SAXParser;
16 import javax.xml.parsers.SAXParserFactory;
17
18 import org.xml.sax.Attributes;
19 import org.xml.sax.SAXException;
20
21 public class WiktionarySplitter extends org.xml.sax.helpers.DefaultHandler {
22   
23   static class Section implements java.io.Serializable {
24     private static final long serialVersionUID = -7676549898325856822L;
25
26     final String title;
27     final String heading;
28     final String text;
29     
30     public Section(final String title, final String heading, final String text) {
31       this.title = title;
32       this.heading = heading;
33       this.text = text;
34       
35       //System.out.printf("TITLE:%s\nHEADING:%s\nTEXT:%s\n\n\n\n\n\n", title, heading, text);
36     }
37   }
38   
39   static class Selector {
40     DataOutputStream out;
41     Pattern pattern;
42     
43     public Selector(final String filename, final String pattern) throws IOException {
44       this.out = new DataOutputStream(new BufferedOutputStream(new FileOutputStream(filename)));
45       this.pattern = Pattern.compile(pattern);
46     }
47   }
48
49   final List<Selector> selectors = new ArrayList<Selector>();
50   StringBuilder titleBuilder;
51   StringBuilder textBuilder;
52   StringBuilder currentBuilder = null;
53
54   public static void main(final String[] args) throws SAXException, IOException, ParserConfigurationException {
55     final SAXParser parser = SAXParserFactory.newInstance().newSAXParser();
56     final WiktionarySplitter wiktionarySplitter = new WiktionarySplitter();
57     
58     // Configure things.
59     final File file = new File(args[0]);
60     final List<Selector> selectors = wiktionarySplitter.selectors;
61     for (int i = 1; i < args.length; i += 2) {
62       final Selector selector = new Selector(args[i], args[i+1]);
63       selectors.add(selector);
64     }
65
66     if (selectors.isEmpty()) {
67       selectors.addAll(Arrays.asList(
68           new Selector("wikiSplit/arabic.data", ".*[Ar]rabic.*"),
69           new Selector("wikiSplit/croation.data", ".*[Cc]roation.*"),
70           new Selector("wikiSplit/czech.data", ".*[Cc]zech.*"),
71           new Selector("wikiSplit/mandarin.data", ".*[Mm]andarin|[Cc]hinese.*"),
72           new Selector("wikiSplit/dutch.data", ".*[Du]utch.*"),
73           new Selector("wikiSplit/english.data", ".*[Ee]nglish.*"),
74           new Selector("wikiSplit/french.data", ".*[Ff]rench.*"),
75           new Selector("wikiSplit/german.data", ".*[Gg]erman.*"),
76           new Selector("wikiSplit/greek.data", ".*[Gg]reek.*"),
77           new Selector("wikiSplit/hindi.data", ".*[Hh]indi.*"),
78           new Selector("wikiSplit/italian.data", ".*[Ii]talian.*"),
79           new Selector("wikiSplit/japanese.data", ".*[Jj]apanese.*"),
80           new Selector("wikiSplit/korean.data", ".*[Kk]orean.*"),
81           new Selector("wikiSplit/persian.data", ".*[Pp]ersian.*"),
82           new Selector("wikiSplit/portuguese.data", ".*[Pp]ortuguese.*"),
83           new Selector("wikiSplit/romanian.data", ".*[Rr]omanian.*"),
84           new Selector("wikiSplit/russian.data", ".*[Rr]ussian.*"),
85           new Selector("wikiSplit/spanish.data", ".*[Ss]panish.*"),
86           new Selector("wikiSplit/swedish.data", ".*[Ss]wedish.*"),
87           new Selector("wikiSplit/thai.data", ".*[Tt]hai.*"),
88           new Selector("wikiSplit/vietnamese.data", ".*[Vv]ietnamese.*")
89           ));
90     }
91     
92     // Do it.
93     parser.parse(file, wiktionarySplitter);
94     
95     // Shutdown.
96     for (final Selector selector : selectors) {
97       selector.out.close();
98     }
99   }
100
101   static final Pattern headingStart = Pattern.compile("^(=+)[^=]+=+", Pattern.MULTILINE);
102   
103   private void endPage() {
104     final String title = titleBuilder.toString();
105     System.out.println("endPage: " + title);
106     
107     String text = textBuilder.toString();
108     
109     while (text.length() > 0) {
110       // Find start.
111       final Matcher startMatcher = headingStart.matcher(text);
112       if (!startMatcher.find()) {
113         return;
114       }
115       text = text.substring(startMatcher.end());
116       
117       final String heading = startMatcher.group();
118       for (final Selector selector : selectors) {
119         if (selector.pattern.matcher(heading).find()) {
120           
121           // Find end.
122           final int depth = startMatcher.group(1).length();
123           final Pattern endPattern = Pattern.compile(String.format("^={1,%d}[^=]+=+", depth), Pattern.MULTILINE);
124           
125           final Matcher endMatcher = endPattern.matcher(text);
126           final int end;
127           if (endMatcher.find()) {
128             end = endMatcher.start();
129           } else {
130             end = text.length();
131           }
132           
133           final String sectionText = text.substring(0, end);
134           final Section section = new Section(title, heading, sectionText);
135           
136           try {
137             selector.out.writeUTF(section.title);
138             selector.out.writeUTF(section.heading);
139             final byte[] bytes = section.text.getBytes("UTF8");
140             selector.out.writeInt(bytes.length);
141             selector.out.write(bytes);
142           } catch (IOException e) {
143             throw new RuntimeException(e);
144           }
145           
146           text = text.substring(end);
147         }
148       }
149     }
150     
151   }
152
153   // -----------------------------------------------------------------------
154   
155     @Override
156     public void startElement(String uri, String localName, String qName,
157         Attributes attributes) {
158       currentBuilder = null;
159       if ("page".equals(qName)) {
160         titleBuilder = new StringBuilder();
161         
162         // Start with "\n" to better match certain strings.
163         textBuilder = new StringBuilder("\n");
164       } else if ("title".equals(qName)) {
165         currentBuilder = titleBuilder;
166       } else if ("text".equals(qName)) {
167         currentBuilder = textBuilder;
168       }
169     }
170
171     @Override
172     public void characters(char[] ch, int start, int length) throws SAXException {
173       if (currentBuilder != null) {
174         currentBuilder.append(ch, start, length);
175       }
176     }
177
178     @Override
179     public void endElement(String uri, String localName, String qName)
180         throws SAXException {
181       currentBuilder = null;
182       if ("page".equals(qName)) {
183         endPage();
184       }
185     }
186     
187
188     public void parse(final File file) throws ParserConfigurationException,
189         SAXException, IOException {
190       final SAXParser parser = SAXParserFactory.newInstance().newSAXParser();
191       parser.parse(file, this);
192     }
193     
194 }