Finished core documentation
This commit is contained in:
parent
0a965e4cbc
commit
12ef0b5703
@ -1 +1,82 @@
|
|||||||
# HTML Renderer
|
# HTML Renderer
|
||||||
|
|
||||||
|
Starting with <Badge text="3.0.0" /> `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 `<a>` 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());
|
||||||
|
}
|
||||||
|
}
|
||||||
|
});
|
||||||
|
```
|
@ -1 +1,61 @@
|
|||||||
# Spans Factory
|
# Spans Factory
|
||||||
|
|
||||||
|
Starting with <Badge text="3.0.0" /> `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)
|
||||||
|
};
|
||||||
|
}
|
||||||
|
});
|
||||||
|
```
|
@ -128,12 +128,24 @@ Typeface of code content
|
|||||||
|
|
||||||
<ThemeProperty name="codeTypeface" type="android.graphics.Typeface" defaults="Typeface.MONOSPACE" />
|
<ThemeProperty name="codeTypeface" type="android.graphics.Typeface" defaults="Typeface.MONOSPACE" />
|
||||||
|
|
||||||
|
### Block code typeface <Badge text="3.0.0" />
|
||||||
|
|
||||||
|
Typeface of block code content
|
||||||
|
|
||||||
|
<ThemeProperty name="codeBlockTypeface" type="android.graphics.Typeface" defaults="<code>codeTypeface</code> if set or Typeface.MONOSPACE" />
|
||||||
|
|
||||||
### Code text size
|
### Code text size
|
||||||
|
|
||||||
Text size of code content
|
Text size of code content
|
||||||
|
|
||||||
<ThemeProperty name="codeTextSize" type="@Px int" defaults="(Content text size) * 0.87 if no custom <a href='#code-typeface'>Typeface</a> was set, otherwise (content text size)" />
|
<ThemeProperty name="codeTextSize" type="@Px int" defaults="(Content text size) * 0.87 if no custom <a href='#code-typeface'>Typeface</a> was set, otherwise (content text size)" />
|
||||||
|
|
||||||
|
### Block code text size <Badge text="3.0.0" />
|
||||||
|
|
||||||
|
Text size of block code content
|
||||||
|
|
||||||
|
<ThemeProperty name="codeBlockTextSize" type="@Px int" defaults="<code>codeTextSize</code> if set or (content text size) * 0.87 if no custom <a href='#code-typeface'>Typeface</a> was set, otherwise (content text size)" />
|
||||||
|
|
||||||
## Heading
|
## Heading
|
||||||
|
|
||||||
### Break height
|
### Break height
|
||||||
|
@ -32,7 +32,7 @@ public interface MarkwonSpansFactory {
|
|||||||
interface Builder {
|
interface Builder {
|
||||||
|
|
||||||
@NonNull
|
@NonNull
|
||||||
<N extends Node> Builder setFactory(@NonNull Class<N> node, @NonNull SpanFactory factory);
|
<N extends Node> Builder setFactory(@NonNull Class<N> node, @Nullable SpanFactory factory);
|
||||||
|
|
||||||
@NonNull
|
@NonNull
|
||||||
MarkwonSpansFactory build();
|
MarkwonSpansFactory build();
|
||||||
|
@ -43,8 +43,12 @@ class MarkwonSpansFactoryImpl implements MarkwonSpansFactory {
|
|||||||
|
|
||||||
@NonNull
|
@NonNull
|
||||||
@Override
|
@Override
|
||||||
public <N extends Node> Builder setFactory(@NonNull Class<N> node, @NonNull SpanFactory factory) {
|
public <N extends Node> Builder setFactory(@NonNull Class<N> node, @Nullable SpanFactory factory) {
|
||||||
factories.put(node, factory);
|
if (factory == null) {
|
||||||
|
factories.remove(node);
|
||||||
|
} else {
|
||||||
|
factories.put(node, factory);
|
||||||
|
}
|
||||||
return this;
|
return this;
|
||||||
}
|
}
|
||||||
|
|
||||||
|
@ -42,10 +42,10 @@ public abstract class MarkwonHtmlRenderer {
|
|||||||
Builder allowNonClosedTags(boolean allowNonClosedTags);
|
Builder allowNonClosedTags(boolean allowNonClosedTags);
|
||||||
|
|
||||||
@NonNull
|
@NonNull
|
||||||
Builder addHandler(@NonNull String tagName, @NonNull TagHandler tagHandler);
|
Builder setHandler(@NonNull String tagName, @NonNull TagHandler tagHandler);
|
||||||
|
|
||||||
@NonNull
|
@NonNull
|
||||||
Builder addHandler(@NonNull Collection<String> tagNames, @NonNull TagHandler tagHandler);
|
Builder setHandler(@NonNull Collection<String> tagNames, @NonNull TagHandler tagHandler);
|
||||||
|
|
||||||
@NonNull
|
@NonNull
|
||||||
Builder removeHandler(@NonNull String tagName);
|
Builder removeHandler(@NonNull String tagName);
|
||||||
|
@ -100,14 +100,14 @@ class MarkwonHtmlRendererImpl extends MarkwonHtmlRenderer {
|
|||||||
|
|
||||||
@NonNull
|
@NonNull
|
||||||
@Override
|
@Override
|
||||||
public Builder addHandler(@NonNull String tagName, @NonNull TagHandler tagHandler) {
|
public Builder setHandler(@NonNull String tagName, @NonNull TagHandler tagHandler) {
|
||||||
tagHandlers.put(tagName, tagHandler);
|
tagHandlers.put(tagName, tagHandler);
|
||||||
return this;
|
return this;
|
||||||
}
|
}
|
||||||
|
|
||||||
@NonNull
|
@NonNull
|
||||||
@Override
|
@Override
|
||||||
public Builder addHandler(@NonNull Collection<String> tagNames, @NonNull TagHandler tagHandler) {
|
public Builder setHandler(@NonNull Collection<String> tagNames, @NonNull TagHandler tagHandler) {
|
||||||
for (String tagName : tagNames) {
|
for (String tagName : tagNames) {
|
||||||
if (tagName != null) {
|
if (tagName != null) {
|
||||||
tagHandlers.put(tagName, tagHandler);
|
tagHandlers.put(tagName, tagHandler);
|
||||||
|
@ -45,37 +45,37 @@ public class HtmlPlugin extends AbstractMarkwonPlugin {
|
|||||||
public void configureHtmlRenderer(@NonNull MarkwonHtmlRenderer.Builder builder) {
|
public void configureHtmlRenderer(@NonNull MarkwonHtmlRenderer.Builder builder) {
|
||||||
|
|
||||||
builder
|
builder
|
||||||
.addHandler(
|
.setHandler(
|
||||||
"img",
|
"img",
|
||||||
ImageHandler.create())
|
ImageHandler.create())
|
||||||
.addHandler(
|
.setHandler(
|
||||||
"a",
|
"a",
|
||||||
new LinkHandler())
|
new LinkHandler())
|
||||||
.addHandler(
|
.setHandler(
|
||||||
"blockquote",
|
"blockquote",
|
||||||
new BlockquoteHandler())
|
new BlockquoteHandler())
|
||||||
.addHandler(
|
.setHandler(
|
||||||
"sub",
|
"sub",
|
||||||
new SubScriptHandler())
|
new SubScriptHandler())
|
||||||
.addHandler(
|
.setHandler(
|
||||||
"sup",
|
"sup",
|
||||||
new SuperScriptHandler())
|
new SuperScriptHandler())
|
||||||
.addHandler(
|
.setHandler(
|
||||||
asList("b", "strong"),
|
asList("b", "strong"),
|
||||||
new StrongEmphasisHandler())
|
new StrongEmphasisHandler())
|
||||||
.addHandler(
|
.setHandler(
|
||||||
asList("s", "del"),
|
asList("s", "del"),
|
||||||
new StrikeHandler())
|
new StrikeHandler())
|
||||||
.addHandler(
|
.setHandler(
|
||||||
asList("u", "ins"),
|
asList("u", "ins"),
|
||||||
new UnderlineHandler())
|
new UnderlineHandler())
|
||||||
.addHandler(
|
.setHandler(
|
||||||
asList("ul", "ol"),
|
asList("ul", "ol"),
|
||||||
new ListHandler())
|
new ListHandler())
|
||||||
.addHandler(
|
.setHandler(
|
||||||
asList("i", "em", "cite", "dfn"),
|
asList("i", "em", "cite", "dfn"),
|
||||||
new EmphasisHandler())
|
new EmphasisHandler())
|
||||||
.addHandler(
|
.setHandler(
|
||||||
asList("h1", "h2", "h3", "h4", "h5", "h6"),
|
asList("h1", "h2", "h3", "h4", "h5", "h6"),
|
||||||
new HeadingHandler());
|
new HeadingHandler());
|
||||||
}
|
}
|
||||||
|
Loading…
x
Reference in New Issue
Block a user