]> gitweb.fperrin.net Git - Dictionary.git/blob - src/com/hughes/android/dictionary/engine/HtmlEntry.java
Starting to do compression.
[Dictionary.git] / src / com / hughes / android / dictionary / engine / HtmlEntry.java
1 package com.hughes.android.dictionary.engine;
2
3 import android.content.Intent;
4
5 import com.hughes.android.dictionary.C;
6 import com.hughes.util.StringUtil;
7 import com.hughes.util.raf.RAFListSerializer;
8 import com.hughes.util.raf.RAFSerializable;
9 import com.ibm.icu.text.Transliterator;
10
11 import java.io.IOException;
12 import java.io.PrintStream;
13 import java.io.RandomAccessFile;
14 import java.util.List;
15 import java.util.regex.Pattern;
16
17 public class HtmlEntry extends AbstractEntry implements RAFSerializable<HtmlEntry>, Comparable<HtmlEntry> {
18   
19   // Title is not HTML escaped.
20   public final String title;
21   public String html;
22   
23   public HtmlEntry(final EntrySource entrySource, String title) {
24     super(entrySource);
25     this.title = title;
26   }
27   
28   public HtmlEntry(Dictionary dictionary, RandomAccessFile raf, final int index) throws IOException {
29     super(dictionary, raf, index);
30     title = raf.readUTF();
31     final boolean compressed = raf.readBoolean();
32     final int length = raf.readInt();
33     final byte[] bytes = new byte[length];
34     raf.readFully(bytes);
35     html = new String(bytes, "UTF-8");
36   }
37   @Override
38   public void write(RandomAccessFile raf) throws IOException {
39     super.write(raf);
40     raf.writeUTF(title);
41     raf.writeBoolean(false);
42     final byte[] bytes = html.getBytes("UTF-8");
43     raf.writeInt(bytes.length);
44     raf.write(bytes);
45   }
46
47   @Override
48   public void addToDictionary(Dictionary dictionary) {
49     assert index == -1;
50     dictionary.htmlEntries.add(this);
51     index = dictionary.htmlEntries.size() - 1;
52   }
53   
54   @Override
55   public RowBase CreateRow(int rowIndex, Index dictionaryIndex) {
56     return new Row(this.index, rowIndex, dictionaryIndex);
57   }
58
59   
60   static final class Serializer implements RAFListSerializer<HtmlEntry> {
61     
62     final Dictionary dictionary;
63     
64     Serializer(Dictionary dictionary) {
65       this.dictionary = dictionary;
66     }
67
68     @Override
69     public HtmlEntry read(RandomAccessFile raf, final int index) throws IOException {
70       return new HtmlEntry(dictionary, raf, index);
71     }
72
73     @Override
74     public void write(RandomAccessFile raf, HtmlEntry t) throws IOException {
75       t.write(raf);
76     }
77   };
78
79   public String getRawText(final boolean compact) {
80     return title + ":\n" + html;
81   }
82
83   
84   @Override
85   public int compareTo(HtmlEntry another) {
86     if (title.compareTo(another.title) != 0) {
87       return title.compareTo(another.title);
88     }
89     return html.compareTo(another.html);
90   }
91   
92   @Override
93   public String toString() {
94     return getRawText(false);
95   }
96   
97   // --------------------------------------------------------------------
98   
99
100   public static class Row extends RowBase {
101     
102     boolean isExpanded = false;
103     
104     Row(final RandomAccessFile raf, final int thisRowIndex,
105         final Index index) throws IOException {
106       super(raf, thisRowIndex, index);
107     }
108
109     Row(final int referenceIndex, final int thisRowIndex,
110         final Index index) {
111       super(referenceIndex, thisRowIndex, index);
112     }
113     
114     @Override
115     public String toString() {
116       return getRawText(false);
117     }
118
119     public HtmlEntry getEntry() {
120       return index.dict.htmlEntries.get(referenceIndex);
121     }
122     
123     @Override
124     public void print(PrintStream out) {
125       final HtmlEntry entry = getEntry();
126       out.println("See also HtmlEntry:" + entry.title);
127     }
128
129     @Override
130     public String getRawText(boolean compact) {
131       final HtmlEntry entry = getEntry();
132       return entry.getRawText(compact);
133     }
134
135     @Override
136     public RowMatchType matches(final List<String> searchTokens, final Pattern orderedMatchPattern, final Transliterator normalizer, final boolean swapPairEntries) {
137       final String text = normalizer.transform(getRawText(false));
138       if (orderedMatchPattern.matcher(text).find()) {
139         return RowMatchType.ORDERED_MATCH;
140       }
141       for (int i = searchTokens.size() - 1; i >= 0; --i) {
142         final String searchToken = searchTokens.get(i);
143         if (!text.contains(searchToken)) {
144           return RowMatchType.NO_MATCH;
145         }
146       }
147       return RowMatchType.BAG_OF_WORDS_MATCH;
148     }
149   }
150
151     public static String htmlBody(final List<HtmlEntry> htmlEntries, final String indexShortName) {
152         final StringBuilder result = new StringBuilder();
153         for (final HtmlEntry htmlEntry : htmlEntries) {
154             final String titleEscaped = StringUtil.escapeToPureHtmlUnicode(htmlEntry.title);
155             result.append(String.format("<h1><a href=\"%s\">%s</a></h1>\n(%s)\n<p>%s\n", 
156                     formatQuickdicUrl(indexShortName, titleEscaped), titleEscaped, htmlEntry.entrySource.name,
157                     htmlEntry.html));
158         }
159         return result.toString();
160     }
161     
162     public static String formatQuickdicUrl(final String indexShortName, final String text) {
163         assert !indexShortName.contains(":");
164         return String.format("qd:%s:%s", indexShortName, text);
165     }
166
167     public static boolean isQuickdicUrl(String url) {
168         return url.startsWith("qd:");
169     }
170     
171     public static void quickdicUrlToIntent(final String url, final Intent intent) {
172         int firstColon = url.indexOf(":");
173         if (firstColon == -1) return;
174         int secondColon = url.indexOf(":", firstColon + 1);
175         if (secondColon == -1) return;
176         intent.putExtra(C.SEARCH_TOKEN, url.substring(secondColon + 1));
177     }
178
179 }