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());
}