diff --git a/Clover/app/src/main/java/org/floens/chan/core/site/common/ChanParserHelper.java b/Clover/app/src/main/java/org/floens/chan/core/site/common/ChanParserHelper.java
new file mode 100644
index 00000000..1f73a9e8
--- /dev/null
+++ b/Clover/app/src/main/java/org/floens/chan/core/site/common/ChanParserHelper.java
@@ -0,0 +1,128 @@
+/*
+ * Clover - 4chan browser https://github.com/Floens/Clover/
+ * Copyright (C) 2014 Floens
+ *
+ * This program is free software: you can redistribute it and/or modify
+ * it under the terms of the GNU General Public License as published by
+ * the Free Software Foundation, either version 3 of the License, or
+ * (at your option) any later version.
+ *
+ * This program is distributed in the hope that it will be useful,
+ * but WITHOUT ANY WARRANTY; without even the implied warranty of
+ * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
+ * GNU General Public License for more details.
+ *
+ * You should have received a copy of the GNU General Public License
+ * along with this program. If not, see
+ * The links are detected with the autolink-java library.
+ *
+ * @param theme The theme to style the links with
+ * @param post The post where the linkables get added to.
+ * @param text Text to find links in
+ * @param spannable Spannable to set the spans on.
+ */
+ public static void detectLinks(Theme theme, Post.Builder post, String text, SpannableString spannable) {
+ final Iterable
+ public static String getNodeTextPreservingLineBreaks(Element node) {
+ final StringBuilder accum = new StringBuilder();
+ new NodeTraversor(new NodeVisitor() {
+ public void head(Node node, int depth) {
+ if (node instanceof TextNode) {
+ TextNode textNode = (TextNode) node;
+ appendNormalisedText(accum, textNode);
+ } else if (node instanceof Element) {
+ Element element = (Element) node;
+ if (accum.length() > 0 &&
+ element.isBlock() &&
+ !lastCharIsWhitespace(accum))
+ accum.append(" ");
+
+ if (element.tag().getName().equals("br")) {
+ accum.append("\n");
+ }
+ }
+ }
+
+ public void tail(Node node, int depth) {
+ }
+ }).traverse(node);
+ return accum.toString().trim();
+ }
+
+ // Copied from org.jsoup.nodes.Element.text()
+ private static boolean lastCharIsWhitespace(StringBuilder sb) {
+ return sb.length() != 0 && sb.charAt(sb.length() - 1) == ' ';
+ }
+
+ // Copied from org.jsoup.nodes.Element.text()
+ private static void appendNormalisedText(StringBuilder accum, TextNode textNode) {
+ String text = textNode.getWholeText();
+
+ if (!preserveWhitespace(textNode.parent())) {
+ text = normaliseWhitespace(text);
+ if (lastCharIsWhitespace(accum))
+ text = stripLeadingWhitespace(text);
+ }
+ accum.append(text);
+ }
+
+ // Copied from org.jsoup.nodes.Element.text()
+ private static String normaliseWhitespace(String text) {
+ text = StringUtil.normaliseWhitespace(text);
+ return text;
+ }
+
+ // Copied from org.jsoup.nodes.Element.text()
+ private static String stripLeadingWhitespace(String text) {
+ return text.replaceFirst("^\\s+", "");
+ }
+
+ // Copied from org.jsoup.nodes.Element.text()
+ private static boolean preserveWhitespace(Node node) {
+ // looks only at this element and one level up, to prevent recursion & needless stack searches
+ if (node != null && node instanceof Element) {
+ Element element = (Element) node;
+ return element.tag().preserveWhitespace() ||
+ element.parent() != null && element.parent().tag().preserveWhitespace();
+ }
+ return false;
+ }
+}
diff --git a/Clover/app/src/main/java/org/floens/chan/core/site/common/ChanReaderRequest.java b/Clover/app/src/main/java/org/floens/chan/core/site/common/ChanReaderRequest.java
index 1a22632a..e4394b0a 100644
--- a/Clover/app/src/main/java/org/floens/chan/core/site/common/ChanReaderRequest.java
+++ b/Clover/app/src/main/java/org/floens/chan/core/site/common/ChanReaderRequest.java
@@ -283,9 +283,12 @@ public class ChanReaderRequest extends JsonReaderRequest
- private String getNodeText(Element node) {
- final StringBuilder accum = new StringBuilder();
- new NodeTraversor(new NodeVisitor() {
- public void head(Node node, int depth) {
- if (node instanceof TextNode) {
- TextNode textNode = (TextNode) node;
- appendNormalisedText(accum, textNode);
- } else if (node instanceof Element) {
- Element element = (Element) node;
- if (accum.length() > 0 &&
- element.isBlock() &&
- !lastCharIsWhitespace(accum))
- accum.append(" ");
-
- if (element.tag().getName().equals("br")) {
- accum.append("\n");
- }
- }
- }
-
- public void tail(Node node, int depth) {
- }
- }).traverse(node);
- return accum.toString().trim();
- }
-
- private static boolean lastCharIsWhitespace(StringBuilder sb) {
- return sb.length() != 0 && sb.charAt(sb.length() - 1) == ' ';
- }
-
- private static void appendNormalisedText(StringBuilder accum, TextNode textNode) {
- String text = textNode.getWholeText();
-
- if (!preserveWhitespace(textNode.parent())) {
- text = normaliseWhitespace(text);
- if (lastCharIsWhitespace(accum))
- text = stripLeadingWhitespace(text);
- }
- accum.append(text);
- }
-
- private static String normaliseWhitespace(String text) {
- text = StringUtil.normaliseWhitespace(text);
- return text;
- }
-
- private static String stripLeadingWhitespace(String text) {
- return text.replaceFirst("^\\s+", "");
- }
-
- private static boolean preserveWhitespace(Node node) {
- // looks only at this element and one level up, to prevent recursion & needless stack searches
- if (node != null && node instanceof Element) {
- Element element = (Element) node;
- return element.tag().preserveWhitespace() ||
- element.parent() != null && element.parent().tag().preserveWhitespace();
- }
- return false;
- }
}
diff --git a/Clover/app/src/main/java/org/floens/chan/core/site/common/FutabaChanParserHandler.java b/Clover/app/src/main/java/org/floens/chan/core/site/common/FutabaChanParserHandler.java
index 8743dd17..c84890d5 100644
--- a/Clover/app/src/main/java/org/floens/chan/core/site/common/FutabaChanParserHandler.java
+++ b/Clover/app/src/main/java/org/floens/chan/core/site/common/FutabaChanParserHandler.java
@@ -26,7 +26,15 @@ public interface FutabaChanParserHandler {
CharSequence handleSpan(FutabaChanParser parser, Theme theme, Post.Builder post, Element span);
- Link getLink(FutabaChanParser parser, Theme theme, Post.Builder post, Element anchor);
+ CharSequence handleTable(FutabaChanParser parser, Theme theme, Post.Builder post, Element table);
+
+ CharSequence handleStrong(FutabaChanParser parser, Theme theme, Post.Builder post, Element strong);
+
+ CharSequence handlePre(FutabaChanParser parser, Theme theme, Post.Builder post, Element pre);
+
+ CharSequence handleStrike(FutabaChanParser parser, Theme theme, Post.Builder post, Element strike);
+
+ Link handleAnchor(FutabaChanParser parser, Theme theme, Post.Builder post, Element anchor);
class Link {
public PostLinkable.Type type;
diff --git a/Clover/app/src/main/java/org/floens/chan/core/site/sites/chan8/Chan8ParserHandler.java b/Clover/app/src/main/java/org/floens/chan/core/site/sites/chan8/Chan8ParserHandler.java
index 1cd47709..8c2a0e41 100644
--- a/Clover/app/src/main/java/org/floens/chan/core/site/sites/chan8/Chan8ParserHandler.java
+++ b/Clover/app/src/main/java/org/floens/chan/core/site/sites/chan8/Chan8ParserHandler.java
@@ -21,6 +21,7 @@ import android.text.SpannableString;
import org.floens.chan.core.model.Post;
import org.floens.chan.core.model.PostLinkable;
+import org.floens.chan.core.site.common.ChanParserHelper;
import org.floens.chan.core.site.common.DefaultFutabaChanParserHandler;
import org.floens.chan.core.site.common.FutabaChanParser;
import org.floens.chan.ui.span.ForegroundColorSpanHashed;
@@ -35,7 +36,7 @@ public class Chan8ParserHandler extends DefaultFutabaChanParserHandler {
if (element.hasClass("quote")) {
SpannableString quote = new SpannableString(text);
quote.setSpan(new ForegroundColorSpanHashed(theme.inlineQuoteColor), 0, quote.length(), 0);
- parser.detectLinks(theme, post, quote.toString(), quote);
+ ChanParserHelper.detectLinks(theme, post, quote.toString(), quote);
return quote;
} else {
return text;
@@ -57,21 +58,21 @@ public class Chan8ParserHandler extends DefaultFutabaChanParserHandler {
} else {
quote = new SpannableString(span.text());
quote.setSpan(new ForegroundColorSpanHashed(theme.inlineQuoteColor), 0, quote.length(), 0);
- parser.detectLinks(theme, post, span.text(), quote);
+ ChanParserHelper.detectLinks(theme, post, span.text(), quote);
}
return quote;
}
@Override
- public Link getLink(FutabaChanParser parser, Theme theme, Post.Builder post, Element anchor) {
+ public Link handleAnchor(FutabaChanParser parser, Theme theme, Post.Builder post, Element anchor) {
String href = anchor.attr("href");
PostLinkable.Type t = null;
String key = null;
Object value = null;
if (href.startsWith("/")) {
- if (href.contains("/thread/")) {
+ if (!href.startsWith("/" + post.board.code + "/res/")) {
// link to another thread
PostLinkable.ThreadLink threadLink = null;
@@ -79,10 +80,10 @@ public class Chan8ParserHandler extends DefaultFutabaChanParserHandler {
if (slashSplit.length == 4) {
String board = slashSplit[1];
String nums = slashSplit[3];
- String[] numsSplitted = nums.split("#p");
+ String[] numsSplitted = nums.split("#");
if (numsSplitted.length == 2) {
try {
- int tId = Integer.parseInt(numsSplitted[0]);
+ int tId = Integer.parseInt(numsSplitted[0].replace(".html", ""));
int pId = Integer.parseInt(numsSplitted[1]);
threadLink = new PostLinkable.ThreadLink(board, tId, pId);
} catch (NumberFormatException ignored) {