Mercurial Hosting > nabble
comparison src/nabble/model/Message.java @ 0:7ecd1a4ef557
add content
author | Franklin Schmidt <fschmidt@gmail.com> |
---|---|
date | Thu, 21 Mar 2019 19:15:52 -0600 |
parents | |
children | cc5b7d515580 |
comparison
equal
deleted
inserted
replaced
-1:000000000000 | 0:7ecd1a4ef557 |
---|---|
1 package nabble.model; | |
2 | |
3 import fschmidt.html.Html; | |
4 import nabble.naml.compiler.CompileException; | |
5 import nabble.naml.compiler.Template; | |
6 import nabble.naml.compiler.TemplatePrintWriter; | |
7 import nabble.naml.compiler.Program; | |
8 import nabble.naml.namespaces.BasicNamespace; | |
9 import nabble.view.web.template.MessageNamespace; | |
10 import nabble.modules.ModuleManager; | |
11 | |
12 import java.io.StringWriter; | |
13 import java.util.Collections; | |
14 import java.util.HashMap; | |
15 import java.util.Map; | |
16 | |
17 | |
18 public class Message { | |
19 | |
20 public static abstract class SourceType extends AbstractType<SourceType> { | |
21 private static final Map<Character,SourceType> map = new HashMap<Character,SourceType>(); | |
22 | |
23 public static final SourceType TEMP = new SourceType('t',"temp") { | |
24 public Source getSource(Site site,long id) { | |
25 User user = site.getUser(id); | |
26 return new TempSource(user); | |
27 } | |
28 public String getIdField() { | |
29 return "user_id"; | |
30 } | |
31 }; | |
32 public static final SourceType NODE = new SourceType('n',"node") { | |
33 public Source getSource(Site site,long id) { | |
34 return site.getNode(id); | |
35 } | |
36 public String getIdField() { | |
37 return "node_id"; | |
38 } | |
39 }; | |
40 public static final SourceType AVATAR = new SourceType('a',"avatar") { | |
41 public Source getSource(Site site,long id) { | |
42 User user = site.getUser(id); | |
43 return user == null? null : new AvatarSource(user); | |
44 } | |
45 public String getIdField() { | |
46 return "user_id"; | |
47 } | |
48 }; | |
49 public static final SourceType SITE = new SourceType('s',"site") { | |
50 public Source getSource(Site site,long id) { | |
51 return site; | |
52 } | |
53 public String getIdField() { | |
54 return null; | |
55 } | |
56 }; | |
57 | |
58 private SourceType(char code,String name) { | |
59 super(map,code,name); | |
60 } | |
61 | |
62 public abstract Source getSource(Site site,long id); | |
63 public abstract String getIdField(); | |
64 | |
65 public static SourceType getType(char code) { | |
66 return AbstractType.getType(map,code); | |
67 } | |
68 } | |
69 | |
70 public interface Source { | |
71 public Site getSite(); | |
72 public long getSourceId(); | |
73 public SourceType getMessageSourceType(); | |
74 } | |
75 | |
76 public static class TempSource implements Source { | |
77 private final User user; | |
78 | |
79 public TempSource(User user) { | |
80 this.user = user; | |
81 } | |
82 | |
83 public Site getSite() { | |
84 return user.getSite(); | |
85 } | |
86 | |
87 public long getSourceId() { | |
88 return user.getId(); | |
89 } | |
90 | |
91 public SourceType getMessageSourceType() { | |
92 return SourceType.TEMP; | |
93 } | |
94 } | |
95 | |
96 public static class AvatarSource implements Source { | |
97 private final User user; | |
98 | |
99 public AvatarSource(User user) { | |
100 this.user = user; | |
101 } | |
102 | |
103 public Site getSite() { | |
104 return user.getSite(); | |
105 } | |
106 | |
107 public long getSourceId() { | |
108 return user.getId(); | |
109 } | |
110 | |
111 public SourceType getMessageSourceType() { | |
112 return SourceType.AVATAR; | |
113 } | |
114 | |
115 public User getUser() { | |
116 return user; | |
117 } | |
118 } | |
119 | |
120 | |
121 public static abstract class Format extends AbstractType<Format> { | |
122 | |
123 private static final Map<Character,Format> map = new HashMap<Character,Format>(); | |
124 | |
125 public static Format getMessageFormat(char code) { | |
126 return AbstractType.getType(map,code); | |
127 } | |
128 | |
129 Format(char code,String name) { | |
130 super(map,code,name); | |
131 } | |
132 | |
133 protected abstract String getText(String msg, Source source); | |
134 | |
135 protected abstract String getTextWithoutQuotes(String msg, Source source); | |
136 | |
137 protected abstract String getEmail(String msg,int i); | |
138 | |
139 protected abstract Html parse(String msg,Message.Source source); | |
140 | |
141 protected abstract Html parseForMailText(String msg,Message.Source source); | |
142 | |
143 public String toString() { | |
144 return getName(); | |
145 } | |
146 | |
147 public static final Format TEXT = MessageFormatImpls.TEXT; | |
148 public static final Format HTML = MessageFormatImpls.HTML; | |
149 public static final Format MAILING_LIST = MailingLists.msgFmt; | |
150 private static final Format SUBSCRIPTION = PostByEmail.msgFmt; | |
151 | |
152 public boolean isMail() { | |
153 return this==MAILING_LIST || this==SUBSCRIPTION; | |
154 } | |
155 } | |
156 | |
157 | |
158 // Message | |
159 | |
160 protected String raw; | |
161 protected final Format format; | |
162 | |
163 public Message(String raw,Format format) { | |
164 this.raw = raw; | |
165 this.format = format; | |
166 } | |
167 | |
168 public String getRaw() { | |
169 return raw; | |
170 } | |
171 | |
172 public final Format getFormat() { | |
173 return format; | |
174 } | |
175 | |
176 public Source getSource() { | |
177 return null; | |
178 } | |
179 | |
180 public boolean equals(Object obj) { | |
181 if( !(obj instanceof Message) ) | |
182 return false; | |
183 Message msg = (Message)obj; | |
184 return msg.format.equals(format) && msg.getRaw().equals(getRaw()); | |
185 } | |
186 | |
187 public final String getText() { | |
188 return getFormat().getText(getRaw(),getSource()); | |
189 } | |
190 | |
191 public final String getTextWithoutQuotes() { | |
192 return getFormat().getTextWithoutQuotes(getRaw(),getSource()); | |
193 } | |
194 | |
195 public final String getEmail(int i) { | |
196 return getFormat().getEmail(getRaw(),i); | |
197 } | |
198 | |
199 public final Html parse() { | |
200 return getFormat().parse(getRaw(),getSource()); | |
201 } | |
202 | |
203 public final Html parseForMailText() { | |
204 return getFormat().parseForMailText(getRaw(),getSource()); | |
205 } | |
206 | |
207 | |
208 public static String wrapQuoteText(String text) { | |
209 StringBuilder buf = new StringBuilder(text); | |
210 wrapQuoteText(buf); | |
211 return buf.toString(); | |
212 } | |
213 | |
214 public static void wrapQuoteText(StringBuilder buf) { | |
215 String quot = ""; | |
216 for (int i=0,n=0,space=-1; i<buf.length(); i++,n++) { | |
217 char c = buf.charAt(i); | |
218 if (c=='\n' || c=='\r') { | |
219 n = 0; | |
220 space = -1; | |
221 quot = getQuot(buf,i+1); | |
222 } else if (Character.isWhitespace(c) && n>quot.length()) { | |
223 space = i; | |
224 } else if (n>76 && space>=0) { | |
225 buf.setCharAt(space,'\n'); | |
226 buf.insert(space+1,quot); | |
227 i+=quot.length(); | |
228 n = i-space; | |
229 space = -1; | |
230 } | |
231 } | |
232 } | |
233 | |
234 private static String getQuot(StringBuilder buf, int start) { | |
235 int end = buf.indexOf(" ",start); | |
236 if (end<=start) return ""; | |
237 for (int i=start;i<end;i++) { | |
238 if (buf.charAt(i)!='>') return ""; | |
239 } | |
240 return buf.substring(start, end+1); | |
241 } | |
242 | |
243 public boolean isDeleted() { | |
244 return false; | |
245 } | |
246 | |
247 public boolean isDeactivated() { | |
248 return false; | |
249 } | |
250 | |
251 // for testing | |
252 public static String toHtml(String raw,Format format) | |
253 throws CompileException | |
254 { | |
255 Message msg = new Message(raw,format); | |
256 Program program = Program.getInstance(ModuleManager.getGenericModules()); | |
257 Template template = program.getTemplate( "message_as_html", | |
258 BasicNamespace.class, MessageNamespace.class | |
259 ); | |
260 StringWriter sw = new StringWriter(); | |
261 template.run( new TemplatePrintWriter(sw), Collections.<String,Object>emptyMap(), | |
262 new BasicNamespace(template), new MessageNamespace(msg) | |
263 ); | |
264 return sw.toString(); | |
265 } | |
266 | |
267 | |
268 public static final Map<String,String> htmlSeparators = new HashMap<String,String>(); | |
269 static { | |
270 htmlSeparators.put("a", " "); | |
271 htmlSeparators.put("/a", " "); | |
272 htmlSeparators.put("blockquote", "\n"); | |
273 htmlSeparators.put("/blockquote", "\n"); | |
274 htmlSeparators.put("br", "\n"); | |
275 htmlSeparators.put("center", "\n"); | |
276 htmlSeparators.put("/center", "\n"); | |
277 htmlSeparators.put("div", "\n"); | |
278 htmlSeparators.put("/div", "\n"); | |
279 htmlSeparators.put("hr", "\n"); | |
280 htmlSeparators.put("img", " "); | |
281 htmlSeparators.put("ul", "\n"); | |
282 htmlSeparators.put("/ul", "\n"); | |
283 htmlSeparators.put("li", "\n"); | |
284 htmlSeparators.put("nabble_a", " "); | |
285 htmlSeparators.put("/nabble_a", " "); | |
286 htmlSeparators.put("nabble_img", " "); | |
287 htmlSeparators.put("ol", "\n"); | |
288 htmlSeparators.put("/ol", "\n"); | |
289 htmlSeparators.put("p", "\n"); | |
290 htmlSeparators.put("/p", "\n"); | |
291 htmlSeparators.put("pre", "\n"); | |
292 htmlSeparators.put("/pre", "\n"); | |
293 htmlSeparators.put("table", "\n"); | |
294 htmlSeparators.put("/table", "\n"); | |
295 htmlSeparators.put("tr", "\n"); | |
296 htmlSeparators.put("th", "\t"); | |
297 htmlSeparators.put("td", "\t"); | |
298 htmlSeparators.put("h1", "\n"); | |
299 htmlSeparators.put("/h1", "\n"); | |
300 htmlSeparators.put("h2", "\n"); | |
301 htmlSeparators.put("/h2", "\n"); | |
302 htmlSeparators.put("h3", "\n"); | |
303 htmlSeparators.put("/h3", "\n"); | |
304 htmlSeparators.put("h4", "\n"); | |
305 htmlSeparators.put("/h4", "\n"); | |
306 htmlSeparators.put("h5", "\n"); | |
307 htmlSeparators.put("/h5", "\n"); | |
308 htmlSeparators.put("h6", "\n"); | |
309 htmlSeparators.put("/h6", "\n"); | |
310 } | |
311 | |
312 } |