diff --git a/Blogdown.cabal b/Blogdown.cabal
--- a/Blogdown.cabal
+++ b/Blogdown.cabal
@@ -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
diff --git a/Readme.md b/Readme.md
--- a/Readme.md
+++ b/Readme.md
@@ -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.
diff --git a/src/AST.hs b/src/AST.hs
--- a/src/AST.hs
+++ b/src/AST.hs
@@ -31,7 +31,10 @@
            | Header Int [Inline]
            | ListBlock List
            | BlockQuote [Inline]
-           | BlockCode String
+           | BlockCode {
+    codeClass :: String,
+    codeContent :: String
+}
            | BlockHtml Html
            | Table {
     thead :: Maybe [TableRow],
diff --git a/src/Parsing/ParseBlock.hs b/src/Parsing/ParseBlock.hs
--- a/src/Parsing/ParseBlock.hs
+++ b/src/Parsing/ParseBlock.hs
@@ -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])
diff --git a/src/Rendering/Render.hs b/src/Rendering/Render.hs
--- a/src/Rendering/Render.hs
+++ b/src/Rendering/Render.hs
@@ -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
diff --git a/src/Rendering/RenderOptions.hs b/src/Rendering/RenderOptions.hs
--- a/src/Rendering/RenderOptions.hs
+++ b/src/Rendering/RenderOptions.hs
@@ -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 "" = []
diff --git a/test/Test.hs b/test/Test.hs
--- a/test/Test.hs
+++ b/test/Test.hs
@@ -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,
diff --git a/test/goldens/bleach.md b/test/goldens/bleach.md
new file mode 100644
--- /dev/null
+++ b/test/goldens/bleach.md
@@ -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;
+```
diff --git a/test/goldens/golden1.md b/test/goldens/golden1.md
new file mode 100644
--- /dev/null
+++ b/test/goldens/golden1.md
@@ -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.
diff --git a/test/goldens/golden2.md b/test/goldens/golden2.md
new file mode 100644
--- /dev/null
+++ b/test/goldens/golden2.md
@@ -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.
