0
|
1 package nabble.model;
|
|
2
|
|
3 import java.net.URL;
|
|
4 import java.net.MalformedURLException;
|
|
5 import java.util.Iterator;
|
|
6 import java.util.regex.Matcher;
|
|
7 import fschmidt.html.Html;
|
|
8 import fschmidt.html.HtmlTag;
|
|
9 import fschmidt.html.HtmlTextContainer;
|
|
10 import fschmidt.util.mail.MailAddress;
|
|
11
|
|
12
|
|
13 public final class MessageUtils {
|
|
14 private MessageUtils() {} // never
|
|
15
|
|
16 public static String getTextWithoutQuotes(String msg) {
|
|
17 Html list = newHtml(msg);
|
|
18 removeQuotes(list);
|
|
19 return htmlToText(list);
|
|
20 }
|
|
21
|
|
22 static Html newHtml(String msg) {
|
|
23 Html html = new Html();
|
|
24 html.containerTags().add("raw");
|
|
25 html.parse(msg);
|
|
26 return html;
|
|
27 }
|
|
28
|
|
29 private static void removeQuotes(Html list) {
|
|
30 int quoteDepth = 0;
|
|
31 for( Iterator i=list.iterator(); i.hasNext(); ) {
|
|
32 Object next = i.next();
|
|
33 boolean remove = quoteDepth > 0;
|
|
34 if (next instanceof HtmlTag) {
|
|
35 String tagName = ((HtmlTag)next).getName().toLowerCase();
|
|
36 if( tagName.equals("quote") ) {
|
|
37 quoteDepth++;
|
|
38 remove = true;
|
|
39 } else if( tagName.equals("/quote") && quoteDepth > 0 ) {
|
|
40 quoteDepth--;
|
|
41 }
|
|
42 }
|
|
43 if( remove )
|
|
44 i.remove();
|
|
45 }
|
|
46 }
|
|
47
|
|
48 static String htmlToText(Html html) {
|
|
49 StringBuilder buf = new StringBuilder();
|
|
50 for( Iterator i=html.iterator(); i.hasNext(); ) {
|
|
51 Object next = i.next();
|
|
52 if( next instanceof String ) {
|
|
53 buf.append(next);
|
|
54 } else if (next instanceof HtmlTag) {
|
|
55 boolean isSeparator = Message.htmlSeparators.containsKey(((HtmlTag)next).getName().toLowerCase());
|
|
56 if (isSeparator && buf.length()>0 && !Character.isWhitespace(buf.charAt(buf.length()-1)))
|
|
57 buf.append(' ');
|
|
58 }
|
|
59 }
|
|
60 return buf.toString();
|
|
61 }
|
|
62
|
|
63 public static String htmlToSearchText(Html html) {
|
|
64 StringBuilder buf = new StringBuilder();
|
|
65 for( Iterator i=html.iterator(); i.hasNext(); ) {
|
|
66 Object next = i.next();
|
|
67 if( next instanceof String ) {
|
|
68 buf.append(next);
|
|
69 } else if (next instanceof HtmlTag) {
|
|
70 HtmlTag tag = (HtmlTag)next;
|
|
71 String name = tag.getName().toLowerCase();
|
|
72 if( name.equals("iframe") ) {
|
|
73 buf.append(" html_iframe");
|
|
74 } else if( name.equals("img") ) {
|
|
75 String src = HtmlTag.unquote(tag.getAttributeValue("src"));
|
|
76 if( src != null )
|
|
77 buf.append(" html_img_").append( src.substring(src.lastIndexOf('.')+1) );
|
|
78 } else if( name.equals("a") ) {
|
|
79 String href = HtmlTag.unquote(tag.getAttributeValue("href"));
|
|
80 if( href != null ) {
|
|
81 buf.append(" html_a");
|
|
82 try {
|
|
83 String domain = new URL(href).getHost();
|
|
84 buf.append(" link_").append(domain);
|
|
85 } catch(MalformedURLException e) {} // ignore
|
|
86 }
|
|
87 }
|
|
88 buf.append(' ');
|
|
89 }
|
|
90 }
|
|
91 return buf.toString();
|
|
92 }
|
|
93
|
|
94 public static String hideAllEmails(String txt) {
|
|
95 if (txt==null) return null;
|
|
96 Matcher m = MailAddress.EMAIL_PATTERN.matcher(txt);
|
|
97 StringBuffer buf = new StringBuffer();
|
|
98 while (m.find()) {
|
|
99 m.appendReplacement(buf, "$1@...");
|
|
100 }
|
|
101 m.appendTail(buf);
|
|
102 return buf.toString();
|
|
103 }
|
|
104
|
|
105 }
|