From a940ed8f9381df4391b93ecd93f6a7ebe218365f Mon Sep 17 00:00:00 2001 From: Florens Douwes Date: Mon, 23 Jun 2014 20:47:40 +0200 Subject: [PATCH] Basic code tag support --- .../java/org/floens/chan/core/model/Post.java | 136 ++++++++++-------- .../org/floens/chan/ui/view/PostView.java | 3 +- .../org/floens/chan/utils/ThemeHelper.java | 6 + Clover/app/src/main/res/values/attrs.xml | 2 + Clover/app/src/main/res/values/styles.xml | 2 + 5 files changed, 91 insertions(+), 58 deletions(-) diff --git a/Clover/app/src/main/java/org/floens/chan/core/model/Post.java b/Clover/app/src/main/java/org/floens/chan/core/model/Post.java index 329b3f3b..7b1e5662 100644 --- a/Clover/app/src/main/java/org/floens/chan/core/model/Post.java +++ b/Clover/app/src/main/java/org/floens/chan/core/model/Post.java @@ -19,8 +19,10 @@ package org.floens.chan.core.model; import android.text.SpannableString; import android.text.TextUtils; +import android.text.style.AbsoluteSizeSpan; import android.text.style.ForegroundColorSpan; import android.text.style.StrikethroughSpan; +import android.text.style.TypefaceSpan; import org.floens.chan.ChanApplication; import org.floens.chan.chan.ChanUrls; @@ -33,6 +35,7 @@ import org.jsoup.nodes.Element; import org.jsoup.nodes.Node; import org.jsoup.nodes.TextNode; import org.jsoup.parser.Parser; +import org.jsoup.safety.Whitelist; import java.util.ArrayList; import java.util.List; @@ -173,75 +176,94 @@ public class Post { List nodes = document.body().childNodes(); for (Node node : nodes) { - String nodeName = node.nodeName(); + CharSequence nodeParsed = parseNode(node); + if (nodeParsed != null) { + total = TextUtils.concat(total, nodeParsed); + } + } + } catch (Exception e) { + e.printStackTrace(); + } - if (node instanceof TextNode) { - String text = ((TextNode) node).text(); - SpannableString spannable = new SpannableString(text); + return total; + } - detectLinks(text, spannable); + private CharSequence parseNode(Node node) { + if (node instanceof TextNode) { + String text = ((TextNode) node).text(); + SpannableString spannable = new SpannableString(text); - total = TextUtils.concat(total, spannable); - } else { - switch (nodeName) { - case "br": { - total = TextUtils.concat(total, "\n"); - break; - } - case "span": { - Element span = (Element) node; - - SpannableString quote = new SpannableString(span.text()); - - Set classes = span.classNames(); - if (classes.contains("deadlink")) { - quote.setSpan(new ForegroundColorSpan(ThemeHelper.getInstance().getQuoteColor()), 0, quote.length(), 0); - quote.setSpan(new StrikethroughSpan(), 0, quote.length(), 0); - } else { - quote.setSpan(new ForegroundColorSpan(ThemeHelper.getInstance().getInlineQuoteColor()), 0, quote.length(), 0); - detectLinks(span.text(), quote); - } - - total = TextUtils.concat(total, quote); - break; - } - case "a": { - CharSequence anchor = parseAnchor((Element)node, total); - if (anchor != null) { - total = TextUtils.concat(total, anchor); - } - break; - } - case "s": { - Element spoiler = (Element) node; + detectLinks(text, spannable); - SpannableString link = new SpannableString(spoiler.text()); + return spannable; + } else { + switch (node.nodeName()) { + case "br": { + return "\n"; + } + case "span": { + Element span = (Element) node; + + SpannableString quote = new SpannableString(span.text()); + + Set classes = span.classNames(); + if (classes.contains("deadlink")) { + quote.setSpan(new ForegroundColorSpan(ThemeHelper.getInstance().getQuoteColor()), 0, quote.length(), 0); + quote.setSpan(new StrikethroughSpan(), 0, quote.length(), 0); + } else { + quote.setSpan(new ForegroundColorSpan(ThemeHelper.getInstance().getInlineQuoteColor()), 0, quote.length(), 0); + detectLinks(span.text(), quote); + } - PostLinkable pl = new PostLinkable(this, spoiler.text(), spoiler.text(), Type.SPOILER); - link.setSpan(pl, 0, link.length(), 0); - linkables.add(pl); + return quote; + } + case "a": { + CharSequence anchor = parseAnchor((Element)node); + if (anchor != null) { + return anchor; + } else { + return ((Element)node).text(); + } + } + case "s": { + Element spoiler = (Element) node; - total = TextUtils.concat(total, link); - break; - } - default: { - // Unknown tag, add the inner part - if (node instanceof Element) { - total = TextUtils.concat(total, ((Element) node).text()); - } - break; - } + SpannableString link = new SpannableString(spoiler.text()); + + PostLinkable pl = new PostLinkable(this, spoiler.text(), spoiler.text(), Type.SPOILER); + link.setSpan(pl, 0, link.length(), 0); + linkables.add(pl); + + return link; + } + case "pre": { + Element pre = (Element) node; + + Set classes = pre.classNames(); + if (classes.contains("prettyprint")) { + String clean = Jsoup.clean(pre.html(), "", new Whitelist().addTags("br"), new Document.OutputSettings().prettyPrint(false)); + clean = clean.replace("
", "\n"); + SpannableString monospace = new SpannableString(clean); + monospace.setSpan(new TypefaceSpan("monospace"), 0, monospace.length(), 0); + monospace.setSpan(new AbsoluteSizeSpan(ThemeHelper.getInstance().getCodeTagSize()), 0, monospace.length(), 0); + return monospace; + } else { + return pre.text(); + } + } + default: { + // Unknown tag, add the inner part + if (node instanceof Element) { + return ((Element) node).text(); + } else { + return null; } } } - } catch (Exception e) { - e.printStackTrace(); } - - return total; } - private CharSequence parseAnchor(Element anchor, CharSequence total) { + private CharSequence parseAnchor(Element anchor) { String href = anchor.attr("href"); Set classes = anchor.classNames(); diff --git a/Clover/app/src/main/java/org/floens/chan/ui/view/PostView.java b/Clover/app/src/main/java/org/floens/chan/ui/view/PostView.java index 5acc7318..7e5bc7ee 100644 --- a/Clover/app/src/main/java/org/floens/chan/ui/view/PostView.java +++ b/Clover/app/src/main/java/org/floens/chan/ui/view/PostView.java @@ -134,6 +134,7 @@ public class PostView extends LinearLayout implements View.OnClickListener { int dateColor = ta.getColor(R.styleable.PostView_date_color, 0); int savedReplyColor = ta.getColor(R.styleable.PostView_saved_reply_color, 0); int highlightedColor = ta.getColor(R.styleable.PostView_highlighted_color, 0); + int detailSize = ta.getDimensionPixelSize(R.styleable.PostView_detail_size, 0); ta.recycle(); @@ -177,7 +178,7 @@ public class PostView extends LinearLayout implements View.OnClickListener { SpannableString date = new SpannableString("No." + post.no + " " + relativeTime); date.setSpan(new ForegroundColorSpan(dateColor), 0, date.length(), 0); - date.setSpan(new AbsoluteSizeSpan(10, true), 0, date.length(), 0); + date.setSpan(new AbsoluteSizeSpan(detailSize), 0, date.length(), 0); total = TextUtils.concat(total, date, " "); } diff --git a/Clover/app/src/main/java/org/floens/chan/utils/ThemeHelper.java b/Clover/app/src/main/java/org/floens/chan/utils/ThemeHelper.java index 7f96ce83..0e53497b 100644 --- a/Clover/app/src/main/java/org/floens/chan/utils/ThemeHelper.java +++ b/Clover/app/src/main/java/org/floens/chan/utils/ThemeHelper.java @@ -46,6 +46,7 @@ public class ThemeHelper { private int linkColor; private int spoilerColor; private int inlineQuoteColor; + private int codeTagSize; public static ThemeHelper getInstance() { if (instance == null) { @@ -87,6 +88,7 @@ public class ThemeHelper { linkColor = ta.getColor(R.styleable.PostView_link_color, 0); spoilerColor = ta.getColor(R.styleable.PostView_spoiler_color, 0); inlineQuoteColor = ta.getColor(R.styleable.PostView_inline_quote_color, 0); + codeTagSize = ta.getDimensionPixelSize(R.styleable.PostView_code_tag_size, 0); ta.recycle(); } @@ -105,4 +107,8 @@ public class ThemeHelper { public int getInlineQuoteColor() { return inlineQuoteColor; } + + public int getCodeTagSize() { + return codeTagSize; + } } diff --git a/Clover/app/src/main/res/values/attrs.xml b/Clover/app/src/main/res/values/attrs.xml index 1c36f132..96a2f502 100644 --- a/Clover/app/src/main/res/values/attrs.xml +++ b/Clover/app/src/main/res/values/attrs.xml @@ -81,6 +81,8 @@ along with this program. If not, see . + + diff --git a/Clover/app/src/main/res/values/styles.xml b/Clover/app/src/main/res/values/styles.xml index 92ec8cdc..a7e4c511 100644 --- a/Clover/app/src/main/res/values/styles.xml +++ b/Clover/app/src/main/res/values/styles.xml @@ -122,6 +122,8 @@ along with this program. If not, see . #ff636363 #00000000 #ff789922 + + 12sp