X Tutup
Skip to content

Commit 8bf8fe3

Browse files
committed
Combine HTML formatting and rendering into HtmlUtils class
1 parent 0c6483e commit 8bf8fe3

File tree

7 files changed

+157
-164
lines changed

7 files changed

+157
-164
lines changed

app/src/main/java/com/github/mobile/gist/GistFragment.java

Lines changed: 3 additions & 3 deletions
Original file line numberDiff line numberDiff line change
@@ -26,18 +26,18 @@
2626
import com.actionbarsherlock.view.Menu;
2727
import com.actionbarsherlock.view.MenuInflater;
2828
import com.actionbarsherlock.view.MenuItem;
29-
import com.github.mobile.RefreshAnimation;
3029
import com.github.mobile.R.id;
3130
import com.github.mobile.R.layout;
3231
import com.github.mobile.R.menu;
3332
import com.github.mobile.R.string;
33+
import com.github.mobile.RefreshAnimation;
3434
import com.github.mobile.async.AuthenticatedUserTask;
3535
import com.github.mobile.comment.CommentViewHolder;
3636
import com.github.mobile.comment.CreateCommentActivity;
3737
import com.github.mobile.core.gist.FullGist;
3838
import com.github.mobile.util.AccountUtils;
3939
import com.github.mobile.util.AvatarUtils;
40-
import com.github.mobile.util.HtmlFormatter;
40+
import com.github.mobile.util.HtmlUtils;
4141
import com.github.mobile.util.ToastUtils;
4242
import com.github.rtyley.android.sherlock.roboguice.fragment.RoboSherlockFragment;
4343
import com.google.inject.Inject;
@@ -335,7 +335,7 @@ public FullGist run() throws Exception {
335335
else
336336
comments = Collections.emptyList();
337337
for (Comment comment : comments)
338-
comment.setBodyHtml(HtmlFormatter.format(comment.getBodyHtml()).toString());
338+
comment.setBodyHtml(HtmlUtils.format(comment.getBodyHtml()).toString());
339339
return new FullGist(gist, gistService.isStarred(gistId), comments);
340340
}
341341

app/src/main/java/com/github/mobile/issue/IssueStore.java

Lines changed: 2 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -1,7 +1,7 @@
11
package com.github.mobile.issue;
22

33
import com.github.mobile.ItemStore;
4-
import com.github.mobile.util.HtmlFormatter;
4+
import com.github.mobile.util.HtmlUtils;
55

66
import java.io.IOException;
77
import java.util.HashMap;
@@ -92,7 +92,7 @@ private RepositoryIssue createRepositoryIssue(Issue issue) {
9292
* @return issue
9393
*/
9494
public RepositoryIssue addIssue(IRepositoryIdProvider repository, Issue issue) {
95-
issue.setBodyHtml(HtmlFormatter.format(issue.getBodyHtml()).toString());
95+
issue.setBodyHtml(HtmlUtils.format(issue.getBodyHtml()).toString());
9696
RepositoryIssue current = getIssue(repository, issue.getNumber());
9797
if (current != null) {
9898
current.setAssignee(issue.getAssignee());

app/src/main/java/com/github/mobile/ui/issue/IssueFragment.java

Lines changed: 4 additions & 4 deletions
Original file line numberDiff line numberDiff line change
@@ -36,12 +36,12 @@
3636
import com.actionbarsherlock.view.MenuItem;
3737
import com.github.mobile.DialogFragmentActivity;
3838
import com.github.mobile.MultiChoiceDialogFragment;
39-
import com.github.mobile.RefreshAnimation;
40-
import com.github.mobile.SingleChoiceDialogFragment;
4139
import com.github.mobile.R.id;
4240
import com.github.mobile.R.layout;
4341
import com.github.mobile.R.menu;
4442
import com.github.mobile.R.string;
43+
import com.github.mobile.RefreshAnimation;
44+
import com.github.mobile.SingleChoiceDialogFragment;
4545
import com.github.mobile.async.AuthenticatedUserTask;
4646
import com.github.mobile.comment.CommentViewHolder;
4747
import com.github.mobile.comment.CreateCommentActivity;
@@ -51,7 +51,7 @@
5151
import com.github.mobile.issue.IssueStore;
5252
import com.github.mobile.ui.DialogResultListener;
5353
import com.github.mobile.util.AvatarUtils;
54-
import com.github.mobile.util.HtmlFormatter;
54+
import com.github.mobile.util.HtmlUtils;
5555
import com.github.mobile.util.ToastUtils;
5656
import com.github.rtyley.android.sherlock.roboguice.fragment.RoboSherlockFragment;
5757
import com.google.inject.Inject;
@@ -270,7 +270,7 @@ public FullIssue run() throws Exception {
270270
else
271271
comments = Collections.emptyList();
272272
for (Comment comment : comments)
273-
comment.setBodyHtml(HtmlFormatter.format(comment.getBodyHtml()).toString());
273+
comment.setBodyHtml(HtmlUtils.format(comment.getBodyHtml()).toString());
274274
return new FullIssue(issue, comments);
275275
}
276276

app/src/main/java/com/github/mobile/util/Html.java

Lines changed: 0 additions & 130 deletions
This file was deleted.

app/src/main/java/com/github/mobile/util/HtmlFormatter.java renamed to app/src/main/java/com/github/mobile/util/HtmlUtils.java

Lines changed: 125 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -1,9 +1,32 @@
11
package com.github.mobile.util;
22

3+
import static android.text.Spanned.SPAN_EXCLUSIVE_EXCLUSIVE;
4+
import static android.text.Spanned.SPAN_MARK_MARK;
5+
import android.text.Editable;
6+
import android.text.Html.ImageGetter;
7+
import android.text.Html.TagHandler;
8+
import android.text.Spanned;
9+
import android.text.style.StrikethroughSpan;
10+
import android.text.style.TypefaceSpan;
11+
12+
import org.xml.sax.XMLReader;
13+
314
/**
4-
* Formatter for HTML strings so that they are ready to be displayed in text views
15+
* HTML Utilities
516
*/
6-
public class HtmlFormatter {
17+
public class HtmlUtils {
18+
19+
private static final String TAG_DEL = "del";
20+
21+
private static final String TAG_UL = "ul";
22+
23+
private static final String TAG_OL = "ol";
24+
25+
private static final String TAG_LI = "li";
26+
27+
private static final String TAG_CODE = "code";
28+
29+
private static final String TAG_PRE = "pre";
730

831
private static final String TOGGLE_START = "<span class=\"email-hidden-toggle\">";
932

@@ -41,6 +64,106 @@ public class HtmlFormatter {
4164

4265
private static final String PRE_END = "</pre>";
4366

67+
private static final TagHandler TAG_HANDLER = new TagHandler() {
68+
69+
private int indentLevel;
70+
71+
public void handleTag(final boolean opening, final String tag, final Editable output, final XMLReader xmlReader) {
72+
if (TAG_DEL.equalsIgnoreCase(tag)) {
73+
if (opening) {
74+
int length = output.length();
75+
output.setSpan(new StrikethroughSpan(), length, length, SPAN_MARK_MARK);
76+
} else {
77+
int length = output.length();
78+
Object span = getLast(output, StrikethroughSpan.class);
79+
int start = output.getSpanStart(span);
80+
output.removeSpan(span);
81+
if (start != length)
82+
output.setSpan(span, start, length, SPAN_EXCLUSIVE_EXCLUSIVE);
83+
}
84+
return;
85+
}
86+
87+
if (TAG_UL.equalsIgnoreCase(tag) || TAG_OL.equalsIgnoreCase(tag)) {
88+
if (opening)
89+
indentLevel++;
90+
else
91+
indentLevel--;
92+
return;
93+
}
94+
95+
if (TAG_LI.equalsIgnoreCase(tag)) {
96+
if (opening) {
97+
output.append('\n');
98+
for (int i = 0; i < indentLevel * 2; i++)
99+
output.append(' ');
100+
output.append('\u2022').append(' ').append(' ');
101+
} else
102+
output.append('\n');
103+
return;
104+
}
105+
106+
if (TAG_CODE.equalsIgnoreCase(tag)) {
107+
if (opening) {
108+
int length = output.length();
109+
TypefaceSpan span = new TypefaceSpan("monospace");
110+
output.setSpan(span, length, length, SPAN_MARK_MARK);
111+
} else {
112+
int length = output.length();
113+
Object span = getLast(output, TypefaceSpan.class);
114+
int start = output.getSpanStart(span);
115+
output.removeSpan(span);
116+
if (start != length)
117+
output.setSpan(span, start, length, SPAN_EXCLUSIVE_EXCLUSIVE);
118+
}
119+
return;
120+
}
121+
122+
if (TAG_PRE.equalsIgnoreCase(tag)) {
123+
output.append('\n');
124+
return;
125+
}
126+
}
127+
};
128+
129+
/**
130+
* Get last span of given kind
131+
*
132+
* @param text
133+
* @param kind
134+
* @return span
135+
*/
136+
private static Object getLast(final Spanned text, final Class<?> kind) {
137+
Object[] spans = text.getSpans(0, text.length(), kind);
138+
return spans.length > 0 ? spans[spans.length - 1] : null;
139+
}
140+
141+
/**
142+
* Encode HTML
143+
*
144+
* @param html
145+
* @return html
146+
*/
147+
public static CharSequence encode(String html) {
148+
return encode(html, null);
149+
}
150+
151+
/**
152+
* Encode HTML
153+
*
154+
* @param html
155+
* @param imageGetter
156+
* @return html
157+
*/
158+
public static CharSequence encode(final String html, final ImageGetter imageGetter) {
159+
if (html == null)
160+
return "";
161+
if (html.length() == 0)
162+
return html;
163+
164+
return android.text.Html.fromHtml(html, imageGetter, TAG_HANDLER);
165+
}
166+
44167
private static StringBuilder strip(final StringBuilder input, final String prefix, final String suffix) {
45168
int start = input.indexOf(prefix);
46169
while (start != -1) {

app/src/main/java/com/github/mobile/util/HttpImageGetter.java

Lines changed: 2 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -66,13 +66,13 @@ public HttpImageGetter(Context context) {
6666
* @return this image getter
6767
*/
6868
public HttpImageGetter bind(final TextView view, final String html, final Object id) {
69-
view.setText(Html.encode(html, loading));
69+
view.setText(HtmlUtils.encode(html, loading));
7070
view.setTag(id);
7171
new RoboAsyncTask<CharSequence>(context) {
7272

7373
public CharSequence call() throws Exception {
7474
if (html.indexOf("<img") != -1)
75-
return Html.encode(html, HttpImageGetter.this);
75+
return HtmlUtils.encode(html, HttpImageGetter.this);
7676
else
7777
return null;
7878
}

0 commit comments

Comments
 (0)
X Tutup