packages feed

Blogdown 0.2.2 → 0.2.3

raw patch · 10 files changed

+350/−25 lines, 10 filesdep ~basePVP ok

version bump matches the API change (PVP)

Dependency ranges changed: base

API changes (from Hackage documentation)

+ Rendering.RenderOptions: isAllowedAttribute :: String -> RenderOptions -> Bool
+ Rendering.RenderOptions: isAllowedTag :: String -> RenderOptions -> Bool

Files

Blogdown.cabal view
@@ -1,5 +1,5 @@ name:                Blogdown-version:             0.2.2+version:             0.2.3 synopsis:            A markdown-like markup language designed for blog posts description:         A library and executable that implement a modified, extended version of Markdown designed for writing blog posts. license:             AGPL-3@@ -10,7 +10,7 @@ copyright:           (c) 2017 Alex Becker category:            Web build-type:          Custom-extra-source-files:  ChangeLog.md, Readme.md+extra-source-files:  ChangeLog.md, Readme.md, test/goldens/*.md, test/goldens/*.md data-files:          assets/Footnotes.css, assets/Footnotes.js cabal-version:       >=1.10 @@ -18,14 +18,14 @@   exposed-modules:     Parsing.Parse, Parsing.ParseOptions, Rendering.Render, Rendering.RenderOptions   other-modules:       AST, Options, Parsing.ParseBlock, Parsing.ParseInline, Parsing.Text, Parsing.Utils, Parsing.ParseFootnotes, Parsing.ParseHtml, Parsing.State, Parsing.TextUtils, Footnotes_css, Footnotes_js   other-extensions:    DeriveGeneric-  build-depends:       base >=4.9 && <4.10, parsec >=3.1 && <3.2, containers >=0.5 && <0.6, MissingH >=1.4 && <1.5, network-uri >=2.6 && <2.7+  build-depends:       base >=4.9 && <5, parsec >=3.1 && <3.2, containers >=0.5 && <0.6, MissingH >=1.4 && <1.5, network-uri >=2.6 && <2.7   hs-source-dirs:      src, assets   default-language:    Haskell2010  executable Blogdown   main-is:             Blogdown.hs   other-extensions:    DeriveGeneric-  build-depends:       base >=4.9 && <4.10, parsec >=3.1 && <3.2, containers >=0.5 && <0.6, MissingH >=1.4 && <1.5, network-uri >=2.6 && <2.7+  build-depends:       base >=4.9 && <5, parsec >=3.1 && <3.2, containers >=0.5 && <0.6, MissingH >=1.4 && <1.5, network-uri >=2.6 && <2.7   hs-source-dirs:      src, assets   default-language:    Haskell2010 @@ -33,7 +33,7 @@   type:                exitcode-stdio-1.0   main-is:             Test.hs   other-extensions:    DeriveGeneric-  build-depends:       base >=4.9 && <4.10, parsec >=3.1 && <3.2, containers >=0.5 && <0.6, MissingH >=1.4 && <1.5, network-uri >=2.6 && <2.7+  build-depends:       base >=4.9 && <5, parsec >=3.1 && <3.2, containers >=0.5 && <0.6, MissingH >=1.4 && <1.5, network-uri >=2.6 && <2.7   hs-source-dirs:      src, assets, test   default-language:    Haskell2010 @@ -41,7 +41,7 @@   type:                exitcode-stdio-1.0   main-is:             Benchmark.hs   other-extensions:    DeriveGeneric-  build-depends:       base >=4.9 && <4.10, parsec >=3.1 && <3.2, containers >=0.5 && <0.6, MissingH >=1.4 && <1.5, criterion >=1.1 && <1.2, network-uri >=2.6 && <2.7+  build-depends:       base >=4.9 && <5, parsec >=3.1 && <3.2, containers >=0.5 && <0.6, MissingH >=1.4 && <1.5, criterion >=1.1 && <1.2, network-uri >=2.6 && <2.7   hs-source-dirs:      src, assets, test   default-language:    Haskell2010 @@ -50,4 +50,4 @@   location:            https://github.com/alexbecker/blogdown  custom-setup-  setup-depends:       base >= 4.9 && <4.10, Cabal >=1.24 && <1.25, MissingH >=1.4 && <1.5+  setup-depends:       base >= 4.9 && <5, Cabal >=1.24 && <1.25, MissingH >=1.4 && <1.5
Readme.md view
@@ -142,13 +142,13 @@  * **Ordered Lists**: A ` - ` begins an ordered list item, which itself is a block. Sequential ordered list items or sublists form an ordered list. List items can contain arbitrary inline nodes.-  * Sublists are created when list items begin with one more space than their parent list, and can be ordered or unordered.-For example, this sublist begins with `  * `.+  - Sublists are created when list items begin with one more space than their parent list, and can be ordered or unordered.+For example, this sublist begins with `  - `.  * **Unordered Lists**: A ` * ` begins an unordered list item, which itself is a block. Sequential unordered list items or sublists form an unordered list. List items can contain arbitrary inline nodes.-  - Sublists are created when list items begin with one more space than their parent list, and can be ordered or unordered.-For example, this sublist begins with `  - `.+  * Sublists are created when list items begin with one more space than their parent list, and can be ordered or unordered.+For example, this sublist begins with `  * `.  * **Blockquote**: Lines beginning with `> ` define a blockquote. Can contain arbitrary inline nodes. Note that the first line not beginning with `> ` will start a new block.
src/AST.hs view
@@ -31,7 +31,10 @@            | Header Int [Inline]            | ListBlock List            | BlockQuote [Inline]-           | BlockCode String+           | BlockCode {+    codeClass :: String,+    codeContent :: String+}            | BlockHtml Html            | Table {     thead :: Maybe [TableRow],
src/Parsing/ParseBlock.hs view
@@ -59,9 +59,17 @@ blockCodeLineStart :: Parser String blockCodeLineStart = try (string "\t" <|> string "    ") <?> "\"    \" or tab (code block)" -blockCode :: Parser Block-blockCode = fmap (BlockCode . unlines) $ many1 $ blockCodeLineStart >> manyTill (noneOf "\n") (char' '\n')+blockCodeIndented :: Parser Block+blockCodeIndented = fmap (BlockCode "" . unlines) $ many1 $ blockCodeLineStart >> manyTill (noneOf "\n") (char' '\n') +blockCodeFenced :: Parser Block+blockCodeFenced = do+    try $ string' "```" -- Backtrack to handle inline code at the start of a line.+    cls <- manyTill (noneOf "\n") (char' '\n')+    content <- many (escapableNoneOf "`")+    string' "```"+    return $ BlockCode cls content+ blockHtml :: Parser Block blockHtml = fmap BlockHtml html @@ -93,4 +101,12 @@ block = between     (many $ char '\n')     (many $ char '\n')-    (choice [blockHtml, hardRule, header, listBlock, blockQuote, table, blockCode, paragraph])+    (choice [blockHtml,+             hardRule,+             header,+             listBlock,+             blockQuote,+             table,+             blockCodeIndented,+             blockCodeFenced,+             paragraph])
src/Rendering/Render.hs view
@@ -2,7 +2,7 @@  import Data.List import Data.List.Utils-import Data.Maybe (isJust, fromJust)+import Data.Maybe (isNothing, isJust, fromJust)  import AST import qualified Footnotes_js as JS@@ -46,6 +46,11 @@     escapeChar '>' = "&gt;"     escapeChar c = [c] +escapeQuotes :: String -> String+escapeQuotes = concatMap escapeChar where+    escapeChar '"' = "&quot;"+    escapeChar c = [c]+ instance ToHtml FootnoteDefs where     toHtml r (FootnoteDefs fs) = withTagAttrs "ol"         [("start", show $ footnoteIndexFrom r), ("class", "footnotes")]@@ -69,7 +74,10 @@     toHtml r (Header level text) = withTag ("h" ++ show level) $ stripEndingNewline $ concatMap (toHtml r) text     toHtml r (ListBlock l) = toHtml r l     toHtml r (BlockQuote ls) = withTag "blockquote" $ stripEndingNewline $ concatMap (toHtml r) ls-    toHtml _ (BlockCode s) = withTag "pre" $ withTag "code" $ escapeHtml s+    toHtml _ (BlockCode "" s) = withTag "pre" $ withTag "code" $ escapeHtml s+    toHtml r (BlockCode cls s) = withTag "pre" $ if isAllowedAttribute "class" r+        then withTagAttrs "code" [("class", escapeQuotes cls)] $ escapeHtml s+        else withTag "code" $ escapeHtml s     toHtml r (BlockHtml h) = toHtml r h     toHtml r (Table Nothing trs) = withTag "table" $ withTag "tbody" body where         body = unlines $ map (toHtml r) trs@@ -110,7 +118,7 @@ instance ToHtml HtmlTag where     toHtml r (HtmlTag name attrs) = unwords (name : (map showAttr filteredAttrs)) where         showAttr (Attr s t) = s ++ "=\"" ++ t ++ "\""-        filteredAttrs = maybe attrs (\allowed -> filter (\(Attr name val) -> elem name allowed) attrs) $ allowedAttributes r+        filteredAttrs = filter (\(Attr name val) -> isAllowedAttribute name r) attrs  showHtmlContent :: RenderOptions -> Either String Html -> String showHtmlContent _ (Left s) = s@@ -119,21 +127,25 @@ instance ToHtml Html where     toHtml r (PairTag open content) = concat [         leftBracket,-        toHtml r open,+        openTagRendered,         rightBracket,         concatMap (showHtmlContent r) content,         leftBracket ++ "/",         tagname open,         rightBracket]         where-            allowTag = maybe True (\attrs -> elem (tagname open) attrs) $ allowedTags r+            allowTag = isAllowedTag (tagname open) r             leftBracket = if allowTag then "<" else "&lt;"             rightBracket = if allowTag then ">" else "&gt;"+            -- Strip attribute if the tag is escaped, so attribute content is not interpreted as HTML.+            openTagRendered = if allowTag then toHtml r open else tagname open     toHtml r (SingleTag tag) = concat [         leftBracket,-        toHtml r tag,+        tagRendered,         "/" ++ rightBracket]         where-            allowTag = maybe True (\attrs -> elem (tagname tag) attrs) $ allowedTags r+            allowTag = isAllowedTag (tagname tag) r             leftBracket = if allowTag then "<" else "&lt;"             rightBracket = if allowTag then ">" else "&gt;"+            -- Strip attribute if the tag is escaped, so attribute content is not interpreted as HTML.+            tagRendered = if allowTag then toHtml r tag else tagname tag
src/Rendering/RenderOptions.hs view
@@ -3,6 +3,7 @@ module Rendering.RenderOptions where  import qualified Data.Map.Strict as M+import Data.Maybe (isNothing, fromJust) import GHC.Generics (Generic)  data RenderOptions = RenderOptions {@@ -26,6 +27,12 @@     allowedTags = Nothing,     allowedAttributes = Nothing }++isAllowedTag :: String -> RenderOptions -> Bool+isAllowedTag tag r = isNothing (allowedTags r) || elem tag (fromJust $ allowedTags r)++isAllowedAttribute :: String -> RenderOptions -> Bool+isAllowedAttribute attr r = isNothing (allowedAttributes r) || elem attr (fromJust $ allowedAttributes r)  splitCommas :: String -> [String] splitCommas "" = []
test/Test.hs view
@@ -125,13 +125,13 @@     "<blockquote>    \"This is it... this is where I belong...\"\n\     \    I know everyone here... even if I've never met them, never talked to\n\     \them, may never hear from them again... I know you all...</blockquote>"-testBlockCode = expectSuccess "block code" blockCode+testBlockCodeIndented = expectSuccess "block code (indented)" blockCodeIndented     "    var x = 0;\n\     \    alert(x);\n"     "<pre><code>var x = 0;\n\     \alert(x);\n\     \</code></pre>"-testBlockCodeWhitespace = expectSuccess "block code handles starting whitespace correctly" blockCode+testBlockCodeWhitespace = expectSuccess "block code handles starting whitespace correctly" blockCodeIndented     "    def f(x):\n\     \        return x\n"     "<pre><code>def f(x):\n\@@ -143,6 +143,38 @@     "<pre><code>&gt; print(1)\n\     \* 1\n\     \</code></pre>"+testBlockCodeFenced = expectSuccess "block code (fenced)" blockCodeFenced+    "```\n\+    \def f(x):\n\+    \    return x\n\+    \```"+    "<pre><code>def f(x):\n\+    \    return x\n\+    \</code></pre>"+testBlockCodeWithClass = expectSuccess "block code with a class applied" blockCodeFenced+    "```python\n\+    \def f(x):\n\+    \    return x\n\+    \```"+    "<pre><code class=\"python\">def f(x):\n\+    \    return x\n\+    \</code></pre>"+testBlockCodeFencedSpecialChars = expectSuccess "block code (fenced) treats special characters within the content as regular text" blockCodeFenced+    "```\n\+    \> print(1)\n\+    \* 1\n\+    \```"+    "<pre><code>&gt; print(1)\n\+    \* 1\n\+    \</code></pre>"+testBlockCodeEscapeClass = expectSuccess "block code with a class escapes it properly" blockCodeFenced+    "```\"><script>alert(1)</script><div class=\"\n\+    \def f(x):\n\+    \    return x\n\+    \```"+    "<pre><code class=\"&quot;><script>alert(1)</script><div class=&quot;\">def f(x):\n\+    \    return x\n\+    \</code></pre>" testBlockHtml = expectSuccess "block html" blockHtml     "<div class=\"class\">\n\     \    <span></span>\n\@@ -367,9 +399,13 @@         testNestedList,         testBlockQuote,         testBlockQuotePreFormatted,-        testBlockCode,+        testBlockCodeIndented,         testBlockCodeWhitespace,         testBlockCodeSpecialChars,+        testBlockCodeFenced,+        testBlockCodeWithClass,+        testBlockCodeFencedSpecialChars,+        testBlockCodeEscapeClass,         testBlockHtml,         testTable,         testTableHeader,
+ test/goldens/bleach.md view
@@ -0,0 +1,9 @@+<div class="<img src=x onerror='alert(1)'/>">escaped</div>+<span class="a">allowed</span>+<span onclick="alert('haxx');"></span>+<span class="a" onclick="alert('haxx');"></span>+<img src="x" onerror="alert('haxx');"/>+<span foo="bar"></span>+```a+var x;+```
+ test/goldens/golden1.md view
@@ -0,0 +1,154 @@+[blah](https://example.com) blah blah blah blah blah blah blah blah blah blah blah blah blah blah blah blah blah.+blah'blah blah <abbr title="blah-blah blah">blah</abbr> blah, blah blah blah, blah blah blah blah, blah blah blah, blah blah blah blah blah.+blah blah blah blah blah blah blah-blah blah'blah blah^[0], blah blah blah blah blah blah blah-blah.+blah blah blah blah blah blah blah blah blah blah blah blah blah blah blah blah.++### blah blah blah++blah blah blah blah blah blah, blah blah blah blah blah blah blah blah blah blah blah blah blah blah blah blah blah blah blah blah blah,+blah blah blah blah, blah blah blah, blah blah blah blah. blah blah blah blah blah blah blah blah blah blah.++#### `blah_blah = blah` blah blah++blah blah blah blah, blah blah blah blah: blah blah blah blah blah, blah blah "blah", blah blah blah blah blah "blah" blah blah blah blah blah blah,+blah blah blah blah blah blah blah blah.+blah blah blah, blah blah blah blah blah blah blah blah blah blah blah blah blah.++blah blah blah blah blah blah, blah blah blah blah blah blah blah blah blah blah blah blah blah blah blah^[1]^[2].+blah blah blah blah blah blah blah blah blah blah blah blah, blah blah blah blah blah:+blah blah blah-blah blah (blah blah blah blah blah) blah blah blah blah-blah blah (blah blah blah blah blah blah).+blah blah blah blah blah blah-blah blah blah blah blah, blah blah blah blah blah blah blah.+blah blah blah blah blah blah blah blah blah blah `blah_blah` blah, blah blah blah blah `blah`&mdash;blah blah blah blah blah blah.++blah blah blah blah blah blah blah blah blah.+blah blah blah^[3] blah blah blah blah:++    blah blah_blah(blah):+        blah = blah.blah.blah(...)   # blah blah blah blah blah blah blah blah blah+        blah.blah_blah_blah_blah()   # blah blah blah blah+        blah.blah()                             # blah blah blah blah blah blah+        blah blah(...)++blah blah blah blah, blah `blah` blah blah blah blah blah blah blah blah blah blah blah,+blah blah blah blah blah blah blah--blah blah blah blah blah blah blah blah blah blah blah blah blah blah.+blah `blah` blah blah blah blah blah, blah blah blah blah blah blah blah blah blah+blah blah blah blah blah blah blah blah'blah blah. blah, `blah_blah_blah_blah` blah blah blah blah blah+blah blah blah blah blah blah blah blah blah blah blah.++#### `blah_blah_blah` blah `blah_blah_blah` blah blah-blah++blah blah blah blah blah blah blah blah blah blah blah blah blah blah blah, blah blah blah, blah blah blah blah blah blah blah blah blah.+blah blah blah blah blah blah blah blah blah blah, blah, blah blah `blah` blah blah blah blah blah `blah`?+blah blah blah blah blah blah blah blah blah, blah.blah. blah blah blah blah blah blah blah `blah` blah blah blah blah `blah` blah blah,+blah blah blah blah blah blah blah blah blah blah.+blah blah blah blah blah blah blah, blah blah blah blah blah blah blah blah blah blah blah blah+[blah blah `blah_blah_blah`](https://example.com):++> blah blah blah blah blah blah blah, blah blah blah, blah blah blah blah blah blah blah.+> blah, blah blah blah blah blah blah blah blah blah blah blah blah blah blah blah `blah_blah_blah` blah (blah `blah` blah `blah_blah`),+> blah blah blah blah blah blah blah-blah blah blah blah blah blah blah blah blah blah blah blah blah blah.++blah blah, blah blah blah blah blah blah blah blah blah, blah blah blah blah blah^[4].+blah blah blah blah blah, blah blah *blah* blah blah blah blah^[5], blah blah blah blah blah blah blah.++#### blah blah blah blah blah blah blah blah blah blah blah++blah blah blah blah blah blah blah blah blah "blah", blah blah blah blah blah blah blah blah blah blah blah blah blah blah.+blah blah blah blah blah blah blah, blah blah, blah blah blah blah blah blah blah blah.+blah blah, blah blah blah blah blah blah blah blah blah blah blah' blah blah.+blah blah blah blah blah blah blah blah blah blah blah, blah?+blah blah blah blah blah blah blah blah blah blah. blah-blah? blah'blah blah blah blah.+blah `blah` blah blah blah, blah blah blah blah blah blah blah? blah'blah blah blah blah. blah? blah blah blah.+blah blah? blah blah blah blah blah blah!++blah blah blah blah blah blah blah blah blah blah blah:+blah, blah-blah blah blah blah blah blah blah blah, blah blah blah blah blah blah blah blah blah blah.++#### blah blah blah blah blah blah `blah`++blah blah blah blah. blah blah'blah blah blah blah blah blah blah'blah blah blah blah blah blah:++    > blah.blah.blah(blah__blah=blah)      # blah blah blah blah blah blah blah blah+    []                                              # blah blah blah blah blah blah blah+    > blah.blah.blah(blah=12345).blah blah blah     # blah blah blah blah blah blah blah blah blah blah blah+    blah                                            # blah blah++blah blah blah blah blah blah blah blah blah blah blah blah blah blah, blah blah blah blah blah `blah`, blah blah blah blah blah blah.+blah blah blah blah blah blah, blah blah blah blah blah blah, blah blah blah blah blah blah blah `blah`, blah blah blah blah blah blah blah blah blah blah.+blah blah blah blah blah blah blah, blah blah-blah blah blah blah blah blah blah blah blah blah blah blah+blah^[6]^[7].++#### blah blah blah++blah blah blah'blah blah blah blah blah blah blah blah blah blah blah blah `blah` blah,+blah blah blah blah blah blah blah blah blah blah blah blah blah.+blah blah blah'blah blah blah blah, blah blah blah blah blah blah blah.+blah blah blah blah blah `blah` blah `blah_blah == blah` blah `blah_blah == 4`,+blah blah'blah blah blah blah blah blah blah (blah: blah).++blah blah blah blah blah blah blah blah blah blah blah blah blah blah blah blah blah blah `@blah` blah.+blah blah blah blah blah blah blah blah blah blah blah, blah blah blah blah blah, blah blah blah blah blah blah blah blah.++### blah blah++blah blah blah blah blah blah blah blah blah blah blah blah blah^[8].+blah blah blah blah blah blah blah blah blah blah blah-blah blah blah blah. blah'blah blah blah blah blah blah blah blah blah blah,+blah `blah` blah `blah` blah. blah blah blah blah blah blah blah blah blah blah blah blah blah blah, blah blah blah blah.+blah blah blah blah blah `blah` blah blah blah, blah blah blah `blah` blah blah, blah blah blah `blah` blah+blah--blah blah blah blah blah blah blah blah blah blah blah blah blah blah, blah blah blah blah blah blah blah blah.+blah'blah blah blah blah blah blah blah blah *blah blah blah*--blah blah blah blah blah blah blah blah blah blah blah blah.++blah, blah blah blah blah blah blah, blah blah blah blah blah blah blah--blah, blah blah blah blah blah blah blah--blah+blah blah blah blah blah blah.+blah blah blah blah blah blah? blah `<blah>` blah blah blah blah blah blah, blah blah blah blah blah blah blah blah!+blah blah blah blah blah blah blah? blah blah blah'blah blah blah blah blah blah blah blah. blah blah blah blah?++blah blah blah blah. blah blah blah blah blah blah blah blah blah blah blah-blah, blah blah blah blah blah blah-blah blah blah!+blah blah blah, blah blah blah'blah blah blah blah blah blah blah blah [blah](https://example.com)) blah,+blah blah blah blah blah blah blah blah blah blah blah blah blah.++### blah++blah blah blah blah blah blah blah blah blah^[9]^[10],+blah blah blah blah blah blah blah blah blah blah blah blah blah.+blah blah blah blah blah blah blah blah blah blah blah blah blah blah blah.+blah blah blah *blah*, blah blah blah blah blah blah blah blah blah blah blah.+blah blah blah blah blah, blah blah blah blah blah blah blah blah.++blah blah blah blah? blah blah blah blah blah blah blah blah blah blah blah blah blah blah blah blah blah+blah blah blah blah blah blah blah.+blah blah blah blah, blah blah `blah_blah_blah` blah `blah_blah_blah`, blah blah blah blah blah blah blah blah blah.+blah blah blah blah blah blah blah blah blah blah blah blah blah, blah blah blah blah blah blah blah blah blah blah blah blah blah blah blah blah.+blah blah blah blah blah blah blah blah blah blah blah blah blah, blah blah blah blah blah blah blah blah blah blah.+blah blah, blah blah blah blah, blah blah blah blah blah, blah blah blah blah blah blah blah blah blah blah blah blah blah blah blah,+blah blah blah blah blah blah blah.++blah blah blah blah blah, blah blah blah blah blah blah blah blah blah blah blah blah blah, blah blah blah blah blah blah blah.++---++~[0] blah [blah blah-blah](https://example.com), blah blah-blah blah blah blah "blah2" blah.+~[1] blah blah blah blah blah blah blah blah, blah blah blah blah blah blah blah blah blah blah.+blah blah, blah blah blah blah blah blah blah blah blah blah blah blah blah blah blah blah,+blah blah blah blah blah blah blah blah blah blah blah blah blah blah blah blah.+~[2] blah blah blah blah blah blah blah blah blah blah, blah blah blah blah [blah 249](https://example.com).+~[3] blah blah blah blah blah blah blah blah blah blah blah.+~[4] blah [blah](https://example.com)+blah blah blah blah blah blah blah blah `blah`, blah blah blah blah blah blah blah blah blah blah blah.+~[5] blah blah [blah](https://example.com):+> blah blah blah blah blah, blah blah blah blah blah blah blah blah blah blah blah blah blah (blah blah),+> blah blah blah blah blah blah `blah_blah_blah` blah blah blah `blah` blah blah blah blah'blah blah blah blah blah `blah()` blah.+~[6] blah blah, blah blah blah, blah blah blah blah 0+([blah blah](https://example.com))+blah blah blah blah.+~[7] blah blah blah blah blah "blah'blah blah blah blah blah blah blah blah".+blah blah blah blah blah blah blah blah blah blah, blah blah blah, blah blah blah blah, blah blah blah blah blah blah.+~[8] blah blah blah blah blah blah blah blah blah blah blah.+~[9] blah blah blah blah `blah()` blah `blah(blah)`,+blah blah blah `blah_blah(blah).blah()` blah blah blah blah blah blah,+blah blah blah `blah()` blah `blah` blah `blah(blah)` blah blah `blah` blah.+~[10] blah blah `blah` blah `blah` blah, blah blah+[blah](https://example.com)+blah blah `blah` blah blah blah'blah `blah` blah, blah blah blah `blah.blah()` blah:+> blah blah blah blah blah `blah()` blah blah blah blah blah blah blah blah blah blah blah blah blah blah blah.+blah, blah blah blah blah blah blah (blah blah blah blah blah blah) blah blah blah `blah()`, `blah.blah()` blah `blah`, blah blah blah blah blah blah blah.
+ test/goldens/golden2.md view
@@ -0,0 +1,88 @@+blah blah blah [blah 1994](https://example.com).+blah blah blah blah blah blah blah blah blah: blah blah [blah](https://example.com) blah blah blah blah blah 2016, blah blah blah 50%.+blah blah blah blah blah blah blah blah blah blah blah blah blah *blah* blah blah blah?++### blah blah blah++blah blah blah blah, blah blah blah blah blah blah blah blah blah blah blah blah, blah blah blah blah.+blah, blah blah blah blah blah blah blah blah blah blah blah blah.+blah blah blah blah blah blah blah blah blah blah blah blah.+blah blah blah blah blah blah blah blah blah blah. blah blah blah blah, blah blah, blah blah. blah blah blah, blah blah blah blah.+blah blah blah blah blah blah blah blah blah blah, blah, blah blah blah.+blah blah blah blah blah blah'blah blah blah, blah blah blah blah (blah blah blah blah^[blah-blah-blah])+blah blah blah blah, blah blah blah blah blah blah blah.++blah blah blah blah blah blah blah blah blah.+blah'blah blah blah blah blah blah blah blah blah blah blah blah blah blah blah.+blah blah blah blah blah blah blah blah blah blah^[blah] blah blah, blah blah blah blah blah blah blah blah blah blah'blah blah, blah blah'blah blah blah blah-blah.+blah blah blah blah blah blah--blah blah blah blah blah blah blah blah blah blah blah blah^[blah-blah].++### blah blah blah blah++blah blah blah blah blah blah blah blah blah blah blah blah blah blah:+ * blah blah blah blah blah blah "blah" blah blah, blah blah, blah blah blah blah blah blah blah.+ * blah blah blah blah blah blah blah blah, blah blah blah blah blah blah blah, blah blah blah blah, blah blah blah blah blah blah blah blah blah blah.+ * blah blah blah blah `blah` blah blah blah blah blah blah blah, blah blah blah blah blah blah blah, blah blah blah.+blah blah blah, blah blah blah blah blah blah blah blah blah, blah blah blah blah blah blah blah blah blah blah blah blah (blah blah blah) blah blah blah.++blah blah blah blah blah blah blah blah blah blah blah blah blah blah blah blah blah.+blah blah blah blah blah blah blah blah blah blah blah, blah blah blah blah blah blah blah'blah blah blah.+blah blah blah blah blah blah blah blah blah blah blah blah blah blah, blah blah blah blah blah blah blah.+blah blah blah blah blah blah blah blah blah blah blah blah blah blah, blah blah blah blah blah blah blah blah blah blah blah blah.+blah blah blah blah^[blah1] blah blah blah blah blah blah blah blah blah blah^[blah2], blah blah blah blah blah blah blah blah.++blah blah blah blah blah blah blah blah blah.+blah blah blah blah blah blah blah blah blah blah^[blah-blah-blah1] blah blah blah blah,+blah blah blah blah blah blah blah blah blah blah blah blah blah blah, blah blah blah `blah` blah blah blah blah.+blah blah blah blah blah blah blah blah blah blah blah blah,+blah, blah blah blah blah blah blah blah, blah blah blah blah blah blah blah blah blah blah blah blah blah blah^[blah3].+blah blah blah blah blah blah blah blah blah blah, blah blah blah^[blah-blah1] blah.+blah blah blah blah blah blah blah blah blah blah blah blah blah blah blah blah blah blah, blah blah blah blah blah blah'blah blah-blah blah^[blah-blah2].+blah blah blah blah blah blah blah blah blah blah blah blah blah `blah` blah, blah blah blah blah blah blah blah blah blah.++### blah-blah-blah++blah blah blah blah blah blah blah blah blah blah blah blah blah blah blah blah blah.+blah blah blah blah blah blah blah blah blah blah blah; blah blah blah, blah blah blah blah blah blah blah blah blah blah-blah blah blah blah blah.+blah blah blah blah blah blah blah blah blah blah blah blah blah blah blah blah blah blah blah blah blah blah,+blah blah blah blah blah blah blah blah blah blah blah blah blah blah.+blah blah blah blah blah blah blah blah blah blah blah blah blah blah blah blah.++blah blah blah blah blah blah blah blah. blah blah3blah blah blah [`blah-blah` blah blah](https://example.com),+blah blah blah blah blah blah blah blah blah blah blah blah, blah blah blah blah blah blah blah blah blah.+blah, blah blah blah [blah blah blah blah](https://example.com) blah blah blah blah blah blah blah.++blah blah blah blah, blah blah: blah `blah-blah-blah` blah.+blah blah blah blah blah blah blah `blah-blah-blah` blah, blah blah blah blah blah blah blah blah blah blah blah, blah blah blah blah blah, blah blah blah blah blah blah.+blah, blah blah blah blah blah blah blah blah blah blah.+blah blah blah blah blah blah blah blah blah blah blah blah blah blah blah.++blah, blah blah blah blah blah blah blah blah blah blah blah blah blah blah (blah.blah. blah), blah blah blah blah blah blah blah blah blah blah blah blah.+blah blah blah blah blah blah blah blah blah 20 blah blah.+blah blah blah blah blah blah blah blah blah `blah-blah-blah` blah blah blah blah blah blah blah blah blah blah, blah blah blah blah blah blah blah blah.+blah blah, blah blah blah.++---++~[blah-blah-blah] blah blah, "blah blah blah" blah blah blah blah blah blah blah blah blah blah blah blah blah blah blah blah.+blah blah blah blah blah blah blah (blah blah blah blah), blah blah blah blah blah, blah blah blah blah, blah blah blah blah blah blah blah blah blah blah.+~[blah] blah blah blah blah blah blah blah blah blah-blah.+~[blah-blah] blah blah [blah blah](https://example.com) blah blah blah blah blah-blah blah blah,+blah [blah'blah blah](https://example.com) blah blah'blah blah blah blah blah blah blah blah blah.+~[blah1] blah blah blah blah blah blah "blah" blah blah blah blah blah. blah blah blah.+blah blah blah blah `blah` blah, blah blah blah "blah", blah blah blah blah blah blah blah blah blah blah blah blah blah blah blah blah blah.+blah, blah blah3blah'blah [blah blah blah](https://example.com) blah blah blah blah blah "blah", blah blah blah blah+blah blah blah blah blah blah blah.^[blah4]+~[blah-blah1] blah blah blah blah blah blah.+~[blah-blah2] blah blah blah blah blah blah blah blah blah.+blah blah blah blah blah blah blah blah blah blah blah blah blah blah blah blah blah blah'blah blah,+blah blah blah blah blah blah blah blah blah blah, blah blah blah blah blah blah blah blah blah blah.+~[blah2] blah blah blah blah, blah blah blah blah blah blah blah blah blah blah.+blah blah blah blah, blah blah blah blah blah, blah blah blah blah-blah blah.+~[blah-blah-blah1] blah blah blah blah blah blah blah blah blah blah: blah blah, blah blah blah blah blah blah blah blah blah blah,+blah blah blah, blah blah blah blah blah blah blah blah blah blah blah blah blah blah.+blah blah blah blah blah blah blah blah blah blah blah blah blah blah blah blah blah blah blah blah blah blah,+blah blah blah blah blah blah blah blah blah blah blah blah blah blah blah, blah blah blah blah, blah blah blah blah blah blah blah blah blah-blah blah.+~[blah3] blah blah, blah blah blah blah, blah blah blah blah [blah blah blah](https://example.com)+blah blah blah blah blah blah blah blah blah blah. blah blah blah blah blah blah.+~[blah4] blah blah blah blah blah "blah" blah blah blah blah blah "blah" blah blah blah, blah blah blah blah blah blah blah blah blah blah blah blah blah blah.