Skip to content

Commit

Permalink
fixed wrong formatting when tweets contains HTML tags.
Browse files Browse the repository at this point in the history
  • Loading branch information
mariotaku committed Jul 8, 2012
1 parent 8f80d8f commit 555b8e9
Showing 1 changed file with 65 additions and 6 deletions.
71 changes: 65 additions & 6 deletions src/org/mariotaku/twidere/util/HtmlBuilder.java
Expand Up @@ -51,7 +51,7 @@ public void addLink(String link, int start, int end) {
if (start < 0 || start >= string_length || end < 0 || end > string_length) {
if (strict)
throw new StringIndexOutOfBoundsException("String length = " + string_length + ", start = " + start
+ ", end = " + end);
+ ", end = " + end);
return;
}
for (int i = 0; i < links.size(); i++) {
Expand All @@ -65,22 +65,22 @@ public void addLink(String link, int start, int end) {
}

public String build() {
if (links.size() == 0) return string;
if (links.size() == 0) return escapeHTMLString(string);
Collections.sort(links, LinkSpec.COMPARATOR);
final StringBuilder builder = new StringBuilder();
for (int i = 0; i < links.size(); i++) {
final LinkSpec spec = links.get(i);
if (i == 0) {
builder.append(string.substring(0, spec.start));
builder.append(escapeHTMLString(string.substring(0, spec.start)));
}
if (i > 0) {
builder.append(string.substring(links.get(i - 1).end, spec.start));
builder.append(escapeHTMLString(string.substring(links.get(i - 1).end, spec.start)));
}
builder.append("<a href=\"" + spec.link + "\">");
builder.append(string.substring(spec.start, spec.end));
builder.append(escapeHTMLString(string.substring(spec.start, spec.end)));
builder.append("</a>");
if (i == links.size() - 1) {
builder.append(string.substring(spec.end, string.length()));
builder.append(escapeHTMLString(string.substring(spec.end, string.length())));
}
}
return builder.toString();
Expand Down Expand Up @@ -111,4 +111,63 @@ public String toString() {
}
}


private static String escapeHTMLString(String string) {
final StringBuffer sb = new StringBuffer(string.length());
// true if last char was blank
boolean lastWasBlankChar = false;
final int len = string.length();
for (int i = 0; i < len; i++) {
final char c = string.charAt(i);
if (c == ' ') {
// blank gets extra work,
// this solves the problem you get if you replace all
// blanks with &nbsp;, if you do that you loss
// word breaking
if (lastWasBlankChar) {
lastWasBlankChar = false;
sb.append("&nbsp;");
} else {
lastWasBlankChar = true;
sb.append(' ');
}
} else {
lastWasBlankChar = false;
// HTML Special Chars
switch (c) {
case '"':
sb.append("&quot;");
break;
case '&':
sb.append("&amp;");
break;
case '<':
sb.append("&lt;");
break;
case '>':
sb.append("&gt;");
break;
case '\n':
sb.append("<br/>");
break;
default:
final int ci = 0xffff & c;
if (ci < 160)
// nothing special only 7 Bit
sb.append(c);
else {
// Not 7 Bit use the unicode system
sb.append("&#");
sb.append(new Integer(ci).toString());
sb.append(';');
}
break;


}
}
}
return sb.toString();
}

}

0 comments on commit 555b8e9

Please sign in to comment.