import {parser} from "../dist/index.js"
import {compareTree} from "./compare-tree.js"
import {SpecParser} from "./spec.js"
const specParser = new SpecParser(parser)
function test(name: string, spec: string) {
it(name, () => {
let {tree, doc} = specParser.parse(spec, name)
compareTree(parser.parse(doc), tree)
})
}
// These are the tests from revision 0.29 of the CommonMark spec,
// mechanically translated to the format used here (because their
// original format, providing expected HTML output, doesn't cover most
// of the aspects of the output that we're interested in), and then eyeballed
// to check whether the produced output corresponds to the intent of
// the test.
describe("CommonMark spec", () => {
test("Tabs (example 1)", `
{CB:{cT:foo baz bim}}
`)
test("Tabs (example 2)", `
{CB:{cT:foo baz bim}}
`)
test("Tabs (example 3)", `
{CB:{cT:a a
} {cT:ὐ a}}
`)
test("Tabs (example 4)", `
{BL:{LI: {l:-} {P:foo}
{P:bar}}}
`)
test("Tabs (example 5)", `
{BL:{LI:{l:-} {P:foo}
{CB:{cT:bar}}}}
`)
test("Tabs (example 6)", `
{Q:{q:>} {CB:{cT:foo}}}
`)
test("Tabs (example 7)", `
{BL:{LI:{l:-} {CB:{cT:foo}}}}
`)
test("Tabs (example 8)", `
{CB:{cT:foo
} {cT:bar}}
`)
test("Tabs (example 9)", `
{BL:{LI: {l:-} {P:foo}
{BL:{LI:{l:-} {P:bar}
{BL:{LI:{l:-} {P:baz}}}}}}}
`)
test("Tabs (example 10)", `
{P:# Foo}
`)
test("Tabs (example 11)", `
{HR:* * * }
`)
test("Precedence (example 12)", `
{BL:{LI:{l:-} {P:\`one}}
{LI:{l:-} {P:two\`}}}
`)
test("Thematic breaks (example 13)", `
{HR:***}
{HR:---}
{HR:___}
`)
test("Thematic breaks (example 14)", `
{P:+++}
`)
test("Thematic breaks (example 15)", `
{P:===}
`)
test("Thematic breaks (example 16)", `
{P:--
**
__}
`)
test("Thematic breaks (example 17)", `
{HR:***}
{HR:***}
{HR:***}
`)
test("Thematic breaks (example 18)", `
{CB:{cT:***}}
`)
test("Thematic breaks (example 19)", `
{P:Foo
***}
`)
test("Thematic breaks (example 20)", `
{HR:_____________________________________}
`)
test("Thematic breaks (example 21)", `
{HR:- - -}
`)
test("Thematic breaks (example 22)", `
{HR:** * ** * ** * **}
`)
test("Thematic breaks (example 23)", `
{HR:- - - -}
`)
test("Thematic breaks (example 24)", `
{HR:- - - - }
`)
test("Thematic breaks (example 25)", `
{P:_ _ _ _ a}
{P:a------}
{P:---a---}
`)
test("Thematic breaks (example 26)", `
{P:{Em:{e:*}-{e:*}}}
`)
test("Thematic breaks (example 27)", `
{BL:{LI:{l:-} {P:foo}}}
{HR:***}
{BL:{LI:{l:-} {P:bar}}}
`)
test("Thematic breaks (example 28)", `
{P:Foo}
{HR:***}
{P:bar}
`)
test("Thematic breaks (example 29)", `
{SH2:Foo
{h:---}}
{P:bar}
`)
test("Thematic breaks (example 30)", `
{BL:{LI:{l:*} {P:Foo}}}
{HR:* * *}
{BL:{LI:{l:*} {P:Bar}}}
`)
test("Thematic breaks (example 31)", `
{BL:{LI:{l:-} {P:Foo}}
{LI:{l:-} {HR:* * *}}}
`)
test("ATX headings (example 32)", `
{H1:{h:#} foo}
{H2:{h:##} foo}
{H3:{h:###} foo}
{H4:{h:####} foo}
{H5:{h:#####} foo}
{H6:{h:######} foo}
`)
test("ATX headings (example 33)", `
{P:####### foo}
`)
test("ATX headings (example 34)", `
{P:#5 bolt}
{P:#hashtag}
`)
test("ATX headings (example 35)", `
{P:{Esc:\\#}# foo}
`)
test("ATX headings (example 36)", `
{H1:{h:#} foo {Em:{e:*}bar{e:*}} {Esc:\\*}baz{Esc:\\*}}
`)
test("ATX headings (example 37)", `
{H1:{h:#} foo }
`)
test("ATX headings (example 38)", `
{H3:{h:###} foo}
{H2:{h:##} foo}
{H1:{h:#} foo}
`)
test("ATX headings (example 39)", `
{CB:{cT:# foo}}
`)
test("ATX headings (example 40)", `
{P:foo
# bar}
`)
test("ATX headings (example 41)", `
{H2:{h:##} foo {h:##}}
{H3:{h:###} bar {h:###}}
`)
test("ATX headings (example 42)", `
{H1:{h:#} foo {h:##################################}}
{H5:{h:#####} foo {h:##}}
`)
test("ATX headings (example 43)", `
{H3:{h:###} foo {h:###} }
`)
test("ATX headings (example 44)", `
{H3:{h:###} foo ### b}
`)
test("ATX headings (example 45)", `
{H1:{h:#} foo#}
`)
test("ATX headings (example 46)", `
{H3:{h:###} foo {Esc:\\#}##}
{H2:{h:##} foo #{Esc:\\#}#}
{H1:{h:#} foo {Esc:\\#}}
`)
test("ATX headings (example 47)", `
{HR:****}
{H2:{h:##} foo}
{HR:****}
`)
test("ATX headings (example 48)", `
{P:Foo bar}
{H1:{h:#} baz}
{P:Bar foo}
`)
test("ATX headings (example 49)", `
{H2:{h:##} }
{H1:{h:#}}
{H3:{h:###} {h:###}}
`)
test("Setext headings (example 50)", `
{SH1:Foo {Em:{e:*}bar{e:*}}
{h:=========}}
{SH2:Foo {Em:{e:*}bar{e:*}}
{h:---------}}
`)
test("Setext headings (example 51)", `
{SH1:Foo {Em:{e:*}bar
baz{e:*}}
{h:====}}
`)
test("Setext headings (example 52)", `
{SH1:Foo {Em:{e:*}bar
baz{e:*}}
{h:====}}
`)
test("Setext headings (example 53)", `
{SH2:Foo
{h:-------------------------}}
{SH1:Foo
{h:=}}
`)
test("Setext headings (example 54)", `
{SH2:Foo
{h:---}}
{SH2:Foo
{h:-----}}
{SH1:Foo
{h:===}}
`)
test("Setext headings (example 55)", `
{CB:{cT:Foo
} {cT:---
} {cT:Foo}}
{HR:---}
`)
test("Setext headings (example 56)", `
{SH2:Foo
{h:----} }
`)
test("Setext headings (example 57)", `
{P:Foo
---}
`)
test("Setext headings (example 58)", `
{P:Foo
= =}
{P:Foo}
{HR:--- -}
`)
test("Setext headings (example 59)", `
{SH2:Foo
{h:-----}}
`)
test("Setext headings (example 60)", `
{SH2:Foo\\
{h:----}}
`)
test("Setext headings (example 61)", `
{SH2:\`Foo
{h:----}}
{P:\`}
{SH2:}
`)
test("Setext headings (example 62)", `
{Q:{q:>} {P:Foo}}
{HR:---}
`)
test("Setext headings (example 63)", `
{Q:{q:>} {P:foo
bar
===}}
`)
test("Setext headings (example 64)", `
{BL:{LI:{l:-} {P:Foo}}}
{HR:---}
`)
test("Setext headings (example 65)", `
{SH2:Foo
Bar
{h:---}}
`)
test("Setext headings (example 66)", `
{HR:---}
{SH2:Foo
{h:---}}
{SH2:Bar
{h:---}}
{P:Baz}
`)
test("Setext headings (example 67)", `
{P:====}
`)
test("Setext headings (example 68)", `
{HR:---}
{HR:---}
`)
test("Setext headings (example 69)", `
{BL:{LI:{l:-} {P:foo}}}
{HR:-----}
`)
test("Setext headings (example 70)", `
{CB:{cT:foo}}
{HR:---}
`)
test("Setext headings (example 71)", `
{Q:{q:>} {P:foo}}
{HR:-----}
`)
test("Setext headings (example 72)", `
{SH2:{Esc:\\>} foo
{h:------}}
`)
test("Setext headings (example 73)", `
{P:Foo}
{SH2:bar
{h:---}}
{P:baz}
`)
test("Setext headings (example 74)", `
{P:Foo
bar}
{HR:---}
{P:baz}
`)
test("Setext headings (example 75)", `
{P:Foo
bar}
{HR:* * *}
{P:baz}
`)
test("Setext headings (example 76)", `
{P:Foo
bar
{Esc:\\-}--
baz}
`)
test("Indented code blocks (example 77)", `
{CB:{cT:a simple
} {cT: indented code block}}
`)
test("Indented code blocks (example 78)", `
{BL:{LI: {l:-} {P:foo}
{P:bar}}}
`)
test("Indented code blocks (example 79)", `
{OL:{LI:{l:1.} {P:foo}
{BL:{LI:{l:-} {P:bar}}}}}
`)
test("Indented code blocks (example 80)", `
{CB:{cT:
} {cT:*hi*
} {cT:- one}}
`)
test("Indented code blocks (example 81)", `
{CB:{cT:chunk1
} {cT:chunk2
} {cT:
} {cT:
} {cT:
} {cT:chunk3}}
`)
test("Indented code blocks (example 82)", `
{CB:{cT:chunk1
} {cT:
} {cT: chunk2}}
`)
test("Indented code blocks (example 83)", `
{P:Foo
bar}
`)
test("Indented code blocks (example 84)", `
{CB:{cT:foo}}
{P:bar}
`)
test("Indented code blocks (example 85)", `
{H1:{h:#} Heading}
{CB:{cT:foo}}
{SH2:Heading
{h:------}}
{CB:{cT:foo}}
{HR:----}
`)
test("Indented code blocks (example 86)", `
{CB:{cT: foo
} {cT:bar}}
`)
test("Indented code blocks (example 87)", `
{CB:{cT:foo}}
`)
test("Indented code blocks (example 88)", `
{CB:{cT:foo }}
`)
test("Fenced code blocks (example 89)", `
{FC:{c:\`\`\`}
{cT:<
>}
{c:\`\`\`}}
`)
test("Fenced code blocks (example 90)", `
{FC:{c:~~~}
{cT:<
>}
{c:~~~}}
`)
test("Fenced code blocks (example 91)", `
{P:{C:{c:\`\`}
foo
{c:\`\`}}}
`)
test("Fenced code blocks (example 92)", `
{FC:{c:\`\`\`}
{cT:aaa
~~~}
{c:\`\`\`}}
`)
test("Fenced code blocks (example 93)", `
{FC:{c:~~~}
{cT:aaa
\`\`\`}
{c:~~~}}
`)
test("Fenced code blocks (example 94)", `
{FC:{c:\`\`\`\`}
{cT:aaa
\`\`\`}
{c:\`\`\`\`\`\`}}
`)
test("Fenced code blocks (example 95)", `
{FC:{c:~~~~}
{cT:aaa
~~~}
{c:~~~~}}
`)
test("Fenced code blocks (example 96)", `
{FC:{c:\`\`\`}
}`)
test("Fenced code blocks (example 97)", `
{FC:{c:\`\`\`\`\`}
{cT:
\`\`\`
aaa
}}`)
test("Fenced code blocks (example 98)", `
{Q:{q:>} {FC:{c:\`\`\`}
{q:>} {cT:aaa}}}
{P:bbb}
`)
test("Fenced code blocks (example 99)", `
{FC:{c:\`\`\`}
{cT:
}
{c:\`\`\`}}
`)
test("Fenced code blocks (example 100)", `
{FC:{c:\`\`\`}
{c:\`\`\`}}
`)
test("Fenced code blocks (example 101)", `
{FC:{c:\`\`\`}
{cT: aaa
aaa}
{c:\`\`\`}}
`)
test("Fenced code blocks (example 102)", `
{FC:{c:\`\`\`}
{cT:aaa
aaa
aaa}
{c:\`\`\`}}
`)
test("Fenced code blocks (example 103)", `
{FC:{c:\`\`\`}
{cT: aaa
aaa
aaa}
{c:\`\`\`}}
`)
test("Fenced code blocks (example 104)", `
{CB:{cT:\`\`\`
} {cT:aaa
} {cT:\`\`\`}}
`)
test("Fenced code blocks (example 105)", `
{FC:{c:\`\`\`}
{cT:aaa}
{c:\`\`\`}}
`)
test("Fenced code blocks (example 106)", `
{FC:{c:\`\`\`}
{cT:aaa}
{c:\`\`\`}}
`)
test("Fenced code blocks (example 107)", `
{FC:{c:\`\`\`}
{cT:aaa
\`\`\`
}}`)
test("Fenced code blocks (example 108)", `
{P:{C:{c:\`\`\`} {c:\`\`\`}}
aaa}
`)
test("Fenced code blocks (example 109)", `
{FC:{c:~~~~~~}
{cT:aaa
~~~ ~~
}}`)
test("Fenced code blocks (example 110)", `
{P:foo}
{FC:{c:\`\`\`}
{cT:bar}
{c:\`\`\`}}
{P:baz}
`)
test("Fenced code blocks (example 111)", `
{SH2:foo
{h:---}}
{FC:{c:~~~}
{cT:bar}
{c:~~~}}
{H1:{h:#} baz}
`)
test("Fenced code blocks (example 112)", `
{FC:{c:\`\`\`}{cI:ruby}
{cT:def foo(x)
return 3
end}
{c:\`\`\`}}
`)
test("Fenced code blocks (example 113)", `
{FC:{c:~~~~} {cI:ruby startline=3 $%@#$}
{cT:def foo(x)
return 3
end}
{c:~~~~~~~}}
`)
test("Fenced code blocks (example 114)", `
{FC:{c:\`\`\`\`}{cI:;}
{c:\`\`\`\`}}
`)
test("Fenced code blocks (example 115)", `
{P:{C:{c:\`\`\`} aa {c:\`\`\`}}
foo}
`)
test("Fenced code blocks (example 116)", `
{FC:{c:~~~} {cI:aa \`\`\` ~~~}
{cT:foo}
{c:~~~}}
`)
test("Fenced code blocks (example 117)", `
{FC:{c:\`\`\`}
{cT:\`\`\` aaa}
{c:\`\`\`}}
`)
test("HTML blocks (example 118)", `
{HB:
**Hello**,}
{P:{Em:{e:_}world{e:_}}.
{HT:}}
{HB: |
}
`)
test("HTML blocks (example 119)", `
{HB:}
{P:okay.}
`)
test("HTML blocks (example 120)", `
{HB:
*foo*}
`)
test("HTML blocks (example 122)", `
{HB:}
{P:{Em:{e:*}Markdown{e:*}}}
{HB:
}
`)
test("HTML blocks (example 123)", `
{HB:
}
`)
test("HTML blocks (example 124)", `
{HB:
}
`)
test("HTML blocks (example 125)", `
{HB:
*foo*}
{P:{Em:{e:*}bar{e:*}}}
`)
test("HTML blocks (example 126)", `
{HB:
}
`)
test("HTML blocks (example 130)", `
{HB:
}
`)
test("HTML blocks (example 131)", `
{HB:
\`\`\` c
int x = 33;
x\`\`\`}
`)
test("HTML blocks (example 132)", `
{HB:
*bar*
}
`)
test("HTML blocks (example 133)", `
{HB:
*bar*
}
`)
test("HTML blocks (example 134)", `
{HB:
*bar*
}
`)
test("HTML blocks (example 135)", `
{HB:
*bar*}
`)
test("HTML blocks (example 136)", `
{HB:
*foo*
}
`)
test("HTML blocks (example 137)", `
{HB:
}
{P:{Em:{e:*}foo{e:*}}}
{HB:}
`)
test("HTML blocks (example 138)", `
{P:{HT:
}{Em:{e:*}foo{e:*}}{HT:}}
`)
test("HTML blocks (example 139)", `
{HB:
import Text.HTML.TagSoup
main :: IO ()
main = print $ parseTags tags
}
{P:okay}
`)
test("HTML blocks (example 140)", `
{HB:}
{P:okay}
`)
test("HTML blocks (example 141)", `
{HB:}
{P:okay}
`)
test("HTML blocks (example 142)", `
{HB:}
{P:{Em:{e:*}foo{e:*}}}
`)
test("HTML blocks (example 146)", `
{CMB:*bar*}
{P:{Em:{e:*}baz{e:*}}}
`)
test("HTML blocks (example 147)", `
{HB:1. *bar*}
`)
test("HTML blocks (example 148)", `
{CMB:}
{P:okay}
`)
test("HTML blocks (example 149)", `
{PI:';
?>}
{P:okay}
`)
test("HTML blocks (example 150)", `
{HB:}
`)
test("HTML blocks (example 151)", `
{HB:}
{P:okay}
`)
test("HTML blocks (example 152)", `
{CMB:}
{CB:{cT:}}
`)
test("HTML blocks (example 153)", `
{HB:
}
{CB:{cT:
}}
`)
test("HTML blocks (example 154)", `
{P:Foo}
{HB:
bar
}
`)
test("HTML blocks (example 155)", `
{HB:
bar
*foo*}
`)
test("HTML blocks (example 156)", `
{P:Foo
{HT:
}
baz}
`)
test("HTML blocks (example 157)", `
{HB:}
{P:{Em:{e:*}Emphasized{e:*}} text.}
{HB:
}
`)
test("HTML blocks (example 158)", `
{HB:
*Emphasized* text.
}
`)
test("HTML blocks (example 159)", `
{HB:}
{HB:}
{HB:|
Hi
| }
{HB:
}
{HB:
}
`)
test("HTML blocks (example 160)", `
{HB:
}
{HB:}
{CB:{cT:|
} {cT: Hi
} {cT: | }}
{HB:
}
{HB:
}
`)
test("Link reference definitions (example 161)", `
{LR:{LL:[foo]}{L::} {URL:/url} {LT:"title"}}
{P:{Ln:{L:[}foo{L:]}}}
`)
test("Link reference definitions (example 162)", `
{LR:{LL:[foo]}{L::}
{URL:/url}
{LT:'the title'} }
{P:{Ln:{L:[}foo{L:]}}}
`)
test("Link reference definitions (example 163)", `
{LR:{LL:[Foo*bar\\]]}{L::}{URL:my_(url)} {LT:'title (with parens)'}}
{P:{Ln:{L:[}Foo*bar{Esc:\\]}{L:]}}}
`)
test("Link reference definitions (example 164)", `
{LR:{LL:[Foo bar]}{L::}
{URL:
}
{LT:'title'}}
{P:{Ln:{L:[}Foo bar{L:]}}}
`)
test("Link reference definitions (example 165)", `
{LR:{LL:[foo]}{L::} {URL:/url} {LT:'
title
line1
line2
'}}
{P:{Ln:{L:[}foo{L:]}}}
`)
test("Link reference definitions (example 166)", `
{P:{Ln:{L:[}foo{L:]}}: /url 'title}
{P:with blank line'}
{P:{Ln:{L:[}foo{L:]}}}
`)
test("Link reference definitions (example 167)", `
{LR:{LL:[foo]}{L::}
{URL:/url}}
{P:{Ln:{L:[}foo{L:]}}}
`)
test("Link reference definitions (example 168)", `
{P:{Ln:{L:[}foo{L:]}}:}
{P:{Ln:{L:[}foo{L:]}}}
`)
test("Link reference definitions (example 169)", `
{LR:{LL:[foo]}{L::} {URL:<>}}
{P:{Ln:{L:[}foo{L:]}}}
`)
test("Link reference definitions (example 170)", `
{P:{Ln:{L:[}foo{L:]}}: {HT:}(baz)}
{P:{Ln:{L:[}foo{L:]}}}
`)
test("Link reference definitions (example 171)", `
{LR:{LL:[foo]}{L::} {URL:/url\`bar\`*baz} {LT:"foo\\"bar\\baz"}}
{P:{Ln:{L:[}foo{L:]}}}
`)
test("Link reference definitions (example 172)", `
{P:{Ln:{L:[}foo{L:]}}}
{LR:{LL:[foo]}{L::} {URL:url}}
`)
test("Link reference definitions (example 173)", `
{P:{Ln:{L:[}foo{L:]}}}
{LR:{LL:[foo]}{L::} {URL:first}}
{LR:{LL:[foo]}{L::} {URL:second}}
`)
test("Link reference definitions (example 174)", `
{LR:{LL:[FOO]}{L::} {URL:/url}}
{P:{Ln:{L:[}Foo{L:]}}}
`)
test("Link reference definitions (example 175)", `
{LR:{LL:[ΑΓΩ]}{L::} {URL:/φου}}
{P:{Ln:{L:[}αγω{L:]}}}
`)
test("Link reference definitions (example 176)", `
{LR:{LL:[foo]}{L::} {URL:/url}}
`)
test("Link reference definitions (example 177)", `
{LR:{LL:[
foo
]}{L::} {URL:/url}}
{P:bar}
`)
test("Link reference definitions (example 178)", `
{P:{Ln:{L:[}foo{L:]}}: /url "title" ok}
`)
test("Link reference definitions (example 179)", `
{LR:{LL:[foo]}{L::} {URL:/url}}
{P:"title" ok}
`)
test("Link reference definitions (example 180)", `
{CB:{cT:[foo]: /url "title"}}
{P:{Ln:{L:[}foo{L:]}}}
`)
test("Link reference definitions (example 181)", `
{FC:{c:\`\`\`}
{cT:[foo]: /url}
{c:\`\`\`}}
{P:{Ln:{L:[}foo{L:]}}}
`)
test("Link reference definitions (example 182)", `
{P:Foo
{Ln:{L:[}bar{L:]}}: /baz}
{P:{Ln:{L:[}bar{L:]}}}
`)
test("Link reference definitions (example 183)", `
{H1:{h:#} {Ln:{L:[}Foo{L:]}}}
{LR:{LL:[foo]}{L::} {URL:/url}}
{Q:{q:>} {P:bar}}
`)
test("Link reference definitions (example 184)", `
{LR:{LL:[foo]}{L::} {URL:/url}}
{SH1:bar
{h:===}}
{P:{Ln:{L:[}foo{L:]}}}
`)
test("Link reference definitions (example 185)", `
{LR:{LL:[foo]}{L::} {URL:/url}}
{P:===
{Ln:{L:[}foo{L:]}}}
`)
test("Link reference definitions (example 186)", `
{LR:{LL:[foo]}{L::} {URL:/foo-url} {LT:"foo"}}
{LR:{LL:[bar]}{L::} {URL:/bar-url}
{LT:"bar"}}
{LR:{LL:[baz]}{L::} {URL:/baz-url}}
{P:{Ln:{L:[}foo{L:]}},
{Ln:{L:[}bar{L:]}},
{Ln:{L:[}baz{L:]}}}
`)
test("Link reference definitions (example 187)", `
{P:{Ln:{L:[}foo{L:]}}}
{Q:{q:>} {LR:{LL:[foo]}{L::} {URL:/url}}}
`)
test("Link reference definitions (example 188)", `
{LR:{LL:[foo]}{L::} {URL:/url}}
`)
test("Paragraphs (example 189)", `
{P:aaa}
{P:bbb}
`)
test("Paragraphs (example 190)", `
{P:aaa
bbb}
{P:ccc
ddd}
`)
test("Paragraphs (example 191)", `
{P:aaa}
{P:bbb}
`)
test("Paragraphs (example 192)", `
{P:aaa
bbb}
`)
test("Paragraphs (example 193)", `
{P:aaa
bbb
ccc}
`)
test("Paragraphs (example 194)", `
{P:aaa
bbb}
`)
test("Paragraphs (example 195)", `
{CB:{cT:aaa}}
{P:bbb}
`)
test("Paragraphs (example 196)", `
{P:aaa{BR:
}bbb }
`)
test("Blank lines (example 197)", `
{P:aaa}
{H1:{h:#} aaa}
`)
test("Block quotes (example 198)", `
{Q:{q:>} {H1:{h:#} Foo}
{q:>} {P:bar
{q:>} baz}}
`)
test("Block quotes (example 199)", `
{Q:{q:>}{H1:{h:#} Foo}
{q:>}{P:bar
{q:>} baz}}
`)
test("Block quotes (example 200)", `
{Q:{q:>} {H1:{h:#} Foo}
{q:>} {P:bar
{q:>} baz}}
`)
test("Block quotes (example 201)", `
{CB:{cT:> # Foo
} {cT:> bar
} {cT:> baz}}
`)
test("Block quotes (example 202)", `
{Q:{q:>} {H1:{h:#} Foo}
{q:>} {P:bar
baz}}
`)
test("Block quotes (example 203)", `
{Q:{q:>} {P:bar
baz
{q:>} foo}}
`)
test("Block quotes (example 204)", `
{Q:{q:>} {P:foo}}
{HR:---}
`)
test("Block quotes (example 205)", `
{Q:{q:>} {BL:{LI:{l:-} {P:foo}}}}
{BL:{LI:{l:-} {P:bar}}}
`)
test("Block quotes (example 206)", `
{Q:{q:>} {CB:{cT:foo}}}
{CB:{cT:bar}}
`)
test("Block quotes (example 207)", `
{Q:{q:>} {FC:{c:\`\`\`}}}
{P:foo}
{FC:{c:\`\`\`}
}`)
test("Block quotes (example 208)", `
{Q:{q:>} {P:foo
- bar}}
`)
test("Block quotes (example 209)", `
{Q:{q:>}{P:}}
`)
test("Block quotes (example 210)", `
{Q:{q:>}{P:}
{q:>}
{q:>} }
`)
test("Block quotes (example 211)", `
{Q:{q:>}{P:
{q:>} foo}
{q:>} }
`)
test("Block quotes (example 212)", `
{Q:{q:>} {P:foo}}
{Q:{q:>} {P:bar}}
`)
test("Block quotes (example 213)", `
{Q:{q:>} {P:foo
{q:>} bar}}
`)
test("Block quotes (example 214)", `
{Q:{q:>} {P:foo}
{q:>}
{q:>} {P:bar}}
`)
test("Block quotes (example 215)", `
{P:foo}
{Q:{q:>} {P:bar}}
`)
test("Block quotes (example 216)", `
{Q:{q:>} {P:aaa}}
{HR:***}
{Q:{q:>} {P:bbb}}
`)
test("Block quotes (example 217)", `
{Q:{q:>} {P:bar
baz}}
`)
test("Block quotes (example 218)", `
{Q:{q:>} {P:bar}}
{P:baz}
`)
test("Block quotes (example 219)", `
{Q:{q:>} {P:bar}
{q:>}}
{P:baz}
`)
test("Block quotes (example 220)", `
{Q:{q:>} {Q:{q:>} {Q:{q:>} {P:foo
bar}}}}
`)
test("Block quotes (example 221)", `
{Q:{q:>}{Q:{q:>}{Q:{q:>} {P:foo
{q:>} bar
{q:>}{q:>}baz}}}}
`)
test("Block quotes (example 222)", `
{Q:{q:>} {CB:{cT:code}}}
{Q:{q:>} {P:not code}}
`)
test("List items (example 223)", `
{P:A paragraph
with two lines.}
{CB:{cT:indented code}}
{Q:{q:>} {P:A block quote.}}
`)
test("List items (example 224)", `
{OL:{LI:{l:1.} {P:A paragraph
with two lines.}
{CB:{cT:indented code}}
{Q:{q:>} {P:A block quote.}}}}
`)
test("List items (example 225)", `
{BL:{LI:{l:-} {P:one}}}
{P:two}
`)
test("List items (example 226)", `
{BL:{LI:{l:-} {P:one}
{P:two}}}
`)
test("List items (example 227)", `
{BL:{LI: {l:-} {P:one}}}
{CB:{cT: two}}
`)
test("List items (example 228)", `
{BL:{LI: {l:-} {P:one}
{P:two}}}
`)
test("List items (example 229)", `
{Q:{q:>} {Q:{q:>} {OL:{LI:{l:1.} {P:one}
{q:>}{q:>}
{q:>}{q:>} {P:two}}}}}
`)
test("List items (example 230)", `
{Q:{q:>}{Q:{q:>}{BL:{LI:{l:-} {P:one}
{q:>}{q:>}}}
{q:>} {q:>} {P:two}}}
`)
test("List items (example 231)", `
{P:-one}
{P:2.two}
`)
test("List items (example 232)", `
{BL:{LI:{l:-} {P:foo}
{P:bar}}}
`)
test("List items (example 233)", `
{OL:{LI:{l:1.} {P:foo}
{FC:{c:\`\`\`}
{cT:bar}
{c:\`\`\`}}
{P:baz}
{Q:{q:>} {P:bam}}}}
`)
test("List items (example 234)", `
{BL:{LI:{l:-} {P:Foo}
{CB:{cT:bar
} {cT:baz}}}}
`)
test("List items (example 235)", `
{OL:{LI:{l:123456789.} {P:ok}}}
`)
test("List items (example 236)", `
{P:1234567890. not ok}
`)
test("List items (example 237)", `
{OL:{LI:{l:0.} {P:ok}}}
`)
test("List items (example 238)", `
{OL:{LI:{l:003.} {P:ok}}}
`)
test("List items (example 239)", `
{P:-1. not ok}
`)
test("List items (example 240)", `
{BL:{LI:{l:-} {P:foo}
{CB:{cT:bar}}}}
`)
test("List items (example 241)", `
{OL:{LI: {l:10.} {P:foo}
{CB:{cT:bar}}}}
`)
test("List items (example 242)", `
{CB:{cT:indented code}}
{P:paragraph}
{CB:{cT:more code}}
`)
test("List items (example 243)", `
{OL:{LI:{l:1.} {CB:{cT:indented code}}
{P:paragraph}
{CB:{cT:more code}}}}
`)
test("List items (example 244)", `
{OL:{LI:{l:1.} {CB:{cT: indented code}}
{P:paragraph}
{CB:{cT:more code}}}}
`)
test("List items (example 245)", `
{P:foo}
{P:bar}
`)
test("List items (example 246)", `
{BL:{LI:{l:-} {P:foo}}}
{P:bar}
`)
test("List items (example 247)", `
{BL:{LI:{l:-} {P:foo}
{P:bar}}}
`)
test("List items (example 248)", `
{BL:{LI:{l:-}{P:
foo}}
{LI:{l:-}{P:}
{FC:{c:\`\`\`}
{cT: bar}
{c:\`\`\`}}}
{LI:{l:-}{P:
baz}}}
`)
test("List items (example 249)", `
{BL:{LI:{l:-} {P:
foo}}}
`)
test("List items (example 250)", `
{BL:{LI:{l:-}{P:}
{P:foo}}}
`)
test("List items (example 251)", `
{BL:{LI:{l:-} {P:foo}}
{LI:{l:-}{P:}}
{LI:{l:-} {P:bar}}}
`)
test("List items (example 252)", `
{BL:{LI:{l:-} {P:foo}}
{LI:{l:-} {P:}}
{LI:{l:-} {P:bar}}}
`)
test("List items (example 253)", `
{OL:{LI:{l:1.} {P:foo}}
{LI:{l:2.}{P:}}
{LI:{l:3.} {P:bar}}}
`)
test("List items (example 254)", `
{BL:{LI:{l:*}{P:}}}
`)
test("List items (example 255)", `
{P:foo
*}
{P:foo
1.}
`)
test("List items (example 256)", `
{OL:{LI: {l:1.} {P:A paragraph
with two lines.}
{CB:{cT:indented code}}
{Q:{q:>} {P:A block quote.}}}}
`)
test("List items (example 257)", `
{OL:{LI: {l:1.} {P:A paragraph
with two lines.}
{CB:{cT:indented code}}
{Q:{q:>} {P:A block quote.}}}}
`)
test("List items (example 258)", `
{OL:{LI: {l:1.} {P:A paragraph
with two lines.}
{CB:{cT:indented code}}
{Q:{q:>} {P:A block quote.}}}}
`)
test("List items (example 259)", `
{CB:{cT:1. A paragraph
} {cT: with two lines.
} {cT: indented code
} {cT: > A block quote.}}
`)
test("List items (example 260)", `
{OL:{LI: {l:1.} {P:A paragraph
with two lines.}
{CB:{cT:indented code}}
{Q:{q:>} {P:A block quote.}}}}
`)
test("List items (example 261)", `
{OL:{LI: {l:1.} {P:A paragraph
with two lines.}}}
`)
test("List items (example 262)", `
{Q:{q:>} {OL:{LI:{l:1.} {Q:{q:>} {P:Blockquote
continued here.}}}}}
`)
test("List items (example 263)", `
{Q:{q:>} {OL:{LI:{l:1.} {Q:{q:>} {P:Blockquote
{q:>} continued here.}}}}}
`)
test("List items (example 264)", `
{BL:{LI:{l:-} {P:foo}
{BL:{LI:{l:-} {P:bar}
{BL:{LI:{l:-} {P:baz}
{BL:{LI:{l:-} {P:boo}}}}}}}}}
`)
test("List items (example 265)", `
{BL:{LI:{l:-} {P:foo}}
{LI: {l:-} {P:bar}}
{LI: {l:-} {P:baz}}
{LI: {l:-} {P:boo}}}
`)
test("List items (example 266)", `
{OL:{LI:{l:10)} {P:foo}
{BL:{LI:{l:-} {P:bar}}}}}
`)
test("List items (example 267)", `
{OL:{LI:{l:10)} {P:foo}}}
{BL:{LI: {l:-} {P:bar}}}
`)
test("List items (example 268)", `
{BL:{LI:{l:-} {BL:{LI:{l:-} {P:foo}}}}}
`)
test("List items (example 269)", `
{OL:{LI:{l:1.} {BL:{LI:{l:-} {OL:{LI:{l:2.} {P:foo}}}}}}}
`)
test("List items (example 270)", `
{BL:{LI:{l:-} {H1:{h:#} Foo}}
{LI:{l:-} {SH2:Bar
{h:---}}
{P:baz}}}
`)
test("Lists (example 271)", `
{BL:{LI:{l:-} {P:foo}}
{LI:{l:-} {P:bar}}}
{BL:{LI:{l:+} {P:baz}}}
`)
test("Lists (example 272)", `
{OL:{LI:{l:1.} {P:foo}}
{LI:{l:2.} {P:bar}}}
{OL:{LI:{l:3)} {P:baz}}}
`)
test("Lists (example 273)", `
{P:Foo}
{BL:{LI:{l:-} {P:bar}}
{LI:{l:-} {P:baz}}}
`)
test("Lists (example 274)", `
{P:The number of windows in my house is
14. The number of doors is 6.}
`)
test("Lists (example 275)", `
{P:The number of windows in my house is}
{OL:{LI:{l:1.} {P:The number of doors is 6.}}}
`)
test("Lists (example 276)", `
{BL:{LI:{l:-} {P:foo}}
{LI:{l:-} {P:bar}}
{LI:{l:-} {P:baz}}}
`)
test("Lists (example 277)", `
{BL:{LI:{l:-} {P:foo}
{BL:{LI:{l:-} {P:bar}
{BL:{LI:{l:-} {P:baz}
{P:bim}}}}}}}
`)
test("Lists (example 278)", `
{BL:{LI:{l:-} {P:foo}}
{LI:{l:-} {P:bar}}}
{CMB:}
{BL:{LI:{l:-} {P:baz}}
{LI:{l:-} {P:bim}}}
`)
test("Lists (example 279)", `
{BL:{LI:{l:-} {P:foo}
{P:notcode}}
{LI:{l:-} {P:foo}}}
{CMB:}
{CB:{cT:code}}
`)
test("Lists (example 280)", `
{BL:{LI:{l:-} {P:a}}
{LI: {l:-} {P:b}}
{LI: {l:-} {P:c}}
{LI: {l:-} {P:d}}
{LI: {l:-} {P:e}}
{LI: {l:-} {P:f}}
{LI:{l:-} {P:g}}}
`)
test("Lists (example 281)", `
{OL:{LI:{l:1.} {P:a}}
{LI: {l:2.} {P:b}}
{LI: {l:3.} {P:c}}}
`)
test("Lists (example 282)", `
{BL:{LI:{l:-} {P:a}}
{LI: {l:-} {P:b}}
{LI: {l:-} {P:c}}
{LI: {l:-} {P:d
- e}}}
`)
test("Lists (example 283)", `
{OL:{LI:{l:1.} {P:a}}
{LI: {l:2.} {P:b}}}
{CB:{cT:3. c}}
`)
test("Lists (example 284)", `
{BL:{LI:{l:-} {P:a}}
{LI:{l:-} {P:b}}
{LI:{l:-} {P:c}}}
`)
test("Lists (example 285)", `
{BL:{LI:{l:*} {P:a}}
{LI:{l:*}{P:}}
{LI:{l:*} {P:c}}}
`)
test("Lists (example 286)", `
{BL:{LI:{l:-} {P:a}}
{LI:{l:-} {P:b}
{P:c}}
{LI:{l:-} {P:d}}}
`)
test("Lists (example 287)", `
{BL:{LI:{l:-} {P:a}}
{LI:{l:-} {P:b}
{LR:{LL:[ref]}{L::} {URL:/url}}}
{LI:{l:-} {P:d}}}
`)
test("Lists (example 288)", `
{BL:{LI:{l:-} {P:a}}
{LI:{l:-} {FC:{c:\`\`\`}
{cT:b
}
{c:\`\`\`}}}
{LI:{l:-} {P:c}}}
`)
test("Lists (example 289)", `
{BL:{LI:{l:-} {P:a}
{BL:{LI:{l:-} {P:b}
{P:c}}}}
{LI:{l:-} {P:d}}}
`)
test("Lists (example 290)", `
{BL:{LI:{l:*} {P:a}
{Q:{q:>} {P:b}
{q:>}}}
{LI:{l:*} {P:c}}}
`)
test("Lists (example 291)", `
{BL:{LI:{l:-} {P:a}
{Q:{q:>} {P:b}}
{FC:{c:\`\`\`}
{cT:c}
{c:\`\`\`}}}
{LI:{l:-} {P:d}}}
`)
test("Lists (example 292)", `
{BL:{LI:{l:-} {P:a}}}
`)
test("Lists (example 293)", `
{BL:{LI:{l:-} {P:a}
{BL:{LI:{l:-} {P:b}}}}}
`)
test("Lists (example 294)", `
{OL:{LI:{l:1.} {FC:{c:\`\`\`}
{cT:foo}
{c:\`\`\`}}
{P:bar}}}
`)
test("Lists (example 295)", `
{BL:{LI:{l:*} {P:foo}
{BL:{LI:{l:*} {P:bar}}}
{P:baz}}}
`)
test("Lists (example 296)", `
{BL:{LI:{l:-} {P:a}
{BL:{LI:{l:-} {P:b}}
{LI:{l:-} {P:c}}}}
{LI:{l:-} {P:d}
{BL:{LI:{l:-} {P:e}}
{LI:{l:-} {P:f}}}}}
`)
test("Backslash escapes (example 297)", `
{P:{Esc:\\!}{Esc:\\"}{Esc:\\#}{Esc:\\$}{Esc:\\%}{Esc:\\&}{Esc:\\'}{Esc:\\(}{Esc:\\)}{Esc:\\*}{Esc:\\+}{Esc:\\,}{Esc:\\-}{Esc:\\.}{Esc:\\/}{Esc:\\:}{Esc:\\;}{Esc:\\<}{Esc:\\=}{Esc:\\>}{Esc:\\?}{Esc:\\@}{Esc:\\[}{Esc:\\\\}{Esc:\\]}{Esc:\\^}{Esc:\\_}{Esc:\\\`}{Esc:\\|}{Esc:\\~}}
`)
test("Backslash escapes (example 299)", `
{P:\\ \\A\\a\\ \\3\\φ\\«}
`)
test("Backslash escapes (example 300)", `
{P:{Esc:\\*}not emphasized*
{Esc:\\<}br/> not a tag
{Esc:\\[}not a link](/foo)
{Esc:\\\`}not code\`
1{Esc:\\.} not a list
{Esc:\\*} not a list
{Esc:\\#} not a heading
{Esc:\\[}foo]: /url "not a reference"
{Esc:\\&}ouml; not a character entity}
`)
test("Backslash escapes (example 301)", `
{P:{Esc:\\\\}{Em:{e:*}emphasis{e:*}}}
`)
test("Backslash escapes (example 302)", `
{P:foo{BR:\\
}bar}
`)
test("Backslash escapes (example 303)", `
{P:{C:{c:\`\`} \\[\\\` {c:\`\`}}}
`)
test("Backslash escapes (example 304)", `
{CB:{cT:\\[\\]}}
`)
test("Backslash escapes (example 305)", `
{FC:{c:~~~}
{cT:\\[\\]}
{c:~~~}}
`)
test("Backslash escapes (example 306)", `
{P:{Al:{L:<}{URL:http://example.com?find=\\*}{L:>}}}
`)
test("Backslash escapes (example 307)", `
{HB:}
`)
test("Backslash escapes (example 308)", `
{P:{Ln:{L:[}foo{L:]}{L:(}{URL:/bar\\*} {LT:"ti\\*tle"}{L:)}}}
`)
test("Backslash escapes (example 309)", `
{P:{Ln:{L:[}foo{L:]}}}
{LR:{LL:[foo]}{L::} {URL:/bar\\*} {LT:"ti\\*tle"}}
`)
test("Backslash escapes (example 310)", `
{FC:{c:\`\`\`} {cI:foo\\+bar}
{cT:foo}
{c:\`\`\`}}
`)
test("Inlines (example 298)", `
{P:{C:{c:\`}hi{c:\`}}lo\`}
`)
test("Entity and numeric character references (example 311)", `
{P:{Ent: } {Ent:&} {Ent:©} {Ent:Æ} {Ent:Ď}
{Ent:¾} {Ent:ℋ} {Ent:ⅆ}
{Ent:∲} {Ent:≧̸}}
`)
test("Entity and numeric character references (example 312)", `
{P:{Ent:#} {Ent:Ӓ} {Ent:Ϡ} {Ent:}}
`)
test("Entity and numeric character references (example 313)", `
{P:{Ent:"} {Ent:ആ} {Ent:ಫ}}
`)
// Our implementation doesn't check for invalid entity names
test("Entity and numeric character references (example 314)", `
{P:  {Ent:&x;}
{Ent:}
abcdef0;
{Ent:&ThisIsNotDefined;} &hi?;}
`)
test("Entity and numeric character references (example 315)", `
{P:©}
`)
// Again, not checking for made-up entity names.
test("Entity and numeric character references (example 316)", `
{P:{Ent:&MadeUpEntity;}}
`)
test("Entity and numeric character references (example 317)", `
{HB:}
`)
test("Entity and numeric character references (example 318)", `
{P:{Ln:{L:[}foo{L:]}{L:(}{URL:/föö} {LT:"föö"}{L:)}}}
`)
test("Entity and numeric character references (example 319)", `
{P:{Ln:{L:[}foo{L:]}}}
{LR:{LL:[foo]}{L::} {URL:/föö} {LT:"föö"}}
`)
test("Entity and numeric character references (example 320)", `
{FC:{c:\`\`\`} {cI:föö}
{cT:foo}
{c:\`\`\`}}
`)
test("Entity and numeric character references (example 321)", `
{P:{C:{c:\`}föö{c:\`}}}
`)
test("Entity and numeric character references (example 322)", `
{CB:{cT:föfö}}
`)
test("Entity and numeric character references (example 323)", `
{P:{Ent:*}foo{Ent:*}
{Em:{e:*}foo{e:*}}}
`)
test("Entity and numeric character references (example 324)", `
{P:{Ent:*} foo}
{BL:{LI:{l:*} {P:foo}}}
`)
test("Entity and numeric character references (example 325)", `
{P:foo{Ent:
}{Ent:
}bar}
`)
test("Entity and numeric character references (example 326)", `
{P:{Ent: }foo}
`)
test("Entity and numeric character references (example 327)", `
{P:{Ln:{L:[}a{L:]}}(url {Ent:"}tit{Ent:"})}
`)
test("Code spans (example 328)", `
{P:{C:{c:\`}foo{c:\`}}}
`)
test("Code spans (example 329)", `
{P:{C:{c:\`\`} foo \` bar {c:\`\`}}}
`)
test("Code spans (example 330)", `
{P:{C:{c:\`} \`\` {c:\`}}}
`)
test("Code spans (example 331)", `
{P:{C:{c:\`} \`\` {c:\`}}}
`)
test("Code spans (example 332)", `
{P:{C:{c:\`} a{c:\`}}}
`)
test("Code spans (example 333)", `
{P:{C:{c:\`} b {c:\`}}}
`)
test("Code spans (example 334)", `
{P:{C:{c:\`} {c:\`}}
{C:{c:\`} {c:\`}}}
`)
test("Code spans (example 335)", `
{P:{C:{c:\`\`}
foo
bar
baz
{c:\`\`}}}
`)
test("Code spans (example 336)", `
{P:{C:{c:\`\`}
foo
{c:\`\`}}}
`)
test("Code spans (example 337)", `
{P:{C:{c:\`}foo bar
baz{c:\`}}}
`)
test("Code spans (example 338)", `
{P:{C:{c:\`}foo\\{c:\`}}bar\`}
`)
test("Code spans (example 339)", `
{P:{C:{c:\`\`}foo\`bar{c:\`\`}}}
`)
test("Code spans (example 340)", `
{P:{C:{c:\`} foo \`\` bar {c:\`}}}
`)
test("Code spans (example 341)", `
{P:*foo{C:{c:\`}*{c:\`}}}
`)
test("Code spans (example 342)", `
{P:[not a {C:{c:\`}link](/foo{c:\`}})}
`)
test("Code spans (example 343)", `
{P:{C:{c:\`}\`}
`)
test("Code spans (example 344)", `
{P:{HT:}\`}
`)
test("Code spans (example 345)", `
{P:{C:{c:\`}\`}
`)
test("Code spans (example 346)", `
{P:{Al:{L:<}{URL:http://foo.bar.\`baz}{L:>}}\`}
`)
test("Code spans (example 347)", `
{P:\`\`\`foo\`\`}
`)
test("Code spans (example 348)", `
{P:\`foo}
`)
test("Code spans (example 349)", `
{P:\`foo{C:{c:\`\`}bar{c:\`\`}}}
`)
test("Emphasis and strong emphasis (example 350)", `
{P:{Em:{e:*}foo bar{e:*}}}
`)
test("Emphasis and strong emphasis (example 351)", `
{P:a * foo bar*}
`)
test("Emphasis and strong emphasis (example 352)", `
{P:a*"foo"*}
`)
test("Emphasis and strong emphasis (example 353)", `
{P:* a *}
`)
test("Emphasis and strong emphasis (example 354)", `
{P:foo{Em:{e:*}bar{e:*}}}
`)
test("Emphasis and strong emphasis (example 355)", `
{P:5{Em:{e:*}6{e:*}}78}
`)
test("Emphasis and strong emphasis (example 356)", `
{P:{Em:{e:_}foo bar{e:_}}}
`)
test("Emphasis and strong emphasis (example 357)", `
{P:_ foo bar_}
`)
test("Emphasis and strong emphasis (example 358)", `
{P:a_"foo"_}
`)
test("Emphasis and strong emphasis (example 359)", `
{P:foo_bar_}
`)
test("Emphasis and strong emphasis (example 360)", `
{P:5_6_78}
`)
test("Emphasis and strong emphasis (example 361)", `
{P:пристаням_стремятся_}
`)
test("Emphasis and strong emphasis (example 362)", `
{P:aa_"bb"_cc}
`)
test("Emphasis and strong emphasis (example 363)", `
{P:foo-{Em:{e:_}(bar){e:_}}}
`)
test("Emphasis and strong emphasis (example 364)", `
{P:_foo*}
`)
test("Emphasis and strong emphasis (example 365)", `
{P:*foo bar *}
`)
test("Emphasis and strong emphasis (example 366)", `
{P:*foo bar
*}
`)
test("Emphasis and strong emphasis (example 367)", `
{P:*(*foo)}
`)
test("Emphasis and strong emphasis (example 368)", `
{P:{Em:{e:*}({Em:{e:*}foo{e:*}}){e:*}}}
`)
test("Emphasis and strong emphasis (example 369)", `
{P:{Em:{e:*}foo{e:*}}bar}
`)
test("Emphasis and strong emphasis (example 370)", `
{P:_foo bar _}
`)
test("Emphasis and strong emphasis (example 371)", `
{P:_(_foo)}
`)
test("Emphasis and strong emphasis (example 372)", `
{P:{Em:{e:_}({Em:{e:_}foo{e:_}}){e:_}}}
`)
test("Emphasis and strong emphasis (example 373)", `
{P:_foo_bar}
`)
test("Emphasis and strong emphasis (example 374)", `
{P:_пристаням_стремятся}
`)
test("Emphasis and strong emphasis (example 375)", `
{P:{Em:{e:_}foo_bar_baz{e:_}}}
`)
test("Emphasis and strong emphasis (example 376)", `
{P:{Em:{e:_}(bar){e:_}}.}
`)
test("Emphasis and strong emphasis (example 377)", `
{P:{St:{e:**}foo bar{e:**}}}
`)
test("Emphasis and strong emphasis (example 378)", `
{P:** foo bar**}
`)
test("Emphasis and strong emphasis (example 379)", `
{P:a**"foo"**}
`)
test("Emphasis and strong emphasis (example 380)", `
{P:foo{St:{e:**}bar{e:**}}}
`)
test("Emphasis and strong emphasis (example 381)", `
{P:{St:{e:__}foo bar{e:__}}}
`)
test("Emphasis and strong emphasis (example 382)", `
{P:__ foo bar__}
`)
test("Emphasis and strong emphasis (example 383)", `
{P:__
foo bar__}
`)
test("Emphasis and strong emphasis (example 384)", `
{P:a__"foo"__}
`)
test("Emphasis and strong emphasis (example 385)", `
{P:foo__bar__}
`)
test("Emphasis and strong emphasis (example 386)", `
{P:5__6__78}
`)
test("Emphasis and strong emphasis (example 387)", `
{P:пристаням__стремятся__}
`)
test("Emphasis and strong emphasis (example 388)", `
{P:{St:{e:__}foo, {St:{e:__}bar{e:__}}, baz{e:__}}}
`)
test("Emphasis and strong emphasis (example 389)", `
{P:foo-{St:{e:__}(bar){e:__}}}
`)
test("Emphasis and strong emphasis (example 390)", `
{P:**foo bar **}
`)
test("Emphasis and strong emphasis (example 391)", `
{P:**(**foo)}
`)
test("Emphasis and strong emphasis (example 392)", `
{P:{Em:{e:*}({St:{e:**}foo{e:**}}){e:*}}}
`)
test("Emphasis and strong emphasis (example 393)", `
{P:{St:{e:**}Gomphocarpus ({Em:{e:*}Gomphocarpus physocarpus{e:*}}, syn.
{Em:{e:*}Asclepias physocarpa{e:*}}){e:**}}}
`)
test("Emphasis and strong emphasis (example 394)", `
{P:{St:{e:**}foo "{Em:{e:*}bar{e:*}}" foo{e:**}}}
`)
test("Emphasis and strong emphasis (example 395)", `
{P:{St:{e:**}foo{e:**}}bar}
`)
test("Emphasis and strong emphasis (example 396)", `
{P:__foo bar __}
`)
test("Emphasis and strong emphasis (example 397)", `
{P:__(__foo)}
`)
test("Emphasis and strong emphasis (example 398)", `
{P:{Em:{e:_}({St:{e:__}foo{e:__}}){e:_}}}
`)
test("Emphasis and strong emphasis (example 399)", `
{P:__foo__bar}
`)
test("Emphasis and strong emphasis (example 400)", `
{P:__пристаням__стремятся}
`)
test("Emphasis and strong emphasis (example 401)", `
{P:{St:{e:__}foo__bar__baz{e:__}}}
`)
test("Emphasis and strong emphasis (example 402)", `
{P:{St:{e:__}(bar){e:__}}.}
`)
test("Emphasis and strong emphasis (example 403)", `
{P:{Em:{e:*}foo {Ln:{L:[}bar{L:]}{L:(}{URL:/url}{L:)}}{e:*}}}
`)
test("Emphasis and strong emphasis (example 404)", `
{P:{Em:{e:*}foo
bar{e:*}}}
`)
test("Emphasis and strong emphasis (example 405)", `
{P:{Em:{e:_}foo {St:{e:__}bar{e:__}} baz{e:_}}}
`)
test("Emphasis and strong emphasis (example 406)", `
{P:{Em:{e:_}foo {Em:{e:_}bar{e:_}} baz{e:_}}}
`)
test("Emphasis and strong emphasis (example 407)", `
{P:{Em:{e:_}{Em:{e:_}foo{e:_}} bar{e:_}}}
`)
test("Emphasis and strong emphasis (example 408)", `
{P:{Em:{e:*}foo {Em:{e:*}bar{e:*}}{e:*}}}
`)
test("Emphasis and strong emphasis (example 409)", `
{P:{Em:{e:*}foo {St:{e:**}bar{e:**}} baz{e:*}}}
`)
test("Emphasis and strong emphasis (example 410)", `
{P:{Em:{e:*}foo{St:{e:**}bar{e:**}}baz{e:*}}}
`)
test("Emphasis and strong emphasis (example 411)", `
{P:{Em:{e:*}foo**bar{e:*}}}
`)
test("Emphasis and strong emphasis (example 412)", `
{P:{Em:{e:*}{St:{e:**}foo{e:**}} bar{e:*}}}
`)
test("Emphasis and strong emphasis (example 413)", `
{P:{Em:{e:*}foo {St:{e:**}bar{e:**}}{e:*}}}
`)
test("Emphasis and strong emphasis (example 414)", `
{P:{Em:{e:*}foo{St:{e:**}bar{e:**}}{e:*}}}
`)
test("Emphasis and strong emphasis (example 415)", `
{P:foo{Em:{e:*}{St:{e:**}bar{e:**}}{e:*}}baz}
`)
test("Emphasis and strong emphasis (example 416)", `
{P:foo{St:{e:**}{St:{e:**}{St:{e:**}bar{e:**}}{e:**}}{e:**}}***baz}
`)
test("Emphasis and strong emphasis (example 417)", `
{P:{Em:{e:*}foo {St:{e:**}bar {Em:{e:*}baz{e:*}} bim{e:**}} bop{e:*}}}
`)
test("Emphasis and strong emphasis (example 418)", `
{P:{Em:{e:*}foo {Ln:{L:[}{Em:{e:*}bar{e:*}}{L:]}{L:(}{URL:/url}{L:)}}{e:*}}}
`)
test("Emphasis and strong emphasis (example 419)", `
{P:** is not an empty emphasis}
`)
test("Emphasis and strong emphasis (example 420)", `
{P:**** is not an empty strong emphasis}
`)
test("Emphasis and strong emphasis (example 421)", `
{P:{St:{e:**}foo {Ln:{L:[}bar{L:]}{L:(}{URL:/url}{L:)}}{e:**}}}
`)
test("Emphasis and strong emphasis (example 422)", `
{P:{St:{e:**}foo
bar{e:**}}}
`)
test("Emphasis and strong emphasis (example 423)", `
{P:{St:{e:__}foo {Em:{e:_}bar{e:_}} baz{e:__}}}
`)
test("Emphasis and strong emphasis (example 424)", `
{P:{St:{e:__}foo {St:{e:__}bar{e:__}} baz{e:__}}}
`)
test("Emphasis and strong emphasis (example 425)", `
{P:{St:{e:__}{St:{e:__}foo{e:__}} bar{e:__}}}
`)
test("Emphasis and strong emphasis (example 426)", `
{P:{St:{e:**}foo {St:{e:**}bar{e:**}}{e:**}}}
`)
test("Emphasis and strong emphasis (example 427)", `
{P:{St:{e:**}foo {Em:{e:*}bar{e:*}} baz{e:**}}}
`)
test("Emphasis and strong emphasis (example 428)", `
{P:{St:{e:**}foo{Em:{e:*}bar{e:*}}baz{e:**}}}
`)
test("Emphasis and strong emphasis (example 429)", `
{P:{St:{e:**}{Em:{e:*}foo{e:*}} bar{e:**}}}
`)
test("Emphasis and strong emphasis (example 430)", `
{P:{St:{e:**}foo {Em:{e:*}bar{e:*}}{e:**}}}
`)
test("Emphasis and strong emphasis (example 431)", `
{P:{St:{e:**}foo {Em:{e:*}bar {St:{e:**}baz{e:**}}
bim{e:*}} bop{e:**}}}
`)
test("Emphasis and strong emphasis (example 432)", `
{P:{St:{e:**}foo {Ln:{L:[}{Em:{e:*}bar{e:*}}{L:]}{L:(}{URL:/url}{L:)}}{e:**}}}
`)
test("Emphasis and strong emphasis (example 433)", `
{P:__ is not an empty emphasis}
`)
test("Emphasis and strong emphasis (example 434)", `
{P:____ is not an empty strong emphasis}
`)
test("Emphasis and strong emphasis (example 435)", `
{P:foo ***}
`)
test("Emphasis and strong emphasis (example 436)", `
{P:foo {Em:{e:*}{Esc:\\*}{e:*}}}
`)
test("Emphasis and strong emphasis (example 437)", `
{P:foo {Em:{e:*}_{e:*}}}
`)
test("Emphasis and strong emphasis (example 438)", `
{P:foo *****}
`)
test("Emphasis and strong emphasis (example 439)", `
{P:foo {St:{e:**}{Esc:\\*}{e:**}}}
`)
test("Emphasis and strong emphasis (example 440)", `
{P:foo {St:{e:**}_{e:**}}}
`)
test("Emphasis and strong emphasis (example 441)", `
{P:*{Em:{e:*}foo{e:*}}}
`)
test("Emphasis and strong emphasis (example 442)", `
{P:{Em:{e:*}foo{e:*}}*}
`)
test("Emphasis and strong emphasis (example 443)", `
{P:*{St:{e:**}foo{e:**}}}
`)
test("Emphasis and strong emphasis (example 444)", `
{P:***{Em:{e:*}foo{e:*}}}
`)
test("Emphasis and strong emphasis (example 445)", `
{P:{St:{e:**}foo{e:**}}*}
`)
test("Emphasis and strong emphasis (example 446)", `
{P:{Em:{e:*}foo{e:*}}***}
`)
test("Emphasis and strong emphasis (example 447)", `
{P:foo ___}
`)
test("Emphasis and strong emphasis (example 448)", `
{P:foo {Em:{e:_}{Esc:\\_}{e:_}}}
`)
test("Emphasis and strong emphasis (example 449)", `
{P:foo {Em:{e:_}*{e:_}}}
`)
test("Emphasis and strong emphasis (example 450)", `
{P:foo _____}
`)
test("Emphasis and strong emphasis (example 451)", `
{P:foo {St:{e:__}{Esc:\\_}{e:__}}}
`)
test("Emphasis and strong emphasis (example 452)", `
{P:foo {St:{e:__}*{e:__}}}
`)
test("Emphasis and strong emphasis (example 453)", `
{P:_{Em:{e:_}foo{e:_}}}
`)
test("Emphasis and strong emphasis (example 454)", `
{P:{Em:{e:_}foo{e:_}}_}
`)
test("Emphasis and strong emphasis (example 455)", `
{P:_{St:{e:__}foo{e:__}}}
`)
test("Emphasis and strong emphasis (example 456)", `
{P:___{Em:{e:_}foo{e:_}}}
`)
test("Emphasis and strong emphasis (example 457)", `
{P:{St:{e:__}foo{e:__}}_}
`)
test("Emphasis and strong emphasis (example 458)", `
{P:{Em:{e:_}foo{e:_}}___}
`)
test("Emphasis and strong emphasis (example 459)", `
{P:{St:{e:**}foo{e:**}}}
`)
test("Emphasis and strong emphasis (example 460)", `
{P:{Em:{e:*}{Em:{e:_}foo{e:_}}{e:*}}}
`)
test("Emphasis and strong emphasis (example 461)", `
{P:{St:{e:__}foo{e:__}}}
`)
test("Emphasis and strong emphasis (example 462)", `
{P:{Em:{e:_}{Em:{e:*}foo{e:*}}{e:_}}}
`)
test("Emphasis and strong emphasis (example 463)", `
{P:{St:{e:**}{St:{e:**}foo{e:**}}{e:**}}}
`)
test("Emphasis and strong emphasis (example 464)", `
{P:{St:{e:__}{St:{e:__}foo{e:__}}{e:__}}}
`)
test("Emphasis and strong emphasis (example 465)", `
{P:{St:{e:**}{St:{e:**}{St:{e:**}foo{e:**}}{e:**}}{e:**}}}
`)
test("Emphasis and strong emphasis (example 466)", `
{P:{Em:{e:*}{St:{e:**}foo{e:**}}{e:*}}}
`)
test("Emphasis and strong emphasis (example 467)", `
{P:{Em:{e:_}{St:{e:__}{St:{e:__}foo{e:__}}{e:__}}{e:_}}}
`)
test("Emphasis and strong emphasis (example 468)", `
{P:{Em:{e:*}foo _bar{e:*}} baz_}
`)
test("Emphasis and strong emphasis (example 469)", `
{P:{Em:{e:*}foo {St:{e:__}bar *baz bim{e:__}} bam{e:*}}}
`)
test("Emphasis and strong emphasis (example 470)", `
{P:**foo {St:{e:**}bar baz{e:**}}}
`)
test("Emphasis and strong emphasis (example 471)", `
{P:*foo {Em:{e:*}bar baz{e:*}}}
`)
test("Emphasis and strong emphasis (example 472)", `
{P:*{Ln:{L:[}bar*{L:]}{L:(}{URL:/url}{L:)}}}
`)
test("Emphasis and strong emphasis (example 473)", `
{P:_foo {Ln:{L:[}bar_{L:]}{L:(}{URL:/url}{L:)}}}
`)
test("Emphasis and strong emphasis (example 474)", `
{P:*{HT:
}}
`)
test("Emphasis and strong emphasis (example 475)", `
{P:**{HT:}}
`)
test("Emphasis and strong emphasis (example 476)", `
{P:__{HT:}}
`)
test("Emphasis and strong emphasis (example 477)", `
{P:{Em:{e:*}a {C:{c:\`}*{c:\`}}{e:*}}}
`)
test("Emphasis and strong emphasis (example 478)", `
{P:{Em:{e:_}a {C:{c:\`}_{c:\`}}{e:_}}}
`)
test("Emphasis and strong emphasis (example 479)", `
{P:**a{Al:{L:<}{URL:http://foo.bar/?q=**}{L:>}}}
`)
test("Emphasis and strong emphasis (example 480)", `
{P:__a{Al:{L:<}{URL:http://foo.bar/?q=__}{L:>}}}
`)
test("Links (example 481)", `
{P:{Ln:{L:[}link{L:]}{L:(}{URL:/uri} {LT:"title"}{L:)}}}
`)
test("Links (example 482)", `
{P:{Ln:{L:[}link{L:]}{L:(}{URL:/uri}{L:)}}}
`)
test("Links (example 483)", `
{P:{Ln:{L:[}link{L:]}{L:(}{L:)}}}
`)
test("Links (example 484)", `
{P:{Ln:{L:[}link{L:]}{L:(}{URL:<>}{L:)}}}
`)
test("Links (example 485)", `
{P:{Ln:{L:[}link{L:]}}(/my uri)}
`)
test("Links (example 486)", `
{P:{Ln:{L:[}link{L:]}{L:(}{URL:}{L:)}}}
`)
test("Links (example 487)", `
{P:{Ln:{L:[}link{L:]}}(foo
bar)}
`)
// Many of these don't align with the output in the spec because our
// implementation doesn't check for an existing link reference when
// accepting non-inline links.
test("Links (example 488)", `
{P:{Ln:{L:[}link{L:]}}({HT:
})}
`)
test("Links (example 489)", `
{P:{Ln:{L:[}a{L:]}{L:(}{URL:}{L:)}}}
`)
test("Links (example 490)", `
{P:{Ln:{L:[}link{L:]}{L:(}{URL:}{L:)}}}
`)
test("Links (example 491)", `
{P:{Ln:{L:[}a{L:]}}(
{Ln:{L:[}a{L:]}}({HT:}c)}
`)
test("Links (example 492)", `
{P:{Ln:{L:[}link{L:]}{L:(}{URL:\\(foo\\)}{L:)}}}
`)
test("Links (example 493)", `
{P:{Ln:{L:[}link{L:]}{L:(}{URL:foo(and(bar))}{L:)}}}
`)
test("Links (example 494)", `
{P:{Ln:{L:[}link{L:]}{L:(}{URL:foo\\(and\\(bar\\)}{L:)}}}
`)
test("Links (example 495)", `
{P:{Ln:{L:[}link{L:]}{L:(}{URL:}{L:)}}}
`)
test("Links (example 496)", `
{P:{Ln:{L:[}link{L:]}{L:(}{URL:foo\\)\\:}{L:)}}}
`)
test("Links (example 497)", `
{P:{Ln:{L:[}link{L:]}{L:(}{URL:#fragment}{L:)}}}
{P:{Ln:{L:[}link{L:]}{L:(}{URL:http://example.com#fragment}{L:)}}}
{P:{Ln:{L:[}link{L:]}{L:(}{URL:http://example.com?foo=3#frag}{L:)}}}
`)
test("Links (example 498)", `
{P:{Ln:{L:[}link{L:]}{L:(}{URL:foo\\bar}{L:)}}}
`)
test("Links (example 499)", `
{P:{Ln:{L:[}link{L:]}{L:(}{URL:foo%20bä}{L:)}}}
`)
test("Links (example 500)", `
{P:{Ln:{L:[}link{L:]}{L:(}{URL:"title"}{L:)}}}
`)
test("Links (example 501)", `
{P:{Ln:{L:[}link{L:]}{L:(}{URL:/url} {LT:"title"}{L:)}}
{Ln:{L:[}link{L:]}{L:(}{URL:/url} {LT:'title'}{L:)}}
{Ln:{L:[}link{L:]}{L:(}{URL:/url} {LT:(title)}{L:)}}}
`)
test("Links (example 502)", `
{P:{Ln:{L:[}link{L:]}{L:(}{URL:/url} {LT:"title \\"""}{L:)}}}
`)
test("Links (example 503)", `
{P:{Ln:{L:[}link{L:]}{L:(}{URL:/url "title"}{L:)}}}
`)
test("Links (example 504)", `
{P:{Ln:{L:[}link{L:]}}(/url "title "and" title")}
`)
test("Links (example 505)", `
{P:{Ln:{L:[}link{L:]}{L:(}{URL:/url} {LT:'title "and" title'}{L:)}}}
`)
test("Links (example 506)", `
{P:{Ln:{L:[}link{L:]}{L:(} {URL:/uri}
{LT:"title"} {L:)}}}
`)
test("Links (example 507)", `
{P:{Ln:{L:[}link{L:]}} (/uri)}
`)
test("Links (example 508)", `
{P:[link [foo {Ln:{L:[}bar{L:]}}]](/uri)}
`)
test("Links (example 509)", `
{P:{Ln:{L:[}link{L:]}} bar](/uri)}
`)
test("Links (example 510)", `
{P:[link {Ln:{L:[}bar{L:]}{L:(}{URL:/uri}{L:)}}}
`)
test("Links (example 511)", `
{P:{Ln:{L:[}link {Esc:\\[}bar{L:]}{L:(}{URL:/uri}{L:)}}}
`)
test("Links (example 512)", `
{P:{Ln:{L:[}link {Em:{e:*}foo {St:{e:**}bar{e:**}} {C:{c:\`}#{c:\`}}{e:*}}{L:]}{L:(}{URL:/uri}{L:)}}}
`)
test("Links (example 513)", `
{P:{Ln:{L:[}{Im:{L:![}moon{L:]}{L:(}{URL:moon.jpg}{L:)}}{L:]}{L:(}{URL:/uri}{L:)}}}
`)
test("Links (example 514)", `
{P:[foo {Ln:{L:[}bar{L:]}{L:(}{URL:/uri}{L:)}}](/uri)}
`)
test("Links (example 515)", `
{P:[foo {Em:{e:*}[bar {Ln:{L:[}baz{L:]}{L:(}{URL:/uri}{L:)}}](/uri){e:*}}](/uri)}
`)
test("Links (example 516)", `
{P:{Im:{L:![}[{Ln:{L:[}foo{L:]}{L:(}{URL:uri1}{L:)}}](uri2){L:]}{L:(}{URL:uri3}{L:)}}}
`)
test("Links (example 517)", `
{P:*{Ln:{L:[}foo*{L:]}{L:(}{URL:/uri}{L:)}}}
`)
test("Links (example 518)", `
{P:{Ln:{L:[}foo *bar{L:]}{L:(}{URL:baz*}{L:)}}}
`)
// Not the spirit of the test, because the shortcut link is still
// accepted.
test("Links (example 519)", `
{P:*foo {Ln:{L:[}bar* baz{L:]}}}
`)
test("Links (example 520)", `
{P:[foo {HT:}}
`)
test("Links (example 521)", `
{P:[foo{C:{c:\`}](/uri){c:\`}}}
`)
test("Links (example 522)", `
{P:[foo{Al:{L:<}{URL:http://example.com/?search=](uri)}{L:>}}}
`)
test("Links (example 523)", `
{P:{Ln:{L:[}foo{L:]}{LL:[bar]}}}
{LR:{LL:[bar]}{L::} {URL:/url} {LT:"title"}}
`)
// This has a different shape than the original test case, because
// we accept the innermost link.
test("Links (example 524)", `
{P:[link [foo {Ln:{L:[}bar{L:]}}]]{Ln:{L:[}ref{L:]}}}
{LR:{LL:[ref]}{L::} {URL:/uri}}
`)
test("Links (example 525)", `
{P:{Ln:{L:[}link {Esc:\\[}bar{L:]}{LL:[ref]}}}
{LR:{LL:[ref]}{L::} {URL:/uri}}
`)
test("Links (example 526)", `
{P:{Ln:{L:[}link {Em:{e:*}foo {St:{e:**}bar{e:**}} {C:{c:\`}#{c:\`}}{e:*}}{L:]}{LL:[ref]}}}
{LR:{LL:[ref]}{L::} {URL:/uri}}
`)
test("Links (example 527)", `
{P:{Ln:{L:[}{Im:{L:![}moon{L:]}{L:(}{URL:moon.jpg}{L:)}}{L:]}{LL:[ref]}}}
{LR:{LL:[ref]}{L::} {URL:/uri}}
`)
test("Links (example 528)", `
{P:[foo {Ln:{L:[}bar{L:]}{L:(}{URL:/uri}{L:)}}]{Ln:{L:[}ref{L:]}}}
{LR:{LL:[ref]}{L::} {URL:/uri}}
`)
test("Links (example 529)", `
{P:[foo {Em:{e:*}bar {Ln:{L:[}baz{L:]}{LL:[ref]}}{e:*}}]{Ln:{L:[}ref{L:]}}}
{LR:{LL:[ref]}{L::} {URL:/uri}}
`)
test("Links (example 530)", `
{P:*{Ln:{L:[}foo*{L:]}{LL:[ref]}}}
{LR:{LL:[ref]}{L::} {URL:/uri}}
`)
test("Links (example 531)", `
{P:{Ln:{L:[}foo *bar{L:]}{LL:[ref]}}}
{LR:{LL:[ref]}{L::} {URL:/uri}}
`)
test("Links (example 532)", `
{P:[foo {HT:}}
{LR:{LL:[ref]}{L::} {URL:/uri}}
`)
test("Links (example 533)", `
{P:[foo{C:{c:\`}][ref]{c:\`}}}
{LR:{LL:[ref]}{L::} {URL:/uri}}
`)
test("Links (example 534)", `
{P:[foo{Al:{L:<}{URL:http://example.com/?search=][ref]}{L:>}}}
{LR:{LL:[ref]}{L::} {URL:/uri}}
`)
test("Links (example 535)", `
{P:{Ln:{L:[}foo{L:]}{LL:[BaR]}}}
{LR:{LL:[bar]}{L::} {URL:/url} {LT:"title"}}
`)
test("Links (example 536)", `
{P:{Ln:{L:[}Толпой{L:]}{LL:[Толпой]}} is a Russian word.}
{LR:{LL:[ТОЛПОЙ]}{L::} {URL:/url}}
`)
test("Links (example 537)", `
{LR:{LL:[Foo
bar]}{L::} {URL:/url}}
{P:{Ln:{L:[}Baz{L:]}{LL:[Foo bar]}}}
`)
test("Links (example 538)", `
{P:{Ln:{L:[}foo{L:]}} {Ln:{L:[}bar{L:]}}}
{LR:{LL:[bar]}{L::} {URL:/url} {LT:"title"}}
`)
test("Links (example 539)", `
{P:{Ln:{L:[}foo{L:]}}
{Ln:{L:[}bar{L:]}}}
{LR:{LL:[bar]}{L::} {URL:/url} {LT:"title"}}
`)
test("Links (example 540)", `
{LR:{LL:[foo]}{L::} {URL:/url1}}
{LR:{LL:[foo]}{L::} {URL:/url2}}
{P:{Ln:{L:[}bar{L:]}{LL:[foo]}}}
`)
test("Links (example 541)", `
{P:{Ln:{L:[}bar{L:]}{LL:[foo\\!]}}}
{LR:{LL:[foo!]}{L::} {URL:/url}}
`)
test("Links (example 542)", `
{P:{Ln:{L:[}foo{L:]}}[ref[]}
{P:[ref[]: /uri}
`)
test("Links (example 543)", `
{P:{Ln:{L:[}foo{L:]}}[ref{Ln:{L:[}bar{L:]}}]}
{P:[ref{Ln:{L:[}bar{L:]}}]: /uri}
`)
test("Links (example 544)", `
{P:[[{Ln:{L:[}foo{L:]}}]]}
{P:[[{Ln:{L:[}foo{L:]}}]]: /url}
`)
test("Links (example 545)", `
{P:{Ln:{L:[}foo{L:]}{LL:[ref\\[]}}}
{LR:{LL:[ref\\[]}{L::} {URL:/uri}}
`)
test("Links (example 546)", `
{LR:{LL:[bar\\\\]}{L::} {URL:/uri}}
{P:{Ln:{L:[}bar{Esc:\\\\}{L:]}}}
`)
test("Links (example 547)", `
{P:[]}
{P:[]: /uri}
`)
test("Links (example 548)", `
{P:[
]}
{P:[
]: /uri}
`)
test("Links (example 549)", `
{P:{Ln:{L:[}foo{L:]}{LL:[]}}}
{LR:{LL:[foo]}{L::} {URL:/url} {LT:"title"}}
`)
test("Links (example 550)", `
{P:{Ln:{L:[}{Em:{e:*}foo{e:*}} bar{L:]}{LL:[]}}}
{LR:{LL:[*foo* bar]}{L::} {URL:/url} {LT:"title"}}
`)
test("Links (example 551)", `
{P:{Ln:{L:[}Foo{L:]}{LL:[]}}}
{LR:{LL:[foo]}{L::} {URL:/url} {LT:"title"}}
`)
test("Links (example 552)", `
{P:{Ln:{L:[}foo{L:]}}
[]}
{LR:{LL:[foo]}{L::} {URL:/url} {LT:"title"}}
`)
test("Links (example 553)", `
{P:{Ln:{L:[}foo{L:]}}}
{LR:{LL:[foo]}{L::} {URL:/url} {LT:"title"}}
`)
test("Links (example 554)", `
{P:{Ln:{L:[}{Em:{e:*}foo{e:*}} bar{L:]}}}
{LR:{LL:[*foo* bar]}{L::} {URL:/url} {LT:"title"}}
`)
test("Links (example 555)", `
{P:[{Ln:{L:[}{Em:{e:*}foo{e:*}} bar{L:]}}]}
{LR:{LL:[*foo* bar]}{L::} {URL:/url} {LT:"title"}}
`)
test("Links (example 556)", `
{P:[[bar {Ln:{L:[}foo{L:]}}}
{LR:{LL:[foo]}{L::} {URL:/url}}
`)
test("Links (example 557)", `
{P:{Ln:{L:[}Foo{L:]}}}
{LR:{LL:[foo]}{L::} {URL:/url} {LT:"title"}}
`)
test("Links (example 558)", `
{P:{Ln:{L:[}foo{L:]}} bar}
{LR:{LL:[foo]}{L::} {URL:/url}}
`)
test("Links (example 559)", `
{P:{Esc:\\[}foo]}
{LR:{LL:[foo]}{L::} {URL:/url} {LT:"title"}}
`)
test("Links (example 560)", `
{LR:{LL:[foo*]}{L::} {URL:/url}}
{P:*{Ln:{L:[}foo*{L:]}}}
`)
test("Links (example 561)", `
{P:{Ln:{L:[}foo{L:]}{LL:[bar]}}}
{LR:{LL:[foo]}{L::} {URL:/url1}}
{LR:{LL:[bar]}{L::} {URL:/url2}}
`)
test("Links (example 562)", `
{P:{Ln:{L:[}foo{L:]}{LL:[]}}}
{LR:{LL:[foo]}{L::} {URL:/url1}}
`)
test("Links (example 563)", `
{P:{Ln:{L:[}foo{L:]}{L:(}{L:)}}}
{LR:{LL:[foo]}{L::} {URL:/url1}}
`)
test("Links (example 564)", `
{P:{Ln:{L:[}foo{L:]}}(not a link)}
{LR:{LL:[foo]}{L::} {URL:/url1}}
`)
// Not really testing what it is supposed to, because the first two
// bracket pairs are blindly accepted as link.
test("Links (example 565)", `
{P:{Ln:{L:[}foo{L:]}{LL:[bar]}}{Ln:{L:[}baz{L:]}}}
{LR:{LL:[baz]}{L::} {URL:/url}}
`)
test("Links (example 566)", `
{P:{Ln:{L:[}foo{L:]}{LL:[bar]}}{Ln:{L:[}baz{L:]}}}
{LR:{LL:[baz]}{L::} {URL:/url1}}
{LR:{LL:[bar]}{L::} {URL:/url2}}
`)
test("Links (example 567)", `
{P:{Ln:{L:[}foo{L:]}{LL:[bar]}}{Ln:{L:[}baz{L:]}}}
{LR:{LL:[baz]}{L::} {URL:/url1}}
{LR:{LL:[foo]}{L::} {URL:/url2}}
`)
test("Images (example 568)", `
{P:{Im:{L:![}foo{L:]}{L:(}{URL:/url} {LT:"title"}{L:)}}}
`)
test("Images (example 569)", `
{P:{Im:{L:![}foo {Em:{e:*}bar{e:*}}{L:]}}}
{LR:{LL:[foo *bar*]}{L::} {URL:train.jpg} {LT:"train & tracks"}}
`)
test("Images (example 570)", `
{P:{Im:{L:![}foo {Im:{L:![}bar{L:]}{L:(}{URL:/url}{L:)}}{L:]}{L:(}{URL:/url2}{L:)}}}
`)
test("Images (example 571)", `
{P:{Im:{L:![}foo {Ln:{L:[}bar{L:]}{L:(}{URL:/url}{L:)}}{L:]}{L:(}{URL:/url2}{L:)}}}
`)
test("Images (example 572)", `
{P:{Im:{L:![}foo {Em:{e:*}bar{e:*}}{L:]}{LL:[]}}}
{LR:{LL:[foo *bar*]}{L::} {URL:train.jpg} {LT:"train & tracks"}}
`)
test("Images (example 573)", `
{P:{Im:{L:![}foo {Em:{e:*}bar{e:*}}{L:]}{LL:[foobar]}}}
{LR:{LL:[FOOBAR]}{L::} {URL:train.jpg} {LT:"train & tracks"}}
`)
test("Images (example 574)", `
{P:{Im:{L:![}foo{L:]}{L:(}{URL:train.jpg}{L:)}}}
`)
test("Images (example 575)", `
{P:My {Im:{L:![}foo bar{L:]}{L:(}{URL:/path/to/train.jpg} {LT:"title"} {L:)}}}
`)
test("Images (example 576)", `
{P:{Im:{L:![}foo{L:]}{L:(}{URL:}{L:)}}}
`)
test("Images (example 577)", `
{P:{Im:{L:![}{L:]}{L:(}{URL:/url}{L:)}}}
`)
test("Images (example 578)", `
{P:{Im:{L:![}foo{L:]}{LL:[bar]}}}
{LR:{LL:[bar]}{L::} {URL:/url}}
`)
test("Images (example 579)", `
{P:{Im:{L:![}foo{L:]}{LL:[bar]}}}
{LR:{LL:[BAR]}{L::} {URL:/url}}
`)
test("Images (example 580)", `
{P:{Im:{L:![}foo{L:]}{LL:[]}}}
{LR:{LL:[foo]}{L::} {URL:/url} {LT:"title"}}
`)
test("Images (example 581)", `
{P:{Im:{L:![}{Em:{e:*}foo{e:*}} bar{L:]}{LL:[]}}}
{LR:{LL:[*foo* bar]}{L::} {URL:/url} {LT:"title"}}
`)
test("Images (example 582)", `
{P:{Im:{L:![}Foo{L:]}{LL:[]}}}
{LR:{LL:[foo]}{L::} {URL:/url} {LT:"title"}}
`)
test("Images (example 583)", `
{P:{Im:{L:![}foo{L:]}}
[]}
{LR:{LL:[foo]}{L::} {URL:/url} {LT:"title"}}
`)
test("Images (example 584)", `
{P:{Im:{L:![}foo{L:]}}}
{LR:{LL:[foo]}{L::} {URL:/url} {LT:"title"}}
`)
test("Images (example 585)", `
{P:{Im:{L:![}{Em:{e:*}foo{e:*}} bar{L:]}}}
{LR:{LL:[*foo* bar]}{L::} {URL:/url} {LT:"title"}}
`)
test("Images (example 586)", `
{P:{Im:{L:![}{Ln:{L:[}foo{L:]}}{L:]}}}
{P:[{Ln:{L:[}foo{L:]}}]: /url "title"}
`)
test("Images (example 587)", `
{P:{Im:{L:![}Foo{L:]}}}
{LR:{LL:[foo]}{L::} {URL:/url} {LT:"title"}}
`)
test("Images (example 588)", `
{P:!{Esc:\\[}foo]}
{LR:{LL:[foo]}{L::} {URL:/url} {LT:"title"}}
`)
test("Images (example 589)", `
{P:{Esc:\\!}{Ln:{L:[}foo{L:]}}}
{LR:{LL:[foo]}{L::} {URL:/url} {LT:"title"}}
`)
test("Autolinks (example 590)", `
{P:{Al:{L:<}{URL:http://foo.bar.baz}{L:>}}}
`)
test("Autolinks (example 591)", `
{P:{Al:{L:<}{URL:http://foo.bar.baz/test?q=hello&id=22&boolean}{L:>}}}
`)
test("Autolinks (example 592)", `
{P:{Al:{L:<}{URL:irc://foo.bar:2233/baz}{L:>}}}
`)
test("Autolinks (example 593)", `
{P:{Al:{L:<}{URL:MAILTO:FOO@BAR.BAZ}{L:>}}}
`)
test("Autolinks (example 594)", `
{P:{Al:{L:<}{URL:a+b+c:d}{L:>}}}
`)
test("Autolinks (example 595)", `
{P:{Al:{L:<}{URL:made-up-scheme://foo,bar}{L:>}}}
`)
test("Autolinks (example 596)", `
{P:{Al:{L:<}{URL:http://../}{L:>}}}
`)
test("Autolinks (example 597)", `
{P:{Al:{L:<}{URL:localhost:5001/foo}{L:>}}}
`)
test("Autolinks (example 598)", `
{P:}
`)
test("Autolinks (example 599)", `
{P:{Al:{L:<}{URL:http://example.com/\\[\\}{L:>}}}
`)
test("Autolinks (example 600)", `
{P:{Al:{L:<}{URL:foo@bar.example.com}{L:>}}}
`)
test("Autolinks (example 601)", `
{P:{Al:{L:<}{URL:foo+special@Bar.baz-bar0.com}{L:>}}}
`)
test("Autolinks (example 602)", `
{P:}
`)
test("Autolinks (example 603)", `
{P:<>}
`)
test("Autolinks (example 604)", `
{P:< http://foo.bar >}
`)
test("Autolinks (example 605)", `
{P:}
`)
test("Autolinks (example 606)", `
{P:}
`)
test("Autolinks (example 607)", `
{P:http://example.com}
`)
test("Autolinks (example 608)", `
{P:foo@bar.example.com}
`)
test("Raw HTML (example 609)", `
{P:{HT:}{HT:}{HT:}}
`)
test("Raw HTML (example 610)", `
{P:{HT:}{HT:}}
`)
test("Raw HTML (example 611)", `
{P:{HT:}{HT:}}
`)
test("Raw HTML (example 612)", `
{P:{HT:}}
`)
test("Raw HTML (example 613)", `
{P:Foo {HT:}}
`)
test("Raw HTML (example 614)", `
{P:<33> <__>}
`)
test("Raw HTML (example 615)", `
{P:}
`)
test("Raw HTML (example 616)", `
{P:}{HT:<
foo>}{HT:}
}
`)
test("Raw HTML (example 618)", `
{P:}
`)
test("Raw HTML (example 619)", `
{P:{HT:}{HT:}}
`)
test("Raw HTML (example 620)", `
{P:}
`)
test("Raw HTML (example 621)", `
{P:foo {CM:}}
`)
test("Raw HTML (example 622)", `
{P:foo }
`)
test("Raw HTML (example 623)", `
{P:foo foo -->}
{P:foo }
`)
test("Raw HTML (example 624)", `
{P:foo {Pi:}}
`)
test("Raw HTML (example 625)", `
{P:foo {HT:}}
`)
test("Raw HTML (example 626)", `
{P:foo {HT:&<]]>}}
`)
test("Raw HTML (example 627)", `
{P:foo {HT:}}
`)
test("Raw HTML (example 628)", `
{P:foo {HT:}}
`)
test("Raw HTML (example 629)", `
{P:}
`)
test("Hard line breaks (example 630)", `
{P:foo{BR:
}baz}
`)
test("Hard line breaks (example 631)", `
{P:foo{BR:\\
}baz}
`)
test("Hard line breaks (example 632)", `
{P:foo{BR:
}baz}
`)
test("Hard line breaks (example 633)", `
{P:foo{BR:
} bar}
`)
test("Hard line breaks (example 634)", `
{P:foo{BR:\\
} bar}
`)
test("Hard line breaks (example 635)", `
{P:{Em:{e:*}foo{BR:
}bar{e:*}}}
`)
test("Hard line breaks (example 636)", `
{P:{Em:{e:*}foo{BR:\\
}bar{e:*}}}
`)
test("Hard line breaks (example 637)", `
{P:{C:{c:\`}code
span{c:\`}}}
`)
test("Hard line breaks (example 638)", `
{P:{C:{c:\`}code\\
span{c:\`}}}
`)
test("Hard line breaks (example 639)", `
{P:{HT:}}
`)
test("Hard line breaks (example 640)", `
{P:{HT:}}
`)
test("Hard line breaks (example 641)", `
{P:foo\\}
`)
test("Hard line breaks (example 642)", `
{P:foo }
`)
test("Hard line breaks (example 643)", `
{H3:{h:###} foo\\}
`)
test("Hard line breaks (example 644)", `
{H3:{h:###} foo }
`)
test("Soft line breaks (example 645)", `
{P:foo
baz}
`)
test("Soft line breaks (example 646)", `
{P:foo
baz}
`)
test("Textual content (example 647)", `
{P:hello $.;'there}
`)
test("Textual content (example 648)", `
{P:Foo χρῆν}
`)
test("Textual content (example 649)", `
{P:Multiple spaces}
`)
})
describe("Custom Markdown tests", () => {
// (Not ideal that the 3rd mark is inside the previous item, but
// this'd require quite a big overhaul to fix.)
test("Quote markers don't end up inside inner list items", `
{Q:{q:>} {BL:{LI:{l:-} {P:Hello}}
{q:>} {LI:{l:-} {P:Two}
{q:>}}
{q:>} {LI:{l:-} {P:Three}}}}
`)
test("Nested bullet lists don't break ordered list parsing", `
{OL:{LI:{l:1.} {P:A}
{BL:{LI:{l:*} {P:A1}}
{LI:{l:*} {P:A2}}}}
{LI:{l:2.} {P:B}}}
`)
it("Doesn't get confused by tabs indenting a list item", () => {
let doc = ` - a\n\t\tb`
if (parser.parse(doc).length > doc.length) throw new RangeError("Wrong tree length")
})
it("Parses horizontal rules when setext headers are disabled", () => {
let tree = parser.configure({remove: ["SetextHeading"]}).parse(`abc\n---`)
if (tree.toString() != "Document(Paragraph,HorizontalRule)")
throw new Error("Unexpected tree: " + tree)
})
})