Skip to content

Commit 20ed1bf

Browse files
author
vishnu
committed
Table item alignment now working.
Links inside tables now working. Clicking reddit user message links should be working
1 parent 0373a2a commit 20ed1bf

File tree

8 files changed

+200
-32
lines changed

8 files changed

+200
-32
lines changed

.idea/misc.xml

+1-1
Some generated files are not rendered by default. Learn more about customizing how changed files appear on GitHub.
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,95 @@
1+
<div class="md"><p><strong>Table Formatting</strong></p>
2+
3+
<table>
4+
<thead>
5+
<tr>
6+
<th>Defaut</th>
7+
<th align="left">Left Aligned Column</th>
8+
<th align="right">Right Aligned Column</th>
9+
<th align="center">Centered Column</th>
10+
</tr>
11+
</thead>
12+
<tbody>
13+
<tr>
14+
<td>1</td>
15+
<td align="left">Option 1</td>
16+
<td align="right">12.546</td>
17+
<td align="center">A</td>
18+
</tr>
19+
<tr>
20+
<td>2</td>
21+
<td align="left">Option 2</td>
22+
<td align="right">4.732</td>
23+
<td align="center">B</td>
24+
</tr>
25+
<tr>
26+
<td>3</td>
27+
<td align="left">Option 3</td>
28+
<td align="right">8.968</td>
29+
<td align="center">C</td>
30+
</tr>
31+
<tr>
32+
<td>4</td>
33+
<td align="left">Option 4</td>
34+
<td align="right">0.892</td>
35+
<td align="center">D</td>
36+
</tr>
37+
</tbody>
38+
</table>
39+
40+
<hr/>
41+
42+
<table>
43+
<thead>
44+
<tr>
45+
<th>Name</th>
46+
<th>Link</th>
47+
</tr>
48+
</thead>
49+
<tbody>
50+
<tr>
51+
<td>Google</td>
52+
<td><a href="https://www.google.com/"
53+
rel="nofollow">https://www.google.com/</a></td>
54+
</tr>
55+
<tr>
56+
<td>Github</td>
57+
<td><a href="https://github.com/"
58+
rel="nofollow">Github</a></td>
59+
</tr>
60+
</tbody>
61+
</table>
62+
63+
<hr/>
64+
65+
<table>
66+
<thead>
67+
<tr>
68+
<th>A</th>
69+
<th align="left">B</th>
70+
<th align="right">C</th>
71+
<th align="center">D</th>
72+
</tr>
73+
</thead>
74+
<tbody>
75+
<tr>
76+
<td>OneOneOne</td>
77+
<td align="left">Option 1 Option 1</td>
78+
<td align="right">12345678.987</td>
79+
<td align="center">Centered Text Centered Text</td>
80+
</tr>
81+
<tr>
82+
<td>TwoTwo</td>
83+
<td align="left">Option 2</td>
84+
<td align="right">123.456</td>
85+
<td align="center">Centered Text</td>
86+
</tr>
87+
<tr>
88+
<td>Three</td>
89+
<td align="left">3</td>
90+
<td align="right">0.789</td>
91+
<td align="center">Centered</td>
92+
</tr>
93+
</tbody>
94+
</table>
95+
</div>

app/src/main/java/xyz/vishnum/snooparser/ExampleActivity.java

+9-4
Original file line numberDiff line numberDiff line change
@@ -3,6 +3,7 @@
33
import android.os.Bundle;
44
import android.support.v7.app.AppCompatActivity;
55
import android.util.Log;
6+
import android.util.TimingLogger;
67
import java.io.IOException;
78
import java.io.InputStream;
89
import java.util.List;
@@ -21,14 +22,16 @@ protected void onCreate(Bundle savedInstanceState) {
2122
SnooView snooView = (SnooView) findViewById(R.id.snooView);
2223
SnooParser parser = new SnooParser();
2324

24-
// Override how the <strong> tag is handled
25-
// Replaces all bold text with blue colored text
26-
// parser.replaceHandler("strong", new ExampleStrongHandler());
27-
2825
// Parse and display the comment/self-text
2926
String exampleHtml = getCommentHtml();
27+
28+
// adb shell setprop log.tag.YOUR_TAG VERBOSE
29+
TimingLogger logger = new TimingLogger(TAG, "SnooParser Timing");
3030
List<RedditBlock> blocks = parser.getBlocks(exampleHtml);
31+
logger.addSplit("PARSED COMMENT BLOCKS");
3132
snooView.setBlocks(blocks);
33+
logger.addSplit("RENDERED COMMENT");
34+
logger.dumpToLog();
3235

3336
// Handle link clicks
3437
snooView.setOnUrlClickListener(new SnooView.OnUrlClickListener() {
@@ -41,7 +44,9 @@ public void onClick(String url) {
4144

4245
private String getCommentHtml() {
4346
try {
47+
//InputStream inputStream = getAssets().open("example-comment-2.html");
4448
InputStream inputStream = getAssets().open("example-comment-2.html");
49+
//InputStream inputStream = getAssets().open("table-formatting-example-1.html");
4550
byte[] buffer = new byte[inputStream.available()];
4651
inputStream.read(buffer);
4752
inputStream.close();

build.gradle

+1-1
Original file line numberDiff line numberDiff line change
@@ -5,7 +5,7 @@ buildscript {
55
jcenter()
66
}
77
dependencies {
8-
classpath 'com.android.tools.build:gradle:2.3.1'
8+
classpath 'com.android.tools.build:gradle:2.3.2'
99
classpath 'com.github.dcendents:android-maven-gradle-plugin:1.5'
1010

1111
// NOTE: Do not place your application dependencies here; they belong

snoohtmlparser/src/main/java/xyz/vishnum/snoohtmlparser/SnooParser.java

+30-11
Original file line numberDiff line numberDiff line change
@@ -18,6 +18,7 @@
1818
import xyz.vishnum.snoohtmlparser.blocks.HrBlock;
1919
import xyz.vishnum.snoohtmlparser.blocks.RedditBlock;
2020
import xyz.vishnum.snoohtmlparser.blocks.TableBlock;
21+
import xyz.vishnum.snoohtmlparser.blocks.TableItem;
2122
import xyz.vishnum.snoohtmlparser.blocks.TextBlock;
2223
import xyz.vishnum.snoohtmlparser.handlers.BlockquoteHandler;
2324
import xyz.vishnum.snoohtmlparser.handlers.CodeHandler;
@@ -59,8 +60,7 @@ public void replaceHandler(String tag, TagNodeHandler handler) {
5960
*/
6061
public List<RedditBlock> getBlocks(String escapedHtml) {
6162
String unescapedHtml = Parser.unescapeEntities(escapedHtml, false);
62-
unescapedHtml = unescapedHtml
63-
.replace("href=\"/u/", "href=\"http://www.reddit.com/u/")
63+
unescapedHtml = unescapedHtml.replace("href=\"/u/", "href=\"http://www.reddit.com/u/")
6464
.replace("href=\"/r/", "href=\"http://www.reddit.com/r/")
6565
.replace("href=\"/message/", "href=\"http://www.reddit.com/message/");
6666
Document document = Jsoup.parseBodyFragment(unescapedHtml);
@@ -121,22 +121,41 @@ private Spannable parse(String bufferHtml, boolean removeWhitespace) {
121121
private TableBlock formatTableBlock(Element table) {
122122
Elements tableRows = table.getElementsByTag("tr");
123123
Elements headerItems = table.getElementsByTag("th");
124-
125-
String[] headerRow = new String[headerItems.size()];
126-
for (int col = 0; col < headerItems.size(); col++) {
127-
headerRow[col] = headerItems.get(col).text();
124+
// Header
125+
List<TableItem> headerRow = new ArrayList<>(headerItems.size());
126+
for (Element headerItem : headerItems) {
127+
TableItem.Align alignment = getTableItemAlignment(headerItem.attr("align"));
128+
headerRow.add(new TableItem(alignment, spanner.fromHtml(headerItem.html())));
128129
}
129-
130-
String[][] tableBody = new String[tableRows.size() - 1][headerItems.size()];
131-
for (int row = 1; row < tableRows.size(); row++) {
130+
// Table body
131+
List<List<TableItem>> bodyRows = new ArrayList<>();
132+
for (int row = 1; row < tableRows.size(); row++) { // skip first row
132133
Element tableRow = tableRows.get(row);
133134
if (tableRow.child(0).tagName().equals("td")) {
135+
List<TableItem> tRow = new ArrayList<>();
134136
for (int column = 0; column < tableRow.children().size(); column++) {
135-
tableBody[row - 1][column] = tableRow.child(column).text();
137+
TableItem.Align alignment =
138+
getTableItemAlignment(tableRow.child(column).attr("align"));
139+
tRow.add(new TableItem(alignment,
140+
spanner.fromHtml(tableRow.child(column).html())));
136141
}
142+
bodyRows.add(tRow);
137143
}
138144
}
139-
return new TableBlock(headerRow, tableBody);
145+
return new TableBlock(headerRow, bodyRows);
146+
}
147+
148+
private TableItem.Align getTableItemAlignment(String attr) {
149+
if (attr == null || attr.isEmpty()) {
150+
return TableItem.Align.LEFT;
151+
} else if (attr.equalsIgnoreCase("left")) {
152+
return TableItem.Align.LEFT;
153+
} else if (attr.equalsIgnoreCase("right")) {
154+
return TableItem.Align.RIGHT;
155+
} else if (attr.equalsIgnoreCase("center")) {
156+
return TableItem.Align.CENTER;
157+
}
158+
return TableItem.Align.LEFT;
140159
}
141160

142161
private void registerNewHandlers() {

snoohtmlparser/src/main/java/xyz/vishnum/snoohtmlparser/SnooView.java

+31-10
Original file line numberDiff line numberDiff line change
@@ -26,6 +26,7 @@
2626
import xyz.vishnum.snoohtmlparser.blocks.CodeBlock;
2727
import xyz.vishnum.snoohtmlparser.blocks.RedditBlock;
2828
import xyz.vishnum.snoohtmlparser.blocks.TableBlock;
29+
import xyz.vishnum.snoohtmlparser.blocks.TableItem;
2930
import xyz.vishnum.snoohtmlparser.blocks.TextBlock;
3031

3132
/**
@@ -100,16 +101,17 @@ public void setBlocks(List<RedditBlock> blocks) {
100101
HorizontalScrollView codeScrollView = new HorizontalScrollView(context);
101102
TextView codeView = new TextView(context);
102103
codeView.setText(((CodeBlock) block).getText());
104+
codeView.setPadding(0, 16, 0, 16);
103105
codeScrollView.addView(codeView);
104106
codeScrollView.setScrollbarFadingEnabled(false);
105107
addView(codeScrollView);
106108
break;
107109
case TABLE:
108110
HorizontalScrollView tableScrollView = new HorizontalScrollView(context);
109-
TableBlock tableBlock = (TableBlock) block;
111+
TableBlock tBlock = (TableBlock) block;
110112
TableLayout tableLayout =
111-
formatTable(tableBlock.getHeaderRow(), tableBlock.getBodyRows(),
112-
context);
113+
formatTable(tBlock.getHeaderRow(), tBlock.getBodyRows(), context);
114+
tableLayout.setPadding(0, 16, 0, 16);
113115
tableScrollView.addView(tableLayout);
114116
tableScrollView.setScrollbarFadingEnabled(false);
115117
addView(tableScrollView);
@@ -122,33 +124,52 @@ public void setOnUrlClickListener(OnUrlClickListener urlClickListener) {
122124
this.urlClickListener = urlClickListener;
123125
}
124126

125-
private TableLayout formatTable(String[] headerItems, String[][] bodyRows, Context context) {
127+
private TableLayout formatTable(List<TableItem> headerItems, List<List<TableItem>> bodyRows,
128+
Context context) {
126129
TableLayout table = new TableLayout(context);
127130
// Add header items
128131
TableRow headerRow = new TableRow(context);
129-
for (String headerItem : headerItems) {
132+
for (TableItem headerItem : headerItems) {
130133
TextView headerItemView = new TextView(context);
131134
headerItemView.setTypeface(Typeface.DEFAULT_BOLD);
132135
headerItemView.setPadding(0, 0, 32, 5);
133-
headerItemView.setText(headerItem);
136+
137+
headerItemView.setText(headerItem.text);
138+
headerItemView.setGravity(getTableItemGravity(headerItem.alignment));
139+
134140
headerRow.addView(headerItemView);
135141
}
136142
table.addView(headerRow);
137143
// Add table body items
138-
for (String[] tableRow : bodyRows) {
144+
for (List<TableItem> tableRow : bodyRows) {
139145
TableRow bodyRow = new TableRow(context);
140-
for (String tableItem : tableRow) {
146+
for (TableItem tableItem : tableRow) {
141147
TextView bodyItemView = new TextView(context);
142148
bodyItemView.setPadding(0, 0, 32, 5);
143-
bodyItemView.setText(tableItem);
144-
bodyItemView.setGravity(Gravity.RIGHT);
149+
150+
bodyItemView.setText(tableItem.text);
151+
bodyItemView.setGravity(getTableItemGravity(tableItem.alignment));
152+
bodyItemView.setMovementMethod(LinkMovementMethod.getInstance());
153+
145154
bodyRow.addView(bodyItemView);
146155
}
147156
table.addView(bodyRow);
148157
}
149158
return table;
150159
}
151160

161+
private int getTableItemGravity(TableItem.Align alignment) {
162+
switch (alignment) {
163+
case LEFT:
164+
return Gravity.LEFT;
165+
case RIGHT:
166+
return Gravity.RIGHT;
167+
case CENTER:
168+
return Gravity.CENTER;
169+
}
170+
return Gravity.LEFT;
171+
}
172+
152173
private void formatUrlSpans(Spannable spannable) {
153174
URLSpan[] urlSpans = spannable.getSpans(0, spannable.length(), URLSpan.class);
154175
for (final URLSpan urlSpan : urlSpans) {

snoohtmlparser/src/main/java/xyz/vishnum/snoohtmlparser/blocks/TableBlock.java

+7-5
Original file line numberDiff line numberDiff line change
@@ -1,5 +1,7 @@
11
package xyz.vishnum.snoohtmlparser.blocks;
22

3+
import java.util.List;
4+
35
/**
46
* Author: vishnu
57
* Created: 5/5/17, 10:31 PM
@@ -8,20 +10,20 @@
810

911
public class TableBlock extends RedditBlock {
1012

11-
private String[] headerRow;
12-
private String[][] bodyRows;
13+
private List<TableItem> headerRow;
14+
private List<List<TableItem>> bodyRows;
1315

14-
public TableBlock(String[] headerRow, String[][] bodyRows) {
16+
public TableBlock(List<TableItem> headerRow, List<List<TableItem>> bodyRows) {
1517
super(Type.TABLE);
1618
this.headerRow = headerRow;
1719
this.bodyRows = bodyRows;
1820
}
1921

20-
public String[] getHeaderRow() {
22+
public List<TableItem> getHeaderRow() {
2123
return headerRow;
2224
}
2325

24-
public String[][] getBodyRows() {
26+
public List<List<TableItem>> getBodyRows() {
2527
return bodyRows;
2628
}
2729
}
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,26 @@
1+
package xyz.vishnum.snoohtmlparser.blocks;
2+
3+
import android.text.Spannable;
4+
5+
/**
6+
* Author: vishnu
7+
* Created: 5/15/17, 4:44 PM
8+
* Purpose:
9+
*/
10+
11+
public class TableItem {
12+
13+
public Align alignment = Align.LEFT;
14+
public Spannable text;
15+
16+
public TableItem(Align alignment, Spannable text) {
17+
this.alignment = alignment;
18+
this.text = text;
19+
}
20+
21+
public TableItem(Spannable text) {
22+
this.text = text;
23+
}
24+
25+
public enum Align {LEFT, RIGHT, CENTER}
26+
}

0 commit comments

Comments
 (0)