diff --git a/docs/docs/v3/core/html-renderer.md b/docs/docs/v3/core/html-renderer.md index 3734eff5..70b8598e 100644 --- a/docs/docs/v3/core/html-renderer.md +++ b/docs/docs/v3/core/html-renderer.md @@ -1 +1,82 @@ -# HTML Renderer \ No newline at end of file +# HTML Renderer + +Starting with `MarkwonHtmlRenderer` controls how HTML +is rendered: + +```java +Markwon.builder(context) + .usePlugin(new AbstractMarkwonPlugin() { + @Override + public void configureHtmlRenderer(@NonNull MarkwonHtmlRenderer.Builder builder) { + builder.setHandler("a", new MyTagHandler()); + } + }); +``` + +:::danger +Customizing `MarkwonHtmlRenderer` is not enough to include HTML content in your application. +You must explicitly include [markwon-html](/docs/v3/html/) artifact (include HtmlParser) +to you project and register `HtmlPlugin`: + +```java +Markwon.builder(context) + .usePlugin(HtmlPlugin.create()) +``` +::: + +For example, to create an `` HTML tag handler: + +```java +builder.setHandler("a", new SimpleTagHandler() { + @Override + public Object getSpans( + @NonNull MarkwonConfiguration configuration, + @NonNull RenderProps renderProps, + @NonNull HtmlTag tag) { + return new LinkSpan( + configuration.theme(), + tag.attributes().get("href"), + configuration.linkResolver()); + } +}); +``` + +`SimpleTagHandler` can be used for simple cases when a tag does not require any special +handling (like visiting it's children) + +:::tip +One can return `null` a single span or an array of spans from `getSpans` method +::: + +For a more advanced usage `TagHandler` can be used directly: + +```java +builder.setHandler("a", new TagHandler() { + @Override + public void handle(@NonNull MarkwonVisitor visitor, @NonNull MarkwonHtmlRenderer renderer, @NonNull HtmlTag tag) { + + // obtain default spanFactory for Link node + final SpanFactory factory = visitor.configuration().spansFactory().get(Link.class); + + if (factory != null) { + + // set destination property + CoreProps.LINK_DESTINATION.set( + visitor.renderProps(), + tag.attributes().get("href")); + + // Obtain spans from the factory + final Object spans = factory.getSpans( + visitor.configuration(), + visitor.renderProps()); + + // apply spans to SpannableBuilder + SpannableBuilder.setSpans( + visitor.builder(), + spans, + tag.start(), + tag.end()); + } + } +}); +``` \ No newline at end of file diff --git a/docs/docs/v3/core/spans-factory.md b/docs/docs/v3/core/spans-factory.md index 3b326736..6044de9a 100644 --- a/docs/docs/v3/core/spans-factory.md +++ b/docs/docs/v3/core/spans-factory.md @@ -1 +1,61 @@ -# Spans Factory \ No newline at end of file +# Spans Factory + +Starting with `MarkwonSpansFactory` controls what spans are displayed +for markdown nodes. + +```java +Markwon.builder(context) + .usePlugin(new AbstractMarkwonPlugin() { + @Override + public void configureSpansFactory(@NonNull MarkwonSpansFactory.Builder builder) { + // passing null as second argument will remove previously added + // factory for the Link node + builder.setFactory(Link.class, null); + } + }); +``` + +## SpanFactory + +In order to create a _generic_ interface for all possible Nodes, a `SpanFactory` +was added: + +```java +builder.setFactory(Link.class, new SpanFactory() { + @Nullable + @Override + public Object getSpans(@NonNull MarkwonConfiguration configuration, @NonNull RenderProps props) { + return null; + } +}); +``` + +All possible arguments are passed via [RenderProps](/docs/v3/core/render-props.md): + +```java +builder.setFactory(Link.class, new SpanFactory() { + @Override + public Object getSpans(@NonNull MarkwonConfiguration configuration, @NonNull RenderProps props) { + final String href = CoreProps.LINK_DESTINATION.require(props); + return new LinkSpan(configuration.theme(), href, configuration.linkResolver()); + } +}); +``` + +`SpanFactory` allows returning `null` for a certain span (no span will be applied). +Or an array of spans: + +```java +builder.setFactory(Link.class, new SpanFactory() { + @Override + public Object getSpans(@NonNull MarkwonConfiguration configuration, @NonNull RenderProps props) { + return new Object[]{ + new LinkSpan( + configuration.theme(), + CoreProps.LINK_DESTINATION.require(props), + configuration.linkResolver()), + new ForegroundColorSpan(Color.RED) + }; + } +}); +``` \ No newline at end of file diff --git a/docs/docs/v3/core/theme.md b/docs/docs/v3/core/theme.md index bfb2b71d..672babc6 100644 --- a/docs/docs/v3/core/theme.md +++ b/docs/docs/v3/core/theme.md @@ -128,12 +128,24 @@ Typeface of code content +### Block code typeface + +Typeface of block code content + + + ### Code text size Text size of code content +### Block code text size + +Text size of block code content + + + ## Heading ### Break height diff --git a/markwon-core/src/main/java/ru/noties/markwon/MarkwonSpansFactory.java b/markwon-core/src/main/java/ru/noties/markwon/MarkwonSpansFactory.java index 326af3e6..dbc6960d 100644 --- a/markwon-core/src/main/java/ru/noties/markwon/MarkwonSpansFactory.java +++ b/markwon-core/src/main/java/ru/noties/markwon/MarkwonSpansFactory.java @@ -32,7 +32,7 @@ public interface MarkwonSpansFactory { interface Builder { @NonNull - Builder setFactory(@NonNull Class node, @NonNull SpanFactory factory); + Builder setFactory(@NonNull Class node, @Nullable SpanFactory factory); @NonNull MarkwonSpansFactory build(); diff --git a/markwon-core/src/main/java/ru/noties/markwon/MarkwonSpansFactoryImpl.java b/markwon-core/src/main/java/ru/noties/markwon/MarkwonSpansFactoryImpl.java index bc472bb4..f3cd0dee 100644 --- a/markwon-core/src/main/java/ru/noties/markwon/MarkwonSpansFactoryImpl.java +++ b/markwon-core/src/main/java/ru/noties/markwon/MarkwonSpansFactoryImpl.java @@ -43,8 +43,12 @@ class MarkwonSpansFactoryImpl implements MarkwonSpansFactory { @NonNull @Override - public Builder setFactory(@NonNull Class node, @NonNull SpanFactory factory) { - factories.put(node, factory); + public Builder setFactory(@NonNull Class node, @Nullable SpanFactory factory) { + if (factory == null) { + factories.remove(node); + } else { + factories.put(node, factory); + } return this; } diff --git a/markwon-core/src/main/java/ru/noties/markwon/html/MarkwonHtmlRenderer.java b/markwon-core/src/main/java/ru/noties/markwon/html/MarkwonHtmlRenderer.java index 931fd092..234d53ac 100644 --- a/markwon-core/src/main/java/ru/noties/markwon/html/MarkwonHtmlRenderer.java +++ b/markwon-core/src/main/java/ru/noties/markwon/html/MarkwonHtmlRenderer.java @@ -42,10 +42,10 @@ public abstract class MarkwonHtmlRenderer { Builder allowNonClosedTags(boolean allowNonClosedTags); @NonNull - Builder addHandler(@NonNull String tagName, @NonNull TagHandler tagHandler); + Builder setHandler(@NonNull String tagName, @NonNull TagHandler tagHandler); @NonNull - Builder addHandler(@NonNull Collection tagNames, @NonNull TagHandler tagHandler); + Builder setHandler(@NonNull Collection tagNames, @NonNull TagHandler tagHandler); @NonNull Builder removeHandler(@NonNull String tagName); diff --git a/markwon-core/src/main/java/ru/noties/markwon/html/MarkwonHtmlRendererImpl.java b/markwon-core/src/main/java/ru/noties/markwon/html/MarkwonHtmlRendererImpl.java index ca94f902..7547e1cc 100644 --- a/markwon-core/src/main/java/ru/noties/markwon/html/MarkwonHtmlRendererImpl.java +++ b/markwon-core/src/main/java/ru/noties/markwon/html/MarkwonHtmlRendererImpl.java @@ -100,14 +100,14 @@ class MarkwonHtmlRendererImpl extends MarkwonHtmlRenderer { @NonNull @Override - public Builder addHandler(@NonNull String tagName, @NonNull TagHandler tagHandler) { + public Builder setHandler(@NonNull String tagName, @NonNull TagHandler tagHandler) { tagHandlers.put(tagName, tagHandler); return this; } @NonNull @Override - public Builder addHandler(@NonNull Collection tagNames, @NonNull TagHandler tagHandler) { + public Builder setHandler(@NonNull Collection tagNames, @NonNull TagHandler tagHandler) { for (String tagName : tagNames) { if (tagName != null) { tagHandlers.put(tagName, tagHandler); diff --git a/markwon-html/src/main/java/ru/noties/markwon/html/HtmlPlugin.java b/markwon-html/src/main/java/ru/noties/markwon/html/HtmlPlugin.java index 032fd68e..d087058e 100644 --- a/markwon-html/src/main/java/ru/noties/markwon/html/HtmlPlugin.java +++ b/markwon-html/src/main/java/ru/noties/markwon/html/HtmlPlugin.java @@ -45,37 +45,37 @@ public class HtmlPlugin extends AbstractMarkwonPlugin { public void configureHtmlRenderer(@NonNull MarkwonHtmlRenderer.Builder builder) { builder - .addHandler( + .setHandler( "img", ImageHandler.create()) - .addHandler( + .setHandler( "a", new LinkHandler()) - .addHandler( + .setHandler( "blockquote", new BlockquoteHandler()) - .addHandler( + .setHandler( "sub", new SubScriptHandler()) - .addHandler( + .setHandler( "sup", new SuperScriptHandler()) - .addHandler( + .setHandler( asList("b", "strong"), new StrongEmphasisHandler()) - .addHandler( + .setHandler( asList("s", "del"), new StrikeHandler()) - .addHandler( + .setHandler( asList("u", "ins"), new UnderlineHandler()) - .addHandler( + .setHandler( asList("ul", "ol"), new ListHandler()) - .addHandler( + .setHandler( asList("i", "em", "cite", "dfn"), new EmphasisHandler()) - .addHandler( + .setHandler( asList("h1", "h2", "h3", "h4", "h5", "h6"), new HeadingHandler()); }