From 03770cfe2d50d44fc6260696bcbf10dee46ecaf6 Mon Sep 17 00:00:00 2001 From: Dimitry Ivanov Date: Thu, 28 May 2020 11:54:15 +0300 Subject: [PATCH] SimpleTagHandler visit children if tag is block --- CHANGELOG.md | 5 ++ .../markwon/html/tag/SimpleTagHandler.java | 5 ++ .../markwon/sample/html/CenterTagHandler.java | 39 +++++++++++ .../markwon/sample/html/HtmlActivity.java | 66 ++++++++++++++++++- .../markwon/sample/html/IFrameHtmlPlugin.java | 2 +- 5 files changed, 114 insertions(+), 3 deletions(-) create mode 100644 sample/src/main/java/io/noties/markwon/sample/html/CenterTagHandler.java diff --git a/CHANGELOG.md b/CHANGELOG.md index 38b9e884..478a4600 100644 --- a/CHANGELOG.md +++ b/CHANGELOG.md @@ -1,5 +1,10 @@ # Changelog +# $nap; +* `html` - `SimpleTagHandler` visits children tags if supplied tag is block one ([#235]) + +[#235]: https://github.com/noties/Markwon/issues/235 + # 4.4.0 * `TextViewSpan` to obtain `TextView` in which markdown is displayed (applied by `CorePlugin`) * `TextLayoutSpan` to obtain `Layout` in which markdown is displayed (applied by `TablePlugin`, more specifically `TableRowSpan` to propagate layout in which cell content is displayed) diff --git a/markwon-html/src/main/java/io/noties/markwon/html/tag/SimpleTagHandler.java b/markwon-html/src/main/java/io/noties/markwon/html/tag/SimpleTagHandler.java index 337ac748..d0ffef45 100644 --- a/markwon-html/src/main/java/io/noties/markwon/html/tag/SimpleTagHandler.java +++ b/markwon-html/src/main/java/io/noties/markwon/html/tag/SimpleTagHandler.java @@ -28,6 +28,11 @@ public abstract class SimpleTagHandler extends TagHandler { @Override public void handle(@NonNull MarkwonVisitor visitor, @NonNull MarkwonHtmlRenderer renderer, @NonNull HtmlTag tag) { + // @since $nap; check if tag is block one and visit children + if (tag.isBlock()) { + visitChildren(visitor, renderer, tag.getAsBlock()); + } + final Object spans = getSpans(visitor.configuration(), visitor.renderProps(), tag); if (spans != null) { SpannableBuilder.setSpans(visitor.builder(), spans, tag.start(), tag.end()); diff --git a/sample/src/main/java/io/noties/markwon/sample/html/CenterTagHandler.java b/sample/src/main/java/io/noties/markwon/sample/html/CenterTagHandler.java new file mode 100644 index 00000000..fa1d7e61 --- /dev/null +++ b/sample/src/main/java/io/noties/markwon/sample/html/CenterTagHandler.java @@ -0,0 +1,39 @@ +package io.noties.markwon.sample.html; + +import android.text.Layout; +import android.text.style.AlignmentSpan; +import android.util.Log; + +import androidx.annotation.NonNull; + +import java.util.Collection; +import java.util.Collections; + +import io.noties.markwon.MarkwonVisitor; +import io.noties.markwon.SpannableBuilder; +import io.noties.markwon.html.HtmlTag; +import io.noties.markwon.html.MarkwonHtmlRenderer; +import io.noties.markwon.html.TagHandler; + +class CenterTagHandler extends TagHandler { + + @Override + public void handle(@NonNull MarkwonVisitor visitor, @NonNull MarkwonHtmlRenderer renderer, @NonNull HtmlTag tag) { + Log.e("HTML", String.format("center, isBlock: %s", tag.isBlock())); + if (tag.isBlock()) { + visitChildren(visitor, renderer, tag.getAsBlock()); + } + SpannableBuilder.setSpans( + visitor.builder(), + new AlignmentSpan.Standard(Layout.Alignment.ALIGN_CENTER), + tag.start(), + tag.end() + ); + } + + @NonNull + @Override + public Collection supportedTags() { + return Collections.singleton("center"); + } +} diff --git a/sample/src/main/java/io/noties/markwon/sample/html/HtmlActivity.java b/sample/src/main/java/io/noties/markwon/sample/html/HtmlActivity.java index 1f289f79..02c65621 100644 --- a/sample/src/main/java/io/noties/markwon/sample/html/HtmlActivity.java +++ b/sample/src/main/java/io/noties/markwon/sample/html/HtmlActivity.java @@ -46,7 +46,8 @@ public class HtmlActivity extends ActivityWithMenuOptions { .add("image", this::image) // .add("elegantUnderline", this::elegantUnderline) .add("iframe", this::iframe) - .add("emptyTagReplacement", this::emptyTagReplacement); + .add("emptyTagReplacement", this::emptyTagReplacement) + .add("centerTag", this::centerTag); } private TextView textView; @@ -60,7 +61,7 @@ public class HtmlActivity extends ActivityWithMenuOptions { // let's define some custom tag-handlers textView = findViewById(R.id.text_view); - + emptyTagReplacement(); } @@ -354,4 +355,65 @@ public class HtmlActivity extends ActivityWithMenuOptions { markwon.setMarkdown(textView, md); } + + private void centerTag() { + final String html = "\n" + + "\n" + + "\n" + + "\n" + + "\n" + + "

\n" + + "

LiSA's Sword Art Online: Alicization OP Song \"ADAMAS\" Certified Platinum with 250,000 Downloads

\n" + + "

\n" + + "
The upper tune was already certified Gold one month after its digital release
\n" + + "

According to The Recording Industry Association of Japan (RIAJ)'s monthly report for April 2020, one of the LiSA's 14th single songs,\n" + + " \"ADAMAS\" (the first OP theme for the TV anime Sword Art Online:\n" + + " Alicization) has been certified Platinum for\n" + + " surpassing 250,000 downloads.

\n" + + "

 

\n" + + "

As a double A-side single with \"Akai Wana (who loves it?),\" \"ADAMAS\" was\n" + + " released from SACRA Music in Japan on December 12, 2018. Its CD single ranked second in Oricon's weekly single\n" + + " chart by selling 35,000 copies in its first week. Meanwhile, the song was released digitally two months prior to\n" + + " its CD release, October 8, then reached Gold (100,000 downloads) in the following month.

\n" + + "

 

\n" + + "

 

\n" + + "
\n" + + "

\"ADAMAS\" MV YouTube EDIT ver.:

\n" + + "

\n" + + "

\n" + + "

 

\n" + + "

Standard edition CD jacket:

\n" + + "

\"\"

\n" + + "
\n" + + "

  

\n" + + "
\n" + + "

 

\n" + + "

Source: RIAJ press release

\n" + + "

 

\n" + + "

©SACRA MUSIC

\n" + + "

 

\n" + + "

\n" + + "\n" + + "\n" + + ""; + + final Markwon markwon = Markwon.builder(this) + .usePlugin(HtmlPlugin.create(new HtmlPlugin.HtmlConfigure() { + @Override + public void configureHtml(@NonNull HtmlPlugin plugin) { + plugin.addHandler(new CenterTagHandler()); + } + })) + .usePlugin(new IFrameHtmlPlugin()) + .usePlugin(ImagesPlugin.create()) + .build(); + + markwon.setMarkdown(textView, html); + } } diff --git a/sample/src/main/java/io/noties/markwon/sample/html/IFrameHtmlPlugin.java b/sample/src/main/java/io/noties/markwon/sample/html/IFrameHtmlPlugin.java index ddbbfce7..effc6fdf 100644 --- a/sample/src/main/java/io/noties/markwon/sample/html/IFrameHtmlPlugin.java +++ b/sample/src/main/java/io/noties/markwon/sample/html/IFrameHtmlPlugin.java @@ -34,7 +34,7 @@ public class IFrameHtmlPlugin extends AbstractMarkwonPlugin { public Object getSpans(@NonNull MarkwonConfiguration configuration, @NonNull RenderProps renderProps, @NonNull HtmlTag tag) { final ImageSize imageSize = new ImageSize(new ImageSize.Dimension(640, "px"), new ImageSize.Dimension(480, "px")); ImageProps.IMAGE_SIZE.set(renderProps, imageSize); - ImageProps.DESTINATION.set(renderProps, "https://hey.com/1.png"); + ImageProps.DESTINATION.set(renderProps, "https://img1.ak.crunchyroll.com/i/spire2/d7b1d6bc7563224388ef5ffc04a967581589950464_full.jpg"); return configuration.spansFactory().require(Image.class) .getSpans(configuration, renderProps); }