From 58ba748aded5a78c0e78c54802cf023e98994b78 Mon Sep 17 00:00:00 2001 From: sk Date: Wed, 30 Nov 2022 11:20:58 +0100 Subject: [PATCH 1/3] add blockquote support --- .../joinmastodon/android/ui/text/HtmlParser.java | 15 ++++++++++----- 1 file changed, 10 insertions(+), 5 deletions(-) diff --git a/mastodon/src/main/java/org/joinmastodon/android/ui/text/HtmlParser.java b/mastodon/src/main/java/org/joinmastodon/android/ui/text/HtmlParser.java index 50112befb..1784b82e3 100644 --- a/mastodon/src/main/java/org/joinmastodon/android/ui/text/HtmlParser.java +++ b/mastodon/src/main/java/org/joinmastodon/android/ui/text/HtmlParser.java @@ -7,6 +7,7 @@ import android.text.SpannableStringBuilder; import android.text.Spanned; import android.text.TextUtils; import android.text.style.BulletSpan; +import android.text.style.LeadingMarginSpan; import android.text.style.StyleSpan; import android.text.style.TypefaceSpan; import android.text.style.UnderlineSpan; @@ -26,6 +27,7 @@ import org.jsoup.safety.Safelist; import org.jsoup.select.NodeVisitor; import java.util.ArrayList; +import java.util.Arrays; import java.util.List; import java.util.Map; import java.util.function.Function; @@ -127,24 +129,27 @@ public class HtmlParser{ openSpans.add(new SpanInfo(new InvisibleSpan(), ssb.length(), el)); } } - case "li" -> openSpans.add(new SpanInfo(new BulletSpan(V.dp(6)), ssb.length(), el)); + case "li" -> openSpans.add(new SpanInfo(new BulletSpan(V.dp(8)), ssb.length(), el)); case "em", "i" -> openSpans.add(new SpanInfo(new StyleSpan(Typeface.ITALIC), ssb.length(), el)); case "strong", "b" -> openSpans.add(new SpanInfo(new StyleSpan(Typeface.BOLD), ssb.length(), el)); case "u" -> openSpans.add(new SpanInfo(new UnderlineSpan(), ssb.length(), el)); case "code", "pre" -> openSpans.add(new SpanInfo(new TypefaceSpan("monospace"), ssb.length(), el)); + case "blockquote" -> openSpans.add(new SpanInfo(new LeadingMarginSpan.Standard(V.dp(10)), ssb.length(), el)); } } } + + final List blockElements = Arrays.asList("p", "ul", "ol", "blockquote"); @Override public void tail(@NonNull Node node, int depth){ if(node instanceof Element el){ if("span".equals(el.nodeName()) && el.hasClass("ellipsis")){ ssb.append("…", new DeleteWhenCopiedSpan(), Spanned.SPAN_EXCLUSIVE_EXCLUSIVE); - }else if("p".equals(el.nodeName()) || "ul".equals(el.nodeName()) || "ol".equals(el.nodeName())){ - if(node.nextSibling()!=null) - ssb.append("\n\n"); - }else if(!openSpans.isEmpty()){ + }else if(blockElements.contains(el.nodeName()) && node.nextSibling()!=null){ + ssb.append("\n\n"); + } + if(!openSpans.isEmpty()){ SpanInfo si=openSpans.get(openSpans.size()-1); if(si.element==el){ ssb.setSpan(si.span, si.start, ssb.length(), Spanned.SPAN_EXCLUSIVE_EXCLUSIVE); From c4747fdc72241cd420bbb7a5875e11cd90d20b80 Mon Sep 17 00:00:00 2001 From: sk Date: Wed, 30 Nov 2022 11:39:53 +0100 Subject: [PATCH 2/3] add support for headings --- .../org/joinmastodon/android/ui/text/HtmlParser.java | 12 ++++++++++-- 1 file changed, 10 insertions(+), 2 deletions(-) diff --git a/mastodon/src/main/java/org/joinmastodon/android/ui/text/HtmlParser.java b/mastodon/src/main/java/org/joinmastodon/android/ui/text/HtmlParser.java index 1784b82e3..9c8eaed3c 100644 --- a/mastodon/src/main/java/org/joinmastodon/android/ui/text/HtmlParser.java +++ b/mastodon/src/main/java/org/joinmastodon/android/ui/text/HtmlParser.java @@ -8,7 +8,11 @@ import android.text.Spanned; import android.text.TextUtils; import android.text.style.BulletSpan; import android.text.style.LeadingMarginSpan; +import android.text.style.RelativeSizeSpan; +import android.text.style.StrikethroughSpan; import android.text.style.StyleSpan; +import android.text.style.SubscriptSpan; +import android.text.style.SuperscriptSpan; import android.text.style.TypefaceSpan; import android.text.style.UnderlineSpan; import android.widget.TextView; @@ -131,15 +135,19 @@ public class HtmlParser{ } case "li" -> openSpans.add(new SpanInfo(new BulletSpan(V.dp(8)), ssb.length(), el)); case "em", "i" -> openSpans.add(new SpanInfo(new StyleSpan(Typeface.ITALIC), ssb.length(), el)); - case "strong", "b" -> openSpans.add(new SpanInfo(new StyleSpan(Typeface.BOLD), ssb.length(), el)); + case "h1" -> openSpans.add(new SpanInfo(new RelativeSizeSpan(1.3f), ssb.length(), el)); + case "strong", "b", "h2" -> openSpans.add(new SpanInfo(new StyleSpan(Typeface.BOLD), ssb.length(), el)); case "u" -> openSpans.add(new SpanInfo(new UnderlineSpan(), ssb.length(), el)); + case "s", "del" -> openSpans.add(new SpanInfo(new StrikethroughSpan(), ssb.length(), el)); + case "sub" -> openSpans.add(new SpanInfo(new SubscriptSpan(), ssb.length(), el)); + case "sup" -> openSpans.add(new SpanInfo(new SuperscriptSpan(), ssb.length(), el)); case "code", "pre" -> openSpans.add(new SpanInfo(new TypefaceSpan("monospace"), ssb.length(), el)); case "blockquote" -> openSpans.add(new SpanInfo(new LeadingMarginSpan.Standard(V.dp(10)), ssb.length(), el)); } } } - final List blockElements = Arrays.asList("p", "ul", "ol", "blockquote"); + final static List blockElements = Arrays.asList("p", "ul", "ol", "blockquote", "h1", "h2", "h3", "h4", "h5", "h6"); @Override public void tail(@NonNull Node node, int depth){ From dc8ac51c83288ed703e78dc0fb1f786c660d3dde Mon Sep 17 00:00:00 2001 From: sk Date: Wed, 30 Nov 2022 11:43:34 +0100 Subject: [PATCH 3/3] fix inline rendering of block elements --- .../joinmastodon/android/ui/text/HtmlParser.java | 15 +++++++++------ 1 file changed, 9 insertions(+), 6 deletions(-) diff --git a/mastodon/src/main/java/org/joinmastodon/android/ui/text/HtmlParser.java b/mastodon/src/main/java/org/joinmastodon/android/ui/text/HtmlParser.java index 20612a335..96de9fb34 100644 --- a/mastodon/src/main/java/org/joinmastodon/android/ui/text/HtmlParser.java +++ b/mastodon/src/main/java/org/joinmastodon/android/ui/text/HtmlParser.java @@ -20,6 +20,7 @@ import org.jsoup.safety.Safelist; import org.jsoup.select.NodeVisitor; import java.util.ArrayList; +import java.util.Arrays; import java.util.List; import java.util.Map; import java.util.function.Function; @@ -126,22 +127,24 @@ public class HtmlParser{ } } + final static List blockElements = Arrays.asList("p", "ul", "ol", "blockquote", "h1", "h2", "h3", "h4", "h5", "h6"); + @Override public void tail(@NonNull Node node, int depth){ if(node instanceof Element el){ if("span".equals(el.nodeName()) && el.hasClass("ellipsis")){ ssb.append("…", new DeleteWhenCopiedSpan(), Spanned.SPAN_EXCLUSIVE_EXCLUSIVE); - }else if("p".equals(el.nodeName()) || "ul".equals(el.nodeName()) || "ol".equals(el.nodeName())){ - if(node.nextSibling()!=null) - ssb.append("\n\n"); - }else if(!openSpans.isEmpty()){ + }else if(blockElements.contains(el.nodeName()) && node.nextSibling()!=null){ + ssb.append("\n\n"); + } + if(!openSpans.isEmpty()){ SpanInfo si=openSpans.get(openSpans.size()-1); if(si.element==el){ ssb.setSpan(si.span, si.start, ssb.length(), Spanned.SPAN_EXCLUSIVE_EXCLUSIVE); openSpans.remove(openSpans.size()-1); } - if("li".equals(el.nodeName())) { - if(node.nextSibling()!=null) ssb.append('\n'); + if("li".equals(el.nodeName()) && node.nextSibling()!=null) { + ssb.append('\n'); } } }