Markwon/docs/v3/core/plugins.html
Dimitry Ivanov b00d0efa9d deploy
2021-01-12 12:50:41 +03:00

299 lines
72 KiB
HTML

<!DOCTYPE html>
<html lang="en-US">
<head>
<meta charset="utf-8">
<meta name="viewport" content="width=device-width,initial-scale=1">
<title>Plugins | Markwon</title>
<meta name="description" content="Android markdown library based on commonmark specification that renders markdown as system-native Spannables (no WebView)">
<link rel="apple-touch-icon" sizes="180x180" href="/Markwon/apple-touch-icon.png?v=1">
<link rel="icon" type="image/png" sizes="16x16" href="/Markwon/favicon-16x16.png?v=1">
<link rel="icon" href="/Markwon/favicon.ico?v=1">
<link rel="icon" type="image/png" sizes="32x32" href="/Markwon/favicon-32x32.png?v=1">
<link rel="manifest" href="/Markwon/manifest.json?v=1">
<meta name="keywords" content="android,markdown,library,spannable,markwon,commonmark">
<link rel="preload" href="/Markwon/assets/css/0.styles.3fbbce9e.css" as="style"><link rel="preload" href="/Markwon/assets/js/app.bdfd2bc6.js" as="script"><link rel="preload" href="/Markwon/assets/js/37.e98b3352.js" as="script"><link rel="preload" href="/Markwon/assets/js/3.eaac0903.js" as="script"><link rel="preload" href="/Markwon/assets/js/12.98308542.js" as="script"><link rel="prefetch" href="/Markwon/assets/js/42.d7ca0851.js"><link rel="prefetch" href="/Markwon/assets/js/2.81714ae9.js"><link rel="prefetch" href="/Markwon/assets/js/4.31fa5321.js"><link rel="prefetch" href="/Markwon/assets/js/5.6234b6a3.js"><link rel="prefetch" href="/Markwon/assets/js/6.ef59e46d.js"><link rel="prefetch" href="/Markwon/assets/js/7.e9b37c71.js"><link rel="prefetch" href="/Markwon/assets/js/8.9dff76ac.js"><link rel="prefetch" href="/Markwon/assets/js/9.7d018a47.js"><link rel="prefetch" href="/Markwon/assets/js/10.99fc608c.js"><link rel="prefetch" href="/Markwon/assets/js/11.cdc173e9.js"><link rel="prefetch" href="/Markwon/assets/js/13.83b81b01.js"><link rel="prefetch" href="/Markwon/assets/js/14.0e5fe31e.js"><link rel="prefetch" href="/Markwon/assets/js/15.724f3dc4.js"><link rel="prefetch" href="/Markwon/assets/js/16.076204be.js"><link rel="prefetch" href="/Markwon/assets/js/17.9412daf3.js"><link rel="prefetch" href="/Markwon/assets/js/18.187f0167.js"><link rel="prefetch" href="/Markwon/assets/js/19.af3507a7.js"><link rel="prefetch" href="/Markwon/assets/js/20.dc11e22f.js"><link rel="prefetch" href="/Markwon/assets/js/21.393a507f.js"><link rel="prefetch" href="/Markwon/assets/js/22.a6ac92c5.js"><link rel="prefetch" href="/Markwon/assets/js/23.9edcc0b3.js"><link rel="prefetch" href="/Markwon/assets/js/24.073942b3.js"><link rel="prefetch" href="/Markwon/assets/js/25.507307eb.js"><link rel="prefetch" href="/Markwon/assets/js/26.87c7e366.js"><link rel="prefetch" href="/Markwon/assets/js/27.a6f7a96f.js"><link rel="prefetch" href="/Markwon/assets/js/28.c0caacb4.js"><link rel="prefetch" href="/Markwon/assets/js/29.230c7321.js"><link rel="prefetch" href="/Markwon/assets/js/30.45e92827.js"><link rel="prefetch" href="/Markwon/assets/js/31.3a2ff699.js"><link rel="prefetch" href="/Markwon/assets/js/32.662e2ab9.js"><link rel="prefetch" href="/Markwon/assets/js/33.d83b2cb7.js"><link rel="prefetch" href="/Markwon/assets/js/34.4b19ef85.js"><link rel="prefetch" href="/Markwon/assets/js/35.1684da38.js"><link rel="prefetch" href="/Markwon/assets/js/36.9852715d.js"><link rel="prefetch" href="/Markwon/assets/js/38.09771599.js"><link rel="prefetch" href="/Markwon/assets/js/39.37003a65.js"><link rel="prefetch" href="/Markwon/assets/js/40.bf595a01.js"><link rel="prefetch" href="/Markwon/assets/js/41.db50f781.js"><link rel="prefetch" href="/Markwon/assets/js/43.78500964.js"><link rel="prefetch" href="/Markwon/assets/js/44.60fec7f9.js"><link rel="prefetch" href="/Markwon/assets/js/45.78224b99.js"><link rel="prefetch" href="/Markwon/assets/js/46.9a7f306b.js"><link rel="prefetch" href="/Markwon/assets/js/47.42b56911.js"><link rel="prefetch" href="/Markwon/assets/js/48.cceb75d4.js"><link rel="prefetch" href="/Markwon/assets/js/49.20507df8.js"><link rel="prefetch" href="/Markwon/assets/js/50.f89d88b1.js"><link rel="prefetch" href="/Markwon/assets/js/51.d7ac54ce.js"><link rel="prefetch" href="/Markwon/assets/js/52.394ded4e.js"><link rel="prefetch" href="/Markwon/assets/js/53.144cf408.js"><link rel="prefetch" href="/Markwon/assets/js/54.0f936c4f.js"><link rel="prefetch" href="/Markwon/assets/js/55.5b7382a9.js"><link rel="prefetch" href="/Markwon/assets/js/56.1cf2f788.js"><link rel="prefetch" href="/Markwon/assets/js/57.1b7dddc1.js"><link rel="prefetch" href="/Markwon/assets/js/58.5271aaaf.js"><link rel="prefetch" href="/Markwon/assets/js/59.7ef6ac9a.js"><link rel="prefetch" href="/Markwon/assets/js/60.9bbfa80f.js"><link rel="prefetch" href="/Markwon/assets/js/61.628c1500.js"><link rel="prefetch" href="/Markwon/assets/js/62.d4d206d7.js"><link rel="prefetch" href="/Markwon/assets/js/63.8ccf8bfc.js"><link rel="prefetch" href="/Markwon/assets/js/64.7672a52b.js"><link rel="prefetch" href="/Markwon/assets/js/65.c4f000dc.js"><link rel="prefetch" href="/Markwon/assets/js/66.4a29728a.js"><link rel="prefetch" href="/Markwon/assets/js/67.7331c7c7.js"><link rel="prefetch" href="/Markwon/assets/js/68.9d1d2ae1.js"><link rel="prefetch" href="/Markwon/assets/js/69.fd31295a.js"><link rel="prefetch" href="/Markwon/assets/js/70.fac8f892.js"><link rel="prefetch" href="/Markwon/assets/js/71.c3fcfb65.js"><link rel="prefetch" href="/Markwon/assets/js/72.d2389fc9.js"><link rel="prefetch" href="/Markwon/assets/js/73.6ce21170.js"><link rel="prefetch" href="/Markwon/assets/js/74.2ad91074.js"><link rel="prefetch" href="/Markwon/assets/js/75.1d59d27c.js"><link rel="prefetch" href="/Markwon/assets/js/76.f3844391.js"><link rel="prefetch" href="/Markwon/assets/js/77.4e5a82c3.js"><link rel="prefetch" href="/Markwon/assets/js/78.ff7203ee.js"><link rel="prefetch" href="/Markwon/assets/js/79.b1718a0d.js"><link rel="prefetch" href="/Markwon/assets/js/80.802db0eb.js"><link rel="prefetch" href="/Markwon/assets/js/81.9edd3cd9.js"><link rel="prefetch" href="/Markwon/assets/js/82.52f04a34.js"><link rel="prefetch" href="/Markwon/assets/js/83.3bd397c0.js"><link rel="prefetch" href="/Markwon/assets/js/84.a9af8a34.js"><link rel="prefetch" href="/Markwon/assets/js/85.2a0d8d40.js">
<link rel="stylesheet" href="/Markwon/assets/css/0.styles.3fbbce9e.css">
</head>
<body>
<div id="app" data-server-rendered="true"><div class="theme-container"><header class="navbar"><div class="sidebar-button"><svg xmlns="http://www.w3.org/2000/svg" aria-hidden="true" role="img" viewBox="0 0 448 512" class="icon"><path fill="currentColor" d="M436 124H12c-6.627 0-12-5.373-12-12V80c0-6.627 5.373-12 12-12h424c6.627 0 12 5.373 12 12v32c0 6.627-5.373 12-12 12zm0 160H12c-6.627 0-12-5.373-12-12v-32c0-6.627 5.373-12 12-12h424c6.627 0 12 5.373 12 12v32c0 6.627-5.373 12-12 12zm0 160H12c-6.627 0-12-5.373-12-12v-32c0-6.627 5.373-12 12-12h424c6.627 0 12 5.373 12 12v32c0 6.627-5.373 12-12 12z"></path></svg></div> <a href="/Markwon/" class="home-link router-link-active"><!----> <span class="site-name">Markwon</span></a> <div class="links" style="max-width:nullpx;"><div class="search-box"><input aria-label="Search" autocomplete="off" spellcheck="false" value=""> <!----></div> <nav class="nav-links can-hide"><div class="nav-item"><a href="/Markwon/docs/v4/install.html" class="nav-link">Install</a></div><div class="nav-item"><div class="dropdown-wrapper"><a class="dropdown-title"><span class="title">API Version</span> <span class="arrow right"></span></a> <ul class="nav-dropdown" style="display:none;"><li class="dropdown-item"><h4>Latest</h4> <ul class="dropdown-subitem-wrapper"><li class="dropdown-subitem"><a href="/Markwon/" class="nav-link">4.x.x</a></li></ul></li><li class="dropdown-item"><h4>Legacy</h4> <ul class="dropdown-subitem-wrapper"><li class="dropdown-subitem"><a href="/Markwon/docs/v3/install.html" class="nav-link">3.x.x</a></li><li class="dropdown-subitem"><a href="/Markwon/docs/v2/" class="nav-link">2.x.x</a></li></ul></li></ul></div></div><div class="nav-item"><a href="https://github.com/noties/Markwon/blob/master/CHANGELOG.md" target="_blank" rel="noopener noreferrer" class="nav-link external">
Changelog
<svg xmlns="http://www.w3.org/2000/svg" aria-hidden="true" x="0px" y="0px" viewBox="0 0 100 100" width="15" height="15" class="icon outbound"><path fill="currentColor" d="M18.8,85.1h56l0,0c2.2,0,4-1.8,4-4v-32h-8v28h-48v-48h28v-8h-32l0,0c-2.2,0-4,1.8-4,4v56C14.8,83.3,16.6,85.1,18.8,85.1z"></path> <polygon fill="currentColor" points="45.7,48.7 51.3,54.3 77.2,28.5 77.2,37.2 85.2,37.2 85.2,14.9 62.8,14.9 62.8,22.9 71.5,22.9"></polygon></svg></a></div><div class="nav-item"><a href="https://github.com/noties/Markwon" target="_blank" rel="noopener noreferrer" class="nav-link external">
Github
<svg xmlns="http://www.w3.org/2000/svg" aria-hidden="true" x="0px" y="0px" viewBox="0 0 100 100" width="15" height="15" class="icon outbound"><path fill="currentColor" d="M18.8,85.1h56l0,0c2.2,0,4-1.8,4-4v-32h-8v28h-48v-48h28v-8h-32l0,0c-2.2,0-4,1.8-4,4v56C14.8,83.3,16.6,85.1,18.8,85.1z"></path> <polygon fill="currentColor" points="45.7,48.7 51.3,54.3 77.2,28.5 77.2,37.2 85.2,37.2 85.2,14.9 62.8,14.9 62.8,22.9 71.5,22.9"></polygon></svg></a></div> <!----></nav></div></header> <div class="sidebar-mask"></div> <div class="sidebar"><nav class="nav-links"><div class="nav-item"><a href="/Markwon/docs/v4/install.html" class="nav-link">Install</a></div><div class="nav-item"><div class="dropdown-wrapper"><a class="dropdown-title"><span class="title">API Version</span> <span class="arrow right"></span></a> <ul class="nav-dropdown" style="display:none;"><li class="dropdown-item"><h4>Latest</h4> <ul class="dropdown-subitem-wrapper"><li class="dropdown-subitem"><a href="/Markwon/" class="nav-link">4.x.x</a></li></ul></li><li class="dropdown-item"><h4>Legacy</h4> <ul class="dropdown-subitem-wrapper"><li class="dropdown-subitem"><a href="/Markwon/docs/v3/install.html" class="nav-link">3.x.x</a></li><li class="dropdown-subitem"><a href="/Markwon/docs/v2/" class="nav-link">2.x.x</a></li></ul></li></ul></div></div><div class="nav-item"><a href="https://github.com/noties/Markwon/blob/master/CHANGELOG.md" target="_blank" rel="noopener noreferrer" class="nav-link external">
Changelog
<svg xmlns="http://www.w3.org/2000/svg" aria-hidden="true" x="0px" y="0px" viewBox="0 0 100 100" width="15" height="15" class="icon outbound"><path fill="currentColor" d="M18.8,85.1h56l0,0c2.2,0,4-1.8,4-4v-32h-8v28h-48v-48h28v-8h-32l0,0c-2.2,0-4,1.8-4,4v56C14.8,83.3,16.6,85.1,18.8,85.1z"></path> <polygon fill="currentColor" points="45.7,48.7 51.3,54.3 77.2,28.5 77.2,37.2 85.2,37.2 85.2,14.9 62.8,14.9 62.8,22.9 71.5,22.9"></polygon></svg></a></div><div class="nav-item"><a href="https://github.com/noties/Markwon" target="_blank" rel="noopener noreferrer" class="nav-link external">
Github
<svg xmlns="http://www.w3.org/2000/svg" aria-hidden="true" x="0px" y="0px" viewBox="0 0 100 100" width="15" height="15" class="icon outbound"><path fill="currentColor" d="M18.8,85.1h56l0,0c2.2,0,4-1.8,4-4v-32h-8v28h-48v-48h28v-8h-32l0,0c-2.2,0-4,1.8-4,4v56C14.8,83.3,16.6,85.1,18.8,85.1z"></path> <polygon fill="currentColor" points="45.7,48.7 51.3,54.3 77.2,28.5 77.2,37.2 85.2,37.2 85.2,14.9 62.8,14.9 62.8,22.9 71.5,22.9"></polygon></svg></a></div> <!----></nav> <ul class="sidebar-links"><li><a href="/Markwon/docs/v3/install.html" class="sidebar-link">/docs/v3/install.html</a></li><li><div class="sidebar-group"><p class="sidebar-heading open"><span>Core</span> <!----></p> <ul class="sidebar-group-items"><li><a href="/Markwon/docs/v3/core/getting-started.html" class="sidebar-link">Getting started</a></li><li><a href="/Markwon/docs/v3/core/plugins.html" class="active sidebar-link">Plugins</a><ul class="sidebar-sub-headers"><li class="sidebar-sub-header"><a href="/Markwon/docs/v3/core/plugins.html#parser" class="sidebar-link">Parser</a></li><li class="sidebar-sub-header"><a href="/Markwon/docs/v3/core/plugins.html#markwontheme" class="sidebar-link">MarkwonTheme</a></li><li class="sidebar-sub-header"><a href="/Markwon/docs/v3/core/plugins.html#images" class="sidebar-link">Images</a></li><li class="sidebar-sub-header"><a href="/Markwon/docs/v3/core/plugins.html#configuration" class="sidebar-link">Configuration</a></li><li class="sidebar-sub-header"><a href="/Markwon/docs/v3/core/plugins.html#visitor" class="sidebar-link">Visitor</a></li><li class="sidebar-sub-header"><a href="/Markwon/docs/v3/core/plugins.html#spans-factory" class="sidebar-link">Spans Factory</a></li><li class="sidebar-sub-header"><a href="/Markwon/docs/v3/core/plugins.html#html-renderer" class="sidebar-link">HTML Renderer</a></li><li class="sidebar-sub-header"><a href="/Markwon/docs/v3/core/plugins.html#priority" class="sidebar-link">Priority</a></li><li class="sidebar-sub-header"><a href="/Markwon/docs/v3/core/plugins.html#process-markdown" class="sidebar-link">Process markdown</a></li><li class="sidebar-sub-header"><a href="/Markwon/docs/v3/core/plugins.html#inspect-modify-node" class="sidebar-link">Inspect/modify Node</a></li><li class="sidebar-sub-header"><a href="/Markwon/docs/v3/core/plugins.html#inspect-node-after-render" class="sidebar-link">Inspect Node after render</a></li><li class="sidebar-sub-header"><a href="/Markwon/docs/v3/core/plugins.html#prepare-textview" class="sidebar-link">Prepare TextView</a></li><li class="sidebar-sub-header"><a href="/Markwon/docs/v3/core/plugins.html#textview-after-markdown-applied" class="sidebar-link">TextView after markdown applied</a></li><li class="sidebar-sub-header"><a href="/Markwon/docs/v3/core/plugins.html#what-happens-underneath" class="sidebar-link">What happens underneath</a></li></ul></li><li><a href="/Markwon/docs/v3/core/theme.html" class="sidebar-link">Theme</a></li><li><a href="/Markwon/docs/v3/core/images.html" class="sidebar-link">Images</a></li><li><a href="/Markwon/docs/v3/core/configuration.html" class="sidebar-link">Configuration</a></li><li><a href="/Markwon/docs/v3/core/visitor.html" class="sidebar-link">Visitor</a></li><li><a href="/Markwon/docs/v3/core/spans-factory.html" class="sidebar-link">Spans Factory</a></li><li><a href="/Markwon/docs/v3/core/html-renderer.html" class="sidebar-link">HTML Renderer</a></li><li><a href="/Markwon/docs/v3/core/core-plugin.html" class="sidebar-link">Core plugin</a></li><li><a href="/Markwon/docs/v3/core/movement-method-plugin.html" class="sidebar-link">Movement method plugin</a></li><li><a href="/Markwon/docs/v3/core/render-props.html" class="sidebar-link">RenderProps</a></li></ul></div></li><li><a href="/Markwon/docs/v3/ext-latex/" class="sidebar-link">LaTeX extension</a></li><li><a href="/Markwon/docs/v3/ext-strikethrough/" class="sidebar-link">Strikethrough extension</a></li><li><a href="/Markwon/docs/v3/ext-tables/" class="sidebar-link">Tables extension</a></li><li><a href="/Markwon/docs/v3/ext-tasklist/" class="sidebar-link">Task list extension</a></li><li><a href="/Markwon/docs/v3/html/" class="sidebar-link">HTML</a></li><li><a href="/Markwon/docs/v3/image/gif.html" class="sidebar-link">Image GIF</a></li><li><a href="/Markwon/docs/v3/image/okhttp.html" class="sidebar-link">Image OkHttp</a></li><li><a href="/Markwon/docs/v3/image/svg.html" class="sidebar-link">Image SVG</a></li><li><a href="/Markwon/docs/v3/recycler/" class="sidebar-link">Recycler</a></li><li><a href="/Markwon/docs/v3/recycler-table/" class="sidebar-link">Recycler Table</a></li><li><a href="/Markwon/docs/v3/syntax-highlight/" class="sidebar-link">Syntax highlight</a></li><li><a href="/Markwon/docs/v3/migration-2-3.html" class="sidebar-link">Migration 2.x.x -&gt; 3.x.x</a></li></ul> </div> <div class="page"> <div class="content"><h1 id="plugins"><a href="#plugins" aria-hidden="true" class="header-anchor">#</a> Plugins <span class="badge tip top" data-v-099ab69c>3.0.0</span></h1> <div class="warning custom-block"><p class="custom-block-title">WARNING</p> <p>This is documentation for <u>legacy</u> versions. For the most current version <a href="/Markwon/">click here.</a></p></div> <p>Since <span class="badge tip top" data-v-099ab69c>3.0.0</span> <code>MarkwonPlugin</code> takes the key role in
processing and rendering markdown. Even <strong>core</strong> functionaly is abstracted
into a <code>CorePlugin</code>. So it's still possible to use <code>Markwon</code> with a completely
own set of plugins.</p> <p>To register a plugin <code>Markwon.Builder</code> must be used:</p> <div class="language-java extra-class"><pre class="language-java"><code>Markwon<span class="token punctuation">.</span><span class="token function">builder</span><span class="token punctuation">(</span>context<span class="token punctuation">)</span>
<span class="token punctuation">.</span><span class="token function">usePlugin</span><span class="token punctuation">(</span>CorePlugin<span class="token punctuation">.</span><span class="token function">create</span><span class="token punctuation">(</span><span class="token punctuation">)</span><span class="token punctuation">)</span>
<span class="token punctuation">.</span><span class="token function">build</span><span class="token punctuation">(</span><span class="token punctuation">)</span><span class="token punctuation">;</span>
</code></pre></div><p>All the process of transforming <em>raw</em> markdown into a styled text (Spanned)
will go through plugins. A plugin can:</p> <ul><li><a href="#parser">configure commonmark-java <code>Parser</code></a></li> <li><a href="#markwontheme">configure <code>MarkwonTheme</code></a></li> <li><a href="#images">configure <code>AsyncDrawableLoader</code> (used to display images in markdown)</a></li> <li><a href="#configuration">configure <code>MarkwonConfiguration</code></a></li> <li><a href="#visitor">configure <code>MarkwonVisitor</code> (extensible commonmark-java Node visitor)</a></li> <li><a href="#spans-factory">configure <code>MarkwonSpansFactory</code> (factory to hold spans information for each Node)</a></li> <li><a href="#html-renderer">configure <code>MarkwonHtmlRenderer</code> (utility to properly display HTML in markdown)</a></li></ul> <hr> <ul><li><a href="#priority">declare a dependency on another plugin (will be used as a runtime validator)</a></li></ul> <hr> <ul><li><a href="#process-markdown">process raw input markdown before parsing it</a></li> <li><a href="#inspect-modify-node">inspect/modify commonmark-java Node after it's been parsed, but before rendering</a></li> <li><a href="#inspect-node-after-render">inspect commonmark-java Node after it's been rendered</a></li> <li><a href="#prepare-textview">prepare TextView to display markdown <em>before</em> markdown is applied to a TextView</a></li> <li><a href="#textview-after-markdown-applied">post-process TextView <em>after</em> markdown was applied</a></li></ul> <div class="tip custom-block"><p class="custom-block-title">TIP</p> <p>if you need to override only few methods of <code>MarkwonPlugin</code> (since it is an interface),
<code>AbstractMarkwonPlugin</code> can be used.</p></div> <h2 id="parser"><a href="#parser" aria-hidden="true" class="header-anchor">#</a> Parser</h2> <p>For example, let's register a new commonmark-java Parser extension:</p> <div class="language-java extra-class"><pre class="language-java"><code><span class="token keyword">final</span> Markwon markwon <span class="token operator">=</span> Markwon<span class="token punctuation">.</span><span class="token function">builder</span><span class="token punctuation">(</span>context<span class="token punctuation">)</span>
<span class="token punctuation">.</span><span class="token function">usePlugin</span><span class="token punctuation">(</span>CorePlugin<span class="token punctuation">.</span><span class="token function">create</span><span class="token punctuation">(</span><span class="token punctuation">)</span><span class="token punctuation">)</span>
<span class="token punctuation">.</span><span class="token function">usePlugin</span><span class="token punctuation">(</span><span class="token keyword">new</span> <span class="token class-name">AbstractMarkwonPlugin</span><span class="token punctuation">(</span><span class="token punctuation">)</span> <span class="token punctuation">{</span>
<span class="token annotation punctuation">@Override</span>
<span class="token keyword">public</span> <span class="token keyword">void</span> <span class="token function">configureParser</span><span class="token punctuation">(</span><span class="token annotation punctuation">@NonNull</span> Parser<span class="token punctuation">.</span>Builder builder<span class="token punctuation">)</span> <span class="token punctuation">{</span>
<span class="token comment">// no need to call `super.configureParser(builder)`</span>
builder<span class="token punctuation">.</span><span class="token function">extensions</span><span class="token punctuation">(</span>Collections<span class="token punctuation">.</span><span class="token function">singleton</span><span class="token punctuation">(</span>StrikethroughExtension<span class="token punctuation">.</span><span class="token function">create</span><span class="token punctuation">(</span><span class="token punctuation">)</span><span class="token punctuation">)</span><span class="token punctuation">)</span><span class="token punctuation">;</span>
<span class="token punctuation">}</span>
<span class="token punctuation">}</span><span class="token punctuation">)</span>
<span class="token punctuation">.</span><span class="token function">build</span><span class="token punctuation">(</span><span class="token punctuation">)</span><span class="token punctuation">;</span>
</code></pre></div><p>There are no limitations on what to do with commonmark-java Parser. For more info
<em>what</em> can be done please refer to <a href="https://github.com/atlassian/commonmark-java/" target="_blank" rel="noopener noreferrer">
commonmark-java documentation
<svg xmlns="http://www.w3.org/2000/svg" aria-hidden="true" x="0px" y="0px" viewBox="0 0 100 100" width="15" height="15" class="icon outbound"><path fill="currentColor" d="M18.8,85.1h56l0,0c2.2,0,4-1.8,4-4v-32h-8v28h-48v-48h28v-8h-32l0,0c-2.2,0-4,1.8-4,4v56C14.8,83.3,16.6,85.1,18.8,85.1z"></path> <polygon fill="currentColor" points="45.7,48.7 51.3,54.3 77.2,28.5 77.2,37.2 85.2,37.2 85.2,14.9 62.8,14.9 62.8,22.9 71.5,22.9"></polygon></svg></a>.</p> <h2 id="markwontheme"><a href="#markwontheme" aria-hidden="true" class="header-anchor">#</a> MarkwonTheme</h2> <p>Starting <span class="badge tip top" data-v-099ab69c>3.0.0</span> <code>MarkwonTheme</code> represents <em>core</em> theme. Aka theme for
things core module knows of. For example it doesn't know anything about <code>strikethrough</code>
or <code>tables</code> (as they belong to different modules).</p> <div class="language-java extra-class"><pre class="language-java"><code><span class="token keyword">final</span> Markwon markwon <span class="token operator">=</span> Markwon<span class="token punctuation">.</span><span class="token function">builder</span><span class="token punctuation">(</span>context<span class="token punctuation">)</span>
<span class="token punctuation">.</span><span class="token function">usePlugin</span><span class="token punctuation">(</span><span class="token keyword">new</span> <span class="token class-name">AbstractMarkwonPlugin</span><span class="token punctuation">(</span><span class="token punctuation">)</span> <span class="token punctuation">{</span>
<span class="token annotation punctuation">@Override</span>
<span class="token keyword">public</span> <span class="token keyword">void</span> <span class="token function">configureTheme</span><span class="token punctuation">(</span><span class="token annotation punctuation">@NonNull</span> MarkwonTheme<span class="token punctuation">.</span>Builder builder<span class="token punctuation">)</span> <span class="token punctuation">{</span>
builder
<span class="token punctuation">.</span><span class="token function">codeTextColor</span><span class="token punctuation">(</span>Color<span class="token punctuation">.</span>BLACK<span class="token punctuation">)</span>
<span class="token punctuation">.</span><span class="token function">codeBackgroundColor</span><span class="token punctuation">(</span>Color<span class="token punctuation">.</span>GREEN<span class="token punctuation">)</span><span class="token punctuation">;</span>
<span class="token punctuation">}</span>
<span class="token punctuation">}</span><span class="token punctuation">)</span>
<span class="token punctuation">.</span><span class="token function">build</span><span class="token punctuation">(</span><span class="token punctuation">)</span><span class="token punctuation">;</span>
</code></pre></div><div class="warning custom-block"><p class="custom-block-title">WARNING</p> <p><code>CorePlugin</code> has special handling - it will be <strong>implicitly</strong> added
if a plugin declares dependency on it. This is why in previous example we haven't
added CorePlugin <em>explicitly</em> as <code>AbstractMarkwonPlugin</code> declares a dependency on it.
If it's not desireable override <code>AbstractMarkwonPlugin#priority</code> method to specify own rules.</p></div> <p>More information about <code>MarkwonTheme</code> can be found <a href="/Markwon/docs/v3/core/theme.html">here</a>.</p> <h2 id="images"><a href="#images" aria-hidden="true" class="header-anchor">#</a> Images</h2> <p>Since <span class="badge tip top" data-v-099ab69c>3.0.0</span> core images functionality moved to the <code>core</code> module.
Now <code>Markwon</code> comes bundled with support for regular images (no <code>SVG</code> or <code>GIF</code>, they
defined in standalone modules now). And 3(4) schemes supported by default:</p> <ul><li>http (+https; using system built-in <code>HttpURLConnection</code>)</li> <li>file (including Android assets)</li> <li>data (image inline, <code>data:image/svg+xml;base64,!@#$%^&amp;*(</code>)</li></ul> <div class="language-java extra-class"><pre class="language-java"><code><span class="token keyword">final</span> Markwon markwon <span class="token operator">=</span> Markwon<span class="token punctuation">.</span><span class="token function">builder</span><span class="token punctuation">(</span>context<span class="token punctuation">)</span>
<span class="token punctuation">.</span><span class="token function">usePlugin</span><span class="token punctuation">(</span>ImagesPlugin<span class="token punctuation">.</span><span class="token function">create</span><span class="token punctuation">(</span><span class="token punctuation">)</span><span class="token punctuation">)</span>
<span class="token punctuation">.</span><span class="token function">usePlugin</span><span class="token punctuation">(</span><span class="token keyword">new</span> <span class="token class-name">AbstractMarkwonPlugin</span><span class="token punctuation">(</span><span class="token punctuation">)</span> <span class="token punctuation">{</span>
<span class="token annotation punctuation">@Override</span>
<span class="token keyword">public</span> <span class="token keyword">void</span> <span class="token function">configureImages</span><span class="token punctuation">(</span><span class="token annotation punctuation">@NonNull</span> AsyncDrawableLoader<span class="token punctuation">.</span>Builder builder<span class="token punctuation">)</span> <span class="token punctuation">{</span>
<span class="token comment">// sorry, these are not bundled with the library</span>
builder
<span class="token punctuation">.</span><span class="token function">addSchemeHandler</span><span class="token punctuation">(</span><span class="token string">&quot;ftp&quot;</span><span class="token punctuation">,</span> <span class="token keyword">new</span> <span class="token class-name">FtpSchemeHandler</span><span class="token punctuation">(</span><span class="token string">&quot;root&quot;</span><span class="token punctuation">,</span> <span class="token string">&quot;&quot;</span><span class="token punctuation">)</span><span class="token punctuation">)</span>
<span class="token punctuation">.</span><span class="token function">addMediaDecoder</span><span class="token punctuation">(</span><span class="token string">&quot;text/plain&quot;</span><span class="token punctuation">,</span> <span class="token keyword">new</span> <span class="token class-name">AnsiiMediaDecoder</span><span class="token punctuation">(</span><span class="token punctuation">)</span><span class="token punctuation">)</span><span class="token punctuation">;</span>
<span class="token punctuation">}</span>
<span class="token punctuation">}</span><span class="token punctuation">)</span>
<span class="token punctuation">.</span><span class="token function">build</span><span class="token punctuation">(</span><span class="token punctuation">)</span><span class="token punctuation">;</span>
</code></pre></div><div class="warning custom-block"><p class="custom-block-title">WARNING</p> <p>Although <code>ImagesPlugin</code> is bundled with the <code>core</code> artifact, it is <strong>not</strong> used by default
and one must <strong>explicitly</strong> add it:</p> <div class="language-java extra-class"><pre class="language-java"><code>Markwon<span class="token punctuation">.</span><span class="token function">builder</span><span class="token punctuation">(</span>context<span class="token punctuation">)</span>
<span class="token punctuation">.</span><span class="token function">usePlugin</span><span class="token punctuation">(</span>ImagesPlugin<span class="token punctuation">.</span><span class="token function">create</span><span class="token punctuation">(</span>context<span class="token punctuation">)</span><span class="token punctuation">)</span><span class="token punctuation">;</span>
</code></pre></div><p>Without explicit usage of <code>ImagesPlugin</code> all image configuration will be ignored (no-op'ed)</p></div> <p>More information about dealing with images can be found <a href="/Markwon/docs/v3/core/images.html">here</a></p> <h2 id="configuration"><a href="#configuration" aria-hidden="true" class="header-anchor">#</a> Configuration</h2> <p><code>MarkwonConfiguration</code> is a set of common tools that are used by different parts
of <code>Markwon</code>. It allows configurations of these:</p> <ul><li><code>SyntaxHighlight</code> (highlighting code blocks)</li> <li><code>LinkResolver</code> (opens links in markdown)</li> <li><code>UrlProcessor</code> (process URLs in markdown for both links and images)</li> <li><code>MarkwonHtmlParser</code> (HTML parser)</li> <li><code>ImageSizeResolver</code> (resolve image sizes, like <code>fit-to-canvas</code>, etc)</li></ul> <div class="language-java extra-class"><pre class="language-java"><code><span class="token keyword">final</span> Markwon markwon <span class="token operator">=</span> Markwon<span class="token punctuation">.</span><span class="token function">builder</span><span class="token punctuation">(</span>context<span class="token punctuation">)</span>
<span class="token punctuation">.</span><span class="token function">usePlugin</span><span class="token punctuation">(</span><span class="token keyword">new</span> <span class="token class-name">AbstractMarkwonPlugin</span><span class="token punctuation">(</span><span class="token punctuation">)</span> <span class="token punctuation">{</span>
<span class="token annotation punctuation">@Override</span>
<span class="token keyword">public</span> <span class="token keyword">void</span> <span class="token function">configureConfiguration</span><span class="token punctuation">(</span><span class="token annotation punctuation">@NonNull</span> MarkwonConfiguration<span class="token punctuation">.</span>Builder builder<span class="token punctuation">)</span> <span class="token punctuation">{</span>
<span class="token comment">// MarkwonHtmlParserImpl is defined in `markwon-html` artifact</span>
builder<span class="token punctuation">.</span><span class="token function">htmlParser</span><span class="token punctuation">(</span>MarkwonHtmlParserImpl<span class="token punctuation">.</span><span class="token function">create</span><span class="token punctuation">(</span><span class="token punctuation">)</span><span class="token punctuation">)</span><span class="token punctuation">;</span>
<span class="token punctuation">}</span>
<span class="token punctuation">}</span><span class="token punctuation">)</span>
<span class="token punctuation">.</span><span class="token function">build</span><span class="token punctuation">(</span><span class="token punctuation">)</span><span class="token punctuation">;</span>
</code></pre></div><p>More information about <code>MarkwonConfiguration</code> can be found <a href="/Markwon/docs/v3/core/configuration.html">here</a></p> <h2 id="visitor"><a href="#visitor" aria-hidden="true" class="header-anchor">#</a> Visitor</h2> <p><code>MarkwonVisitor</code> <span class="badge tip top" data-v-099ab69c>3.0.0</span> is commonmark-java Visitor that allows
configuration of how each Node is visited. There is no longer need to create
own subclass of Visitor and override required methods (like in <code>2.x.x</code> versions).
<code>MarkwonVisitor</code> also allows registration of Nodes, that <code>core</code> module knows
nothing about (instead of relying on <code>visit(CustomNode)</code> method)).</p> <p>For example, let's add <code>strikethrough</code> Node visitor:</p> <div class="language-java extra-class"><pre class="language-java"><code><span class="token keyword">final</span> Markwon markwon <span class="token operator">=</span> Markwon<span class="token punctuation">.</span><span class="token function">builder</span><span class="token punctuation">(</span>context<span class="token punctuation">)</span>
<span class="token punctuation">.</span><span class="token function">usePlugin</span><span class="token punctuation">(</span><span class="token keyword">new</span> <span class="token class-name">AbstractMarkwonPlugin</span><span class="token punctuation">(</span><span class="token punctuation">)</span> <span class="token punctuation">{</span>
<span class="token annotation punctuation">@Override</span>
<span class="token keyword">public</span> <span class="token keyword">void</span> <span class="token function">configureVisitor</span><span class="token punctuation">(</span><span class="token annotation punctuation">@NonNull</span> MarkwonVisitor<span class="token punctuation">.</span>Builder builder<span class="token punctuation">)</span> <span class="token punctuation">{</span>
builder
<span class="token punctuation">.</span><span class="token function">on</span><span class="token punctuation">(</span>Strikethrough<span class="token punctuation">.</span><span class="token keyword">class</span><span class="token punctuation">,</span> <span class="token keyword">new</span> <span class="token class-name">MarkwonVisitor<span class="token punctuation">.</span>NodeVisitor</span><span class="token generics function"><span class="token punctuation">&lt;</span>Strikethrough<span class="token punctuation">&gt;</span></span><span class="token punctuation">(</span><span class="token punctuation">)</span> <span class="token punctuation">{</span>
<span class="token annotation punctuation">@Override</span>
<span class="token keyword">public</span> <span class="token keyword">void</span> <span class="token function">visit</span><span class="token punctuation">(</span><span class="token annotation punctuation">@NonNull</span> MarkwonVisitor visitor<span class="token punctuation">,</span> <span class="token annotation punctuation">@NonNull</span> Strikethrough strikethrough<span class="token punctuation">)</span> <span class="token punctuation">{</span>
<span class="token keyword">final</span> <span class="token keyword">int</span> length <span class="token operator">=</span> visitor<span class="token punctuation">.</span><span class="token function">length</span><span class="token punctuation">(</span><span class="token punctuation">)</span><span class="token punctuation">;</span>
visitor<span class="token punctuation">.</span><span class="token function">visitChildren</span><span class="token punctuation">(</span>strikethrough<span class="token punctuation">)</span><span class="token punctuation">;</span>
visitor<span class="token punctuation">.</span><span class="token function">setSpansForNodeOptional</span><span class="token punctuation">(</span>strikethrough<span class="token punctuation">,</span> length<span class="token punctuation">)</span><span class="token punctuation">;</span>
<span class="token punctuation">}</span>
<span class="token punctuation">}</span><span class="token punctuation">)</span><span class="token punctuation">;</span>
<span class="token punctuation">}</span>
<span class="token punctuation">}</span><span class="token punctuation">)</span>
<span class="token punctuation">.</span><span class="token function">build</span><span class="token punctuation">(</span><span class="token punctuation">)</span><span class="token punctuation">;</span>
</code></pre></div><div class="tip custom-block"><p class="custom-block-title">TIP</p> <p><code>MarkwonVisitor</code> also allows <em>overriding</em> already registered nodes. For example,
we can disable <code>Heading</code> Node rendering:</p> <div class="language-java extra-class"><pre class="language-java"><code>builder<span class="token punctuation">.</span><span class="token function">on</span><span class="token punctuation">(</span>Heading<span class="token punctuation">.</span><span class="token keyword">class</span><span class="token punctuation">,</span> null<span class="token punctuation">)</span><span class="token punctuation">;</span>
</code></pre></div><p>Please note that <code>Priority</code> plays nicely here to ensure that your
custom Node override/disable happens <em>after</em> some plugin defines it.</p></div> <p>More information about <code>MarkwonVisitor</code> can be found <a href="/Markwon/docs/v3/core/visitor.html">here</a></p> <h2 id="spans-factory"><a href="#spans-factory" aria-hidden="true" class="header-anchor">#</a> Spans Factory</h2> <p><code>MarkwonSpansFactory</code> <span class="badge tip top" data-v-099ab69c>3.0.0</span> is an abstract factory (factory that produces other factories)
for spans that <code>Markwon</code> uses. It controls what spans to use for certain Nodes.</p> <div class="language-java extra-class"><pre class="language-java"><code><span class="token keyword">final</span> Markwon markwon <span class="token operator">=</span> Markwon<span class="token punctuation">.</span><span class="token function">builder</span><span class="token punctuation">(</span>context<span class="token punctuation">)</span>
<span class="token punctuation">.</span><span class="token function">usePlugin</span><span class="token punctuation">(</span><span class="token keyword">new</span> <span class="token class-name">AbstractMarkwonPlugin</span><span class="token punctuation">(</span><span class="token punctuation">)</span> <span class="token punctuation">{</span>
<span class="token annotation punctuation">@Override</span>
<span class="token keyword">public</span> <span class="token keyword">void</span> <span class="token function">configureSpansFactory</span><span class="token punctuation">(</span><span class="token annotation punctuation">@NonNull</span> MarkwonSpansFactory<span class="token punctuation">.</span>Builder builder<span class="token punctuation">)</span> <span class="token punctuation">{</span>
<span class="token comment">// override emphasis factory to make all emphasis nodes underlined</span>
builder<span class="token punctuation">.</span><span class="token function">setFactory</span><span class="token punctuation">(</span>Emphasis<span class="token punctuation">.</span><span class="token keyword">class</span><span class="token punctuation">,</span> <span class="token keyword">new</span> <span class="token class-name">SpanFactory</span><span class="token punctuation">(</span><span class="token punctuation">)</span> <span class="token punctuation">{</span>
<span class="token annotation punctuation">@Override</span>
<span class="token keyword">public</span> Object <span class="token function">getSpans</span><span class="token punctuation">(</span><span class="token annotation punctuation">@NonNull</span> MarkwonConfiguration configuration<span class="token punctuation">,</span> <span class="token annotation punctuation">@NonNull</span> RenderProps props<span class="token punctuation">)</span> <span class="token punctuation">{</span>
<span class="token keyword">return</span> <span class="token keyword">new</span> <span class="token class-name">UnderlineSpan</span><span class="token punctuation">(</span><span class="token punctuation">)</span><span class="token punctuation">;</span>
<span class="token punctuation">}</span>
<span class="token punctuation">}</span><span class="token punctuation">)</span><span class="token punctuation">;</span>
<span class="token punctuation">}</span>
<span class="token punctuation">}</span><span class="token punctuation">)</span>
<span class="token punctuation">.</span><span class="token function">build</span><span class="token punctuation">(</span><span class="token punctuation">)</span><span class="token punctuation">;</span>
</code></pre></div><div class="tip custom-block"><p class="custom-block-title">TIP</p> <p><code>SpanFactory</code> allows to return an <em>array</em> of spans to apply multiple spans
for a Node:</p> <div class="language-java extra-class"><pre class="language-java"><code><span class="token annotation punctuation">@Override</span>
<span class="token keyword">public</span> Object <span class="token function">getSpans</span><span class="token punctuation">(</span><span class="token annotation punctuation">@NonNull</span> MarkwonConfiguration configuration<span class="token punctuation">,</span> <span class="token annotation punctuation">@NonNull</span> RenderProps props<span class="token punctuation">)</span> <span class="token punctuation">{</span>
<span class="token comment">// make underlined and set text color to red</span>
<span class="token keyword">return</span> <span class="token keyword">new</span> <span class="token class-name">Object</span><span class="token punctuation">[</span><span class="token punctuation">]</span><span class="token punctuation">{</span>
<span class="token keyword">new</span> <span class="token class-name">UnderlineSpan</span><span class="token punctuation">(</span><span class="token punctuation">)</span><span class="token punctuation">,</span>
<span class="token keyword">new</span> <span class="token class-name">ForegroundColorSpan</span><span class="token punctuation">(</span>Color<span class="token punctuation">.</span>RED<span class="token punctuation">)</span>
<span class="token punctuation">}</span><span class="token punctuation">;</span>
<span class="token punctuation">}</span>
</code></pre></div></div> <p>More information about spans factory can be found <a href="/Markwon/docs/v3/core/spans-factory.html">here</a></p> <h2 id="html-renderer"><a href="#html-renderer" aria-hidden="true" class="header-anchor">#</a> HTML Renderer</h2> <p><code>MarkwonHtmlRenderer</code> controls how HTML is rendered in markdown.</p> <div class="language-java extra-class"><pre class="language-java"><code><span class="token keyword">final</span> Markwon markwon <span class="token operator">=</span> Markwon<span class="token punctuation">.</span><span class="token function">builder</span><span class="token punctuation">(</span>context<span class="token punctuation">)</span>
<span class="token punctuation">.</span><span class="token function">usePlugin</span><span class="token punctuation">(</span>HtmlPlugin<span class="token punctuation">.</span><span class="token function">create</span><span class="token punctuation">(</span><span class="token punctuation">)</span><span class="token punctuation">)</span>
<span class="token punctuation">.</span><span class="token function">usePlugin</span><span class="token punctuation">(</span><span class="token keyword">new</span> <span class="token class-name">AbstractMarkwonPlugin</span><span class="token punctuation">(</span><span class="token punctuation">)</span> <span class="token punctuation">{</span>
<span class="token annotation punctuation">@Override</span>
<span class="token keyword">public</span> <span class="token keyword">void</span> <span class="token function">configureHtmlRenderer</span><span class="token punctuation">(</span><span class="token annotation punctuation">@NonNull</span> MarkwonHtmlRenderer<span class="token punctuation">.</span>Builder builder<span class="token punctuation">)</span> <span class="token punctuation">{</span>
<span class="token comment">// &lt;center&gt; tag handling (deprecated but valid in our case)</span>
<span class="token comment">// can be any tag name, there is no connection with _real_ HTML tags,</span>
<span class="token comment">// &lt;just-try-to-not-go-crazy-and-remember-about-portability&gt;</span>
builder<span class="token punctuation">.</span><span class="token function">addHandler</span><span class="token punctuation">(</span><span class="token string">&quot;center&quot;</span><span class="token punctuation">,</span> <span class="token keyword">new</span> <span class="token class-name">SimpleTagHandler</span><span class="token punctuation">(</span><span class="token punctuation">)</span> <span class="token punctuation">{</span>
<span class="token annotation punctuation">@Override</span>
<span class="token keyword">public</span> Object <span class="token function">getSpans</span><span class="token punctuation">(</span><span class="token annotation punctuation">@NonNull</span> MarkwonConfiguration configuration<span class="token punctuation">,</span> <span class="token annotation punctuation">@NonNull</span> RenderProps renderProps<span class="token punctuation">,</span> <span class="token annotation punctuation">@NonNull</span> HtmlTag tag<span class="token punctuation">)</span> <span class="token punctuation">{</span>
<span class="token keyword">return</span> <span class="token keyword">new</span> <span class="token class-name">AlignmentSpan</span><span class="token punctuation">(</span><span class="token punctuation">)</span> <span class="token punctuation">{</span>
<span class="token annotation punctuation">@Override</span>
<span class="token keyword">public</span> Layout<span class="token punctuation">.</span>Alignment <span class="token function">getAlignment</span><span class="token punctuation">(</span><span class="token punctuation">)</span> <span class="token punctuation">{</span>
<span class="token keyword">return</span> Layout<span class="token punctuation">.</span>Alignment<span class="token punctuation">.</span>ALIGN_CENTER<span class="token punctuation">;</span>
<span class="token punctuation">}</span>
<span class="token punctuation">}</span><span class="token punctuation">;</span>
<span class="token punctuation">}</span>
<span class="token punctuation">}</span><span class="token punctuation">)</span><span class="token punctuation">;</span>
<span class="token punctuation">}</span>
<span class="token punctuation">}</span><span class="token punctuation">)</span>
<span class="token punctuation">.</span><span class="token function">build</span><span class="token punctuation">(</span><span class="token punctuation">)</span><span class="token punctuation">;</span>
</code></pre></div><div class="danger custom-block"><p class="custom-block-title">WARNING</p> <p>Although <code>MarkwonHtmlRenderer</code> is bundled with <code>core</code> artifact, actual
HTML parser is placed in a standalone artifact and must be added to your
project <strong>explicitly</strong> and then registered via <code>Markwon.Builder#usePlugin(HtmlPlugin.create())</code>.
If not done so, no HTML will be parsed nor rendered.</p></div> <p>More information about HTML rendering can be found <a href="/Markwon/docs/v3/core/html-renderer.html">here</a></p> <h2 id="priority"><a href="#priority" aria-hidden="true" class="header-anchor">#</a> Priority</h2> <p><code>Priority</code> is an abstraction to <em>state</em> dependency connection between plugins. It is
also used as a runtime graph validator. If a plugin defines a dependency on other, but
<em>other</em> is not in resulting <code>Markwon</code> instance, then a runtime exception will be thrown.
<code>Priority</code> is also defines the order in which plugins will be placed. So, if a plugin <code>A</code>
states a plugin <code>B</code> as a dependency, then plugin <code>A</code> will come <strong>after</strong> plugin <code>B</code>.</p> <div class="language-java extra-class"><pre class="language-java"><code><span class="token keyword">final</span> Markwon markwon <span class="token operator">=</span> Markwon<span class="token punctuation">.</span><span class="token function">builder</span><span class="token punctuation">(</span>context<span class="token punctuation">)</span>
<span class="token punctuation">.</span><span class="token function">usePlugin</span><span class="token punctuation">(</span><span class="token keyword">new</span> <span class="token class-name">AbstractMarkwonPlugin</span><span class="token punctuation">(</span><span class="token punctuation">)</span> <span class="token punctuation">{</span>
<span class="token annotation punctuation">@NonNull</span>
<span class="token annotation punctuation">@Override</span>
<span class="token keyword">public</span> Priority <span class="token function">priority</span><span class="token punctuation">(</span><span class="token punctuation">)</span> <span class="token punctuation">{</span>
<span class="token keyword">return</span> Priority<span class="token punctuation">.</span><span class="token function">after</span><span class="token punctuation">(</span>CorePlugin<span class="token punctuation">.</span><span class="token keyword">class</span><span class="token punctuation">)</span><span class="token punctuation">;</span>
<span class="token punctuation">}</span>
<span class="token punctuation">}</span><span class="token punctuation">)</span>
<span class="token punctuation">.</span><span class="token function">build</span><span class="token punctuation">(</span><span class="token punctuation">)</span><span class="token punctuation">;</span>
</code></pre></div><div class="warning custom-block"><p class="custom-block-title">WARNING</p> <p>Please note that <code>AbstractMarkwonPlugin</code> <em>implicitly</em> defines <code>CorePlugin</code>
as a dependency (<code>return Priority.after(CorePlugin.class);</code>). This will
also add <code>CorePlugin</code> to a <code>Markwon</code> instance, because it will be added
<em>implicitly</em> if a plugin defines it as a dependency.</p></div> <p>Use one of the factory methods to create a <code>Priority</code> instance:</p> <div class="language-java extra-class"><pre class="language-java"><code><span class="token comment">// none</span>
Priority<span class="token punctuation">.</span><span class="token function">none</span><span class="token punctuation">(</span><span class="token punctuation">)</span><span class="token punctuation">;</span>
<span class="token comment">// single dependency</span>
Priority<span class="token punctuation">.</span><span class="token function">after</span><span class="token punctuation">(</span>CorePlugin<span class="token punctuation">.</span><span class="token keyword">class</span><span class="token punctuation">)</span><span class="token punctuation">;</span>
<span class="token comment">// 2 dependencies</span>
Priority<span class="token punctuation">.</span><span class="token function">after</span><span class="token punctuation">(</span>CorePlugin<span class="token punctuation">.</span><span class="token keyword">class</span><span class="token punctuation">,</span> ImagesPlugin<span class="token punctuation">.</span><span class="token keyword">class</span><span class="token punctuation">)</span><span class="token punctuation">;</span>
<span class="token comment">// for a number &gt;2, use #builder</span>
Priority<span class="token punctuation">.</span><span class="token function">builder</span><span class="token punctuation">(</span><span class="token punctuation">)</span>
<span class="token punctuation">.</span><span class="token function">after</span><span class="token punctuation">(</span>CorePlugin<span class="token punctuation">.</span><span class="token keyword">class</span><span class="token punctuation">)</span>
<span class="token punctuation">.</span><span class="token function">after</span><span class="token punctuation">(</span>ImagesPlugin<span class="token punctuation">.</span><span class="token keyword">class</span><span class="token punctuation">)</span>
<span class="token punctuation">.</span><span class="token function">after</span><span class="token punctuation">(</span>StrikethroughPlugin<span class="token punctuation">.</span><span class="token keyword">class</span><span class="token punctuation">)</span>
<span class="token punctuation">.</span><span class="token function">build</span><span class="token punctuation">(</span><span class="token punctuation">)</span><span class="token punctuation">;</span>
</code></pre></div><h2 id="process-markdown"><a href="#process-markdown" aria-hidden="true" class="header-anchor">#</a> Process markdown</h2> <p>A plugin can be used to <em>pre-process</em> input markdown (this will be called before <em>parsing</em>):</p> <div class="language-java extra-class"><pre class="language-java"><code><span class="token keyword">final</span> Markwon markwon <span class="token operator">=</span> Markwon<span class="token punctuation">.</span><span class="token function">builder</span><span class="token punctuation">(</span>context<span class="token punctuation">)</span>
<span class="token punctuation">.</span><span class="token function">usePlugin</span><span class="token punctuation">(</span><span class="token keyword">new</span> <span class="token class-name">AbstractMarkwonPlugin</span><span class="token punctuation">(</span><span class="token punctuation">)</span> <span class="token punctuation">{</span>
<span class="token annotation punctuation">@NonNull</span>
<span class="token annotation punctuation">@Override</span>
<span class="token keyword">public</span> String <span class="token function">processMarkdown</span><span class="token punctuation">(</span><span class="token annotation punctuation">@NonNull</span> String markdown<span class="token punctuation">)</span> <span class="token punctuation">{</span>
<span class="token keyword">return</span> markdown<span class="token punctuation">.</span><span class="token function">replaceAll</span><span class="token punctuation">(</span><span class="token string">&quot;foo&quot;</span><span class="token punctuation">,</span> <span class="token string">&quot;bar&quot;</span><span class="token punctuation">)</span><span class="token punctuation">;</span>
<span class="token punctuation">}</span>
<span class="token punctuation">}</span><span class="token punctuation">)</span>
<span class="token punctuation">.</span><span class="token function">build</span><span class="token punctuation">(</span><span class="token punctuation">)</span><span class="token punctuation">;</span>
</code></pre></div><h2 id="inspect-modify-node"><a href="#inspect-modify-node" aria-hidden="true" class="header-anchor">#</a> Inspect/modify Node</h2> <p>A plugin can inspect/modify commonmark-java Node <em>before</em> it's being rendered.</p> <div class="language-java extra-class"><pre class="language-java"><code><span class="token keyword">final</span> Markwon markwon <span class="token operator">=</span> Markwon<span class="token punctuation">.</span><span class="token function">builder</span><span class="token punctuation">(</span>context<span class="token punctuation">)</span>
<span class="token punctuation">.</span><span class="token function">usePlugin</span><span class="token punctuation">(</span><span class="token keyword">new</span> <span class="token class-name">AbstractMarkwonPlugin</span><span class="token punctuation">(</span><span class="token punctuation">)</span> <span class="token punctuation">{</span>
<span class="token annotation punctuation">@Override</span>
<span class="token keyword">public</span> <span class="token keyword">void</span> <span class="token function">beforeRender</span><span class="token punctuation">(</span><span class="token annotation punctuation">@NonNull</span> Node node<span class="token punctuation">)</span> <span class="token punctuation">{</span>
<span class="token comment">// for example inspect it with custom visitor</span>
node<span class="token punctuation">.</span><span class="token function">accept</span><span class="token punctuation">(</span><span class="token keyword">new</span> <span class="token class-name">MyVisitor</span><span class="token punctuation">(</span><span class="token punctuation">)</span><span class="token punctuation">)</span><span class="token punctuation">;</span>
<span class="token comment">// or modify (you know what you are doing, right?)</span>
node<span class="token punctuation">.</span><span class="token function">appendChild</span><span class="token punctuation">(</span><span class="token keyword">new</span> <span class="token class-name">Text</span><span class="token punctuation">(</span><span class="token string">&quot;Appended&quot;</span><span class="token punctuation">)</span><span class="token punctuation">)</span><span class="token punctuation">;</span>
<span class="token punctuation">}</span>
<span class="token punctuation">}</span><span class="token punctuation">)</span>
<span class="token punctuation">.</span><span class="token function">build</span><span class="token punctuation">(</span><span class="token punctuation">)</span><span class="token punctuation">;</span>
</code></pre></div><h2 id="inspect-node-after-render"><a href="#inspect-node-after-render" aria-hidden="true" class="header-anchor">#</a> Inspect Node after render</h2> <p>A plugin can inspect commonmark-java Node after it's been rendered.
Modifying Node at this point makes not much sense (it's already been
rendered and all modifications won't change anything). But this method can be used,
for example, to clean-up some internal state (after rendering). Generally
speaking, a plugin must be stateless, but if it cannot, then this method is
the best place to clean-up.</p> <div class="language-java extra-class"><pre class="language-java"><code><span class="token keyword">final</span> Markwon markwon <span class="token operator">=</span> Markwon<span class="token punctuation">.</span><span class="token function">builder</span><span class="token punctuation">(</span>context<span class="token punctuation">)</span>
<span class="token punctuation">.</span><span class="token function">usePlugin</span><span class="token punctuation">(</span><span class="token keyword">new</span> <span class="token class-name">AbstractMarkwonPlugin</span><span class="token punctuation">(</span><span class="token punctuation">)</span> <span class="token punctuation">{</span>
<span class="token annotation punctuation">@Override</span>
<span class="token keyword">public</span> <span class="token keyword">void</span> <span class="token function">afterRender</span><span class="token punctuation">(</span><span class="token annotation punctuation">@NonNull</span> Node node<span class="token punctuation">,</span> <span class="token annotation punctuation">@NonNull</span> MarkwonVisitor visitor<span class="token punctuation">)</span> <span class="token punctuation">{</span>
<span class="token function">cleanUp</span><span class="token punctuation">(</span><span class="token punctuation">)</span><span class="token punctuation">;</span>
<span class="token punctuation">}</span>
<span class="token punctuation">}</span><span class="token punctuation">)</span>
<span class="token punctuation">.</span><span class="token function">build</span><span class="token punctuation">(</span><span class="token punctuation">)</span><span class="token punctuation">;</span>
</code></pre></div><h2 id="prepare-textview"><a href="#prepare-textview" aria-hidden="true" class="header-anchor">#</a> Prepare TextView</h2> <p>A plugin can <em>prepare</em> a TextView before markdown is applied. For example <code>images</code>
unschedules all previously scheduled <code>AsyncDrawableSpans</code> (if any) here. This way
when new markdown (and set of Spannables) arrives, previous set won't be kept in
memory and could be garbage-collected.</p> <div class="language-java extra-class"><pre class="language-java"><code><span class="token keyword">final</span> Markwon markwon <span class="token operator">=</span> Markwon<span class="token punctuation">.</span><span class="token function">builder</span><span class="token punctuation">(</span>context<span class="token punctuation">)</span>
<span class="token punctuation">.</span><span class="token function">usePlugin</span><span class="token punctuation">(</span><span class="token keyword">new</span> <span class="token class-name">AbstractMarkwonPlugin</span><span class="token punctuation">(</span><span class="token punctuation">)</span> <span class="token punctuation">{</span>
<span class="token annotation punctuation">@Override</span>
<span class="token keyword">public</span> <span class="token keyword">void</span> <span class="token function">beforeSetText</span><span class="token punctuation">(</span><span class="token annotation punctuation">@NonNull</span> TextView textView<span class="token punctuation">,</span> <span class="token annotation punctuation">@NonNull</span> Spanned markdown<span class="token punctuation">)</span> <span class="token punctuation">{</span>
<span class="token comment">// clean-up previous</span>
AsyncDrawableScheduler<span class="token punctuation">.</span><span class="token function">unschedule</span><span class="token punctuation">(</span>textView<span class="token punctuation">)</span><span class="token punctuation">;</span>
<span class="token punctuation">}</span>
<span class="token punctuation">}</span><span class="token punctuation">)</span>
<span class="token punctuation">.</span><span class="token function">build</span><span class="token punctuation">(</span><span class="token punctuation">)</span><span class="token punctuation">;</span>
</code></pre></div><h2 id="textview-after-markdown-applied"><a href="#textview-after-markdown-applied" aria-hidden="true" class="header-anchor">#</a> TextView after markdown applied</h2> <p>A plugin will receive a callback <em>after</em> markdown is applied to a TextView.
For example <code>images</code> uses this callback to schedule new set of Spannables.</p> <div class="language-java extra-class"><pre class="language-java"><code><span class="token keyword">final</span> Markwon markwon <span class="token operator">=</span> Markwon<span class="token punctuation">.</span><span class="token function">builder</span><span class="token punctuation">(</span>context<span class="token punctuation">)</span>
<span class="token punctuation">.</span><span class="token function">usePlugin</span><span class="token punctuation">(</span><span class="token keyword">new</span> <span class="token class-name">AbstractMarkwonPlugin</span><span class="token punctuation">(</span><span class="token punctuation">)</span> <span class="token punctuation">{</span>
<span class="token annotation punctuation">@Override</span>
<span class="token keyword">public</span> <span class="token keyword">void</span> <span class="token function">afterSetText</span><span class="token punctuation">(</span><span class="token annotation punctuation">@NonNull</span> TextView textView<span class="token punctuation">)</span> <span class="token punctuation">{</span>
AsyncDrawableScheduler<span class="token punctuation">.</span><span class="token function">schedule</span><span class="token punctuation">(</span>textView<span class="token punctuation">)</span><span class="token punctuation">;</span>
<span class="token punctuation">}</span>
<span class="token punctuation">}</span><span class="token punctuation">)</span>
<span class="token punctuation">.</span><span class="token function">build</span><span class="token punctuation">(</span><span class="token punctuation">)</span><span class="token punctuation">;</span>
</code></pre></div><div class="tip custom-block"><p class="custom-block-title">TIP</p> <p>Please note that unlike <code>#beforeSetText</code>, <code>#afterSetText</code> won't receive
<code>Spanned</code> markdown. This happens because at this point spans must be
queried directly from a TextView.</p></div> <h2 id="what-happens-underneath"><a href="#what-happens-underneath" aria-hidden="true" class="header-anchor">#</a> What happens underneath</h2> <p>Here is what happens inside <code>Markwon</code> when <code>setMarkdown</code> method is called:</p> <div class="language-java extra-class"><pre class="language-java"><code><span class="token comment">// `Markwon#create` implicitly uses CorePlugin</span>
<span class="token keyword">final</span> Markwon markwon <span class="token operator">=</span> Markwon<span class="token punctuation">.</span><span class="token function">builder</span><span class="token punctuation">(</span>context<span class="token punctuation">)</span>
<span class="token punctuation">.</span><span class="token function">usePlugin</span><span class="token punctuation">(</span>CorePlugin<span class="token punctuation">.</span><span class="token function">create</span><span class="token punctuation">(</span><span class="token punctuation">)</span><span class="token punctuation">)</span>
<span class="token punctuation">.</span><span class="token function">build</span><span class="token punctuation">(</span><span class="token punctuation">)</span><span class="token punctuation">;</span>
<span class="token comment">// warning: pseudo-code</span>
<span class="token comment">// 0. each plugin will be called to _pre-process_ raw input markdown</span>
rawInput <span class="token operator">=</span> plugins<span class="token punctuation">.</span><span class="token function">reduce</span><span class="token punctuation">(</span>rawInput<span class="token punctuation">,</span> <span class="token punctuation">(</span>input<span class="token punctuation">,</span> plugin<span class="token punctuation">)</span> <span class="token operator">-</span><span class="token operator">&gt;</span> plugin<span class="token punctuation">.</span><span class="token function">processMarkdown</span><span class="token punctuation">(</span>input<span class="token punctuation">)</span><span class="token punctuation">)</span><span class="token punctuation">;</span>
<span class="token comment">// 1. after input is processed it's being parsed to a Node</span>
node <span class="token operator">=</span> parser<span class="token punctuation">.</span><span class="token function">parse</span><span class="token punctuation">(</span>rawInput<span class="token punctuation">)</span><span class="token punctuation">;</span>
<span class="token comment">// 2. each plugin will be able to inspect or manipulate resulting Node</span>
<span class="token comment">// before rendering</span>
plugins<span class="token punctuation">.</span><span class="token function">forEach</span><span class="token punctuation">(</span>plugin <span class="token operator">-</span><span class="token operator">&gt;</span> plugin<span class="token punctuation">.</span><span class="token function">beforeRender</span><span class="token punctuation">(</span>node<span class="token punctuation">)</span><span class="token punctuation">)</span><span class="token punctuation">;</span>
<span class="token comment">// 3. node is being visited by a visitor</span>
node<span class="token punctuation">.</span><span class="token function">accept</span><span class="token punctuation">(</span>visitor<span class="token punctuation">)</span><span class="token punctuation">;</span>
<span class="token comment">// 4. each plugin will be called after node is being visited (aka rendered)</span>
plugins<span class="token punctuation">.</span><span class="token function">forEach</span><span class="token punctuation">(</span>plugin <span class="token operator">-</span><span class="token operator">&gt;</span> plugin<span class="token punctuation">.</span><span class="token function">afterRender</span><span class="token punctuation">(</span>node<span class="token punctuation">,</span> visitor<span class="token punctuation">)</span><span class="token punctuation">)</span><span class="token punctuation">;</span>
<span class="token comment">// 5. styled markdown ready at this point</span>
<span class="token keyword">final</span> Spanned markdown <span class="token operator">=</span> visitor<span class="token punctuation">.</span><span class="token function">markdown</span><span class="token punctuation">(</span><span class="token punctuation">)</span><span class="token punctuation">;</span>
<span class="token comment">// NB, points 6-8 are applied **only** if markdown is set to a TextView</span>
<span class="token comment">// 6. each plugin will be called before styled markdown is applied to a TextView</span>
plugins<span class="token punctuation">.</span><span class="token function">forEach</span><span class="token punctuation">(</span>plugin <span class="token operator">-</span><span class="token operator">&gt;</span> plugin<span class="token punctuation">.</span><span class="token function">beforeSetText</span><span class="token punctuation">(</span>textView<span class="token punctuation">,</span> markdown<span class="token punctuation">)</span><span class="token punctuation">)</span><span class="token punctuation">;</span>
<span class="token comment">// 7. markdown is applied to a TextView</span>
textView<span class="token punctuation">.</span><span class="token function">setText</span><span class="token punctuation">(</span>markdown<span class="token punctuation">)</span><span class="token punctuation">;</span>
<span class="token comment">// 8. each plugin will be called after markdown is applied to a TextView</span>
plugins<span class="token punctuation">.</span><span class="token function">forEach</span><span class="token punctuation">(</span>plugin <span class="token operator">-</span><span class="token operator">&gt;</span> plugin<span class="token punctuation">.</span><span class="token function">afterSetText</span><span class="token punctuation">(</span>textView<span class="token punctuation">)</span><span class="token punctuation">)</span><span class="token punctuation">;</span>
</code></pre></div></div> <div class="page-edit"><!----> <div class="last-updated"><span class="prefix">Last Updated: </span> <span class="time">8/6/2019, 7:27:20 PM</span></div></div> <div class="page-nav"><p class="inner"><span class="prev">
<a href="/Markwon/docs/v3/core/getting-started.html" class="prev">
Getting started
</a></span> <span class="next"><a href="/Markwon/docs/v3/core/theme.html">
Theme
</a>
</span></p></div> </div> <!----></div></div>
<script src="/Markwon/assets/js/37.e98b3352.js" defer></script><script src="/Markwon/assets/js/3.eaac0903.js" defer></script><script src="/Markwon/assets/js/12.98308542.js" defer></script><script src="/Markwon/assets/js/app.bdfd2bc6.js" defer></script>
</body>
</html>