242 lines
59 KiB
HTML
242 lines
59 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/59.7ef6ac9a.js" as="script"><link rel="preload" href="/Markwon/assets/js/3.eaac0903.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/12.98308542.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/37.e98b3352.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/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/" class="sidebar-link">Introduction</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/v4/core/getting-started.html" class="sidebar-link">Getting started</a></li><li><a href="/Markwon/docs/v4/core/plugins.html" class="active sidebar-link">Plugins</a><ul class="sidebar-sub-headers"><li class="sidebar-sub-header"><a href="/Markwon/docs/v4/core/plugins.html#registry" class="sidebar-link">Registry</a></li><li class="sidebar-sub-header"><a href="/Markwon/docs/v4/core/plugins.html#parser" class="sidebar-link">Parser</a></li><li class="sidebar-sub-header"><a href="/Markwon/docs/v4/core/plugins.html#markwontheme" class="sidebar-link">MarkwonTheme</a></li><li class="sidebar-sub-header"><a href="/Markwon/docs/v4/core/plugins.html#configuration" class="sidebar-link">Configuration</a></li><li class="sidebar-sub-header"><a href="/Markwon/docs/v4/core/plugins.html#visitor" class="sidebar-link">Visitor</a></li><li class="sidebar-sub-header"><a href="/Markwon/docs/v4/core/plugins.html#spans-factory" class="sidebar-link">Spans Factory</a></li><li class="sidebar-sub-header"><a href="/Markwon/docs/v4/core/plugins.html#process-markdown" class="sidebar-link">Process markdown</a></li><li class="sidebar-sub-header"><a href="/Markwon/docs/v4/core/plugins.html#inspect-modify-node" class="sidebar-link">Inspect/modify Node</a></li><li class="sidebar-sub-header"><a href="/Markwon/docs/v4/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/v4/core/plugins.html#prepare-textview" class="sidebar-link">Prepare TextView</a></li><li class="sidebar-sub-header"><a href="/Markwon/docs/v4/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/v4/core/plugins.html#what-happens-underneath" class="sidebar-link">What happens underneath</a></li></ul></li><li><a href="/Markwon/docs/v4/core/registry.html" class="sidebar-link">Registry</a></li><li><a href="/Markwon/docs/v4/core/theme.html" class="sidebar-link">Theme</a></li><li><a href="/Markwon/docs/v4/core/configuration.html" class="sidebar-link">Configuration</a></li><li><a href="/Markwon/docs/v4/core/visitor.html" class="sidebar-link">Visitor</a></li><li><a href="/Markwon/docs/v4/core/spans-factory.html" class="sidebar-link">Spans Factory</a></li><li><a href="/Markwon/docs/v4/core/core-plugin.html" class="sidebar-link">Core plugin</a></li><li><a href="/Markwon/docs/v4/core/movement-method-plugin.html" class="sidebar-link">Movement method plugin</a></li><li><a href="/Markwon/docs/v4/core/render-props.html" class="sidebar-link">RenderProps</a></li><li><a href="/Markwon/docs/v4/core/text-setter.html" class="sidebar-link">TextSetter</a></li></ul></div></li><li><a href="/Markwon/docs/v4/editor/" class="sidebar-link">Editor</a></li><li><a href="/Markwon/docs/v4/ext-latex/" class="sidebar-link">LaTeX extension</a></li><li><a href="/Markwon/docs/v4/ext-strikethrough/" class="sidebar-link">Strikethrough extension</a></li><li><a href="/Markwon/docs/v4/ext-tables/" class="sidebar-link">Tables extension</a></li><li><a href="/Markwon/docs/v4/ext-tasklist/" class="sidebar-link">Task list extension</a></li><li><a href="/Markwon/docs/v4/html/" class="sidebar-link">HTML</a></li><li><a href="/Markwon/docs/v4/image/" class="sidebar-link">Image</a></li><li><a href="/Markwon/docs/v4/image-coil/" class="sidebar-link">Image Coil</a></li><li><a href="/Markwon/docs/v4/image-glide/" class="sidebar-link">Image Glide</a></li><li><a href="/Markwon/docs/v4/image-picasso/" class="sidebar-link">Image Picasso</a></li><li><a href="/Markwon/docs/v4/inline-parser/" class="sidebar-link">Inline Parser</a></li><li><a href="/Markwon/docs/v4/linkify/" class="sidebar-link">Linkify</a></li><li><a href="/Markwon/docs/v4/recycler/" class="sidebar-link">Recycler</a></li><li><a href="/Markwon/docs/v4/recycler-table/" class="sidebar-link">Recycler Table</a></li><li><a href="/Markwon/docs/v4/simple-ext/" class="sidebar-link">Simple Extension</a></li><li><a href="/Markwon/docs/v4/syntax-highlight/" class="sidebar-link">Syntax highlight</a></li><li><a href="/Markwon/docs/v4/recipes.html" class="sidebar-link">Recipes</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> <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 comment">// @since 4.0.0 there is no need to register CorePlugin, as it's registered automatically</span>
|
|
<span class="token comment">// .usePlugin(CorePlugin.create())</span>
|
|
<span class="token punctuation">.</span><span class="token function">usePlugin</span><span class="token punctuation">(</span>MyPlugin<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="#registry">configure plugin registry</a></li> <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></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="registry"><a href="#registry" aria-hidden="true" class="header-anchor">#</a> Registry <span class="badge tip top" data-v-099ab69c>4.0.0</span></h2> <p>Registry is a special step to pre-configure all registered plugins. It is also
|
|
used to determine the order of plugins inside <code>Markwon</code> instance.</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">configure</span><span class="token punctuation">(</span><span class="token annotation punctuation">@NonNull</span> Registry registry<span class="token punctuation">)</span> <span class="token punctuation">{</span>
|
|
|
|
<span class="token keyword">final</span> CorePlugin corePlugin <span class="token operator">=</span> registry<span class="token punctuation">.</span><span class="token function">require</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">// or</span>
|
|
registry<span class="token punctuation">.</span><span class="token function">require</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 keyword">new</span> <span class="token class-name">Action</span><span class="token generics function"><span class="token punctuation"><</span>CorePlugin<span class="token punctuation">></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">apply</span><span class="token punctuation">(</span><span class="token annotation punctuation">@NonNull</span> CorePlugin corePlugin<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><p>More information about registry can be found <a href="/Markwon/docs/v4/core/registry.html">here</a></p> <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><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="tip custom-block"><p class="custom-block-title">TIP</p> <p><code>CorePlugin</code> has special handling - it will be added automatically
|
|
when <code>Markwon.builder(Context)</code> method is used. If you wish to create
|
|
Markwon instance <em>without</em> CorePlugin registered -
|
|
use <code>Markwon.builderNoCore(Context)</code> method instead</p></div> <p>More information about <code>MarkwonTheme</code> can be found <a href="/Markwon/docs/v4/core/theme.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>AsyncDrawableLoader</code> (image loading)</li> <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>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>
|
|
builder<span class="token punctuation">.</span><span class="token function">linkResolver</span><span class="token punctuation">(</span><span class="token keyword">new</span> <span class="token class-name">LinkResolverDef</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/v4/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>
|
|
<span class="token comment">// please note that strike-through parser extension must be registered</span>
|
|
<span class="token comment">// in order to receive such callback</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"><</span>Strikethrough<span class="token punctuation">></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,
|
|
you 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></div> <p>More information about <code>MarkwonVisitor</code> can be found <a href="/Markwon/docs/v4/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/v4/core/spans-factory.html">here</a></p> <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">"foo"</span><span class="token punctuation">,</span> <span class="token string">"bar"</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">"Appended"</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 keyword">final</span> Markwon markwon <span class="token operator">=</span> Markwon<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 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">></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">></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">></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">></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">></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">6/12/2019, 6:45:28 PM</span></div></div> <div class="page-nav"><p class="inner"><span class="prev">
|
|
←
|
|
<a href="/Markwon/docs/v4/core/getting-started.html" class="prev">
|
|
Getting started
|
|
</a></span> <span class="next"><a href="/Markwon/docs/v4/core/registry.html">
|
|
Registry
|
|
</a>
|
|
→
|
|
</span></p></div> </div> <!----></div></div>
|
|
<script src="/Markwon/assets/js/59.7ef6ac9a.js" defer></script><script src="/Markwon/assets/js/3.eaac0903.js" defer></script><script src="/Markwon/assets/js/app.bdfd2bc6.js" defer></script>
|
|
</body>
|
|
</html>
|