Markwon/assets/js/25.507307eb.js
Dimitry Ivanov b00d0efa9d deploy
2021-01-12 12:50:41 +03:00

1 line
35 KiB
JavaScript
Raw Blame History

This file contains invisible Unicode characters

This file contains invisible Unicode characters that are indistinguishable to humans but may be processed differently by a computer. If you think that this is intentional, you can safely ignore this warning. Use the Escape button to reveal them.

(window.webpackJsonp=window.webpackJsonp||[]).push([[25],{279:function(t,a,s){"use strict";s.r(a);var n=s(0),e=Object(n.a)({},function(){var t=this,a=t.$createElement,s=t._self._c||a;return s("div",{staticClass:"content"},[s("h1",{attrs:{id:"html"}},[s("a",{staticClass:"header-anchor",attrs:{href:"#html","aria-hidden":"true"}},[t._v("#")]),t._v(" HTML "),s("Badge",{attrs:{text:"2.0.0"}})],1),t._v(" "),s("LegacyWarning"),t._v(" "),s("p",[t._v("Starting with version "),s("code",[t._v("2.0.0")]),t._v(" "),s("code",[t._v("Markwon")]),t._v(" brings the whole HTML parsing/rendering\nstack "),s("em",[t._v("on-site")]),t._v(". The main reason for this are "),s("em",[t._v("special")]),t._v(" definitions of HTML nodes\nby "),s("Link",{attrs:{name:"commonmark-spec"}}),t._v(". More specifically: "),s("Link",{attrs:{name:"commonmark-spec#inline",displayName:"inline"}}),t._v("\nand "),s("Link",{attrs:{name:"commonmark-spec#block",displayName:"block"}}),t._v(".\nThese two are "),s("em",[t._v("a bit")]),t._v(" different from "),s("em",[t._v("native")]),t._v(" HTML understanding.\nWell, they are "),s("em",[t._v("completely")]),t._v(" different and share only the same names as\n"),s("Link",{attrs:{name:"html-inlines",displayName:"HTML-inline"}}),t._v(" and "),s("Link",{attrs:{name:"html-blocks",displayName:"HTML-block"}}),t._v("\nelements. This leads to situations when for example an "),s("code",[t._v("<i>")]),t._v(" tag is considered\na block when it's used like this:")],1),t._v(" "),t._m(0),s("div",{staticClass:"tip custom-block"},[s("p",{staticClass:"custom-block-title"},[t._v("A bit of background")]),t._v(" "),s("br"),t._v(" "),s("GithubIssue",{attrs:{id:"52",displayName:"This issue"}}),t._v(" had brought attention to differences between HTML & commonmark implementations. "),s("br"),s("br")],1),t._v(" "),t._m(1),t._v(" "),t._m(2),s("p",[t._v("We have just added a "),s("code",[t._v("new-line")]),t._v(" before closing "),s("code",[t._v("</i>")]),t._v(" tag. And this\nchanges everything as now, according to the "),s("Link",{attrs:{name:"commonmark-dingus"}}),t._v(",\nwe have 2 HtmlBlocks: one before "),s("code",[t._v("new-line")]),t._v(" (containing open "),s("code",[t._v("<i>")]),t._v(" tag and text content)\nand one after (containing as little as closing "),s("code",[t._v("</i>")]),t._v(" tag).")],1),t._v(" "),t._m(3),t._v(" "),t._m(4),s("p",[t._v("We will have 1 HtmlBlock (from previous snippet) and a bunch of HtmlInlines:")]),t._v(" "),t._m(5),t._v(" "),t._m(6),t._v(" "),t._m(7),t._v(" "),t._m(8),t._v(" "),s("p",[t._v("We will get:")]),t._v(" "),t._m(9),t._v(" "),t._m(10),t._v(" "),s("p",[t._v("Which will be rendered in a final document:")]),t._v(" "),t._m(11),t._v(" "),t._m(12),t._v(" "),t._m(13),t._v(" "),s("p",[t._v("We, on the other hand, do not posess HTML heritage ("),s("em",[t._v("thank 🤖!")]),t._v("), but still\nwant to display some HTML to style resulting markdown a bit. That's why "),s("code",[t._v("Markwon")]),t._v("\nincorporated own HTML parsing logic. It is based on the "),s("Link",{attrs:{name:"jsoup"}}),t._v(" project.\nAnd makes usage of the "),s("code",[t._v("Tokekiser")]),t._v(" class that allows to "),s("em",[t._v("tokenise")]),t._v(" input HTML.\nAll other code that doesn't follow this purpose was removed. It's safe to use\nin projects that already have "),s("code",[t._v("jsoup")]),t._v(" dependency as "),s("code",[t._v("Markwon")]),t._v(" repackaged "),s("strong",[t._v("jsoup")]),t._v(" source classes\n(which could be found "),s("Link",{attrs:{name:"markwon-jsoup",displayName:"here"}}),t._v(")")],1),t._v(" "),t._m(14),t._v(" "),t._m(15),t._v(" "),t._m(16),t._v(" "),t._m(17),t._v(" "),t._m(18),t._m(19),t._v(" "),t._m(20),t._m(21),t._v(" "),t._m(22),t._v(" "),s("p",[t._v("Consider this:")]),t._v(" "),t._m(23),t._v(" "),t._m(24),t._v(" "),t._m(25),t._v(" "),t._m(26),t._v(" "),t._m(27),t._m(28),t._v(" "),t._m(29),t._v(" "),s("p",[s("code",[t._v("MarkwonHtmlParserImpl")]),t._v(" does not create a unified HTML node. Instead it creates\n2 collections: inline tags and block tags. Inline tags are represented as a "),s("code",[t._v("List")]),t._v("\nof inline tags ("),s("Link",{attrs:{name:"html-inlines",displayName:"reference"}}),t._v("). And\nblock tags are structured in a tree. This helps to achieve "),s("em",[t._v("browser")]),t._v("-like behaviour,\nwhen open inline tag is applied to all content (even if inside blocks) until closing tag.\nAll tags that are not "),s("em",[t._v("inline")]),t._v(" are considered to be "),s("em",[t._v("block")]),t._v(" ones.")],1),t._v(" "),t._m(30),t._v(" "),t._m(31),t._v(" "),s("p",[t._v("Default implementation can be obtain like this:")]),t._v(" "),t._m(32),t._m(33),t._v(" "),t._m(34),t._v(" "),t._m(35),t._v(" "),t._m(36),t._m(37),t._v(" "),t._m(38),t._m(39),t._v(" "),t._m(40),t._v(" "),t._m(41),t._m(42),t._v(" "),t._m(43),t._m(44),t._v(" "),t._m(45),t._m(46),t._v(" "),t._m(47),t._v(" "),t._m(48),t._v(" "),t._m(49),t._v(" "),t._m(50),t._m(51),t._v(" "),t._m(52),t._v(" "),s("MavenBadge",{attrs:{artifact:"markwon"}}),t._v(" "),t._m(53),t._m(54),t._v(" "),t._m(55)],1)},[function(){var t=this,a=t.$createElement,s=t._self._c||a;return s("div",{staticClass:"language-markdown extra-class"},[s("pre",{pre:!0,attrs:{class:"language-markdown"}},[s("code",[s("span",{attrs:{class:"token tag"}},[s("span",{attrs:{class:"token tag"}},[s("span",{attrs:{class:"token punctuation"}},[t._v("<")]),t._v("i")]),s("span",{attrs:{class:"token punctuation"}},[t._v(">")])]),t._v("\nHello from italics tag\n"),s("span",{attrs:{class:"token tag"}},[s("span",{attrs:{class:"token tag"}},[s("span",{attrs:{class:"token punctuation"}},[t._v("</")]),t._v("i")]),s("span",{attrs:{class:"token punctuation"}},[t._v(">")])]),t._v("\n")])])])},function(){var t=this.$createElement,a=this._self._c||t;return a("p",[this._v("Let's modify code snippet above "),a("em",[this._v("a bit")]),this._v(":")])},function(){var t=this,a=t.$createElement,s=t._self._c||a;return s("div",{staticClass:"language-markdown extra-class"},[s("div",{staticClass:"highlight-lines"},[s("br"),s("br"),s("div",{staticClass:"highlighted"},[t._v(" ")]),s("br"),s("br")]),s("pre",{pre:!0,attrs:{class:"language-markdown"}},[s("code",[s("span",{attrs:{class:"token tag"}},[s("span",{attrs:{class:"token tag"}},[s("span",{attrs:{class:"token punctuation"}},[t._v("<")]),t._v("i")]),s("span",{attrs:{class:"token punctuation"}},[t._v(">")])]),t._v("\nHello from italics tag\n\n"),s("span",{attrs:{class:"token tag"}},[s("span",{attrs:{class:"token tag"}},[s("span",{attrs:{class:"token punctuation"}},[t._v("</")]),t._v("i")]),s("span",{attrs:{class:"token punctuation"}},[t._v(">")])]),t._v("\n")])])])},function(){var t=this.$createElement,a=this._self._c||t;return a("p",[this._v("If we modify code snippet "),a("em",[this._v("a bit")]),this._v(" again:")])},function(){var t=this,a=t.$createElement,s=t._self._c||a;return s("div",{staticClass:"language-markdown extra-class"},[s("div",{staticClass:"highlight-lines"},[s("br"),s("br"),s("br"),s("div",{staticClass:"highlighted"},[t._v(" ")]),s("br")]),s("pre",{pre:!0,attrs:{class:"language-markdown"}},[s("code",[s("span",{attrs:{class:"token tag"}},[s("span",{attrs:{class:"token tag"}},[s("span",{attrs:{class:"token punctuation"}},[t._v("<")]),t._v("i")]),s("span",{attrs:{class:"token punctuation"}},[t._v(">")])]),t._v("\nHello from italics tag\n\n"),s("span",{attrs:{class:"token tag"}},[s("span",{attrs:{class:"token tag"}},[s("span",{attrs:{class:"token punctuation"}},[t._v("</")]),t._v("i")]),s("span",{attrs:{class:"token punctuation"}},[t._v(">")])]),s("span",{attrs:{class:"token tag"}},[s("span",{attrs:{class:"token tag"}},[s("span",{attrs:{class:"token punctuation"}},[t._v("<")]),t._v("b")]),s("span",{attrs:{class:"token punctuation"}},[t._v(">")])]),t._v("bold>"),s("span",{attrs:{class:"token tag"}},[s("span",{attrs:{class:"token tag"}},[s("span",{attrs:{class:"token punctuation"}},[t._v("</")]),t._v("b")]),s("span",{attrs:{class:"token punctuation"}},[t._v(">")])]),t._v("\n")])])])},function(){var t=this,a=t.$createElement,s=t._self._c||a;return s("ul",[s("li",[t._v("HtmlInline ("),s("code",[t._v("<i>")]),t._v(")")]),t._v(" "),s("li",[t._v("HtmlInline ("),s("code",[t._v("<b>")]),t._v(")")]),t._v(" "),s("li",[t._v("Text ("),s("code",[t._v("bold")]),t._v(")")]),t._v(" "),s("li",[t._v("HtmlInline ("),s("code",[t._v("</b>")]),t._v(")")])])},function(){var t=this,a=t.$createElement,s=t._self._c||a;return s("p",[t._v("Those "),s("em",[t._v("little")]),t._v(" differences render "),s("code",[t._v("Html.fromHtml")]),t._v(" (which was used in "),s("code",[t._v("1.x.x")]),t._v(" versions)\nuseless. And actually it renders most of the HTML parsers implementations useless,\nas most of them do not allow processing of HTML fragments in a raw fashion\nwithout "),s("em",[t._v("fixing")]),t._v(" content on-the-fly.")])},function(){var t=this,a=t.$createElement,s=t._self._c||a;return s("p",[t._v("Both "),s("code",[t._v("TagSoup")]),t._v(" and "),s("code",[t._v("Jsoup")]),t._v(" HTML parsers (that were considered for this project) are built to deal with\n"),s("em",[t._v("malicious")]),t._v(" HTML code ("),s("em",[t._v("all HTML code")]),t._v("? 😶). So, when supplied\nwith a "),s("code",[t._v("<i>italic")]),t._v(" fragment they will make it "),s("code",[t._v("<i>italic</i>")]),t._v(".\nAnd it's a good thing, but consider these fragments for the sake of markdown:")])},function(){var t=this.$createElement,a=this._self._c||t;return a("ul",[a("li",[a("code",[this._v("<i>italic")])]),this._v(" "),a("li",[a("code",[this._v("<b>bold italic")])]),this._v(" "),a("li",[a("code",[this._v("</b><i>")])])])},function(){var t=this.$createElement,a=this._self._c||t;return a("ul",[a("li",[a("code",[this._v("<i>italic </i>")])]),this._v(" "),a("li",[a("code",[this._v("<b>bold italic</b>")])])])},function(){var t=this.$createElement,a=this._self._c||t;return a("p",[a("em",[a("sup",[this._v("*")]),this._v(" Or to be precise: "),a("code",[this._v("<html><head></head><body><i>italic </i></body></html>")]),this._v(" &\n"),a("code",[this._v("<html><head></head><body><b>bold italic</b></body></html>")])])])},function(){var t=this,a=t.$createElement,s=t._self._c||a;return s("table",[s("thead",[s("tr",[s("th",[t._v("expected")]),t._v(" "),s("th",[t._v("actual")])])]),t._v(" "),s("tbody",[s("tr",[s("td",[s("i",[t._v("italic "),s("b",[t._v("bold italic")])])]),t._v(" "),s("td",[s("i",[t._v("italic ")]),s("b",[t._v("bold italic")])])])])])},function(){var t=this.$createElement,a=this._self._c||t;return a("p",[this._v("This might seem like a minor problem, but add more tags to a document,\nintroduce some deeply nested structures, spice openning and closing tags up\nby adding markdown markup between them and finally write "),a("em",[this._v("malicious")]),this._v(" HTML code 😆!")])},function(){var t=this.$createElement,a=this._self._c||t;return a("p",[this._v("There is no such problem on the "),a("em",[this._v("frontend")]),this._v(" for which commonmark specification is mostly\naimed as "),a("em",[this._v("frontend")]),this._v(" runs in a web-browser environment. After all "),a("em",[this._v("parsed")]),this._v(" markdown\nwill become HTML tags (most common usage). And web-browser will know how to render final result.")])},function(){var t=this.$createElement,a=this._self._c||t;return a("h2",{attrs:{id:"parser"}},[a("a",{staticClass:"header-anchor",attrs:{href:"#parser","aria-hidden":"true"}},[this._v("#")]),this._v(" Parser")])},function(){var t=this.$createElement,a=this._self._c||t;return a("p",[this._v("There are no additional steps to configure HTML parsing. It's enabled by default.\nIf you wish to "),a("em",[this._v("exclude")]),this._v(" it, please follow the "),a("a",{attrs:{href:"#exclude-html-parsing"}},[this._v("exclude")]),this._v(" section below.")])},function(){var t=this.$createElement,a=this._self._c||t;return a("p",[this._v("The key class here is: "),a("code",[this._v("MarkwonHtmlParser")]),this._v(" that is defined in "),a("code",[this._v("markwon-html-parser-api")]),this._v(" module.\n"),a("code",[this._v("markwon-html-parser-api")]),this._v(" is a simple module that defines HTML parsing contract and\ndoes not provide implementation.")])},function(){var t=this.$createElement,a=this._self._c||t;return a("p",[this._v("To change what implementation "),a("code",[this._v("Markwon")]),this._v(" should use, "),a("code",[this._v("SpannableConfiguration")]),this._v(" can be used:")])},function(){var t=this,a=t.$createElement,s=t._self._c||a;return s("div",{staticClass:"language-java extra-class"},[s("div",{staticClass:"highlight-lines"},[s("br"),s("div",{staticClass:"highlighted"},[t._v(" ")]),s("br"),s("br")]),s("pre",{pre:!0,attrs:{class:"language-java"}},[s("code",[t._v("SpannableConfiguration"),s("span",{attrs:{class:"token punctuation"}},[t._v(".")]),s("span",{attrs:{class:"token function"}},[t._v("builder")]),s("span",{attrs:{class:"token punctuation"}},[t._v("(")]),t._v("context"),s("span",{attrs:{class:"token punctuation"}},[t._v(")")]),t._v("\n "),s("span",{attrs:{class:"token punctuation"}},[t._v(".")]),s("span",{attrs:{class:"token function"}},[t._v("htmlParser")]),s("span",{attrs:{class:"token punctuation"}},[t._v("(")]),t._v("MarkwonHtmlParser"),s("span",{attrs:{class:"token punctuation"}},[t._v(")")]),t._v("\n "),s("span",{attrs:{class:"token punctuation"}},[t._v(".")]),s("span",{attrs:{class:"token function"}},[t._v("build")]),s("span",{attrs:{class:"token punctuation"}},[t._v("(")]),s("span",{attrs:{class:"token punctuation"}},[t._v(")")]),s("span",{attrs:{class:"token punctuation"}},[t._v(";")]),t._v("\n")])])])},function(){var t=this.$createElement,a=this._self._c||t;return a("p",[a("code",[this._v("markwon-html-parser-impl")]),this._v(" on the other hand provides "),a("code",[this._v("MarkwonHtmlParser")]),this._v(" implementation.\nIt's called "),a("code",[this._v("MarkwonHtmlParserImpl")]),this._v(". It can be created like this:")])},function(){var t=this,a=t.$createElement,s=t._self._c||a;return s("div",{staticClass:"language-java extra-class"},[s("pre",{pre:!0,attrs:{class:"language-java"}},[s("code",[s("span",{attrs:{class:"token keyword"}},[t._v("final")]),t._v(" MarkwonHtmlParser htmlParser "),s("span",{attrs:{class:"token operator"}},[t._v("=")]),t._v(" MarkwonHtmlParserImpl"),s("span",{attrs:{class:"token punctuation"}},[t._v(".")]),s("span",{attrs:{class:"token function"}},[t._v("create")]),s("span",{attrs:{class:"token punctuation"}},[t._v("(")]),s("span",{attrs:{class:"token punctuation"}},[t._v(")")]),s("span",{attrs:{class:"token punctuation"}},[t._v(";")]),t._v("\n"),s("span",{attrs:{class:"token comment"}},[t._v("// or")]),t._v("\n"),s("span",{attrs:{class:"token keyword"}},[t._v("final")]),t._v(" MarkwonHtmlParser htmlParser "),s("span",{attrs:{class:"token operator"}},[t._v("=")]),t._v(" MarkwonHtmlParserImpl"),s("span",{attrs:{class:"token punctuation"}},[t._v(".")]),s("span",{attrs:{class:"token function"}},[t._v("create")]),s("span",{attrs:{class:"token punctuation"}},[t._v("(")]),t._v("HtmlEmptyTagReplacement"),s("span",{attrs:{class:"token punctuation"}},[t._v(")")]),s("span",{attrs:{class:"token punctuation"}},[t._v(";")]),t._v("\n")])])])},function(){var t=this.$createElement,a=this._self._c||t;return a("h3",{attrs:{id:"empty-tag-replacement"}},[a("a",{staticClass:"header-anchor",attrs:{href:"#empty-tag-replacement","aria-hidden":"true"}},[this._v("#")]),this._v(" Empty tag replacement")])},function(){var t=this.$createElement,a=this._self._c||t;return a("p",[this._v("In order to append text content for self-closing, void or just "),a("em",[this._v("empty")]),this._v(" HTML tags,\n"),a("code",[this._v("HtmlEmptyTagReplacement")]),this._v(" can be used. As we cannot set Span for empty content,\nwe must represent empty tag with text during parsing stage (if we want it to be represented).")])},function(){var t=this.$createElement,a=this._self._c||t;return a("ul",[a("li",[a("code",[this._v('<img src="me-sad.JPG">')])]),this._v(" "),a("li",[a("code",[this._v("<br />")])]),this._v(" "),a("li",[a("code",[this._v("<who-am-i></who-am-i>")])])])},function(){var t=this,a=t.$createElement,s=t._self._c||a;return s("p",[t._v("By default ("),s("code",[t._v("HtmlEmptyTagReplacement.create()")]),t._v(") will handle "),s("code",[t._v("img")]),t._v(" and "),s("code",[t._v("br")]),t._v(" tags.\n"),s("code",[t._v("img")]),t._v(" will be replaced with "),s("code",[t._v("alt")]),t._v(" property if it is present and "),s("code",[t._v("\\uFFFC")]),t._v(" if it is not.\nAnd "),s("code",[t._v("br")]),t._v(" will insert a new line.")])},function(){var t=this.$createElement,a=this._self._c||t;return a("h3",{attrs:{id:"non-closed-tags"}},[a("a",{staticClass:"header-anchor",attrs:{href:"#non-closed-tags","aria-hidden":"true"}},[this._v("#")]),this._v(" Non-closed tags")])},function(){var t=this.$createElement,a=this._self._c||t;return a("p",[this._v("It's possible that your HTML can contain non-closed tags. By default "),a("code",[this._v("Markwon")]),this._v(" will ignore them,\nbut if you wish to get a bit closer to a web-browser experience, you can allow this behaviour:")])},function(){var t=this,a=t.$createElement,s=t._self._c||a;return s("div",{staticClass:"language-java extra-class"},[s("div",{staticClass:"highlight-lines"},[s("br"),s("div",{staticClass:"highlighted"},[t._v(" ")]),s("br"),s("br")]),s("pre",{pre:!0,attrs:{class:"language-java"}},[s("code",[t._v("SpannableConfiguration"),s("span",{attrs:{class:"token punctuation"}},[t._v(".")]),s("span",{attrs:{class:"token function"}},[t._v("builder")]),s("span",{attrs:{class:"token punctuation"}},[t._v("(")]),t._v("context"),s("span",{attrs:{class:"token punctuation"}},[t._v(")")]),t._v("\n "),s("span",{attrs:{class:"token punctuation"}},[t._v(".")]),s("span",{attrs:{class:"token function"}},[t._v("htmlAllowNonClosedTags")]),s("span",{attrs:{class:"token punctuation"}},[t._v("(")]),s("span",{attrs:{class:"token boolean"}},[t._v("true")]),s("span",{attrs:{class:"token punctuation"}},[t._v(")")]),t._v("\n "),s("span",{attrs:{class:"token punctuation"}},[t._v(".")]),s("span",{attrs:{class:"token function"}},[t._v("build")]),s("span",{attrs:{class:"token punctuation"}},[t._v("(")]),s("span",{attrs:{class:"token punctuation"}},[t._v(")")]),s("span",{attrs:{class:"token punctuation"}},[t._v(";")]),t._v("\n")])])])},function(){var t=this,a=t.$createElement,s=t._self._c||a;return s("div",{staticClass:"warning custom-block"},[s("p",{staticClass:"custom-block-title"},[t._v("Note")]),t._v(" "),s("p",[t._v("If there is (for example) an "),s("code",[t._v("<i>")]),t._v(" tag at the start of a document and it's not closed\nand "),s("code",[t._v("Markwon")]),t._v(" is configured to "),s("strong",[t._v("not")]),t._v(" ignore non-closed tags ("),s("code",[t._v(".htmlAllowNonClosedTags(true)")]),t._v("),\nit will make the whole document in italics")])])},function(){var t=this.$createElement,a=this._self._c||t;return a("h3",{attrs:{id:"implementation-note"}},[a("a",{staticClass:"header-anchor",attrs:{href:"#implementation-note","aria-hidden":"true"}},[this._v("#")]),this._v(" Implementation note")])},function(){var t=this.$createElement,a=this._self._c||t;return a("h2",{attrs:{id:"renderer"}},[a("a",{staticClass:"header-anchor",attrs:{href:"#renderer","aria-hidden":"true"}},[this._v("#")]),this._v(" Renderer")])},function(){var t=this.$createElement,a=this._self._c||t;return a("p",[this._v("Unlike "),a("code",[this._v("MarkwonHtmlParser")]),this._v(" "),a("code",[this._v("Markwon")]),this._v(" comes with a "),a("code",[this._v("MarkwonHtmlRenderer")]),this._v(" by default.")])},function(){var t=this.$createElement,a=this._self._c||t;return a("div",{staticClass:"language-java extra-class"},[a("pre",{pre:!0,attrs:{class:"language-java"}},[a("code",[this._v("MarkwonHtmlRenderer"),a("span",{attrs:{class:"token punctuation"}},[this._v(".")]),a("span",{attrs:{class:"token function"}},[this._v("create")]),a("span",{attrs:{class:"token punctuation"}},[this._v("(")]),a("span",{attrs:{class:"token punctuation"}},[this._v(")")]),a("span",{attrs:{class:"token punctuation"}},[this._v(";")]),this._v("\n")])])])},function(){var t=this.$createElement,a=this._self._c||t;return a("p",[this._v("Default instance have these tags "),a("em",[this._v("handled")]),this._v(":")])},function(){var t=this,a=t.$createElement,s=t._self._c||a;return s("ul",[s("li",[t._v("emphasis\n"),s("ul",[s("li",[s("code",[t._v("i")])]),t._v(" "),s("li",[s("code",[t._v("em")])]),t._v(" "),s("li",[s("code",[t._v("cite")])]),t._v(" "),s("li",[s("code",[t._v("dfn")])])])]),t._v(" "),s("li",[t._v("strong emphasis\n"),s("ul",[s("li",[s("code",[t._v("b")])]),t._v(" "),s("li",[s("code",[t._v("strong")])])])]),t._v(" "),s("li",[s("code",[t._v("sup")]),t._v(" (super script)")]),t._v(" "),s("li",[s("code",[t._v("sub")]),t._v(" (sub script)")]),t._v(" "),s("li",[t._v("underline\n"),s("ul",[s("li",[s("code",[t._v("u")])]),t._v(" "),s("li",[s("code",[t._v("ins")])])])]),t._v(" "),s("li",[t._v("strike through\n"),s("ul",[s("li",[s("code",[t._v("del")])]),t._v(" "),s("li",[s("code",[t._v("s")])]),t._v(" "),s("li",[s("code",[t._v("strike")])])])]),t._v(" "),s("li",[s("code",[t._v("a")]),t._v(" (link)")]),t._v(" "),s("li",[s("code",[t._v("ul")]),t._v(" (unordered list)")]),t._v(" "),s("li",[s("code",[t._v("ol")]),t._v(" (ordered list)")]),t._v(" "),s("li",[s("code",[t._v("img")]),t._v(" (image)")]),t._v(" "),s("li",[s("code",[t._v("blockquote")]),t._v(" (block quote)")]),t._v(" "),s("li",[s("code",[t._v("h{1-6}")]),t._v(" (heading)")])])},function(){var t=this.$createElement,a=this._self._c||t;return a("p",[this._v("If you wish to "),a("em",[this._v("extend")]),this._v(" default handling (or override existing),\n"),a("code",[this._v("#builderWithDefaults")]),this._v(" factory method can be used:")])},function(){var t=this.$createElement,a=this._self._c||t;return a("div",{staticClass:"language-java extra-class"},[a("pre",{pre:!0,attrs:{class:"language-java"}},[a("code",[this._v("MarkwonHtmlRenderer"),a("span",{attrs:{class:"token punctuation"}},[this._v(".")]),a("span",{attrs:{class:"token function"}},[this._v("builderWithDefaults")]),a("span",{attrs:{class:"token punctuation"}},[this._v("(")]),a("span",{attrs:{class:"token punctuation"}},[this._v(")")]),a("span",{attrs:{class:"token punctuation"}},[this._v(";")]),this._v("\n")])])])},function(){var t=this.$createElement,a=this._self._c||t;return a("p",[this._v("For a completely "),a("em",[this._v("clean")]),this._v(" configurable instance "),a("code",[this._v("#builder")]),this._v(" method can be used:")])},function(){var t=this.$createElement,a=this._self._c||t;return a("div",{staticClass:"language-java extra-class"},[a("pre",{pre:!0,attrs:{class:"language-java"}},[a("code",[this._v("MarkwonHtmlRenderer"),a("span",{attrs:{class:"token punctuation"}},[this._v(".")]),a("span",{attrs:{class:"token function"}},[this._v("builder")]),a("span",{attrs:{class:"token punctuation"}},[this._v("(")]),a("span",{attrs:{class:"token punctuation"}},[this._v(")")]),a("span",{attrs:{class:"token punctuation"}},[this._v(";")]),this._v("\n")])])])},function(){var t=this.$createElement,a=this._self._c||t;return a("h3",{attrs:{id:"custom-tag-handler"}},[a("a",{staticClass:"header-anchor",attrs:{href:"#custom-tag-handler","aria-hidden":"true"}},[this._v("#")]),this._v(" Custom tag handler")])},function(){var t=this.$createElement,a=this._self._c||t;return a("p",[this._v("To configure "),a("code",[this._v("MarkwonHtmlRenderer")]),this._v(" to handle tags differently or\ncreate a new tag handler - "),a("code",[this._v("TagHandler")]),this._v(" can be used")])},function(){var t=this,a=t.$createElement,s=t._self._c||a;return s("div",{staticClass:"language-java extra-class"},[s("pre",{pre:!0,attrs:{class:"language-java"}},[s("code",[s("span",{attrs:{class:"token keyword"}},[t._v("public")]),t._v(" "),s("span",{attrs:{class:"token keyword"}},[t._v("abstract")]),t._v(" "),s("span",{attrs:{class:"token keyword"}},[t._v("class")]),t._v(" "),s("span",{attrs:{class:"token class-name"}},[t._v("TagHandler")]),t._v(" "),s("span",{attrs:{class:"token punctuation"}},[t._v("{")]),t._v("\n\n "),s("span",{attrs:{class:"token keyword"}},[t._v("public")]),t._v(" "),s("span",{attrs:{class:"token keyword"}},[t._v("abstract")]),t._v(" "),s("span",{attrs:{class:"token keyword"}},[t._v("void")]),t._v(" "),s("span",{attrs:{class:"token function"}},[t._v("handle")]),s("span",{attrs:{class:"token punctuation"}},[t._v("(")]),t._v("\n "),s("span",{attrs:{class:"token annotation punctuation"}},[t._v("@NonNull")]),t._v(" SpannableConfiguration configuration"),s("span",{attrs:{class:"token punctuation"}},[t._v(",")]),t._v("\n "),s("span",{attrs:{class:"token annotation punctuation"}},[t._v("@NonNull")]),t._v(" SpannableBuilder builder"),s("span",{attrs:{class:"token punctuation"}},[t._v(",")]),t._v("\n "),s("span",{attrs:{class:"token annotation punctuation"}},[t._v("@NonNull")]),t._v(" HtmlTag tag\n "),s("span",{attrs:{class:"token punctuation"}},[t._v(")")]),s("span",{attrs:{class:"token punctuation"}},[t._v(";")]),t._v("\n"),s("span",{attrs:{class:"token punctuation"}},[t._v("}")]),t._v("\n")])])])},function(){var t=this.$createElement,a=this._self._c||t;return a("p",[this._v("For the most simple "),a("em",[this._v("inline")]),this._v(" tag handler a "),a("code",[this._v("SimpleTagHandler")]),this._v(" can be used:")])},function(){var t=this,a=t.$createElement,s=t._self._c||a;return s("div",{staticClass:"language-java extra-class"},[s("pre",{pre:!0,attrs:{class:"language-java"}},[s("code",[s("span",{attrs:{class:"token keyword"}},[t._v("public")]),t._v(" "),s("span",{attrs:{class:"token keyword"}},[t._v("abstract")]),t._v(" "),s("span",{attrs:{class:"token keyword"}},[t._v("class")]),t._v(" "),s("span",{attrs:{class:"token class-name"}},[t._v("SimpleTagHandler")]),t._v(" "),s("span",{attrs:{class:"token keyword"}},[t._v("extends")]),t._v(" "),s("span",{attrs:{class:"token class-name"}},[t._v("TagHandler")]),t._v(" "),s("span",{attrs:{class:"token punctuation"}},[t._v("{")]),t._v("\n\n "),s("span",{attrs:{class:"token annotation punctuation"}},[t._v("@Nullable")]),t._v("\n "),s("span",{attrs:{class:"token keyword"}},[t._v("public")]),t._v(" "),s("span",{attrs:{class:"token keyword"}},[t._v("abstract")]),t._v(" Object "),s("span",{attrs:{class:"token function"}},[t._v("getSpans")]),s("span",{attrs:{class:"token punctuation"}},[t._v("(")]),s("span",{attrs:{class:"token annotation punctuation"}},[t._v("@NonNull")]),t._v(" SpannableConfiguration configuration"),s("span",{attrs:{class:"token punctuation"}},[t._v(",")]),t._v(" "),s("span",{attrs:{class:"token annotation punctuation"}},[t._v("@NonNull")]),t._v(" HtmlTag tag"),s("span",{attrs:{class:"token punctuation"}},[t._v(")")]),s("span",{attrs:{class:"token punctuation"}},[t._v(";")]),t._v("\n"),s("span",{attrs:{class:"token punctuation"}},[t._v("}")]),t._v("\n")])])])},function(){var t=this.$createElement,a=this._self._c||t;return a("p",[this._v("For example, "),a("code",[this._v("EmphasisHandler")]),this._v(":")])},function(){var t=this,a=t.$createElement,s=t._self._c||a;return s("div",{staticClass:"language-java extra-class"},[s("pre",{pre:!0,attrs:{class:"language-java"}},[s("code",[s("span",{attrs:{class:"token keyword"}},[t._v("public")]),t._v(" "),s("span",{attrs:{class:"token keyword"}},[t._v("class")]),t._v(" "),s("span",{attrs:{class:"token class-name"}},[t._v("EmphasisHandler")]),t._v(" "),s("span",{attrs:{class:"token keyword"}},[t._v("extends")]),t._v(" "),s("span",{attrs:{class:"token class-name"}},[t._v("SimpleTagHandler")]),t._v(" "),s("span",{attrs:{class:"token punctuation"}},[t._v("{")]),t._v("\n "),s("span",{attrs:{class:"token annotation punctuation"}},[t._v("@Nullable")]),t._v("\n "),s("span",{attrs:{class:"token annotation punctuation"}},[t._v("@Override")]),t._v("\n "),s("span",{attrs:{class:"token keyword"}},[t._v("public")]),t._v(" Object "),s("span",{attrs:{class:"token function"}},[t._v("getSpans")]),s("span",{attrs:{class:"token punctuation"}},[t._v("(")]),s("span",{attrs:{class:"token annotation punctuation"}},[t._v("@NonNull")]),t._v(" SpannableConfiguration configuration"),s("span",{attrs:{class:"token punctuation"}},[t._v(",")]),t._v(" "),s("span",{attrs:{class:"token annotation punctuation"}},[t._v("@NonNull")]),t._v(" HtmlTag tag"),s("span",{attrs:{class:"token punctuation"}},[t._v(")")]),t._v(" "),s("span",{attrs:{class:"token punctuation"}},[t._v("{")]),t._v("\n "),s("span",{attrs:{class:"token keyword"}},[t._v("return")]),t._v(" configuration"),s("span",{attrs:{class:"token punctuation"}},[t._v(".")]),s("span",{attrs:{class:"token function"}},[t._v("factory")]),s("span",{attrs:{class:"token punctuation"}},[t._v("(")]),s("span",{attrs:{class:"token punctuation"}},[t._v(")")]),s("span",{attrs:{class:"token punctuation"}},[t._v(".")]),s("span",{attrs:{class:"token function"}},[t._v("emphasis")]),s("span",{attrs:{class:"token punctuation"}},[t._v("(")]),s("span",{attrs:{class:"token punctuation"}},[t._v(")")]),s("span",{attrs:{class:"token punctuation"}},[t._v(";")]),t._v("\n "),s("span",{attrs:{class:"token punctuation"}},[t._v("}")]),t._v("\n"),s("span",{attrs:{class:"token punctuation"}},[t._v("}")]),t._v("\n")])])])},function(){var t=this.$createElement,a=this._self._c||t;return a("p",[this._v("If you wish to handle a "),a("em",[this._v("block")]),this._v(" HTML node (for example "),a("code",[this._v("<ul><li>First<li>Second</ul>")]),this._v(") refer\nto "),a("code",[this._v("ListHandler")]),this._v(" source code for reference.")])},function(){var t=this,a=t.$createElement,s=t._self._c||a;return s("div",{staticClass:"warning custom-block"},[s("p",{staticClass:"custom-block-title"},[t._v("WARNING")]),t._v(" "),s("p",[t._v("The most important thing when implementing custom "),s("code",[t._v("TagHandler")]),t._v(" is to know\nwhat type of "),s("code",[t._v("HtmlTag")]),t._v(" we are dealing with. There are 2: inline & block.\nInline tag cannot contain children. Block "),s("em",[t._v("can")]),t._v(" contain children. And they\n"),s("em",[t._v("most likely")]),t._v(" should also be visited and "),s("em",[t._v("handled")]),t._v(" by registered "),s("code",[t._v("TagHandler")]),t._v(" (if any)\naccordingly. See "),s("code",[t._v("TagHandler#visitChildren(configuration, builder, child);")])])])},function(){var t=this.$createElement,a=this._self._c||t;return a("h4",{attrs:{id:"css-inline-style-parser"}},[a("a",{staticClass:"header-anchor",attrs:{href:"#css-inline-style-parser","aria-hidden":"true"}},[this._v("#")]),this._v(" Css inline style parser")])},function(){var t=this.$createElement,a=this._self._c||t;return a("p",[this._v("When implementing own "),a("code",[this._v("TagHandler")]),this._v(" you might want to inspect inline CSS styles\nof a HTML element. "),a("code",[this._v("Markwon")]),this._v(" provides an utility parser for that purpose:")])},function(){var t=this,a=t.$createElement,s=t._self._c||a;return s("div",{staticClass:"language-java extra-class"},[s("pre",{pre:!0,attrs:{class:"language-java"}},[s("code",[s("span",{attrs:{class:"token keyword"}},[t._v("final")]),t._v(" CssInlineStyleParser inlineStyleParser "),s("span",{attrs:{class:"token operator"}},[t._v("=")]),t._v(" CssInlineStyleParser"),s("span",{attrs:{class:"token punctuation"}},[t._v(".")]),s("span",{attrs:{class:"token function"}},[t._v("create")]),s("span",{attrs:{class:"token punctuation"}},[t._v("(")]),s("span",{attrs:{class:"token punctuation"}},[t._v(")")]),s("span",{attrs:{class:"token punctuation"}},[t._v(";")]),t._v("\n"),s("span",{attrs:{class:"token keyword"}},[t._v("for")]),t._v(" "),s("span",{attrs:{class:"token punctuation"}},[t._v("(")]),t._v("CssProperty property"),s("span",{attrs:{class:"token operator"}},[t._v(":")]),t._v(" inlineStyleParser"),s("span",{attrs:{class:"token punctuation"}},[t._v(".")]),s("span",{attrs:{class:"token function"}},[t._v("parse")]),s("span",{attrs:{class:"token punctuation"}},[t._v("(")]),s("span",{attrs:{class:"token string"}},[t._v('"width: 100%; height: 100%;"')]),s("span",{attrs:{class:"token punctuation"}},[t._v(")")]),s("span",{attrs:{class:"token punctuation"}},[t._v(")")]),t._v(" "),s("span",{attrs:{class:"token punctuation"}},[t._v("{")]),t._v("\n "),s("span",{attrs:{class:"token comment"}},[t._v("// [0] = CssProperty({width=100%}),")]),t._v("\n "),s("span",{attrs:{class:"token comment"}},[t._v("// [1] = CssProperty({height=100%})")]),t._v("\n"),s("span",{attrs:{class:"token punctuation"}},[t._v("}")]),t._v("\n")])])])},function(){var t=this.$createElement,a=this._self._c||t;return a("h2",{attrs:{id:"exclude-html-parsing"}},[a("a",{staticClass:"header-anchor",attrs:{href:"#exclude-html-parsing","aria-hidden":"true"}},[this._v("#")]),this._v(" Exclude HTML parsing")])},function(){var t=this,a=t.$createElement,s=t._self._c||a;return s("p",[t._v("If you wish to exclude HTML parsing altogether, you can manually\nexclude "),s("code",[t._v("markwon-html-parser-impl")]),t._v(" artifact from your projects compile classpath.\nThis can be beneficial if you know that markdown input won't contain\nHTML and/or you wish to ignore it. Excluding HTML parsing\ncan speed up "),s("code",[t._v("Markwon")]),t._v(" parsing and will decrease final size of\n"),s("code",[t._v("Markwon")]),t._v(" dependency by around "),s("code",[t._v("100kb")]),t._v(".")])},function(){var t=this,a=t.$createElement,s=t._self._c||a;return s("div",{staticClass:"language-groovy extra-class"},[s("pre",{pre:!0,attrs:{class:"language-groovy"}},[s("code",[t._v("dependencies "),s("span",{attrs:{class:"token punctuation"}},[t._v("{")]),t._v("\n "),s("span",{attrs:{class:"token function"}},[t._v("implementation")]),s("span",{attrs:{class:"token punctuation"}},[t._v("(")]),s("span",{attrs:{class:"token string gstring"}},[t._v('"ru.noties:markwon:'),s("span",{attrs:{class:"token expression"}},[s("span",{attrs:{class:"token punctuation"}},[t._v("$")]),s("span",{attrs:{class:"token punctuation"}},[t._v("{")]),t._v("markwonVersion"),s("span",{attrs:{class:"token punctuation"}},[t._v("}")])]),t._v('"')]),s("span",{attrs:{class:"token punctuation"}},[t._v(")")]),t._v(" "),s("span",{attrs:{class:"token punctuation"}},[t._v("{")]),t._v("\n exclude module"),s("span",{attrs:{class:"token punctuation"}},[t._v(":")]),t._v(" "),s("span",{attrs:{class:"token string"}},[t._v("'markwon-html-parser-impl'")]),t._v("\n "),s("span",{attrs:{class:"token punctuation"}},[t._v("}")]),t._v("\n"),s("span",{attrs:{class:"token punctuation"}},[t._v("}")]),t._v("\n")])])])},function(){var t=this.$createElement,a=this._self._c||t;return a("p",[this._v("Excluding "),a("code",[this._v("markwon-html-parser-impl")]),this._v(" this way will result in\n"),a("code",[this._v("MarkwonHtmlParser#noOp")]),this._v(" implementation. No further steps are\nrequired.")])},function(){var t=this,a=t.$createElement,s=t._self._c||a;return s("div",{staticClass:"warning custom-block"},[s("p",{staticClass:"custom-block-title"},[t._v("Note")]),t._v(" "),s("p",[t._v("Excluding "),s("code",[t._v("markwon-html-parser-impl")]),t._v(" won't remove "),s("em",[t._v("all")]),t._v(" the content between\nHTML tags. It will if "),s("code",[t._v("commonmark")]),t._v(" decides that a specific fragment is a\n"),s("code",[t._v("HtmlBlock")]),t._v(", but it won't if fragment is considered a "),s("code",[t._v("HtmlInline")]),t._v(" as "),s("code",[t._v("HtmlInline")]),t._v("\ndoes not contain content (just a tag definition).")])])}],!1,null,null,null);e.options.__file="html.md";a.default=e.exports}}]);