diff --git a/.prettierignore b/.prettierignore new file mode 100644 index 0000000..0f8af58 --- /dev/null +++ b/.prettierignore @@ -0,0 +1 @@ +/test/javascripts/recook-corpus.js diff --git a/DESIGN.md b/DESIGN.md new file mode 100644 index 0000000..0fe32d7 --- /dev/null +++ b/DESIGN.md @@ -0,0 +1,212 @@ +# BBCode plugin: goals, decisions and open work + +Working notes for continuing the native parser work. `README.md` describes how the parser works; this file records why it works that way, what was measured, what was tried and rejected, and what is still open. State as of commit `79abe87`. + +## Goals + +- **XenForo fidelity.** Existing RpNation posts were written against XenForo and must look the same after a rebake. The reference is XenForo's own rendered HTML for real posts (see [Verification](#verification)), not the old BBob output. +- **BBCode and markdown in one parse.** Tags are markdown-it rules on the same instance Discourse cooks with, so markdown works inside tags and tags inside markdown (lists, headings, `**bold**`, polls, details, math). This replaced BBob, which ran as a whole-document HTML pre-processor and broke core markdown around tags. +- **Same code on server and in the composer.** `PrettyText.cook` and the composer preview must produce the same HTML. Every cooking change is checked on both. +- **Malformed input stays visible.** An unclosed tag or an unmatched close is left as literal text; nothing is swallowed or emptied. +- **No core changes unless they improve core on their own.** Plugin needs are met from the plugin. A change goes upstream only when it improves Discourse's default behavior without this plugin, such as the Nokogiri fragment search below. +- **Posts up to 500,000 characters** (production raises `max_post_length` with a separate plugin). Cooking must not fail or approach the 25s JavaScript timeout for any input of that size. + +## Design decisions + +### Tag syntax and matching + +- **Loose tag grammar, ported from BBob's lexer.** Everything up to the first `]` is the tag, unless the `]` is inside a value quoted right after `=` (`[div style="a]b"]`); a quote that never closes, or that a blank line or an unquoted `[` interrupts, is read as before. If there is no space before the first `=`, the rest is one raw value (`[div=height:auto; width:100%]`), up to the first key the tag reads (`[font=Open Sans style=bold]`); otherwise it is `key=value` pairs, whose keys are case-insensitive. An unquoted value ends at whitespace, as in BBob. A tag without any `=` takes only the bare flags it declares (`[slide open]`), so `[center is cool]` stays text. Tags declare their keys and flags in `attributes` (see `define.js`). `parseLooseTag` is the one reader of openers: literal regions and `[code]` use it too. Core's `parseBBCodeTag` stops at whitespace, so the plugin has its own scanner (`scanner.js`) and its own rules instead of core's bbcode ruler. +- **Closes are matched by name and depth.** Each text is scanned once per tag (`tagPairs`), and a "next lower running balance" array turns every `findClose` into a binary-search lookup, so unmatched tags scale linearly. +- **Mis-nesting is repaired, "close and drop", as BBob did:** `[b][i]x[/b] y[/i]` reads `[b][i]x[/i][/b] y`. Only tags closed somewhere take part. Core `[url]`/`[quote]`, `[tab]`/`[slide]`, and every block tag another rule registers on core's block bbcode ruler (`[details]`, `[wrap]`, `[poll]`, ...) count as parents. When the parent's close is alone on its line, the inner closes go at the end of the content before it, so the close stays alone: core's block tags only match it there. +- **Literal regions win.** Block-level ones first: fences and the HTML blocks markdown leaves alone (`
`, `'; font-weight: 400; font-style: normal;" data-font="https://fonts.googleapis.com/css2?family=Arial">:ital,wght@0,400">x y
diff --git a/spec/fixtures/recook/security.txt b/spec/fixtures/recook/security.txt
new file mode 100644
index 0000000..fbba13e
--- /dev/null
+++ b/spec/fixtures/recook/security.txt
@@ -0,0 +1,63 @@
+Hostile input: nothing here may run script or escape the post.
+==== style-attribute-breakout
+[color=red" onmouseover="alert(1)]x[/color]
+==== style-attribute-single-quote-breakout
+[div=color:red' onclick='alert(1)]x[/div]
+==== css-javascript-url
+[div style="background:url(javascript:alert(1))"]x[/div]
+==== css-expression
+[div=width:expression(alert(1))]x[/div]
+==== javascript-links
+[url=javascript:alert(1)]x[/url] [url]javascript:alert(1)[/url] [goto=" onclick="alert(1)]y[/goto]
+==== data-uri-links
+[url=data:text/html;base64,PHNjcmlwdD5hbGVydCgxKTwvc2NyaXB0Pg==]x[/url]
+==== anchor-id-injection
+[a=x" onclick="alert(1)]a[/a]
+==== fa-class-and-style
+[fa style="color:red;background:url(javascript:alert(1))"]fas fa-x" onclick="alert(1)[/fa]
+==== img-onerror
+[img]x" onerror="alert(1)[/img]
+==== raw-script-tags
+ [b][/b]
+==== raw-event-handlers
+ [b]x[/b]
+==== iframes-and-objects
+ 
+==== svg
+
+==== forged-template-marker
+
+==== forged-template-in-tag
+[b][/b]
+==== class-name-breakout
+[class name="x{} .d-header{display:none} .y"]color:red[/class]
+==== class-selector-breakout
+[class name=x selector="{} .d-header{display:none}"]color:red[/class]
+==== class-body-breakout
+[class name=x]color:red}.d-header{display:none[/class]
+==== class-body-closes-template
+[class name=x][/class]
+==== script-body-closes-template
+[script][/script]
+==== script-bad-class-and-event
+[script class="x y" on=onload]x[/script]
+==== animation-name-breakout
+[animation=x{}.d-header{display:none}][keyframe=0]a:b[/keyframe][/animation]
+==== keyframe-selector-breakout
+[animation=x][keyframe=0{} .d-header{display:none] a:b[/keyframe][/animation]
+==== comment-closing-early
+[comment]-->  
+==== empty
+
+==== mid-line
+before  after
+==== own-lines
+
+==== own-lines-between-text
+before
+
+after +==== starts-mid-line-spans-lines +before after +==== blank-line-inside + +==== markdown-blocks-inside + +==== inline-markdown-inside + +==== in-blockquote +
+
+==== in-list-item + +==== in-table-cell +
+ + + + + + + + + + + +
head
+
+==== in-heading +

+==== around-b + +==== in-b +before after +==== in-core-quote + +==== misnested-with-i + tail[/i] +==== nested-in-itself + +==== repeated + +==== tail-and-next-line + tail
+next line +==== blank-lines-around +before





after +==== unclosed +[comment]hidden x +==== unmatched-close +hidden x[/comment] +==== escaped +[comment]hidden x[/comment] +==== uppercase + diff --git a/spec/fixtures/recook/tag-comment.txt b/spec/fixtures/recook/tag-comment.txt new file mode 100644 index 0000000..60fbc56 --- /dev/null +++ b/spec/fixtures/recook/tag-comment.txt @@ -0,0 +1,85 @@ +Generated by generate.rb; edit that, not this file. +==== alone +[comment]hidden [b]x[/b][/comment] +==== empty +[comment][/comment] +==== mid-line +before [comment]hidden [b]x[/b][/comment] after +==== own-lines +[comment] +hidden [b]x[/b] +[/comment] +==== own-lines-between-text +before +[comment] +hidden [b]x[/b] +[/comment] +after +==== starts-mid-line-spans-lines +before [comment]hidden [b]x[/b] +more[/comment] after +==== blank-line-inside +[comment] +hidden [b]x[/b] + +second paragraph +[/comment] +==== markdown-blocks-inside +[comment] +## Heading + +- one +- two + +> quoted +[/comment] +==== inline-markdown-inside +[comment]**bold** _italic_ `code` [link](https://example.com) :smile:[/comment] +==== in-blockquote +> [comment] +> hidden [b]x[/b] +> [/comment] +==== in-list-item +- [comment] + hidden [b]x[/b] + [/comment] +- next +==== in-table-cell +| head | +|---| +| [comment]hidden [b]x[/b][/comment] | +==== in-heading +## [comment]hidden [b]x[/b][/comment] +==== around-b +[comment][b]hidden [b]x[/b][/b][/comment] +==== in-b +[b]before [comment]hidden [b]x[/b][/comment] after[/b] +==== in-core-quote +[quote] +[comment]hidden [b]x[/b][/comment] +[/quote] +==== misnested-with-i +[comment][i]hidden [b]x[/b][/comment] tail[/i] +==== nested-in-itself +[comment]outer [comment]inner[/comment] outer[/comment] +==== repeated +[comment]one[/comment][comment]two[/comment] [comment]three[/comment] +==== tail-and-next-line +[comment]hidden [b]x[/b][/comment] tail +next line +==== blank-lines-around +before + + +[comment]hidden [b]x[/b][/comment] + + +after +==== unclosed +[comment]hidden [b]x[/b] +==== unmatched-close +hidden [b]x[/b][/comment] +==== escaped +\[comment]hidden [b]x[/b][/comment] +==== uppercase +[COMMENT]hidden [b]x[/b][/COMMENT] diff --git a/spec/fixtures/recook/tag-details.cooked b/spec/fixtures/recook/tag-details.cooked new file mode 100644 index 0000000..cde6052 --- /dev/null +++ b/spec/fixtures/recook/tag-details.cooked @@ -0,0 +1,134 @@ +==== alone +
+ +Summary +text
+==== empty +[details=Summary][/details] +==== mid-line +before [details=Summary]text[/details] after +==== own-lines +
+ +Summary +text
+==== own-lines-between-text +before
+ +Summary +text
+
after +==== starts-mid-line-spans-lines +before [details=Summary]text
+more[/details] after +==== blank-line-inside +
+ +Summary +text

second paragraph
+==== markdown-blocks-inside +
+ +Summary +

Heading

+ +
+quoted
+
+==== inline-markdown-inside +
+ +Summary +bold italic code link :smile:
+==== in-blockquote +
+
+ +Summary +text
+
+==== in-list-item + +==== in-table-cell +
+ + + + + + + + + + + +
head
[details=Summary]text[/details]
+
+==== in-heading +

[details=Summary]text[/details]

+==== around-b +
+ +Summary +text
+==== in-b +before [details=Summary]text[/details] after +==== in-core-quote + +==== misnested-with-i +[details=Summary]text[/details] tail +==== nested-in-itself +
+ +Summary +outer [details=Summary]inner[/details] outer
+==== repeated +
+ +Summary +one[/details][details=Summary]two[/details] [details=Summary]three
+==== tail-and-next-line +[details=Summary]text[/details] tail
+next line +==== blank-lines-around +before


+ +Summary +text
+


after +==== unclosed +[details=Summary]text +==== unmatched-close +text[/details] +==== escaped +[details=Summary]text[/details] +==== uppercase +[DETAILS=Summary]text[/DETAILS] +==== [details] alone +
+ + +text
+==== [details] own-lines +
+ + +text
diff --git a/spec/fixtures/recook/tag-details.txt b/spec/fixtures/recook/tag-details.txt new file mode 100644 index 0000000..84ccb2f --- /dev/null +++ b/spec/fixtures/recook/tag-details.txt @@ -0,0 +1,91 @@ +Generated by generate.rb; edit that, not this file. +==== alone +[details=Summary]text[/details] +==== empty +[details=Summary][/details] +==== mid-line +before [details=Summary]text[/details] after +==== own-lines +[details=Summary] +text +[/details] +==== own-lines-between-text +before +[details=Summary] +text +[/details] +after +==== starts-mid-line-spans-lines +before [details=Summary]text +more[/details] after +==== blank-line-inside +[details=Summary] +text + +second paragraph +[/details] +==== markdown-blocks-inside +[details=Summary] +## Heading + +- one +- two + +> quoted +[/details] +==== inline-markdown-inside +[details=Summary]**bold** _italic_ `code` [link](https://example.com) :smile:[/details] +==== in-blockquote +> [details=Summary] +> text +> [/details] +==== in-list-item +- [details=Summary] + text + [/details] +- next +==== in-table-cell +| head | +|---| +| [details=Summary]text[/details] | +==== in-heading +## [details=Summary]text[/details] +==== around-b +[details=Summary][b]text[/b][/details] +==== in-b +[b]before [details=Summary]text[/details] after[/b] +==== in-core-quote +[quote] +[details=Summary]text[/details] +[/quote] +==== misnested-with-i +[details=Summary][i]text[/details] tail[/i] +==== nested-in-itself +[details=Summary]outer [details=Summary]inner[/details] outer[/details] +==== repeated +[details=Summary]one[/details][details=Summary]two[/details] [details=Summary]three[/details] +==== tail-and-next-line +[details=Summary]text[/details] tail +next line +==== blank-lines-around +before + + +[details=Summary]text[/details] + + +after +==== unclosed +[details=Summary]text +==== unmatched-close +text[/details] +==== escaped +\[details=Summary]text[/details] +==== uppercase +[DETAILS=Summary]text[/DETAILS] +==== [details] alone +[details]text[/details] +==== [details] own-lines +[details] +text +[/details] diff --git a/spec/fixtures/recook/tag-div.cooked b/spec/fixtures/recook/tag-div.cooked new file mode 100644 index 0000000..c9eeb7f --- /dev/null +++ b/spec/fixtures/recook/tag-div.cooked @@ -0,0 +1,143 @@ +==== alone +
text
+==== empty +
+==== mid-line +before
text
after +==== own-lines +
+
+text
+
+==== own-lines-between-text +before
+
+text
+
+
after +==== starts-mid-line-spans-lines +before
+text
+more
+after +==== blank-line-inside +
+
+text

second paragraph
+
+==== markdown-blocks-inside +
+
+

Heading

+ +
+quoted
+
+
+==== inline-markdown-inside +
bold italic code link :smile:
+==== in-blockquote +
+
+
+text
+
+
+==== in-list-item + +==== in-table-cell +
+ + + + + + + + + + + +
head
text
+
+==== in-heading +

text

+==== around-b +
text
+==== in-b +before
text
after
+==== in-core-quote + +==== misnested-with-i +
text
+tail +==== nested-in-itself +
outer
inner
outer
+==== repeated +
one
+
two
+
three
+==== tail-and-next-line +
text
+tail
next line +==== blank-lines-around +before


text
+


after +==== unclosed +[div=color:red]text +==== unmatched-close +text[/div] +==== escaped +[div=color:red]text[/div] +==== uppercase +
text
+==== [div] alone +
text
+==== [div] own-lines +
+
+text
+
+==== [div=color:red; padding: 4px] alone +
text
+==== [div=color:red; padding: 4px] own-lines +
+
+text
+
+==== [div style="color:red" class="box"] alone +
text
+==== [div style="color:red" class="box"] own-lines +
+
+text
+
+==== [div class=box] alone +
text
+==== [div class=box] own-lines +
+
+text
+
+==== [div class="a b"] alone +
text
+==== [div class="a b"] own-lines +
+
+text
+
diff --git a/spec/fixtures/recook/tag-div.txt b/spec/fixtures/recook/tag-div.txt new file mode 100644 index 0000000..7b96a7a --- /dev/null +++ b/spec/fixtures/recook/tag-div.txt @@ -0,0 +1,115 @@ +Generated by generate.rb; edit that, not this file. +==== alone +[div=color:red]text[/div] +==== empty +[div=color:red][/div] +==== mid-line +before [div=color:red]text[/div] after +==== own-lines +[div=color:red] +text +[/div] +==== own-lines-between-text +before +[div=color:red] +text +[/div] +after +==== starts-mid-line-spans-lines +before [div=color:red]text +more[/div] after +==== blank-line-inside +[div=color:red] +text + +second paragraph +[/div] +==== markdown-blocks-inside +[div=color:red] +## Heading + +- one +- two + +> quoted +[/div] +==== inline-markdown-inside +[div=color:red]**bold** _italic_ `code` [link](https://example.com) :smile:[/div] +==== in-blockquote +> [div=color:red] +> text +> [/div] +==== in-list-item +- [div=color:red] + text + [/div] +- next +==== in-table-cell +| head | +|---| +| [div=color:red]text[/div] | +==== in-heading +## [div=color:red]text[/div] +==== around-b +[div=color:red][b]text[/b][/div] +==== in-b +[b]before [div=color:red]text[/div] after[/b] +==== in-core-quote +[quote] +[div=color:red]text[/div] +[/quote] +==== misnested-with-i +[div=color:red][i]text[/div] tail[/i] +==== nested-in-itself +[div=color:red]outer [div=color:red]inner[/div] outer[/div] +==== repeated +[div=color:red]one[/div][div=color:red]two[/div] [div=color:red]three[/div] +==== tail-and-next-line +[div=color:red]text[/div] tail +next line +==== blank-lines-around +before + + +[div=color:red]text[/div] + + +after +==== unclosed +[div=color:red]text +==== unmatched-close +text[/div] +==== escaped +\[div=color:red]text[/div] +==== uppercase +[DIV=color:red]text[/DIV] +==== [div] alone +[div]text[/div] +==== [div] own-lines +[div] +text +[/div] +==== [div=color:red; padding: 4px] alone +[div=color:red; padding: 4px]text[/div] +==== [div=color:red; padding: 4px] own-lines +[div=color:red; padding: 4px] +text +[/div] +==== [div style="color:red" class="box"] alone +[div style="color:red" class="box"]text[/div] +==== [div style="color:red" class="box"] own-lines +[div style="color:red" class="box"] +text +[/div] +==== [div class=box] alone +[div class=box]text[/div] +==== [div class=box] own-lines +[div class=box] +text +[/div] +==== [div class="a b"] alone +[div class="a b"]text[/div] +==== [div class="a b"] own-lines +[div class="a b"] +text +[/div] diff --git a/spec/fixtures/recook/tag-divide.cooked b/spec/fixtures/recook/tag-divide.cooked new file mode 100644 index 0000000..f404e3a --- /dev/null +++ b/spec/fixtures/recook/tag-divide.cooked @@ -0,0 +1,122 @@ +==== alone +
text
+==== empty +
+==== mid-line +before
text
after +==== own-lines +
+
+text
+
+==== own-lines-between-text +before
+
+text
+
+after +==== starts-mid-line-spans-lines +before
+text
+more
+after +==== blank-line-inside +
+
+text

second paragraph
+
+==== markdown-blocks-inside +
+
+

Heading

+ +
+quoted
+
+
+==== inline-markdown-inside +
bold italic code link :smile:
+==== in-blockquote +
+
+
+text
+
+
+==== in-list-item + +==== in-table-cell +
+ + + + + + + + + + + +
head
text
+
+==== in-heading +

text

+==== around-b +
text
+==== in-b +before
text
after
+==== in-core-quote + +==== misnested-with-i +
text
+tail +==== nested-in-itself +
outer
inner
outer
+==== repeated +
one
+
two
+
three
+==== tail-and-next-line +
text
+tail
next line +==== blank-lines-around +before


text
+

after +==== unclosed +[divide=dotted]text +==== unmatched-close +text[/divide] +==== escaped +[divide=dotted]text[/divide] +==== uppercase +
text
+==== [divide] alone +
text
+==== [divide] own-lines +
+
+text
+
+==== [divide=DASHED] alone +
text
+==== [divide=DASHED] own-lines +
+
+text
+
diff --git a/spec/fixtures/recook/tag-divide.txt b/spec/fixtures/recook/tag-divide.txt new file mode 100644 index 0000000..2dec776 --- /dev/null +++ b/spec/fixtures/recook/tag-divide.txt @@ -0,0 +1,97 @@ +Generated by generate.rb; edit that, not this file. +==== alone +[divide=dotted]text[/divide] +==== empty +[divide=dotted][/divide] +==== mid-line +before [divide=dotted]text[/divide] after +==== own-lines +[divide=dotted] +text +[/divide] +==== own-lines-between-text +before +[divide=dotted] +text +[/divide] +after +==== starts-mid-line-spans-lines +before [divide=dotted]text +more[/divide] after +==== blank-line-inside +[divide=dotted] +text + +second paragraph +[/divide] +==== markdown-blocks-inside +[divide=dotted] +## Heading + +- one +- two + +> quoted +[/divide] +==== inline-markdown-inside +[divide=dotted]**bold** _italic_ `code` [link](https://example.com) :smile:[/divide] +==== in-blockquote +> [divide=dotted] +> text +> [/divide] +==== in-list-item +- [divide=dotted] + text + [/divide] +- next +==== in-table-cell +| head | +|---| +| [divide=dotted]text[/divide] | +==== in-heading +## [divide=dotted]text[/divide] +==== around-b +[divide=dotted][b]text[/b][/divide] +==== in-b +[b]before [divide=dotted]text[/divide] after[/b] +==== in-core-quote +[quote] +[divide=dotted]text[/divide] +[/quote] +==== misnested-with-i +[divide=dotted][i]text[/divide] tail[/i] +==== nested-in-itself +[divide=dotted]outer [divide=dotted]inner[/divide] outer[/divide] +==== repeated +[divide=dotted]one[/divide][divide=dotted]two[/divide] [divide=dotted]three[/divide] +==== tail-and-next-line +[divide=dotted]text[/divide] tail +next line +==== blank-lines-around +before + + +[divide=dotted]text[/divide] + + +after +==== unclosed +[divide=dotted]text +==== unmatched-close +text[/divide] +==== escaped +\[divide=dotted]text[/divide] +==== uppercase +[DIVIDE=dotted]text[/DIVIDE] +==== [divide] alone +[divide]text[/divide] +==== [divide] own-lines +[divide] +text +[/divide] +==== [divide=DASHED] alone +[divide=DASHED]text[/divide] +==== [divide=DASHED] own-lines +[divide=DASHED] +text +[/divide] diff --git a/spec/fixtures/recook/tag-email.cooked b/spec/fixtures/recook/tag-email.cooked new file mode 100644 index 0000000..bf4c18e --- /dev/null +++ b/spec/fixtures/recook/tag-email.cooked @@ -0,0 +1,92 @@ +==== alone +someone@example.com +==== empty + +==== mid-line +before someone@example.com after +==== own-lines + +someone@example.com + +==== own-lines-between-text +before
+ +someone@example.com +
+after +==== starts-mid-line-spans-lines +before someone@example.com +more after +==== blank-line-inside +[email]
+someone@example.com

second paragraph
+[/email] +==== markdown-blocks-inside +[email]

Heading

+ +
+quoted
+[/email]
+==== inline-markdown-inside +**bold** _italic_ `code` [link](https://example.com) :smile: +==== in-blockquote +
+ +someone@example.com +
+==== in-list-item + +==== in-table-cell +
+ + + + + + + + + + + +
head
someone@example.com
+
+==== in-heading +

someone@example.com

+==== around-b +[b]someone@example.com[/b] +==== in-b +before someone@example.com after +==== in-core-quote + +==== misnested-with-i +[i]someone@example.com tail[/i] +==== nested-in-itself +outer [email]inner outer[/email] +==== repeated +onetwo three +==== tail-and-next-line +someone@example.com tail
+next line +==== blank-lines-around +before


someone@example.com


after +==== unclosed +[email]someone@example.com +==== unmatched-close +someone@example.com[/email] +==== escaped +[email]someone@example.com[/email] +==== uppercase +someone@example.com diff --git a/spec/fixtures/recook/tag-email.txt b/spec/fixtures/recook/tag-email.txt new file mode 100644 index 0000000..cbd170e --- /dev/null +++ b/spec/fixtures/recook/tag-email.txt @@ -0,0 +1,85 @@ +Generated by generate.rb; edit that, not this file. +==== alone +[email]someone@example.com[/email] +==== empty +[email][/email] +==== mid-line +before [email]someone@example.com[/email] after +==== own-lines +[email] +someone@example.com +[/email] +==== own-lines-between-text +before +[email] +someone@example.com +[/email] +after +==== starts-mid-line-spans-lines +before [email]someone@example.com +more[/email] after +==== blank-line-inside +[email] +someone@example.com + +second paragraph +[/email] +==== markdown-blocks-inside +[email] +## Heading + +- one +- two + +> quoted +[/email] +==== inline-markdown-inside +[email]**bold** _italic_ `code` [link](https://example.com) :smile:[/email] +==== in-blockquote +> [email] +> someone@example.com +> [/email] +==== in-list-item +- [email] + someone@example.com + [/email] +- next +==== in-table-cell +| head | +|---| +| [email]someone@example.com[/email] | +==== in-heading +## [email]someone@example.com[/email] +==== around-b +[email][b]someone@example.com[/b][/email] +==== in-b +[b]before [email]someone@example.com[/email] after[/b] +==== in-core-quote +[quote] +[email]someone@example.com[/email] +[/quote] +==== misnested-with-i +[email][i]someone@example.com[/email] tail[/i] +==== nested-in-itself +[email]outer [email]inner[/email] outer[/email] +==== repeated +[email]one[/email][email]two[/email] [email]three[/email] +==== tail-and-next-line +[email]someone@example.com[/email] tail +next line +==== blank-lines-around +before + + +[email]someone@example.com[/email] + + +after +==== unclosed +[email]someone@example.com +==== unmatched-close +someone@example.com[/email] +==== escaped +\[email]someone@example.com[/email] +==== uppercase +[EMAIL]someone@example.com[/EMAIL] diff --git a/spec/fixtures/recook/tag-fa.cooked b/spec/fixtures/recook/tag-fa.cooked new file mode 100644 index 0000000..44620fb --- /dev/null +++ b/spec/fixtures/recook/tag-fa.cooked @@ -0,0 +1,80 @@ +==== alone + +==== empty + +==== mid-line +before after +==== own-lines + +==== own-lines-between-text +before

after +==== starts-mid-line-spans-lines +before after +==== blank-line-inside + +==== markdown-blocks-inside + +==== inline-markdown-inside + +==== in-blockquote +
+==== in-list-item + +==== in-table-cell +
+ + + + + + + + + + + +
head
+
+==== in-heading +

+==== around-b + +==== in-b +before after +==== in-core-quote + +==== misnested-with-i + tail[/i] +==== nested-in-itself + +==== repeated + +==== tail-and-next-line + tail
next line +==== blank-lines-around +before





after +==== unclosed +[fa]fas fa-dice +==== unmatched-close +fas fa-dice[/fa] +==== escaped +[fa]fas fa-dice[/fa] +==== uppercase + +==== [fa style="color:red" fa-transform=grow-2] alone + +==== [fa style="color:red" fa-transform=grow-2] own-lines + diff --git a/spec/fixtures/recook/tag-fa.txt b/spec/fixtures/recook/tag-fa.txt new file mode 100644 index 0000000..36597c8 --- /dev/null +++ b/spec/fixtures/recook/tag-fa.txt @@ -0,0 +1,91 @@ +Generated by generate.rb; edit that, not this file. +==== alone +[fa]fas fa-dice[/fa] +==== empty +[fa][/fa] +==== mid-line +before [fa]fas fa-dice[/fa] after +==== own-lines +[fa] +fas fa-dice +[/fa] +==== own-lines-between-text +before +[fa] +fas fa-dice +[/fa] +after +==== starts-mid-line-spans-lines +before [fa]fas fa-dice +more[/fa] after +==== blank-line-inside +[fa] +fas fa-dice + +second paragraph +[/fa] +==== markdown-blocks-inside +[fa] +## Heading + +- one +- two + +> quoted +[/fa] +==== inline-markdown-inside +[fa]**bold** _italic_ `code` [link](https://example.com) :smile:[/fa] +==== in-blockquote +> [fa] +> fas fa-dice +> [/fa] +==== in-list-item +- [fa] + fas fa-dice + [/fa] +- next +==== in-table-cell +| head | +|---| +| [fa]fas fa-dice[/fa] | +==== in-heading +## [fa]fas fa-dice[/fa] +==== around-b +[fa][b]fas fa-dice[/b][/fa] +==== in-b +[b]before [fa]fas fa-dice[/fa] after[/b] +==== in-core-quote +[quote] +[fa]fas fa-dice[/fa] +[/quote] +==== misnested-with-i +[fa][i]fas fa-dice[/fa] tail[/i] +==== nested-in-itself +[fa]outer [fa]inner[/fa] outer[/fa] +==== repeated +[fa]one[/fa][fa]two[/fa] [fa]three[/fa] +==== tail-and-next-line +[fa]fas fa-dice[/fa] tail +next line +==== blank-lines-around +before + + +[fa]fas fa-dice[/fa] + + +after +==== unclosed +[fa]fas fa-dice +==== unmatched-close +fas fa-dice[/fa] +==== escaped +\[fa]fas fa-dice[/fa] +==== uppercase +[FA]fas fa-dice[/FA] +==== [fa style="color:red" fa-transform=grow-2] alone +[fa style="color:red" fa-transform=grow-2]fas fa-dice[/fa] +==== [fa style="color:red" fa-transform=grow-2] own-lines +[fa style="color:red" fa-transform=grow-2] +fas fa-dice +[/fa] diff --git a/spec/fixtures/recook/tag-fieldset.cooked b/spec/fixtures/recook/tag-fieldset.cooked new file mode 100644 index 0000000..2b64806 --- /dev/null +++ b/spec/fixtures/recook/tag-fieldset.cooked @@ -0,0 +1,201 @@ +==== alone +
+ +Legend +
text
+
+==== empty +
+ +Legend +
+
+==== mid-line +before
Legend
text
after +==== own-lines +
+ +Legend +
+
+text
+
+
+==== own-lines-between-text +before
+ +Legend +
+
+text
+
+
+
after +==== starts-mid-line-spans-lines +before
+ +Legend +
+text
+more
+
+after +==== blank-line-inside +
+ +Legend +
+
+text

second paragraph
+
+
+==== markdown-blocks-inside +
+ +Legend +
+
+

Heading

+
    +
  • one
  • +
  • two
  • +
+
+quoted
+
+
+
+==== inline-markdown-inside +
+ +Legend +
bold italic code link :smile:
+
+==== in-blockquote +
+
+ +Legend +
+
+text
+
+
+
+==== in-list-item + +==== in-table-cell +
+ + + + + + + + + + + +
head
Legend
text
+
+==== in-heading +

Legend
text

+==== around-b +
+ +Legend +
text
+
+==== in-b +before
Legend
text
after
+==== in-core-quote + +==== misnested-with-i +
+ +Legend +
text
+
+tail +==== nested-in-itself +
+ +Legend +
outer
Legend
inner
outer
+
+==== repeated +
+ +Legend +
one
+
+
+ +Legend +
two
+
+
+ +Legend +
three
+
+==== tail-and-next-line +
+ +Legend +
text
+
+tail
next line +==== blank-lines-around +before


+ +Legend +
text
+
+


after +==== unclosed +[fieldset=Legend]text +==== unmatched-close +text[/fieldset] +==== escaped +[fieldset=Legend]text[/fieldset] +==== uppercase +
+ +Legend +
text
+
+==== [fieldset] alone +
+ +
text
+
+==== [fieldset] own-lines +
+ +
+
+text
+
+
diff --git a/spec/fixtures/recook/tag-fieldset.txt b/spec/fixtures/recook/tag-fieldset.txt new file mode 100644 index 0000000..5fb37cf --- /dev/null +++ b/spec/fixtures/recook/tag-fieldset.txt @@ -0,0 +1,91 @@ +Generated by generate.rb; edit that, not this file. +==== alone +[fieldset=Legend]text[/fieldset] +==== empty +[fieldset=Legend][/fieldset] +==== mid-line +before [fieldset=Legend]text[/fieldset] after +==== own-lines +[fieldset=Legend] +text +[/fieldset] +==== own-lines-between-text +before +[fieldset=Legend] +text +[/fieldset] +after +==== starts-mid-line-spans-lines +before [fieldset=Legend]text +more[/fieldset] after +==== blank-line-inside +[fieldset=Legend] +text + +second paragraph +[/fieldset] +==== markdown-blocks-inside +[fieldset=Legend] +## Heading + +- one +- two + +> quoted +[/fieldset] +==== inline-markdown-inside +[fieldset=Legend]**bold** _italic_ `code` [link](https://example.com) :smile:[/fieldset] +==== in-blockquote +> [fieldset=Legend] +> text +> [/fieldset] +==== in-list-item +- [fieldset=Legend] + text + [/fieldset] +- next +==== in-table-cell +| head | +|---| +| [fieldset=Legend]text[/fieldset] | +==== in-heading +## [fieldset=Legend]text[/fieldset] +==== around-b +[fieldset=Legend][b]text[/b][/fieldset] +==== in-b +[b]before [fieldset=Legend]text[/fieldset] after[/b] +==== in-core-quote +[quote] +[fieldset=Legend]text[/fieldset] +[/quote] +==== misnested-with-i +[fieldset=Legend][i]text[/fieldset] tail[/i] +==== nested-in-itself +[fieldset=Legend]outer [fieldset=Legend]inner[/fieldset] outer[/fieldset] +==== repeated +[fieldset=Legend]one[/fieldset][fieldset=Legend]two[/fieldset] [fieldset=Legend]three[/fieldset] +==== tail-and-next-line +[fieldset=Legend]text[/fieldset] tail +next line +==== blank-lines-around +before + + +[fieldset=Legend]text[/fieldset] + + +after +==== unclosed +[fieldset=Legend]text +==== unmatched-close +text[/fieldset] +==== escaped +\[fieldset=Legend]text[/fieldset] +==== uppercase +[FIELDSET=Legend]text[/FIELDSET] +==== [fieldset] alone +[fieldset]text[/fieldset] +==== [fieldset] own-lines +[fieldset] +text +[/fieldset] diff --git a/spec/fixtures/recook/tag-font.cooked b/spec/fixtures/recook/tag-font.cooked new file mode 100644 index 0000000..8ab5706 --- /dev/null +++ b/spec/fixtures/recook/tag-font.cooked @@ -0,0 +1,120 @@ +==== alone +text +==== empty + +==== mid-line +before text after +==== own-lines +
+text
+
+==== own-lines-between-text +before
+
+text
+

+after +==== starts-mid-line-spans-lines +before text
+more
after +==== blank-line-inside +
+text
+
+second paragraph
+
+==== markdown-blocks-inside +
+
+

Heading

+ +
+quoted
+
+
+==== inline-markdown-inside +bold italic code link :smile: +==== in-blockquote +
+
+text
+
+==== in-list-item + +==== in-table-cell +
+ + + + + + + + + + + +
head
text
+
+==== in-heading +

text

+==== around-b +text +==== in-b +before text after +==== in-core-quote + +==== misnested-with-i +text tail +==== nested-in-itself +outer inner outer +==== repeated +onetwo three +==== tail-and-next-line +text tail
+next line +==== blank-lines-around +before


text


after +==== unclosed +[font=Georgia]text +==== unmatched-close +text[/font] +==== escaped +[font=Georgia]text[/font] +==== uppercase +text +==== [font=Open Sans] alone +text +==== [font=Open Sans] own-lines +
+text
+
+==== [font=Lato style=bold] alone +text +==== [font=Lato style=bold] own-lines +
+text
+
+==== [font family=Roboto wght=300] alone +text +==== [font family=Roboto wght=300] own-lines +
+text
+
+==== [font=Arial size=3] alone +text +==== [font=Arial size=3] own-lines +
+text
+
diff --git a/spec/fixtures/recook/tag-font.txt b/spec/fixtures/recook/tag-font.txt new file mode 100644 index 0000000..c3e73ab --- /dev/null +++ b/spec/fixtures/recook/tag-font.txt @@ -0,0 +1,109 @@ +Generated by generate.rb; edit that, not this file. +==== alone +[font=Georgia]text[/font] +==== empty +[font=Georgia][/font] +==== mid-line +before [font=Georgia]text[/font] after +==== own-lines +[font=Georgia] +text +[/font] +==== own-lines-between-text +before +[font=Georgia] +text +[/font] +after +==== starts-mid-line-spans-lines +before [font=Georgia]text +more[/font] after +==== blank-line-inside +[font=Georgia] +text + +second paragraph +[/font] +==== markdown-blocks-inside +[font=Georgia] +## Heading + +- one +- two + +> quoted +[/font] +==== inline-markdown-inside +[font=Georgia]**bold** _italic_ `code` [link](https://example.com) :smile:[/font] +==== in-blockquote +> [font=Georgia] +> text +> [/font] +==== in-list-item +- [font=Georgia] + text + [/font] +- next +==== in-table-cell +| head | +|---| +| [font=Georgia]text[/font] | +==== in-heading +## [font=Georgia]text[/font] +==== around-b +[font=Georgia][b]text[/b][/font] +==== in-b +[b]before [font=Georgia]text[/font] after[/b] +==== in-core-quote +[quote] +[font=Georgia]text[/font] +[/quote] +==== misnested-with-i +[font=Georgia][i]text[/font] tail[/i] +==== nested-in-itself +[font=Georgia]outer [font=Georgia]inner[/font] outer[/font] +==== repeated +[font=Georgia]one[/font][font=Georgia]two[/font] [font=Georgia]three[/font] +==== tail-and-next-line +[font=Georgia]text[/font] tail +next line +==== blank-lines-around +before + + +[font=Georgia]text[/font] + + +after +==== unclosed +[font=Georgia]text +==== unmatched-close +text[/font] +==== escaped +\[font=Georgia]text[/font] +==== uppercase +[FONT=Georgia]text[/FONT] +==== [font=Open Sans] alone +[font=Open Sans]text[/font] +==== [font=Open Sans] own-lines +[font=Open Sans] +text +[/font] +==== [font=Lato style=bold] alone +[font=Lato style=bold]text[/font] +==== [font=Lato style=bold] own-lines +[font=Lato style=bold] +text +[/font] +==== [font family=Roboto wght=300] alone +[font family=Roboto wght=300]text[/font] +==== [font family=Roboto wght=300] own-lines +[font family=Roboto wght=300] +text +[/font] +==== [font=Arial size=3] alone +[font=Arial size=3]text[/font] +==== [font=Arial size=3] own-lines +[font=Arial size=3] +text +[/font] diff --git a/spec/fixtures/recook/tag-goto.cooked b/spec/fixtures/recook/tag-goto.cooked new file mode 100644 index 0000000..93da70e --- /dev/null +++ b/spec/fixtures/recook/tag-goto.cooked @@ -0,0 +1,93 @@ +==== alone +text +==== empty + +==== mid-line +before text after +==== own-lines +
+text
+
+==== own-lines-between-text +before
+
+text
+

+after +==== starts-mid-line-spans-lines +before text
+more
after +==== blank-line-inside +
+text
+
+second paragraph
+
+==== markdown-blocks-inside +
+## Heading
+
+- one
+- two
+
+> quoted
+
+==== inline-markdown-inside +bold italic code link :smile: +==== in-blockquote +
+
+text
+
+==== in-list-item + +==== in-table-cell +
+ + + + + + + + + + + +
head
text
+
+==== in-heading +

text

+==== around-b +text +==== in-b +before text after +==== in-core-quote + +==== misnested-with-i +text tail +==== nested-in-itself +outer inner outer +==== repeated +onetwo three +==== tail-and-next-line +text tail
+next line +==== blank-lines-around +before


text


after +==== unclosed +[goto=top]text +==== unmatched-close +text[/goto] +==== escaped +[goto=top]text[/goto] +==== uppercase +text diff --git a/spec/fixtures/recook/tag-goto.txt b/spec/fixtures/recook/tag-goto.txt new file mode 100644 index 0000000..2be914e --- /dev/null +++ b/spec/fixtures/recook/tag-goto.txt @@ -0,0 +1,85 @@ +Generated by generate.rb; edit that, not this file. +==== alone +[goto=top]text[/goto] +==== empty +[goto=top][/goto] +==== mid-line +before [goto=top]text[/goto] after +==== own-lines +[goto=top] +text +[/goto] +==== own-lines-between-text +before +[goto=top] +text +[/goto] +after +==== starts-mid-line-spans-lines +before [goto=top]text +more[/goto] after +==== blank-line-inside +[goto=top] +text + +second paragraph +[/goto] +==== markdown-blocks-inside +[goto=top] +## Heading + +- one +- two + +> quoted +[/goto] +==== inline-markdown-inside +[goto=top]**bold** _italic_ `code` [link](https://example.com) :smile:[/goto] +==== in-blockquote +> [goto=top] +> text +> [/goto] +==== in-list-item +- [goto=top] + text + [/goto] +- next +==== in-table-cell +| head | +|---| +| [goto=top]text[/goto] | +==== in-heading +## [goto=top]text[/goto] +==== around-b +[goto=top][b]text[/b][/goto] +==== in-b +[b]before [goto=top]text[/goto] after[/b] +==== in-core-quote +[quote] +[goto=top]text[/goto] +[/quote] +==== misnested-with-i +[goto=top][i]text[/goto] tail[/i] +==== nested-in-itself +[goto=top]outer [goto=top]inner[/goto] outer[/goto] +==== repeated +[goto=top]one[/goto][goto=top]two[/goto] [goto=top]three[/goto] +==== tail-and-next-line +[goto=top]text[/goto] tail +next line +==== blank-lines-around +before + + +[goto=top]text[/goto] + + +after +==== unclosed +[goto=top]text +==== unmatched-close +text[/goto] +==== escaped +\[goto=top]text[/goto] +==== uppercase +[GOTO=top]text[/GOTO] diff --git a/spec/fixtures/recook/tag-h.cooked b/spec/fixtures/recook/tag-h.cooked new file mode 100644 index 0000000..d9a71e2 --- /dev/null +++ b/spec/fixtures/recook/tag-h.cooked @@ -0,0 +1,108 @@ +==== alone +

text

+==== empty +

+==== mid-line +before

text

after +==== own-lines +

+
+text
+

+==== own-lines-between-text +before

+
+text
+

+
after +==== starts-mid-line-spans-lines +before

+text
+more

+after +==== blank-line-inside +

+
+text

second paragraph
+

+==== markdown-blocks-inside +

+
+

Heading

+ +
+quoted
+
+ +==== inline-markdown-inside +

bold italic code link :smile:

+==== in-blockquote +
+

+
+text
+

+
+==== in-list-item + +==== in-table-cell +
+ + + + + + + + + + + +
head

text

+
+==== in-heading +

text

+==== around-b +

text

+==== in-b +before

text

after
+==== in-core-quote + +==== misnested-with-i +

text

+tail +==== nested-in-itself +

outer

inner

outer +==== repeated +

one

+

two

+

three

+==== tail-and-next-line +

text

+tail
next line +==== blank-lines-around +before


text

+


after +==== unclosed +[h]text +==== unmatched-close +text[/h] +==== escaped +[h]text[/h] +==== uppercase +

text

diff --git a/spec/fixtures/recook/tag-h.txt b/spec/fixtures/recook/tag-h.txt new file mode 100644 index 0000000..f35436a --- /dev/null +++ b/spec/fixtures/recook/tag-h.txt @@ -0,0 +1,85 @@ +Generated by generate.rb; edit that, not this file. +==== alone +[h]text[/h] +==== empty +[h][/h] +==== mid-line +before [h]text[/h] after +==== own-lines +[h] +text +[/h] +==== own-lines-between-text +before +[h] +text +[/h] +after +==== starts-mid-line-spans-lines +before [h]text +more[/h] after +==== blank-line-inside +[h] +text + +second paragraph +[/h] +==== markdown-blocks-inside +[h] +## Heading + +- one +- two + +> quoted +[/h] +==== inline-markdown-inside +[h]**bold** _italic_ `code` [link](https://example.com) :smile:[/h] +==== in-blockquote +> [h] +> text +> [/h] +==== in-list-item +- [h] + text + [/h] +- next +==== in-table-cell +| head | +|---| +| [h]text[/h] | +==== in-heading +## [h]text[/h] +==== around-b +[h][b]text[/b][/h] +==== in-b +[b]before [h]text[/h] after[/b] +==== in-core-quote +[quote] +[h]text[/h] +[/quote] +==== misnested-with-i +[h][i]text[/h] tail[/i] +==== nested-in-itself +[h]outer [h]inner[/h] outer[/h] +==== repeated +[h]one[/h][h]two[/h] [h]three[/h] +==== tail-and-next-line +[h]text[/h] tail +next line +==== blank-lines-around +before + + +[h]text[/h] + + +after +==== unclosed +[h]text +==== unmatched-close +text[/h] +==== escaped +\[h]text[/h] +==== uppercase +[H]text[/H] diff --git a/spec/fixtures/recook/tag-h1.cooked b/spec/fixtures/recook/tag-h1.cooked new file mode 100644 index 0000000..4e8c2d4 --- /dev/null +++ b/spec/fixtures/recook/tag-h1.cooked @@ -0,0 +1,108 @@ +==== alone +

text

+==== empty +

+==== mid-line +before

text

after +==== own-lines +

+
+text
+

+==== own-lines-between-text +before

+
+text
+

+
after +==== starts-mid-line-spans-lines +before

+text
+more

+after +==== blank-line-inside +

+
+text

second paragraph
+

+==== markdown-blocks-inside +

+
+

Heading

+ +
+quoted
+
+ +==== inline-markdown-inside +

bold italic code link :smile:

+==== in-blockquote +
+

+
+text
+

+
+==== in-list-item + +==== in-table-cell +
+ + + + + + + + + + + +
head

text

+
+==== in-heading +

text

+==== around-b +

text

+==== in-b +before

text

after
+==== in-core-quote + +==== misnested-with-i +

text

+tail +==== nested-in-itself +

outer

inner

outer +==== repeated +

one

+

two

+

three

+==== tail-and-next-line +

text

+tail
next line +==== blank-lines-around +before


text

+


after +==== unclosed +[h1]text +==== unmatched-close +text[/h1] +==== escaped +[h1]text[/h1] +==== uppercase +

text

diff --git a/spec/fixtures/recook/tag-h1.txt b/spec/fixtures/recook/tag-h1.txt new file mode 100644 index 0000000..acc8873 --- /dev/null +++ b/spec/fixtures/recook/tag-h1.txt @@ -0,0 +1,85 @@ +Generated by generate.rb; edit that, not this file. +==== alone +[h1]text[/h1] +==== empty +[h1][/h1] +==== mid-line +before [h1]text[/h1] after +==== own-lines +[h1] +text +[/h1] +==== own-lines-between-text +before +[h1] +text +[/h1] +after +==== starts-mid-line-spans-lines +before [h1]text +more[/h1] after +==== blank-line-inside +[h1] +text + +second paragraph +[/h1] +==== markdown-blocks-inside +[h1] +## Heading + +- one +- two + +> quoted +[/h1] +==== inline-markdown-inside +[h1]**bold** _italic_ `code` [link](https://example.com) :smile:[/h1] +==== in-blockquote +> [h1] +> text +> [/h1] +==== in-list-item +- [h1] + text + [/h1] +- next +==== in-table-cell +| head | +|---| +| [h1]text[/h1] | +==== in-heading +## [h1]text[/h1] +==== around-b +[h1][b]text[/b][/h1] +==== in-b +[b]before [h1]text[/h1] after[/b] +==== in-core-quote +[quote] +[h1]text[/h1] +[/quote] +==== misnested-with-i +[h1][i]text[/h1] tail[/i] +==== nested-in-itself +[h1]outer [h1]inner[/h1] outer[/h1] +==== repeated +[h1]one[/h1][h1]two[/h1] [h1]three[/h1] +==== tail-and-next-line +[h1]text[/h1] tail +next line +==== blank-lines-around +before + + +[h1]text[/h1] + + +after +==== unclosed +[h1]text +==== unmatched-close +text[/h1] +==== escaped +\[h1]text[/h1] +==== uppercase +[H1]text[/H1] diff --git a/spec/fixtures/recook/tag-h2.cooked b/spec/fixtures/recook/tag-h2.cooked new file mode 100644 index 0000000..cc8912d --- /dev/null +++ b/spec/fixtures/recook/tag-h2.cooked @@ -0,0 +1,108 @@ +==== alone +

text

+==== empty +

+==== mid-line +before

text

after +==== own-lines +

+
+text
+

+==== own-lines-between-text +before

+
+text
+

+
after +==== starts-mid-line-spans-lines +before

+text
+more

+after +==== blank-line-inside +

+
+text

second paragraph
+

+==== markdown-blocks-inside +

+
+

Heading

+ +
+quoted
+
+ +==== inline-markdown-inside +

bold italic code link :smile:

+==== in-blockquote +
+

+
+text
+

+
+==== in-list-item + +==== in-table-cell +
+ + + + + + + + + + + +
head

text

+
+==== in-heading +

text

+==== around-b +

text

+==== in-b +before

text

after
+==== in-core-quote + +==== misnested-with-i +

text

+tail +==== nested-in-itself +

outer

inner

outer +==== repeated +

one

+

two

+

three

+==== tail-and-next-line +

text

+tail
next line +==== blank-lines-around +before


text

+


after +==== unclosed +[h2]text +==== unmatched-close +text[/h2] +==== escaped +[h2]text[/h2] +==== uppercase +

text

diff --git a/spec/fixtures/recook/tag-h2.txt b/spec/fixtures/recook/tag-h2.txt new file mode 100644 index 0000000..067d64c --- /dev/null +++ b/spec/fixtures/recook/tag-h2.txt @@ -0,0 +1,85 @@ +Generated by generate.rb; edit that, not this file. +==== alone +[h2]text[/h2] +==== empty +[h2][/h2] +==== mid-line +before [h2]text[/h2] after +==== own-lines +[h2] +text +[/h2] +==== own-lines-between-text +before +[h2] +text +[/h2] +after +==== starts-mid-line-spans-lines +before [h2]text +more[/h2] after +==== blank-line-inside +[h2] +text + +second paragraph +[/h2] +==== markdown-blocks-inside +[h2] +## Heading + +- one +- two + +> quoted +[/h2] +==== inline-markdown-inside +[h2]**bold** _italic_ `code` [link](https://example.com) :smile:[/h2] +==== in-blockquote +> [h2] +> text +> [/h2] +==== in-list-item +- [h2] + text + [/h2] +- next +==== in-table-cell +| head | +|---| +| [h2]text[/h2] | +==== in-heading +## [h2]text[/h2] +==== around-b +[h2][b]text[/b][/h2] +==== in-b +[b]before [h2]text[/h2] after[/b] +==== in-core-quote +[quote] +[h2]text[/h2] +[/quote] +==== misnested-with-i +[h2][i]text[/h2] tail[/i] +==== nested-in-itself +[h2]outer [h2]inner[/h2] outer[/h2] +==== repeated +[h2]one[/h2][h2]two[/h2] [h2]three[/h2] +==== tail-and-next-line +[h2]text[/h2] tail +next line +==== blank-lines-around +before + + +[h2]text[/h2] + + +after +==== unclosed +[h2]text +==== unmatched-close +text[/h2] +==== escaped +\[h2]text[/h2] +==== uppercase +[H2]text[/H2] diff --git a/spec/fixtures/recook/tag-h3.cooked b/spec/fixtures/recook/tag-h3.cooked new file mode 100644 index 0000000..5cc63e1 --- /dev/null +++ b/spec/fixtures/recook/tag-h3.cooked @@ -0,0 +1,108 @@ +==== alone +

text

+==== empty +

+==== mid-line +before

text

after +==== own-lines +

+
+text
+

+==== own-lines-between-text +before

+
+text
+

+
after +==== starts-mid-line-spans-lines +before

+text
+more

+after +==== blank-line-inside +

+
+text

second paragraph
+

+==== markdown-blocks-inside +

+
+

Heading

+ +
+quoted
+
+ +==== inline-markdown-inside +

bold italic code link :smile:

+==== in-blockquote +
+

+
+text
+

+
+==== in-list-item + +==== in-table-cell +
+ + + + + + + + + + + +
head

text

+
+==== in-heading +

text

+==== around-b +

text

+==== in-b +before

text

after
+==== in-core-quote + +==== misnested-with-i +

text

+tail +==== nested-in-itself +

outer

inner

outer +==== repeated +

one

+

two

+

three

+==== tail-and-next-line +

text

+tail
next line +==== blank-lines-around +before


text

+


after +==== unclosed +[h3]text +==== unmatched-close +text[/h3] +==== escaped +[h3]text[/h3] +==== uppercase +

text

diff --git a/spec/fixtures/recook/tag-h3.txt b/spec/fixtures/recook/tag-h3.txt new file mode 100644 index 0000000..e37b244 --- /dev/null +++ b/spec/fixtures/recook/tag-h3.txt @@ -0,0 +1,85 @@ +Generated by generate.rb; edit that, not this file. +==== alone +[h3]text[/h3] +==== empty +[h3][/h3] +==== mid-line +before [h3]text[/h3] after +==== own-lines +[h3] +text +[/h3] +==== own-lines-between-text +before +[h3] +text +[/h3] +after +==== starts-mid-line-spans-lines +before [h3]text +more[/h3] after +==== blank-line-inside +[h3] +text + +second paragraph +[/h3] +==== markdown-blocks-inside +[h3] +## Heading + +- one +- two + +> quoted +[/h3] +==== inline-markdown-inside +[h3]**bold** _italic_ `code` [link](https://example.com) :smile:[/h3] +==== in-blockquote +> [h3] +> text +> [/h3] +==== in-list-item +- [h3] + text + [/h3] +- next +==== in-table-cell +| head | +|---| +| [h3]text[/h3] | +==== in-heading +## [h3]text[/h3] +==== around-b +[h3][b]text[/b][/h3] +==== in-b +[b]before [h3]text[/h3] after[/b] +==== in-core-quote +[quote] +[h3]text[/h3] +[/quote] +==== misnested-with-i +[h3][i]text[/h3] tail[/i] +==== nested-in-itself +[h3]outer [h3]inner[/h3] outer[/h3] +==== repeated +[h3]one[/h3][h3]two[/h3] [h3]three[/h3] +==== tail-and-next-line +[h3]text[/h3] tail +next line +==== blank-lines-around +before + + +[h3]text[/h3] + + +after +==== unclosed +[h3]text +==== unmatched-close +text[/h3] +==== escaped +\[h3]text[/h3] +==== uppercase +[H3]text[/H3] diff --git a/spec/fixtures/recook/tag-h4.cooked b/spec/fixtures/recook/tag-h4.cooked new file mode 100644 index 0000000..094614c --- /dev/null +++ b/spec/fixtures/recook/tag-h4.cooked @@ -0,0 +1,108 @@ +==== alone +

text

+==== empty +

+==== mid-line +before

text

after +==== own-lines +

+
+text
+

+==== own-lines-between-text +before

+
+text
+

+
after +==== starts-mid-line-spans-lines +before

+text
+more

+after +==== blank-line-inside +

+
+text

second paragraph
+

+==== markdown-blocks-inside +

+
+

Heading

+ +
+quoted
+
+ +==== inline-markdown-inside +

bold italic code link :smile:

+==== in-blockquote +
+

+
+text
+

+
+==== in-list-item + +==== in-table-cell +
+ + + + + + + + + + + +
head

text

+
+==== in-heading +

text

+==== around-b +

text

+==== in-b +before

text

after
+==== in-core-quote + +==== misnested-with-i +

text

+tail +==== nested-in-itself +

outer

inner

outer +==== repeated +

one

+

two

+

three

+==== tail-and-next-line +

text

+tail
next line +==== blank-lines-around +before


text

+


after +==== unclosed +[h4]text +==== unmatched-close +text[/h4] +==== escaped +[h4]text[/h4] +==== uppercase +

text

diff --git a/spec/fixtures/recook/tag-h4.txt b/spec/fixtures/recook/tag-h4.txt new file mode 100644 index 0000000..d3bc3ca --- /dev/null +++ b/spec/fixtures/recook/tag-h4.txt @@ -0,0 +1,85 @@ +Generated by generate.rb; edit that, not this file. +==== alone +[h4]text[/h4] +==== empty +[h4][/h4] +==== mid-line +before [h4]text[/h4] after +==== own-lines +[h4] +text +[/h4] +==== own-lines-between-text +before +[h4] +text +[/h4] +after +==== starts-mid-line-spans-lines +before [h4]text +more[/h4] after +==== blank-line-inside +[h4] +text + +second paragraph +[/h4] +==== markdown-blocks-inside +[h4] +## Heading + +- one +- two + +> quoted +[/h4] +==== inline-markdown-inside +[h4]**bold** _italic_ `code` [link](https://example.com) :smile:[/h4] +==== in-blockquote +> [h4] +> text +> [/h4] +==== in-list-item +- [h4] + text + [/h4] +- next +==== in-table-cell +| head | +|---| +| [h4]text[/h4] | +==== in-heading +## [h4]text[/h4] +==== around-b +[h4][b]text[/b][/h4] +==== in-b +[b]before [h4]text[/h4] after[/b] +==== in-core-quote +[quote] +[h4]text[/h4] +[/quote] +==== misnested-with-i +[h4][i]text[/h4] tail[/i] +==== nested-in-itself +[h4]outer [h4]inner[/h4] outer[/h4] +==== repeated +[h4]one[/h4][h4]two[/h4] [h4]three[/h4] +==== tail-and-next-line +[h4]text[/h4] tail +next line +==== blank-lines-around +before + + +[h4]text[/h4] + + +after +==== unclosed +[h4]text +==== unmatched-close +text[/h4] +==== escaped +\[h4]text[/h4] +==== uppercase +[H4]text[/H4] diff --git a/spec/fixtures/recook/tag-h5.cooked b/spec/fixtures/recook/tag-h5.cooked new file mode 100644 index 0000000..08d9b17 --- /dev/null +++ b/spec/fixtures/recook/tag-h5.cooked @@ -0,0 +1,108 @@ +==== alone +
text
+==== empty +
+==== mid-line +before
text
after +==== own-lines +
+
+text
+
+==== own-lines-between-text +before
+
+text
+
+
after +==== starts-mid-line-spans-lines +before
+text
+more
+after +==== blank-line-inside +
+
+text

second paragraph
+
+==== markdown-blocks-inside +
+
+

Heading

+ +
+quoted
+
+ +==== inline-markdown-inside +
bold italic code link :smile:
+==== in-blockquote +
+
+
+text
+
+
+==== in-list-item + +==== in-table-cell +
+ + + + + + + + + + + +
head
text
+
+==== in-heading +

text
+==== around-b +
text
+==== in-b +before
text
after
+==== in-core-quote + +==== misnested-with-i +
text
+tail +==== nested-in-itself +
outer
inner
outer +==== repeated +
one
+
two
+
three
+==== tail-and-next-line +
text
+tail
next line +==== blank-lines-around +before


text
+


after +==== unclosed +[h5]text +==== unmatched-close +text[/h5] +==== escaped +[h5]text[/h5] +==== uppercase +
text
diff --git a/spec/fixtures/recook/tag-h5.txt b/spec/fixtures/recook/tag-h5.txt new file mode 100644 index 0000000..c22840e --- /dev/null +++ b/spec/fixtures/recook/tag-h5.txt @@ -0,0 +1,85 @@ +Generated by generate.rb; edit that, not this file. +==== alone +[h5]text[/h5] +==== empty +[h5][/h5] +==== mid-line +before [h5]text[/h5] after +==== own-lines +[h5] +text +[/h5] +==== own-lines-between-text +before +[h5] +text +[/h5] +after +==== starts-mid-line-spans-lines +before [h5]text +more[/h5] after +==== blank-line-inside +[h5] +text + +second paragraph +[/h5] +==== markdown-blocks-inside +[h5] +## Heading + +- one +- two + +> quoted +[/h5] +==== inline-markdown-inside +[h5]**bold** _italic_ `code` [link](https://example.com) :smile:[/h5] +==== in-blockquote +> [h5] +> text +> [/h5] +==== in-list-item +- [h5] + text + [/h5] +- next +==== in-table-cell +| head | +|---| +| [h5]text[/h5] | +==== in-heading +## [h5]text[/h5] +==== around-b +[h5][b]text[/b][/h5] +==== in-b +[b]before [h5]text[/h5] after[/b] +==== in-core-quote +[quote] +[h5]text[/h5] +[/quote] +==== misnested-with-i +[h5][i]text[/h5] tail[/i] +==== nested-in-itself +[h5]outer [h5]inner[/h5] outer[/h5] +==== repeated +[h5]one[/h5][h5]two[/h5] [h5]three[/h5] +==== tail-and-next-line +[h5]text[/h5] tail +next line +==== blank-lines-around +before + + +[h5]text[/h5] + + +after +==== unclosed +[h5]text +==== unmatched-close +text[/h5] +==== escaped +\[h5]text[/h5] +==== uppercase +[H5]text[/H5] diff --git a/spec/fixtures/recook/tag-h6.cooked b/spec/fixtures/recook/tag-h6.cooked new file mode 100644 index 0000000..c0f075c --- /dev/null +++ b/spec/fixtures/recook/tag-h6.cooked @@ -0,0 +1,108 @@ +==== alone +
text
+==== empty +
+==== mid-line +before
text
after +==== own-lines +
+
+text
+
+==== own-lines-between-text +before
+
+text
+
+
after +==== starts-mid-line-spans-lines +before
+text
+more
+after +==== blank-line-inside +
+
+text

second paragraph
+
+==== markdown-blocks-inside +
+
+

Heading

+ +
+quoted
+
+ +==== inline-markdown-inside +
bold italic code link :smile:
+==== in-blockquote +
+
+
+text
+
+
+==== in-list-item + +==== in-table-cell +
+ + + + + + + + + + + +
head
text
+
+==== in-heading +

text
+==== around-b +
text
+==== in-b +before
text
after
+==== in-core-quote + +==== misnested-with-i +
text
+tail +==== nested-in-itself +
outer
inner
outer +==== repeated +
one
+
two
+
three
+==== tail-and-next-line +
text
+tail
next line +==== blank-lines-around +before


text
+


after +==== unclosed +[h6]text +==== unmatched-close +text[/h6] +==== escaped +[h6]text[/h6] +==== uppercase +
text
diff --git a/spec/fixtures/recook/tag-h6.txt b/spec/fixtures/recook/tag-h6.txt new file mode 100644 index 0000000..47ccd0d --- /dev/null +++ b/spec/fixtures/recook/tag-h6.txt @@ -0,0 +1,85 @@ +Generated by generate.rb; edit that, not this file. +==== alone +[h6]text[/h6] +==== empty +[h6][/h6] +==== mid-line +before [h6]text[/h6] after +==== own-lines +[h6] +text +[/h6] +==== own-lines-between-text +before +[h6] +text +[/h6] +after +==== starts-mid-line-spans-lines +before [h6]text +more[/h6] after +==== blank-line-inside +[h6] +text + +second paragraph +[/h6] +==== markdown-blocks-inside +[h6] +## Heading + +- one +- two + +> quoted +[/h6] +==== inline-markdown-inside +[h6]**bold** _italic_ `code` [link](https://example.com) :smile:[/h6] +==== in-blockquote +> [h6] +> text +> [/h6] +==== in-list-item +- [h6] + text + [/h6] +- next +==== in-table-cell +| head | +|---| +| [h6]text[/h6] | +==== in-heading +## [h6]text[/h6] +==== around-b +[h6][b]text[/b][/h6] +==== in-b +[b]before [h6]text[/h6] after[/b] +==== in-core-quote +[quote] +[h6]text[/h6] +[/quote] +==== misnested-with-i +[h6][i]text[/h6] tail[/i] +==== nested-in-itself +[h6]outer [h6]inner[/h6] outer[/h6] +==== repeated +[h6]one[/h6][h6]two[/h6] [h6]three[/h6] +==== tail-and-next-line +[h6]text[/h6] tail +next line +==== blank-lines-around +before + + +[h6]text[/h6] + + +after +==== unclosed +[h6]text +==== unmatched-close +text[/h6] +==== escaped +\[h6]text[/h6] +==== uppercase +[H6]text[/H6] diff --git a/spec/fixtures/recook/tag-heightrestrict.cooked b/spec/fixtures/recook/tag-heightrestrict.cooked new file mode 100644 index 0000000..ce98850 --- /dev/null +++ b/spec/fixtures/recook/tag-heightrestrict.cooked @@ -0,0 +1,143 @@ +==== alone +
text
+==== empty +
+==== mid-line +before
text
after +==== own-lines +
+
+text
+
+==== own-lines-between-text +before
+
+text
+
+
after +==== starts-mid-line-spans-lines +before
+text
+more
+after +==== blank-line-inside +
+
+text

second paragraph
+
+==== markdown-blocks-inside +
+
+

Heading

+ +
+quoted
+
+
+==== inline-markdown-inside +
bold italic code link :smile:
+==== in-blockquote +
+
+
+text
+
+
+==== in-list-item + +==== in-table-cell +
+ + + + + + + + + + + +
head
text
+
+==== in-heading +

text

+==== around-b +
text
+==== in-b +before
text
after
+==== in-core-quote + +==== misnested-with-i +
text
+tail +==== nested-in-itself +
outer
inner
outer
+==== repeated +
one
+
two
+
three
+==== tail-and-next-line +
text
+tail
next line +==== blank-lines-around +before


text
+


after +==== unclosed +[heightrestrict=100]text +==== unmatched-close +text[/heightrestrict] +==== escaped +[heightrestrict=100]text[/heightrestrict] +==== uppercase +
text
+==== [heightrestrict] alone +
text
+==== [heightrestrict] own-lines +
+
+text
+
+==== [heightrestrict=0] alone +
text
+==== [heightrestrict=0] own-lines +
+
+text
+
+==== [heightrestrict=9999] alone +
text
+==== [heightrestrict=9999] own-lines +
+
+text
+
+==== [heightrestrict=-5] alone +
text
+==== [heightrestrict=-5] own-lines +
+
+text
+
+==== [heightrestrict=abc] alone +
text
+==== [heightrestrict=abc] own-lines +
+
+text
+
diff --git a/spec/fixtures/recook/tag-heightrestrict.txt b/spec/fixtures/recook/tag-heightrestrict.txt new file mode 100644 index 0000000..3ebcef5 --- /dev/null +++ b/spec/fixtures/recook/tag-heightrestrict.txt @@ -0,0 +1,115 @@ +Generated by generate.rb; edit that, not this file. +==== alone +[heightrestrict=100]text[/heightrestrict] +==== empty +[heightrestrict=100][/heightrestrict] +==== mid-line +before [heightrestrict=100]text[/heightrestrict] after +==== own-lines +[heightrestrict=100] +text +[/heightrestrict] +==== own-lines-between-text +before +[heightrestrict=100] +text +[/heightrestrict] +after +==== starts-mid-line-spans-lines +before [heightrestrict=100]text +more[/heightrestrict] after +==== blank-line-inside +[heightrestrict=100] +text + +second paragraph +[/heightrestrict] +==== markdown-blocks-inside +[heightrestrict=100] +## Heading + +- one +- two + +> quoted +[/heightrestrict] +==== inline-markdown-inside +[heightrestrict=100]**bold** _italic_ `code` [link](https://example.com) :smile:[/heightrestrict] +==== in-blockquote +> [heightrestrict=100] +> text +> [/heightrestrict] +==== in-list-item +- [heightrestrict=100] + text + [/heightrestrict] +- next +==== in-table-cell +| head | +|---| +| [heightrestrict=100]text[/heightrestrict] | +==== in-heading +## [heightrestrict=100]text[/heightrestrict] +==== around-b +[heightrestrict=100][b]text[/b][/heightrestrict] +==== in-b +[b]before [heightrestrict=100]text[/heightrestrict] after[/b] +==== in-core-quote +[quote] +[heightrestrict=100]text[/heightrestrict] +[/quote] +==== misnested-with-i +[heightrestrict=100][i]text[/heightrestrict] tail[/i] +==== nested-in-itself +[heightrestrict=100]outer [heightrestrict=100]inner[/heightrestrict] outer[/heightrestrict] +==== repeated +[heightrestrict=100]one[/heightrestrict][heightrestrict=100]two[/heightrestrict] [heightrestrict=100]three[/heightrestrict] +==== tail-and-next-line +[heightrestrict=100]text[/heightrestrict] tail +next line +==== blank-lines-around +before + + +[heightrestrict=100]text[/heightrestrict] + + +after +==== unclosed +[heightrestrict=100]text +==== unmatched-close +text[/heightrestrict] +==== escaped +\[heightrestrict=100]text[/heightrestrict] +==== uppercase +[HEIGHTRESTRICT=100]text[/HEIGHTRESTRICT] +==== [heightrestrict] alone +[heightrestrict]text[/heightrestrict] +==== [heightrestrict] own-lines +[heightrestrict] +text +[/heightrestrict] +==== [heightrestrict=0] alone +[heightrestrict=0]text[/heightrestrict] +==== [heightrestrict=0] own-lines +[heightrestrict=0] +text +[/heightrestrict] +==== [heightrestrict=9999] alone +[heightrestrict=9999]text[/heightrestrict] +==== [heightrestrict=9999] own-lines +[heightrestrict=9999] +text +[/heightrestrict] +==== [heightrestrict=-5] alone +[heightrestrict=-5]text[/heightrestrict] +==== [heightrestrict=-5] own-lines +[heightrestrict=-5] +text +[/heightrestrict] +==== [heightrestrict=abc] alone +[heightrestrict=abc]text[/heightrestrict] +==== [heightrestrict=abc] own-lines +[heightrestrict=abc] +text +[/heightrestrict] diff --git a/spec/fixtures/recook/tag-highlight.cooked b/spec/fixtures/recook/tag-highlight.cooked new file mode 100644 index 0000000..be02e83 --- /dev/null +++ b/spec/fixtures/recook/tag-highlight.cooked @@ -0,0 +1,96 @@ +==== alone +text +==== empty + +==== mid-line +before text after +==== own-lines +
+text
+
+==== own-lines-between-text +before
+
+text
+

+after +==== starts-mid-line-spans-lines +before text
+more
after +==== blank-line-inside +
+text
+
+second paragraph
+
+==== markdown-blocks-inside +
+
+

Heading

+ +
+quoted
+
+
+==== inline-markdown-inside +bold italic code link :smile: +==== in-blockquote +
+
+text
+
+==== in-list-item + +==== in-table-cell +
+ + + + + + + + + + + +
head
text
+
+==== in-heading +

text

+==== around-b +text +==== in-b +before text after +==== in-core-quote + +==== misnested-with-i +text tail +==== nested-in-itself +outer inner outer +==== repeated +onetwo three +==== tail-and-next-line +text tail
+next line +==== blank-lines-around +before


text


after +==== unclosed +[highlight]text +==== unmatched-close +text[/highlight] +==== escaped +[highlight]text[/highlight] +==== uppercase +text diff --git a/spec/fixtures/recook/tag-highlight.txt b/spec/fixtures/recook/tag-highlight.txt new file mode 100644 index 0000000..bb5e3ca --- /dev/null +++ b/spec/fixtures/recook/tag-highlight.txt @@ -0,0 +1,85 @@ +Generated by generate.rb; edit that, not this file. +==== alone +[highlight]text[/highlight] +==== empty +[highlight][/highlight] +==== mid-line +before [highlight]text[/highlight] after +==== own-lines +[highlight] +text +[/highlight] +==== own-lines-between-text +before +[highlight] +text +[/highlight] +after +==== starts-mid-line-spans-lines +before [highlight]text +more[/highlight] after +==== blank-line-inside +[highlight] +text + +second paragraph +[/highlight] +==== markdown-blocks-inside +[highlight] +## Heading + +- one +- two + +> quoted +[/highlight] +==== inline-markdown-inside +[highlight]**bold** _italic_ `code` [link](https://example.com) :smile:[/highlight] +==== in-blockquote +> [highlight] +> text +> [/highlight] +==== in-list-item +- [highlight] + text + [/highlight] +- next +==== in-table-cell +| head | +|---| +| [highlight]text[/highlight] | +==== in-heading +## [highlight]text[/highlight] +==== around-b +[highlight][b]text[/b][/highlight] +==== in-b +[b]before [highlight]text[/highlight] after[/b] +==== in-core-quote +[quote] +[highlight]text[/highlight] +[/quote] +==== misnested-with-i +[highlight][i]text[/highlight] tail[/i] +==== nested-in-itself +[highlight]outer [highlight]inner[/highlight] outer[/highlight] +==== repeated +[highlight]one[/highlight][highlight]two[/highlight] [highlight]three[/highlight] +==== tail-and-next-line +[highlight]text[/highlight] tail +next line +==== blank-lines-around +before + + +[highlight]text[/highlight] + + +after +==== unclosed +[highlight]text +==== unmatched-close +text[/highlight] +==== escaped +\[highlight]text[/highlight] +==== uppercase +[HIGHLIGHT]text[/HIGHLIGHT] diff --git a/spec/fixtures/recook/tag-i.cooked b/spec/fixtures/recook/tag-i.cooked new file mode 100644 index 0000000..1cc11a0 --- /dev/null +++ b/spec/fixtures/recook/tag-i.cooked @@ -0,0 +1,96 @@ +==== alone +text +==== empty + +==== mid-line +before text after +==== own-lines +
+text
+
+==== own-lines-between-text +before
+
+text
+

+after +==== starts-mid-line-spans-lines +before text
+more
after +==== blank-line-inside +
+text
+
+second paragraph
+
+==== markdown-blocks-inside +
+
+

Heading

+ +
+quoted
+
+
+==== inline-markdown-inside +bold italic code link :smile: +==== in-blockquote +
+
+text
+
+==== in-list-item + +==== in-table-cell +
+ + + + + + + + + + + +
head
text
+
+==== in-heading +

text

+==== around-b +text +==== in-b +before text after +==== in-core-quote + +==== misnested-with-i +text tail +==== nested-in-itself +outer inner outer +==== repeated +onetwo three +==== tail-and-next-line +text tail
+next line +==== blank-lines-around +before


text


after +==== unclosed +[i]text +==== unmatched-close +text[/i] +==== escaped +[i]text[/i] +==== uppercase +text diff --git a/spec/fixtures/recook/tag-i.txt b/spec/fixtures/recook/tag-i.txt new file mode 100644 index 0000000..39c8fdb --- /dev/null +++ b/spec/fixtures/recook/tag-i.txt @@ -0,0 +1,85 @@ +Generated by generate.rb; edit that, not this file. +==== alone +[i]text[/i] +==== empty +[i][/i] +==== mid-line +before [i]text[/i] after +==== own-lines +[i] +text +[/i] +==== own-lines-between-text +before +[i] +text +[/i] +after +==== starts-mid-line-spans-lines +before [i]text +more[/i] after +==== blank-line-inside +[i] +text + +second paragraph +[/i] +==== markdown-blocks-inside +[i] +## Heading + +- one +- two + +> quoted +[/i] +==== inline-markdown-inside +[i]**bold** _italic_ `code` [link](https://example.com) :smile:[/i] +==== in-blockquote +> [i] +> text +> [/i] +==== in-list-item +- [i] + text + [/i] +- next +==== in-table-cell +| head | +|---| +| [i]text[/i] | +==== in-heading +## [i]text[/i] +==== around-b +[i][b]text[/b][/i] +==== in-b +[b]before [i]text[/i] after[/b] +==== in-core-quote +[quote] +[i]text[/i] +[/quote] +==== misnested-with-i +[i][i]text[/i] tail[/i] +==== nested-in-itself +[i]outer [i]inner[/i] outer[/i] +==== repeated +[i]one[/i][i]two[/i] [i]three[/i] +==== tail-and-next-line +[i]text[/i] tail +next line +==== blank-lines-around +before + + +[i]text[/i] + + +after +==== unclosed +[i]text +==== unmatched-close +text[/i] +==== escaped +\[i]text[/i] +==== uppercase +[I]text[/I] diff --git a/spec/fixtures/recook/tag-icode.cooked b/spec/fixtures/recook/tag-icode.cooked new file mode 100644 index 0000000..76cc2c9 --- /dev/null +++ b/spec/fixtures/recook/tag-icode.cooked @@ -0,0 +1,76 @@ +==== alone +[b]x[/b] <b>y</b> +==== empty + +==== mid-line +before [b]x[/b] <b>y</b> after +==== own-lines +[b]x[/b] <b>y</b> +==== own-lines-between-text +before
[b]x[/b] <b>y</b>
after +==== starts-mid-line-spans-lines +before [b]x[/b] <b>y</b> +more after +==== blank-line-inside +[b]x[/b] <b>y</b> + +second paragraph +==== markdown-blocks-inside +## Heading + +- one +- two + +> quoted +==== inline-markdown-inside +**bold** _italic_ `code` [link](https://example.com) :smile: +==== in-blockquote +
[b]x[/b] <b>y</b>
+==== in-list-item + +==== in-table-cell +
+ + + + + + + + + + + +
head
[b]x[/b] <b>y</b>
+
+==== in-heading +

[b]x[/b] <b>y</b>

+==== around-b +[b][b]x[/b] <b>y</b>[/b] +==== in-b +before [b]x[/b] <b>y</b> after +==== in-core-quote + +==== misnested-with-i +[i][b]x[/b] <b>y</b> tail[/i] +==== nested-in-itself +outer [icode]inner[/icode] outer +==== repeated +onetwo three +==== tail-and-next-line +[b]x[/b] <b>y</b> tail
next line +==== blank-lines-around +before


[b]x[/b] <b>y</b>


after +==== unclosed +[icode]x y +==== unmatched-close +x y[/icode] +==== escaped +[icode]x y[/icode] +==== uppercase +[b]x[/b] <b>y</b> diff --git a/spec/fixtures/recook/tag-icode.txt b/spec/fixtures/recook/tag-icode.txt new file mode 100644 index 0000000..92a078a --- /dev/null +++ b/spec/fixtures/recook/tag-icode.txt @@ -0,0 +1,85 @@ +Generated by generate.rb; edit that, not this file. +==== alone +[icode][b]x[/b] y[/icode] +==== empty +[icode][/icode] +==== mid-line +before [icode][b]x[/b] y[/icode] after +==== own-lines +[icode] +[b]x[/b] y +[/icode] +==== own-lines-between-text +before +[icode] +[b]x[/b] y +[/icode] +after +==== starts-mid-line-spans-lines +before [icode][b]x[/b] y +more[/icode] after +==== blank-line-inside +[icode] +[b]x[/b] y + +second paragraph +[/icode] +==== markdown-blocks-inside +[icode] +## Heading + +- one +- two + +> quoted +[/icode] +==== inline-markdown-inside +[icode]**bold** _italic_ `code` [link](https://example.com) :smile:[/icode] +==== in-blockquote +> [icode] +> [b]x[/b] y +> [/icode] +==== in-list-item +- [icode] + [b]x[/b] y + [/icode] +- next +==== in-table-cell +| head | +|---| +| [icode][b]x[/b] y[/icode] | +==== in-heading +## [icode][b]x[/b] y[/icode] +==== around-b +[icode][b][b]x[/b] y[/b][/icode] +==== in-b +[b]before [icode][b]x[/b] y[/icode] after[/b] +==== in-core-quote +[quote] +[icode][b]x[/b] y[/icode] +[/quote] +==== misnested-with-i +[icode][i][b]x[/b] y[/icode] tail[/i] +==== nested-in-itself +[icode]outer [icode]inner[/icode] outer[/icode] +==== repeated +[icode]one[/icode][icode]two[/icode] [icode]three[/icode] +==== tail-and-next-line +[icode][b]x[/b] y[/icode] tail +next line +==== blank-lines-around +before + + +[icode][b]x[/b] y[/icode] + + +after +==== unclosed +[icode][b]x[/b] y +==== unmatched-close +[b]x[/b] y[/icode] +==== escaped +\[icode][b]x[/b] y[/icode] +==== uppercase +[ICODE][b]x[/b] y[/ICODE] diff --git a/spec/fixtures/recook/tag-imagefloat.cooked b/spec/fixtures/recook/tag-imagefloat.cooked new file mode 100644 index 0000000..03b9351 --- /dev/null +++ b/spec/fixtures/recook/tag-imagefloat.cooked @@ -0,0 +1,122 @@ +==== alone +
text
+==== empty +
+==== mid-line +before
text
after +==== own-lines +
+
+text
+
+==== own-lines-between-text +before
+
+text
+
+after +==== starts-mid-line-spans-lines +before
+text
+more
+after +==== blank-line-inside +
+
+text

second paragraph
+
+==== markdown-blocks-inside +
+
+

Heading

+ +
+quoted
+
+
+==== inline-markdown-inside +
bold italic code link :smile:
+==== in-blockquote +
+
+
+text
+
+
+==== in-list-item + +==== in-table-cell +
+ + + + + + + + + + + +
head
text
+
+==== in-heading +

text

+==== around-b +
text
+==== in-b +before
text
after
+==== in-core-quote + +==== misnested-with-i +
text
+tail +==== nested-in-itself +
outer
inner
outer
+==== repeated +
one
+
two
+
three
+==== tail-and-next-line +
text
+tail
next line +==== blank-lines-around +before


text
+

after +==== unclosed +[imagefloat=left]text +==== unmatched-close +text[/imagefloat] +==== escaped +[imagefloat=left]text[/imagefloat] +==== uppercase +
text
+==== [imagefloat] alone +
text
+==== [imagefloat] own-lines +
+
+text
+
+==== [imagefloat=right] alone +
text
+==== [imagefloat=right] own-lines +
+
+text
+
diff --git a/spec/fixtures/recook/tag-imagefloat.txt b/spec/fixtures/recook/tag-imagefloat.txt new file mode 100644 index 0000000..c8b574f --- /dev/null +++ b/spec/fixtures/recook/tag-imagefloat.txt @@ -0,0 +1,97 @@ +Generated by generate.rb; edit that, not this file. +==== alone +[imagefloat=left]text[/imagefloat] +==== empty +[imagefloat=left][/imagefloat] +==== mid-line +before [imagefloat=left]text[/imagefloat] after +==== own-lines +[imagefloat=left] +text +[/imagefloat] +==== own-lines-between-text +before +[imagefloat=left] +text +[/imagefloat] +after +==== starts-mid-line-spans-lines +before [imagefloat=left]text +more[/imagefloat] after +==== blank-line-inside +[imagefloat=left] +text + +second paragraph +[/imagefloat] +==== markdown-blocks-inside +[imagefloat=left] +## Heading + +- one +- two + +> quoted +[/imagefloat] +==== inline-markdown-inside +[imagefloat=left]**bold** _italic_ `code` [link](https://example.com) :smile:[/imagefloat] +==== in-blockquote +> [imagefloat=left] +> text +> [/imagefloat] +==== in-list-item +- [imagefloat=left] + text + [/imagefloat] +- next +==== in-table-cell +| head | +|---| +| [imagefloat=left]text[/imagefloat] | +==== in-heading +## [imagefloat=left]text[/imagefloat] +==== around-b +[imagefloat=left][b]text[/b][/imagefloat] +==== in-b +[b]before [imagefloat=left]text[/imagefloat] after[/b] +==== in-core-quote +[quote] +[imagefloat=left]text[/imagefloat] +[/quote] +==== misnested-with-i +[imagefloat=left][i]text[/imagefloat] tail[/i] +==== nested-in-itself +[imagefloat=left]outer [imagefloat=left]inner[/imagefloat] outer[/imagefloat] +==== repeated +[imagefloat=left]one[/imagefloat][imagefloat=left]two[/imagefloat] [imagefloat=left]three[/imagefloat] +==== tail-and-next-line +[imagefloat=left]text[/imagefloat] tail +next line +==== blank-lines-around +before + + +[imagefloat=left]text[/imagefloat] + + +after +==== unclosed +[imagefloat=left]text +==== unmatched-close +text[/imagefloat] +==== escaped +\[imagefloat=left]text[/imagefloat] +==== uppercase +[IMAGEFLOAT=left]text[/IMAGEFLOAT] +==== [imagefloat] alone +[imagefloat]text[/imagefloat] +==== [imagefloat] own-lines +[imagefloat] +text +[/imagefloat] +==== [imagefloat=right] alone +[imagefloat=right]text[/imagefloat] +==== [imagefloat=right] own-lines +[imagefloat=right] +text +[/imagefloat] diff --git a/spec/fixtures/recook/tag-img.cooked b/spec/fixtures/recook/tag-img.cooked new file mode 100644 index 0000000..fe6ded2 --- /dev/null +++ b/spec/fixtures/recook/tag-img.cooked @@ -0,0 +1,83 @@ +==== alone + +==== empty + +==== mid-line +before after +==== own-lines + +==== own-lines-between-text +before
+
+after +==== starts-mid-line-spans-lines +before after +==== blank-line-inside +[img]
+https://example.com/a.png

second paragraph
+[/img] +==== markdown-blocks-inside +[img]

Heading

+ +
+quoted
+[/img]
+==== inline-markdown-inside + +==== in-blockquote +
+
+==== in-list-item + +==== in-table-cell +
+ + + + + + + + + + + +
head
+
+==== in-heading +

+==== around-b + +==== in-b +before after +==== in-core-quote + +==== misnested-with-i + tail[/i] +==== nested-in-itself + outer[/img] +==== repeated + +==== tail-and-next-line + tail
+next line +==== blank-lines-around +before





after +==== unclosed +[img]https://example.com/a.png +==== unmatched-close +https://example.com/a.png[/img] +==== escaped +[img]https://example.com/a.png[/img] +==== uppercase + diff --git a/spec/fixtures/recook/tag-img.txt b/spec/fixtures/recook/tag-img.txt new file mode 100644 index 0000000..4b2fc17 --- /dev/null +++ b/spec/fixtures/recook/tag-img.txt @@ -0,0 +1,85 @@ +Generated by generate.rb; edit that, not this file. +==== alone +[img]https://example.com/a.png[/img] +==== empty +[img][/img] +==== mid-line +before [img]https://example.com/a.png[/img] after +==== own-lines +[img] +https://example.com/a.png +[/img] +==== own-lines-between-text +before +[img] +https://example.com/a.png +[/img] +after +==== starts-mid-line-spans-lines +before [img]https://example.com/a.png +more[/img] after +==== blank-line-inside +[img] +https://example.com/a.png + +second paragraph +[/img] +==== markdown-blocks-inside +[img] +## Heading + +- one +- two + +> quoted +[/img] +==== inline-markdown-inside +[img]**bold** _italic_ `code` [link](https://example.com) :smile:[/img] +==== in-blockquote +> [img] +> https://example.com/a.png +> [/img] +==== in-list-item +- [img] + https://example.com/a.png + [/img] +- next +==== in-table-cell +| head | +|---| +| [img]https://example.com/a.png[/img] | +==== in-heading +## [img]https://example.com/a.png[/img] +==== around-b +[img][b]https://example.com/a.png[/b][/img] +==== in-b +[b]before [img]https://example.com/a.png[/img] after[/b] +==== in-core-quote +[quote] +[img]https://example.com/a.png[/img] +[/quote] +==== misnested-with-i +[img][i]https://example.com/a.png[/img] tail[/i] +==== nested-in-itself +[img]outer [img]inner[/img] outer[/img] +==== repeated +[img]one[/img][img]two[/img] [img]three[/img] +==== tail-and-next-line +[img]https://example.com/a.png[/img] tail +next line +==== blank-lines-around +before + + +[img]https://example.com/a.png[/img] + + +after +==== unclosed +[img]https://example.com/a.png +==== unmatched-close +https://example.com/a.png[/img] +==== escaped +\[img]https://example.com/a.png[/img] +==== uppercase +[IMG]https://example.com/a.png[/IMG] diff --git a/spec/fixtures/recook/tag-inlinespoiler.cooked b/spec/fixtures/recook/tag-inlinespoiler.cooked new file mode 100644 index 0000000..2e4ceea --- /dev/null +++ b/spec/fixtures/recook/tag-inlinespoiler.cooked @@ -0,0 +1,81 @@ +==== alone +text +==== empty + +==== mid-line +before text after +==== own-lines +text +==== own-lines-between-text +before
+text
+after +==== starts-mid-line-spans-lines +before text
+more
after +==== blank-line-inside +text
+
+second paragraph
+==== markdown-blocks-inside +## Heading
+
+- one
+- two
+
+> quoted
+==== inline-markdown-inside +bold italic code link :smile: +==== in-blockquote +
+text
+==== in-list-item + +==== in-table-cell +
+ + + + + + + + + + + +
head
text
+
+==== in-heading +

text

+==== around-b +text +==== in-b +before text after +==== in-core-quote + +==== misnested-with-i +text tail +==== nested-in-itself +outer inner outer +==== repeated +onetwo three +==== tail-and-next-line +text tail
+next line +==== blank-lines-around +before


text


after +==== unclosed +[inlinespoiler]text +==== unmatched-close +text[/inlinespoiler] +==== escaped +[inlinespoiler]text[/inlinespoiler] +==== uppercase +text diff --git a/spec/fixtures/recook/tag-inlinespoiler.txt b/spec/fixtures/recook/tag-inlinespoiler.txt new file mode 100644 index 0000000..a8d32f7 --- /dev/null +++ b/spec/fixtures/recook/tag-inlinespoiler.txt @@ -0,0 +1,85 @@ +Generated by generate.rb; edit that, not this file. +==== alone +[inlinespoiler]text[/inlinespoiler] +==== empty +[inlinespoiler][/inlinespoiler] +==== mid-line +before [inlinespoiler]text[/inlinespoiler] after +==== own-lines +[inlinespoiler] +text +[/inlinespoiler] +==== own-lines-between-text +before +[inlinespoiler] +text +[/inlinespoiler] +after +==== starts-mid-line-spans-lines +before [inlinespoiler]text +more[/inlinespoiler] after +==== blank-line-inside +[inlinespoiler] +text + +second paragraph +[/inlinespoiler] +==== markdown-blocks-inside +[inlinespoiler] +## Heading + +- one +- two + +> quoted +[/inlinespoiler] +==== inline-markdown-inside +[inlinespoiler]**bold** _italic_ `code` [link](https://example.com) :smile:[/inlinespoiler] +==== in-blockquote +> [inlinespoiler] +> text +> [/inlinespoiler] +==== in-list-item +- [inlinespoiler] + text + [/inlinespoiler] +- next +==== in-table-cell +| head | +|---| +| [inlinespoiler]text[/inlinespoiler] | +==== in-heading +## [inlinespoiler]text[/inlinespoiler] +==== around-b +[inlinespoiler][b]text[/b][/inlinespoiler] +==== in-b +[b]before [inlinespoiler]text[/inlinespoiler] after[/b] +==== in-core-quote +[quote] +[inlinespoiler]text[/inlinespoiler] +[/quote] +==== misnested-with-i +[inlinespoiler][i]text[/inlinespoiler] tail[/i] +==== nested-in-itself +[inlinespoiler]outer [inlinespoiler]inner[/inlinespoiler] outer[/inlinespoiler] +==== repeated +[inlinespoiler]one[/inlinespoiler][inlinespoiler]two[/inlinespoiler] [inlinespoiler]three[/inlinespoiler] +==== tail-and-next-line +[inlinespoiler]text[/inlinespoiler] tail +next line +==== blank-lines-around +before + + +[inlinespoiler]text[/inlinespoiler] + + +after +==== unclosed +[inlinespoiler]text +==== unmatched-close +text[/inlinespoiler] +==== escaped +\[inlinespoiler]text[/inlinespoiler] +==== uppercase +[INLINESPOILER]text[/INLINESPOILER] diff --git a/spec/fixtures/recook/tag-justify.cooked b/spec/fixtures/recook/tag-justify.cooked new file mode 100644 index 0000000..51265a1 --- /dev/null +++ b/spec/fixtures/recook/tag-justify.cooked @@ -0,0 +1,108 @@ +==== alone +
text
+==== empty +
+==== mid-line +before
text
after +==== own-lines +
+
+text
+
+==== own-lines-between-text +before
+
+text
+
+after +==== starts-mid-line-spans-lines +before
+text
+more
+after +==== blank-line-inside +
+
+text

second paragraph
+
+==== markdown-blocks-inside +
+
+

Heading

+ +
+quoted
+
+
+==== inline-markdown-inside +
bold italic code link :smile:
+==== in-blockquote +
+
+
+text
+
+
+==== in-list-item + +==== in-table-cell +
+ + + + + + + + + + + +
head
text
+
+==== in-heading +

text

+==== around-b +
text
+==== in-b +before
text
after
+==== in-core-quote + +==== misnested-with-i +
text
+tail +==== nested-in-itself +
outer
inner
outer
+==== repeated +
one
+
two
+
three
+==== tail-and-next-line +
text
+tail
next line +==== blank-lines-around +before


text
+

after +==== unclosed +[justify]text +==== unmatched-close +text[/justify] +==== escaped +[justify]text[/justify] +==== uppercase +
text
diff --git a/spec/fixtures/recook/tag-justify.txt b/spec/fixtures/recook/tag-justify.txt new file mode 100644 index 0000000..94f3819 --- /dev/null +++ b/spec/fixtures/recook/tag-justify.txt @@ -0,0 +1,85 @@ +Generated by generate.rb; edit that, not this file. +==== alone +[justify]text[/justify] +==== empty +[justify][/justify] +==== mid-line +before [justify]text[/justify] after +==== own-lines +[justify] +text +[/justify] +==== own-lines-between-text +before +[justify] +text +[/justify] +after +==== starts-mid-line-spans-lines +before [justify]text +more[/justify] after +==== blank-line-inside +[justify] +text + +second paragraph +[/justify] +==== markdown-blocks-inside +[justify] +## Heading + +- one +- two + +> quoted +[/justify] +==== inline-markdown-inside +[justify]**bold** _italic_ `code` [link](https://example.com) :smile:[/justify] +==== in-blockquote +> [justify] +> text +> [/justify] +==== in-list-item +- [justify] + text + [/justify] +- next +==== in-table-cell +| head | +|---| +| [justify]text[/justify] | +==== in-heading +## [justify]text[/justify] +==== around-b +[justify][b]text[/b][/justify] +==== in-b +[b]before [justify]text[/justify] after[/b] +==== in-core-quote +[quote] +[justify]text[/justify] +[/quote] +==== misnested-with-i +[justify][i]text[/justify] tail[/i] +==== nested-in-itself +[justify]outer [justify]inner[/justify] outer[/justify] +==== repeated +[justify]one[/justify][justify]two[/justify] [justify]three[/justify] +==== tail-and-next-line +[justify]text[/justify] tail +next line +==== blank-lines-around +before + + +[justify]text[/justify] + + +after +==== unclosed +[justify]text +==== unmatched-close +text[/justify] +==== escaped +\[justify]text[/justify] +==== uppercase +[JUSTIFY]text[/JUSTIFY] diff --git a/spec/fixtures/recook/tag-left.cooked b/spec/fixtures/recook/tag-left.cooked new file mode 100644 index 0000000..35a5787 --- /dev/null +++ b/spec/fixtures/recook/tag-left.cooked @@ -0,0 +1,108 @@ +==== alone +
text
+==== empty +
+==== mid-line +before
text
after +==== own-lines +
+
+text
+
+==== own-lines-between-text +before
+
+text
+
+
after +==== starts-mid-line-spans-lines +before
+text
+more
+after +==== blank-line-inside +
+
+text

second paragraph
+
+==== markdown-blocks-inside +
+
+

Heading

+ +
+quoted
+
+
+==== inline-markdown-inside +
bold italic code link :smile:
+==== in-blockquote +
+
+
+text
+
+
+==== in-list-item + +==== in-table-cell +
+ + + + + + + + + + + +
head
text
+
+==== in-heading +

text

+==== around-b +
text
+==== in-b +before
text
after
+==== in-core-quote + +==== misnested-with-i +
text
+tail +==== nested-in-itself +
outer
inner
outer
+==== repeated +
one
+
two
+
three
+==== tail-and-next-line +
text
+tail
next line +==== blank-lines-around +before


text
+


after +==== unclosed +[left]text +==== unmatched-close +text[/left] +==== escaped +[left]text[/left] +==== uppercase +
text
diff --git a/spec/fixtures/recook/tag-left.txt b/spec/fixtures/recook/tag-left.txt new file mode 100644 index 0000000..70fa742 --- /dev/null +++ b/spec/fixtures/recook/tag-left.txt @@ -0,0 +1,85 @@ +Generated by generate.rb; edit that, not this file. +==== alone +[left]text[/left] +==== empty +[left][/left] +==== mid-line +before [left]text[/left] after +==== own-lines +[left] +text +[/left] +==== own-lines-between-text +before +[left] +text +[/left] +after +==== starts-mid-line-spans-lines +before [left]text +more[/left] after +==== blank-line-inside +[left] +text + +second paragraph +[/left] +==== markdown-blocks-inside +[left] +## Heading + +- one +- two + +> quoted +[/left] +==== inline-markdown-inside +[left]**bold** _italic_ `code` [link](https://example.com) :smile:[/left] +==== in-blockquote +> [left] +> text +> [/left] +==== in-list-item +- [left] + text + [/left] +- next +==== in-table-cell +| head | +|---| +| [left]text[/left] | +==== in-heading +## [left]text[/left] +==== around-b +[left][b]text[/b][/left] +==== in-b +[b]before [left]text[/left] after[/b] +==== in-core-quote +[quote] +[left]text[/left] +[/quote] +==== misnested-with-i +[left][i]text[/left] tail[/i] +==== nested-in-itself +[left]outer [left]inner[/left] outer[/left] +==== repeated +[left]one[/left][left]two[/left] [left]three[/left] +==== tail-and-next-line +[left]text[/left] tail +next line +==== blank-lines-around +before + + +[left]text[/left] + + +after +==== unclosed +[left]text +==== unmatched-close +text[/left] +==== escaped +\[left]text[/left] +==== uppercase +[LEFT]text[/LEFT] diff --git a/spec/fixtures/recook/tag-mail.cooked b/spec/fixtures/recook/tag-mail.cooked new file mode 100644 index 0000000..9f133f4 --- /dev/null +++ b/spec/fixtures/recook/tag-mail.cooked @@ -0,0 +1,362 @@ +==== alone +
+
+
+Bob
+
+Hi
+
text
+ +
+==== empty +
+
+
+Bob
+
+Hi
+
+ +
+==== mid-line +before
Bob
Hi
text
after +==== own-lines +
+
+
+Bob
+
+Hi
+
+
+text
+
+ +
+==== own-lines-between-text +before
+
+
+Bob
+
+Hi
+
+
+text
+
+ +
+
after +==== starts-mid-line-spans-lines +before
+
+
+Bob
+
+Hi
+
+text
+more
+ +
+after +==== blank-line-inside +
+
+
+Bob
+
+Hi
+
+
+text

second paragraph
+
+ +
+==== markdown-blocks-inside +
+
+
+Bob
+
+Hi
+
+
+

Heading

+
    +
  • one
  • +
  • two
  • +
+
+quoted
+
+
+ +
+==== inline-markdown-inside +
+
+
+Bob
+
+Hi
+
bold italic code link :smile:
+ +
+==== in-blockquote +
+
+
+
+Bob
+
+Hi
+
+
+text
+
+ +
+
+==== in-list-item + +==== in-table-cell +
+ + + + + + + + + + + +
head
Bob
Hi
text
+
+==== in-heading +

Bob
Hi
text

+==== around-b +
+
+
+Bob
+
+Hi
+
text
+ +
+==== in-b +before
Bob
Hi
text
after
+==== in-core-quote + +==== misnested-with-i +
+
+
+Bob
+
+Hi
+
text
+ +
+tail +==== nested-in-itself +
+
+
+Bob
+
+Hi
+
outer
Bob
Hi
inner
outer
+ +
+==== repeated +
+
+
+Bob
+
+Hi
+
one
+ +
+
+
+
+Bob
+
+Hi
+
two
+ +
+
+
+
+Bob
+
+Hi
+
three
+ +
+==== tail-and-next-line +
+
+
+Bob
+
+Hi
+
text
+ +
+tail
next line +==== blank-lines-around +before


+
+
+Bob
+
+Hi
+
text
+ +
+


after +==== unclosed +[mail person=Bob subject=Hi]text +==== unmatched-close +text[/mail] +==== escaped +[mail person=Bob subject=Hi]text[/mail] +==== uppercase +
+
+
+Bob
+
+Hi
+
text
+ +
+==== [mail] alone +
+
+
+Unknown
+
+Empty
+
text
+ +
+==== [mail] own-lines +
+
+
+Unknown
+
+Empty
+
+
+text
+
+ +
+==== [mail type=receive person="Bob Smith" subject="Re: hi"] alone +
+
+
+Bob Smith
+
+Re: hi
+
text
+ +
+==== [mail type=receive person="Bob Smith" subject="Re: hi"] own-lines +
+
+
+Bob Smith
+
+Re: hi
+
+
+text
+
+ +
diff --git a/spec/fixtures/recook/tag-mail.txt b/spec/fixtures/recook/tag-mail.txt new file mode 100644 index 0000000..a81c92e --- /dev/null +++ b/spec/fixtures/recook/tag-mail.txt @@ -0,0 +1,97 @@ +Generated by generate.rb; edit that, not this file. +==== alone +[mail person=Bob subject=Hi]text[/mail] +==== empty +[mail person=Bob subject=Hi][/mail] +==== mid-line +before [mail person=Bob subject=Hi]text[/mail] after +==== own-lines +[mail person=Bob subject=Hi] +text +[/mail] +==== own-lines-between-text +before +[mail person=Bob subject=Hi] +text +[/mail] +after +==== starts-mid-line-spans-lines +before [mail person=Bob subject=Hi]text +more[/mail] after +==== blank-line-inside +[mail person=Bob subject=Hi] +text + +second paragraph +[/mail] +==== markdown-blocks-inside +[mail person=Bob subject=Hi] +## Heading + +- one +- two + +> quoted +[/mail] +==== inline-markdown-inside +[mail person=Bob subject=Hi]**bold** _italic_ `code` [link](https://example.com) :smile:[/mail] +==== in-blockquote +> [mail person=Bob subject=Hi] +> text +> [/mail] +==== in-list-item +- [mail person=Bob subject=Hi] + text + [/mail] +- next +==== in-table-cell +| head | +|---| +| [mail person=Bob subject=Hi]text[/mail] | +==== in-heading +## [mail person=Bob subject=Hi]text[/mail] +==== around-b +[mail person=Bob subject=Hi][b]text[/b][/mail] +==== in-b +[b]before [mail person=Bob subject=Hi]text[/mail] after[/b] +==== in-core-quote +[quote] +[mail person=Bob subject=Hi]text[/mail] +[/quote] +==== misnested-with-i +[mail person=Bob subject=Hi][i]text[/mail] tail[/i] +==== nested-in-itself +[mail person=Bob subject=Hi]outer [mail person=Bob subject=Hi]inner[/mail] outer[/mail] +==== repeated +[mail person=Bob subject=Hi]one[/mail][mail person=Bob subject=Hi]two[/mail] [mail person=Bob subject=Hi]three[/mail] +==== tail-and-next-line +[mail person=Bob subject=Hi]text[/mail] tail +next line +==== blank-lines-around +before + + +[mail person=Bob subject=Hi]text[/mail] + + +after +==== unclosed +[mail person=Bob subject=Hi]text +==== unmatched-close +text[/mail] +==== escaped +\[mail person=Bob subject=Hi]text[/mail] +==== uppercase +[MAIL person=Bob subject=Hi]text[/MAIL] +==== [mail] alone +[mail]text[/mail] +==== [mail] own-lines +[mail] +text +[/mail] +==== [mail type=receive person="Bob Smith" subject="Re: hi"] alone +[mail type=receive person="Bob Smith" subject="Re: hi"]text[/mail] +==== [mail type=receive person="Bob Smith" subject="Re: hi"] own-lines +[mail type=receive person="Bob Smith" subject="Re: hi"] +text +[/mail] diff --git a/spec/fixtures/recook/tag-message.cooked b/spec/fixtures/recook/tag-message.cooked new file mode 100644 index 0000000..6366876 --- /dev/null +++ b/spec/fixtures/recook/tag-message.cooked @@ -0,0 +1,181 @@ +==== alone +
+
text
+
+==== empty +
+
+
+==== mid-line +before
text
after +==== own-lines +
+
+
+text
+
+
+==== own-lines-between-text +before
+
+
+text
+
+
+
after +==== starts-mid-line-spans-lines +before
+
+text
+more
+
+after +==== blank-line-inside +
+
+
+text

second paragraph
+
+
+==== markdown-blocks-inside +
+
+
+

Heading

+
    +
  • one
  • +
  • two
  • +
+
+quoted
+
+
+
+==== inline-markdown-inside +
+
bold italic code link :smile:
+
+==== in-blockquote +
+
+
+
+text
+
+
+
+==== in-list-item + +==== in-table-cell +
+ + + + + + + + + + + +
head
text
+
+==== in-heading +

text

+==== around-b +
+
text
+
+==== in-b +before
text
after
+==== in-core-quote + +==== misnested-with-i +
+
text
+
+tail +==== nested-in-itself +
+
outer
inner
outer
+
+==== repeated +
+
one
+
+
+
two
+
+
+
three
+
+==== tail-and-next-line +
+
text
+
+tail
next line +==== blank-lines-around +before


+
text
+
+


after +==== unclosed +[message=me]text +==== unmatched-close +text[/message] +==== escaped +[message=me]text[/message] +==== uppercase +
+
text
+
+==== [message] alone +
+
text
+
+==== [message] own-lines +
+
+
+text
+
+
+==== [message=them] alone +
+
text
+
+==== [message=them] own-lines +
+
+
+text
+
+
+==== [message=left] alone +
+
text
+
+==== [message=left] own-lines +
+
+
+text
+
+
diff --git a/spec/fixtures/recook/tag-message.txt b/spec/fixtures/recook/tag-message.txt new file mode 100644 index 0000000..ec915ed --- /dev/null +++ b/spec/fixtures/recook/tag-message.txt @@ -0,0 +1,103 @@ +Generated by generate.rb; edit that, not this file. +==== alone +[message=me]text[/message] +==== empty +[message=me][/message] +==== mid-line +before [message=me]text[/message] after +==== own-lines +[message=me] +text +[/message] +==== own-lines-between-text +before +[message=me] +text +[/message] +after +==== starts-mid-line-spans-lines +before [message=me]text +more[/message] after +==== blank-line-inside +[message=me] +text + +second paragraph +[/message] +==== markdown-blocks-inside +[message=me] +## Heading + +- one +- two + +> quoted +[/message] +==== inline-markdown-inside +[message=me]**bold** _italic_ `code` [link](https://example.com) :smile:[/message] +==== in-blockquote +> [message=me] +> text +> [/message] +==== in-list-item +- [message=me] + text + [/message] +- next +==== in-table-cell +| head | +|---| +| [message=me]text[/message] | +==== in-heading +## [message=me]text[/message] +==== around-b +[message=me][b]text[/b][/message] +==== in-b +[b]before [message=me]text[/message] after[/b] +==== in-core-quote +[quote] +[message=me]text[/message] +[/quote] +==== misnested-with-i +[message=me][i]text[/message] tail[/i] +==== nested-in-itself +[message=me]outer [message=me]inner[/message] outer[/message] +==== repeated +[message=me]one[/message][message=me]two[/message] [message=me]three[/message] +==== tail-and-next-line +[message=me]text[/message] tail +next line +==== blank-lines-around +before + + +[message=me]text[/message] + + +after +==== unclosed +[message=me]text +==== unmatched-close +text[/message] +==== escaped +\[message=me]text[/message] +==== uppercase +[MESSAGE=me]text[/MESSAGE] +==== [message] alone +[message]text[/message] +==== [message] own-lines +[message] +text +[/message] +==== [message=them] alone +[message=them]text[/message] +==== [message=them] own-lines +[message=them] +text +[/message] +==== [message=left] alone +[message=left]text[/message] +==== [message=left] own-lines +[message=left] +text +[/message] diff --git a/spec/fixtures/recook/tag-newspaper.cooked b/spec/fixtures/recook/tag-newspaper.cooked new file mode 100644 index 0000000..4c539ba --- /dev/null +++ b/spec/fixtures/recook/tag-newspaper.cooked @@ -0,0 +1,108 @@ +==== alone +
text
+==== empty +
+==== mid-line +before
text
after +==== own-lines +
+
+text
+
+==== own-lines-between-text +before
+
+text
+
+after +==== starts-mid-line-spans-lines +before
+text
+more
+after +==== blank-line-inside +
+
+text

second paragraph
+
+==== markdown-blocks-inside +
+
+

Heading

+ +
+quoted
+
+
+==== inline-markdown-inside +
bold italic code link :smile:
+==== in-blockquote +
+
+
+text
+
+
+==== in-list-item + +==== in-table-cell +
+ + + + + + + + + + + +
head
text
+
+==== in-heading +

text

+==== around-b +
text
+==== in-b +before
text
after
+==== in-core-quote + +==== misnested-with-i +
text
+tail +==== nested-in-itself +
outer
inner
outer
+==== repeated +
one
+
two
+
three
+==== tail-and-next-line +
text
+tail
next line +==== blank-lines-around +before


text
+

after +==== unclosed +[newspaper]text +==== unmatched-close +text[/newspaper] +==== escaped +[newspaper]text[/newspaper] +==== uppercase +
text
diff --git a/spec/fixtures/recook/tag-newspaper.txt b/spec/fixtures/recook/tag-newspaper.txt new file mode 100644 index 0000000..43a7bef --- /dev/null +++ b/spec/fixtures/recook/tag-newspaper.txt @@ -0,0 +1,85 @@ +Generated by generate.rb; edit that, not this file. +==== alone +[newspaper]text[/newspaper] +==== empty +[newspaper][/newspaper] +==== mid-line +before [newspaper]text[/newspaper] after +==== own-lines +[newspaper] +text +[/newspaper] +==== own-lines-between-text +before +[newspaper] +text +[/newspaper] +after +==== starts-mid-line-spans-lines +before [newspaper]text +more[/newspaper] after +==== blank-line-inside +[newspaper] +text + +second paragraph +[/newspaper] +==== markdown-blocks-inside +[newspaper] +## Heading + +- one +- two + +> quoted +[/newspaper] +==== inline-markdown-inside +[newspaper]**bold** _italic_ `code` [link](https://example.com) :smile:[/newspaper] +==== in-blockquote +> [newspaper] +> text +> [/newspaper] +==== in-list-item +- [newspaper] + text + [/newspaper] +- next +==== in-table-cell +| head | +|---| +| [newspaper]text[/newspaper] | +==== in-heading +## [newspaper]text[/newspaper] +==== around-b +[newspaper][b]text[/b][/newspaper] +==== in-b +[b]before [newspaper]text[/newspaper] after[/b] +==== in-core-quote +[quote] +[newspaper]text[/newspaper] +[/quote] +==== misnested-with-i +[newspaper][i]text[/newspaper] tail[/i] +==== nested-in-itself +[newspaper]outer [newspaper]inner[/newspaper] outer[/newspaper] +==== repeated +[newspaper]one[/newspaper][newspaper]two[/newspaper] [newspaper]three[/newspaper] +==== tail-and-next-line +[newspaper]text[/newspaper] tail +next line +==== blank-lines-around +before + + +[newspaper]text[/newspaper] + + +after +==== unclosed +[newspaper]text +==== unmatched-close +text[/newspaper] +==== escaped +\[newspaper]text[/newspaper] +==== uppercase +[NEWSPAPER]text[/NEWSPAPER] diff --git a/spec/fixtures/recook/tag-nobr.cooked b/spec/fixtures/recook/tag-nobr.cooked new file mode 100644 index 0000000..e7e491c --- /dev/null +++ b/spec/fixtures/recook/tag-nobr.cooked @@ -0,0 +1,110 @@ +==== alone +one +two +==== empty + +==== mid-line +before one +two after +==== own-lines +one +two +==== own-lines-between-text +before
+one +two +
after +==== starts-mid-line-spans-lines +before one +two +more after +==== blank-line-inside +one +two + +second paragraph +==== markdown-blocks-inside +

Heading

+ + + + + +
+quoted
+==== inline-markdown-inside +bold italic code link :smile: +==== in-blockquote +
+ +one +two +
+==== in-list-item + +==== in-table-cell +
+ + + + + + + + + + + +
head
one +two
+
+==== in-heading +

one +two

+==== around-b +one +two +==== in-b +before one +two after +==== in-core-quote + +==== misnested-with-i +one +twotail +==== nested-in-itself +outer inner outer +==== repeated +onetwothree +==== tail-and-next-line +one +twotail
next line +==== blank-lines-around +before


one +two


after +==== unclosed +[nobr]one
+two +==== unmatched-close +one
+two[/nobr] +==== escaped +[nobr]one
+two[/nobr] +==== uppercase +one +two diff --git a/spec/fixtures/recook/tag-nobr.txt b/spec/fixtures/recook/tag-nobr.txt new file mode 100644 index 0000000..6012d00 --- /dev/null +++ b/spec/fixtures/recook/tag-nobr.txt @@ -0,0 +1,105 @@ +Generated by generate.rb; edit that, not this file. +==== alone +[nobr]one +two[/nobr] +==== empty +[nobr][/nobr] +==== mid-line +before [nobr]one +two[/nobr] after +==== own-lines +[nobr] +one +two +[/nobr] +==== own-lines-between-text +before +[nobr] +one +two +[/nobr] +after +==== starts-mid-line-spans-lines +before [nobr]one +two +more[/nobr] after +==== blank-line-inside +[nobr] +one +two + +second paragraph +[/nobr] +==== markdown-blocks-inside +[nobr] +## Heading + +- one +- two + +> quoted +[/nobr] +==== inline-markdown-inside +[nobr]**bold** _italic_ `code` [link](https://example.com) :smile:[/nobr] +==== in-blockquote +> [nobr] +> one +two +> [/nobr] +==== in-list-item +- [nobr] + one +two + [/nobr] +- next +==== in-table-cell +| head | +|---| +| [nobr]one +two[/nobr] | +==== in-heading +## [nobr]one +two[/nobr] +==== around-b +[nobr][b]one +two[/b][/nobr] +==== in-b +[b]before [nobr]one +two[/nobr] after[/b] +==== in-core-quote +[quote] +[nobr]one +two[/nobr] +[/quote] +==== misnested-with-i +[nobr][i]one +two[/nobr] tail[/i] +==== nested-in-itself +[nobr]outer [nobr]inner[/nobr] outer[/nobr] +==== repeated +[nobr]one[/nobr][nobr]two[/nobr] [nobr]three[/nobr] +==== tail-and-next-line +[nobr]one +two[/nobr] tail +next line +==== blank-lines-around +before + + +[nobr]one +two[/nobr] + + +after +==== unclosed +[nobr]one +two +==== unmatched-close +one +two[/nobr] +==== escaped +\[nobr]one +two[/nobr] +==== uppercase +[NOBR]one +two[/NOBR] diff --git a/spec/fixtures/recook/tag-note.cooked b/spec/fixtures/recook/tag-note.cooked new file mode 100644 index 0000000..ece4e3a --- /dev/null +++ b/spec/fixtures/recook/tag-note.cooked @@ -0,0 +1,188 @@ +==== alone +
+
+
text +
+
+==== empty +
+
+
+
+
+==== mid-line +before
text
after +==== own-lines +
+
+
+
+text
+ +
+
+==== own-lines-between-text +before
+
+
+
+text
+ +
+
+
after +==== starts-mid-line-spans-lines +before
+
+
+text
+more +
+
+after +==== blank-line-inside +
+
+
+
+text

second paragraph
+ +
+
+==== markdown-blocks-inside +
+
+
+
+

Heading

+
    +
  • one
  • +
  • two
  • +
+
+quoted
+
+ +
+
+==== inline-markdown-inside +
+
+
bold italic code link :smile: +
+
+==== in-blockquote +
+
+
+
+
+text
+ +
+
+
+==== in-list-item + +==== in-table-cell +
+ + + + + + + + + + + +
head
text
+
+==== in-heading +

text

+==== around-b +
+
+
text +
+
+==== in-b +before
text
after
+==== in-core-quote + +==== misnested-with-i +
+
+
text +
+
+tail +==== nested-in-itself +
+
+
outer
inner
outer +
+
+==== repeated +
+
+
one +
+
+
+
+
two +
+
+
+
+
three +
+
+==== tail-and-next-line +
+
+
text +
+
+tail
next line +==== blank-lines-around +before


+
+
text +
+
+


after +==== unclosed +[note]text +==== unmatched-close +text[/note] +==== escaped +[note]text[/note] +==== uppercase +
+
+
text +
+
diff --git a/spec/fixtures/recook/tag-note.txt b/spec/fixtures/recook/tag-note.txt new file mode 100644 index 0000000..253962b --- /dev/null +++ b/spec/fixtures/recook/tag-note.txt @@ -0,0 +1,85 @@ +Generated by generate.rb; edit that, not this file. +==== alone +[note]text[/note] +==== empty +[note][/note] +==== mid-line +before [note]text[/note] after +==== own-lines +[note] +text +[/note] +==== own-lines-between-text +before +[note] +text +[/note] +after +==== starts-mid-line-spans-lines +before [note]text +more[/note] after +==== blank-line-inside +[note] +text + +second paragraph +[/note] +==== markdown-blocks-inside +[note] +## Heading + +- one +- two + +> quoted +[/note] +==== inline-markdown-inside +[note]**bold** _italic_ `code` [link](https://example.com) :smile:[/note] +==== in-blockquote +> [note] +> text +> [/note] +==== in-list-item +- [note] + text + [/note] +- next +==== in-table-cell +| head | +|---| +| [note]text[/note] | +==== in-heading +## [note]text[/note] +==== around-b +[note][b]text[/b][/note] +==== in-b +[b]before [note]text[/note] after[/b] +==== in-core-quote +[quote] +[note]text[/note] +[/quote] +==== misnested-with-i +[note][i]text[/note] tail[/i] +==== nested-in-itself +[note]outer [note]inner[/note] outer[/note] +==== repeated +[note]one[/note][note]two[/note] [note]three[/note] +==== tail-and-next-line +[note]text[/note] tail +next line +==== blank-lines-around +before + + +[note]text[/note] + + +after +==== unclosed +[note]text +==== unmatched-close +text[/note] +==== escaped +\[note]text[/note] +==== uppercase +[NOTE]text[/NOTE] diff --git a/spec/fixtures/recook/tag-ooc.cooked b/spec/fixtures/recook/tag-ooc.cooked new file mode 100644 index 0000000..aa4af3a --- /dev/null +++ b/spec/fixtures/recook/tag-ooc.cooked @@ -0,0 +1,96 @@ +==== alone +
text
+==== empty +
+==== mid-line +before
text
after +==== own-lines +
+text
+==== own-lines-between-text +before
+text
+after +==== starts-mid-line-spans-lines +before
+text
+more
+after +==== blank-line-inside +
+text

second paragraph
+==== markdown-blocks-inside +
+

Heading

+ +
+quoted
+
+==== inline-markdown-inside +
bold italic code link :smile:
+==== in-blockquote +
+
+text
+
+==== in-list-item + +==== in-table-cell +
+ + + + + + + + + + + +
head
text
+
+==== in-heading +

text

+==== around-b +
text
+==== in-b +before
text
after
+==== in-core-quote + +==== misnested-with-i +
text
+tail +==== nested-in-itself +
outer
inner
outer
+==== repeated +
one
+
two
+
three
+==== tail-and-next-line +
text
+tail
next line +==== blank-lines-around +before


text
+

after +==== unclosed +[ooc]text +==== unmatched-close +text[/ooc] +==== escaped +[ooc]text[/ooc] +==== uppercase +
text
diff --git a/spec/fixtures/recook/tag-ooc.txt b/spec/fixtures/recook/tag-ooc.txt new file mode 100644 index 0000000..180d292 --- /dev/null +++ b/spec/fixtures/recook/tag-ooc.txt @@ -0,0 +1,85 @@ +Generated by generate.rb; edit that, not this file. +==== alone +[ooc]text[/ooc] +==== empty +[ooc][/ooc] +==== mid-line +before [ooc]text[/ooc] after +==== own-lines +[ooc] +text +[/ooc] +==== own-lines-between-text +before +[ooc] +text +[/ooc] +after +==== starts-mid-line-spans-lines +before [ooc]text +more[/ooc] after +==== blank-line-inside +[ooc] +text + +second paragraph +[/ooc] +==== markdown-blocks-inside +[ooc] +## Heading + +- one +- two + +> quoted +[/ooc] +==== inline-markdown-inside +[ooc]**bold** _italic_ `code` [link](https://example.com) :smile:[/ooc] +==== in-blockquote +> [ooc] +> text +> [/ooc] +==== in-list-item +- [ooc] + text + [/ooc] +- next +==== in-table-cell +| head | +|---| +| [ooc]text[/ooc] | +==== in-heading +## [ooc]text[/ooc] +==== around-b +[ooc][b]text[/b][/ooc] +==== in-b +[b]before [ooc]text[/ooc] after[/b] +==== in-core-quote +[quote] +[ooc]text[/ooc] +[/quote] +==== misnested-with-i +[ooc][i]text[/ooc] tail[/i] +==== nested-in-itself +[ooc]outer [ooc]inner[/ooc] outer[/ooc] +==== repeated +[ooc]one[/ooc][ooc]two[/ooc] [ooc]three[/ooc] +==== tail-and-next-line +[ooc]text[/ooc] tail +next line +==== blank-lines-around +before + + +[ooc]text[/ooc] + + +after +==== unclosed +[ooc]text +==== unmatched-close +text[/ooc] +==== escaped +\[ooc]text[/ooc] +==== uppercase +[OOC]text[/OOC] diff --git a/spec/fixtures/recook/tag-pindent.cooked b/spec/fixtures/recook/tag-pindent.cooked new file mode 100644 index 0000000..199c3a5 --- /dev/null +++ b/spec/fixtures/recook/tag-pindent.cooked @@ -0,0 +1,96 @@ +==== alone +text +==== empty + +==== mid-line +before text after +==== own-lines +
+text
+
+==== own-lines-between-text +before
+
+text
+

+after +==== starts-mid-line-spans-lines +before text
+more
after +==== blank-line-inside +
+text
+
+second paragraph
+
+==== markdown-blocks-inside +
+
+

Heading

+ +
+quoted
+
+
+==== inline-markdown-inside +bold italic code link :smile: +==== in-blockquote +
+
+text
+
+==== in-list-item + +==== in-table-cell +
+ + + + + + + + + + + +
head
text
+
+==== in-heading +

text

+==== around-b +text +==== in-b +before text after +==== in-core-quote + +==== misnested-with-i +text tail +==== nested-in-itself +outer inner outer +==== repeated +onetwo three +==== tail-and-next-line +text tail
+next line +==== blank-lines-around +before


text


after +==== unclosed +[pindent]text +==== unmatched-close +text[/pindent] +==== escaped +[pindent]text[/pindent] +==== uppercase +text diff --git a/spec/fixtures/recook/tag-pindent.txt b/spec/fixtures/recook/tag-pindent.txt new file mode 100644 index 0000000..0f9825b --- /dev/null +++ b/spec/fixtures/recook/tag-pindent.txt @@ -0,0 +1,85 @@ +Generated by generate.rb; edit that, not this file. +==== alone +[pindent]text[/pindent] +==== empty +[pindent][/pindent] +==== mid-line +before [pindent]text[/pindent] after +==== own-lines +[pindent] +text +[/pindent] +==== own-lines-between-text +before +[pindent] +text +[/pindent] +after +==== starts-mid-line-spans-lines +before [pindent]text +more[/pindent] after +==== blank-line-inside +[pindent] +text + +second paragraph +[/pindent] +==== markdown-blocks-inside +[pindent] +## Heading + +- one +- two + +> quoted +[/pindent] +==== inline-markdown-inside +[pindent]**bold** _italic_ `code` [link](https://example.com) :smile:[/pindent] +==== in-blockquote +> [pindent] +> text +> [/pindent] +==== in-list-item +- [pindent] + text + [/pindent] +- next +==== in-table-cell +| head | +|---| +| [pindent]text[/pindent] | +==== in-heading +## [pindent]text[/pindent] +==== around-b +[pindent][b]text[/b][/pindent] +==== in-b +[b]before [pindent]text[/pindent] after[/b] +==== in-core-quote +[quote] +[pindent]text[/pindent] +[/quote] +==== misnested-with-i +[pindent][i]text[/pindent] tail[/i] +==== nested-in-itself +[pindent]outer [pindent]inner[/pindent] outer[/pindent] +==== repeated +[pindent]one[/pindent][pindent]two[/pindent] [pindent]three[/pindent] +==== tail-and-next-line +[pindent]text[/pindent] tail +next line +==== blank-lines-around +before + + +[pindent]text[/pindent] + + +after +==== unclosed +[pindent]text +==== unmatched-close +text[/pindent] +==== escaped +\[pindent]text[/pindent] +==== uppercase +[PINDENT]text[/PINDENT] diff --git a/spec/fixtures/recook/tag-plain.cooked b/spec/fixtures/recook/tag-plain.cooked new file mode 100644 index 0000000..f440087 --- /dev/null +++ b/spec/fixtures/recook/tag-plain.cooked @@ -0,0 +1,85 @@ +==== alone +[b]not bold[/b] :smile: +==== empty + +==== mid-line +before [b]not bold[/b] :smile: after +==== own-lines +
+[b]not bold[/b] :smile:
+==== own-lines-between-text +before

+[b]not bold[/b] :smile:
+
after +==== starts-mid-line-spans-lines +before [b]not bold[/b] :smile:
+more after +==== blank-line-inside +
+[b]not bold[/b] :smile:
+
+second paragraph
+==== markdown-blocks-inside +
+## Heading
+
+- one
+- two
+
+> quoted
+==== inline-markdown-inside +**bold** _italic_ `code` [link](https://example.com) :smile: +==== in-blockquote +

+[b]not bold[/b] :smile:
+
+==== in-list-item + +==== in-table-cell +
+ + + + + + + + + + + +
head
[b]not bold[/b] :smile:
+
+==== in-heading +

[b]not bold[/b] :smile:

+==== around-b +[b][b]not bold[/b] :smile:[/b] +==== in-b +before [b]not bold[/b] :smile: after +==== in-core-quote + +==== misnested-with-i +[i][b]not bold[/b] :smile: tail[/i] +==== nested-in-itself +outer [plain]inner[/plain] outer +==== repeated +onetwo three +==== tail-and-next-line +[b]not bold[/b] :smile: tail
next line +==== blank-lines-around +before


[b]not bold[/b] :smile:


after +==== unclosed +[plain]not bold :smile: +==== unmatched-close +not bold :smile:[/plain] +==== escaped +[plain]not bold :smile:[/plain] +==== uppercase +[b]not bold[/b] :smile: diff --git a/spec/fixtures/recook/tag-plain.txt b/spec/fixtures/recook/tag-plain.txt new file mode 100644 index 0000000..1c0bd2d --- /dev/null +++ b/spec/fixtures/recook/tag-plain.txt @@ -0,0 +1,85 @@ +Generated by generate.rb; edit that, not this file. +==== alone +[plain][b]not bold[/b] :smile:[/plain] +==== empty +[plain][/plain] +==== mid-line +before [plain][b]not bold[/b] :smile:[/plain] after +==== own-lines +[plain] +[b]not bold[/b] :smile: +[/plain] +==== own-lines-between-text +before +[plain] +[b]not bold[/b] :smile: +[/plain] +after +==== starts-mid-line-spans-lines +before [plain][b]not bold[/b] :smile: +more[/plain] after +==== blank-line-inside +[plain] +[b]not bold[/b] :smile: + +second paragraph +[/plain] +==== markdown-blocks-inside +[plain] +## Heading + +- one +- two + +> quoted +[/plain] +==== inline-markdown-inside +[plain]**bold** _italic_ `code` [link](https://example.com) :smile:[/plain] +==== in-blockquote +> [plain] +> [b]not bold[/b] :smile: +> [/plain] +==== in-list-item +- [plain] + [b]not bold[/b] :smile: + [/plain] +- next +==== in-table-cell +| head | +|---| +| [plain][b]not bold[/b] :smile:[/plain] | +==== in-heading +## [plain][b]not bold[/b] :smile:[/plain] +==== around-b +[plain][b][b]not bold[/b] :smile:[/b][/plain] +==== in-b +[b]before [plain][b]not bold[/b] :smile:[/plain] after[/b] +==== in-core-quote +[quote] +[plain][b]not bold[/b] :smile:[/plain] +[/quote] +==== misnested-with-i +[plain][i][b]not bold[/b] :smile:[/plain] tail[/i] +==== nested-in-itself +[plain]outer [plain]inner[/plain] outer[/plain] +==== repeated +[plain]one[/plain][plain]two[/plain] [plain]three[/plain] +==== tail-and-next-line +[plain][b]not bold[/b] :smile:[/plain] tail +next line +==== blank-lines-around +before + + +[plain][b]not bold[/b] :smile:[/plain] + + +after +==== unclosed +[plain][b]not bold[/b] :smile: +==== unmatched-close +[b]not bold[/b] :smile:[/plain] +==== escaped +\[plain][b]not bold[/b] :smile:[/plain] +==== uppercase +[PLAIN][b]not bold[/b] :smile:[/PLAIN] diff --git a/spec/fixtures/recook/tag-print.cooked b/spec/fixtures/recook/tag-print.cooked new file mode 100644 index 0000000..f0aeb00 --- /dev/null +++ b/spec/fixtures/recook/tag-print.cooked @@ -0,0 +1,136 @@ +==== alone +
text
+==== empty +
+==== mid-line +before
text
after +==== own-lines +
+
+text
+
+==== own-lines-between-text +before
+
+text
+
+after +==== starts-mid-line-spans-lines +before
+text
+more
+after +==== blank-line-inside +
+
+text

second paragraph
+
+==== markdown-blocks-inside +
+
+

Heading

+ +
+quoted
+
+
+==== inline-markdown-inside +
bold italic code link :smile:
+==== in-blockquote +
+
+
+text
+
+
+==== in-list-item + +==== in-table-cell +
+ + + + + + + + + + + +
head
text
+
+==== in-heading +

text

+==== around-b +
text
+==== in-b +before
text
after
+==== in-core-quote + +==== misnested-with-i +
text
+tail +==== nested-in-itself +
outer
inner
outer
+==== repeated +
one
+
two
+
three
+==== tail-and-next-line +
text
+tail
next line +==== blank-lines-around +before


text
+

after +==== unclosed +[print=line]text +==== unmatched-close +text[/print] +==== escaped +[print=line]text[/print] +==== uppercase +
text
+==== [print] alone +
text
+==== [print] own-lines +
+
+text
+
+==== [print=graph] alone +
text
+==== [print=graph] own-lines +
+
+text
+
+==== [print=parchment] alone +
text
+==== [print=parchment] own-lines +
+
+text
+
+==== [print=unknown] alone +
text
+==== [print=unknown] own-lines +
+
+text
+
diff --git a/spec/fixtures/recook/tag-print.txt b/spec/fixtures/recook/tag-print.txt new file mode 100644 index 0000000..70f326e --- /dev/null +++ b/spec/fixtures/recook/tag-print.txt @@ -0,0 +1,109 @@ +Generated by generate.rb; edit that, not this file. +==== alone +[print=line]text[/print] +==== empty +[print=line][/print] +==== mid-line +before [print=line]text[/print] after +==== own-lines +[print=line] +text +[/print] +==== own-lines-between-text +before +[print=line] +text +[/print] +after +==== starts-mid-line-spans-lines +before [print=line]text +more[/print] after +==== blank-line-inside +[print=line] +text + +second paragraph +[/print] +==== markdown-blocks-inside +[print=line] +## Heading + +- one +- two + +> quoted +[/print] +==== inline-markdown-inside +[print=line]**bold** _italic_ `code` [link](https://example.com) :smile:[/print] +==== in-blockquote +> [print=line] +> text +> [/print] +==== in-list-item +- [print=line] + text + [/print] +- next +==== in-table-cell +| head | +|---| +| [print=line]text[/print] | +==== in-heading +## [print=line]text[/print] +==== around-b +[print=line][b]text[/b][/print] +==== in-b +[b]before [print=line]text[/print] after[/b] +==== in-core-quote +[quote] +[print=line]text[/print] +[/quote] +==== misnested-with-i +[print=line][i]text[/print] tail[/i] +==== nested-in-itself +[print=line]outer [print=line]inner[/print] outer[/print] +==== repeated +[print=line]one[/print][print=line]two[/print] [print=line]three[/print] +==== tail-and-next-line +[print=line]text[/print] tail +next line +==== blank-lines-around +before + + +[print=line]text[/print] + + +after +==== unclosed +[print=line]text +==== unmatched-close +text[/print] +==== escaped +\[print=line]text[/print] +==== uppercase +[PRINT=line]text[/PRINT] +==== [print] alone +[print]text[/print] +==== [print] own-lines +[print] +text +[/print] +==== [print=graph] alone +[print=graph]text[/print] +==== [print=graph] own-lines +[print=graph] +text +[/print] +==== [print=parchment] alone +[print=parchment]text[/print] +==== [print=parchment] own-lines +[print=parchment] +text +[/print] +==== [print=unknown] alone +[print=unknown]text[/print] +==== [print=unknown] own-lines +[print=unknown] +text +[/print] diff --git a/spec/fixtures/recook/tag-progress.cooked b/spec/fixtures/recook/tag-progress.cooked new file mode 100644 index 0000000..de0e70e --- /dev/null +++ b/spec/fixtures/recook/tag-progress.cooked @@ -0,0 +1,202 @@ +==== alone +
+
text
+
+
+
+==== empty +
+
+
+
+
+==== mid-line +before
text
after +==== own-lines +
+
+text
+
+
+
+==== own-lines-between-text +before
+
+text
+
+
+
+
after +==== starts-mid-line-spans-lines +before
+
+text
+more
+
+
+
+after +==== blank-line-inside +
+
+text

second paragraph
+
+
+
+==== markdown-blocks-inside +
+
+

Heading

+
    +
  • one
  • +
  • two
  • +
+
+quoted
+
+
+
+
+==== inline-markdown-inside +
+
bold italic code link :smile:
+
+
+
+==== in-blockquote +
+
+
+text
+
+
+
+
+==== in-list-item + +==== in-table-cell +
+ + + + + + + + + + + +
head
text
+
+==== in-heading +

text

+==== around-b +
+
text
+
+
+
+==== in-b +before
text
after
+==== in-core-quote + +==== misnested-with-i +
+
text
+
+
+
+tail +==== nested-in-itself +
+
outer
inner
outer
+
+
+
+==== repeated +
+
one
+
+
+
+
+
two
+
+
+
+
+
three
+
+
+
+==== tail-and-next-line +
+
text
+
+
+
+tail
next line +==== blank-lines-around +before


+
text
+
+
+
+


after +==== unclosed +[progress=40]text +==== unmatched-close +text[/progress] +==== escaped +[progress=40]text[/progress] +==== uppercase +
+
text
+
+
+
+==== [progress] alone +
+
text
+
+
+
+==== [progress] own-lines +
+
+text
+
+
+
+==== [progress=150] alone +
+
text
+
+
+
+==== [progress=150] own-lines +
+
+text
+
+
+
diff --git a/spec/fixtures/recook/tag-progress.txt b/spec/fixtures/recook/tag-progress.txt new file mode 100644 index 0000000..f32c115 --- /dev/null +++ b/spec/fixtures/recook/tag-progress.txt @@ -0,0 +1,97 @@ +Generated by generate.rb; edit that, not this file. +==== alone +[progress=40]text[/progress] +==== empty +[progress=40][/progress] +==== mid-line +before [progress=40]text[/progress] after +==== own-lines +[progress=40] +text +[/progress] +==== own-lines-between-text +before +[progress=40] +text +[/progress] +after +==== starts-mid-line-spans-lines +before [progress=40]text +more[/progress] after +==== blank-line-inside +[progress=40] +text + +second paragraph +[/progress] +==== markdown-blocks-inside +[progress=40] +## Heading + +- one +- two + +> quoted +[/progress] +==== inline-markdown-inside +[progress=40]**bold** _italic_ `code` [link](https://example.com) :smile:[/progress] +==== in-blockquote +> [progress=40] +> text +> [/progress] +==== in-list-item +- [progress=40] + text + [/progress] +- next +==== in-table-cell +| head | +|---| +| [progress=40]text[/progress] | +==== in-heading +## [progress=40]text[/progress] +==== around-b +[progress=40][b]text[/b][/progress] +==== in-b +[b]before [progress=40]text[/progress] after[/b] +==== in-core-quote +[quote] +[progress=40]text[/progress] +[/quote] +==== misnested-with-i +[progress=40][i]text[/progress] tail[/i] +==== nested-in-itself +[progress=40]outer [progress=40]inner[/progress] outer[/progress] +==== repeated +[progress=40]one[/progress][progress=40]two[/progress] [progress=40]three[/progress] +==== tail-and-next-line +[progress=40]text[/progress] tail +next line +==== blank-lines-around +before + + +[progress=40]text[/progress] + + +after +==== unclosed +[progress=40]text +==== unmatched-close +text[/progress] +==== escaped +\[progress=40]text[/progress] +==== uppercase +[PROGRESS=40]text[/PROGRESS] +==== [progress] alone +[progress]text[/progress] +==== [progress] own-lines +[progress] +text +[/progress] +==== [progress=150] alone +[progress=150]text[/progress] +==== [progress=150] own-lines +[progress=150] +text +[/progress] diff --git a/spec/fixtures/recook/tag-quote.cooked b/spec/fixtures/recook/tag-quote.cooked new file mode 100644 index 0000000..ccfae77 --- /dev/null +++ b/spec/fixtures/recook/tag-quote.cooked @@ -0,0 +1,143 @@ +==== alone + +==== empty +[quote][/quote] +==== mid-line +before [quote]text[/quote] after +==== own-lines + +==== own-lines-between-text +before
+after +==== starts-mid-line-spans-lines +before [quote]text
+more[/quote] after +==== blank-line-inside + +==== markdown-blocks-inside + +==== inline-markdown-inside + +==== in-blockquote +
+ +
+==== in-list-item + +==== in-table-cell +
+ + + + + + + + + + + +
head
[quote]text[/quote]
+
+==== in-heading +

[quote]text[/quote]

+==== around-b + +==== in-b +before [quote]text[/quote] after +==== in-core-quote + +==== misnested-with-i +[quote]text[/quote] tail +==== nested-in-itself + +==== repeated + +==== tail-and-next-line +[quote]text[/quote] tail
+next line +==== blank-lines-around +before


+

after +==== unclosed +[quote]text +==== unmatched-close +text[/quote] +==== escaped +[quote]text[/quote] +==== uppercase + +==== [quote="system, post:1, topic:1"] alone + +==== [quote="system, post:1, topic:1"] own-lines + diff --git a/spec/fixtures/recook/tag-quote.txt b/spec/fixtures/recook/tag-quote.txt new file mode 100644 index 0000000..592b097 --- /dev/null +++ b/spec/fixtures/recook/tag-quote.txt @@ -0,0 +1,91 @@ +Generated by generate.rb; edit that, not this file. +==== alone +[quote]text[/quote] +==== empty +[quote][/quote] +==== mid-line +before [quote]text[/quote] after +==== own-lines +[quote] +text +[/quote] +==== own-lines-between-text +before +[quote] +text +[/quote] +after +==== starts-mid-line-spans-lines +before [quote]text +more[/quote] after +==== blank-line-inside +[quote] +text + +second paragraph +[/quote] +==== markdown-blocks-inside +[quote] +## Heading + +- one +- two + +> quoted +[/quote] +==== inline-markdown-inside +[quote]**bold** _italic_ `code` [link](https://example.com) :smile:[/quote] +==== in-blockquote +> [quote] +> text +> [/quote] +==== in-list-item +- [quote] + text + [/quote] +- next +==== in-table-cell +| head | +|---| +| [quote]text[/quote] | +==== in-heading +## [quote]text[/quote] +==== around-b +[quote][b]text[/b][/quote] +==== in-b +[b]before [quote]text[/quote] after[/b] +==== in-core-quote +[quote] +[quote]text[/quote] +[/quote] +==== misnested-with-i +[quote][i]text[/quote] tail[/i] +==== nested-in-itself +[quote]outer [quote]inner[/quote] outer[/quote] +==== repeated +[quote]one[/quote][quote]two[/quote] [quote]three[/quote] +==== tail-and-next-line +[quote]text[/quote] tail +next line +==== blank-lines-around +before + + +[quote]text[/quote] + + +after +==== unclosed +[quote]text +==== unmatched-close +text[/quote] +==== escaped +\[quote]text[/quote] +==== uppercase +[QUOTE]text[/QUOTE] +==== [quote="system, post:1, topic:1"] alone +[quote="system, post:1, topic:1"]text[/quote] +==== [quote="system, post:1, topic:1"] own-lines +[quote="system, post:1, topic:1"] +text +[/quote] diff --git a/spec/fixtures/recook/tag-right.cooked b/spec/fixtures/recook/tag-right.cooked new file mode 100644 index 0000000..039365c --- /dev/null +++ b/spec/fixtures/recook/tag-right.cooked @@ -0,0 +1,108 @@ +==== alone +
text
+==== empty +
+==== mid-line +before
text
after +==== own-lines +
+
+text
+
+==== own-lines-between-text +before
+
+text
+
+
after +==== starts-mid-line-spans-lines +before
+text
+more
+after +==== blank-line-inside +
+
+text

second paragraph
+
+==== markdown-blocks-inside +
+
+

Heading

+ +
+quoted
+
+
+==== inline-markdown-inside +
bold italic code link :smile:
+==== in-blockquote +
+
+
+text
+
+
+==== in-list-item + +==== in-table-cell +
+ + + + + + + + + + + +
head
text
+
+==== in-heading +

text

+==== around-b +
text
+==== in-b +before
text
after
+==== in-core-quote + +==== misnested-with-i +
text
+tail +==== nested-in-itself +
outer
inner
outer
+==== repeated +
one
+
two
+
three
+==== tail-and-next-line +
text
+tail
next line +==== blank-lines-around +before


text
+


after +==== unclosed +[right]text +==== unmatched-close +text[/right] +==== escaped +[right]text[/right] +==== uppercase +
text
diff --git a/spec/fixtures/recook/tag-right.txt b/spec/fixtures/recook/tag-right.txt new file mode 100644 index 0000000..0f9122e --- /dev/null +++ b/spec/fixtures/recook/tag-right.txt @@ -0,0 +1,85 @@ +Generated by generate.rb; edit that, not this file. +==== alone +[right]text[/right] +==== empty +[right][/right] +==== mid-line +before [right]text[/right] after +==== own-lines +[right] +text +[/right] +==== own-lines-between-text +before +[right] +text +[/right] +after +==== starts-mid-line-spans-lines +before [right]text +more[/right] after +==== blank-line-inside +[right] +text + +second paragraph +[/right] +==== markdown-blocks-inside +[right] +## Heading + +- one +- two + +> quoted +[/right] +==== inline-markdown-inside +[right]**bold** _italic_ `code` [link](https://example.com) :smile:[/right] +==== in-blockquote +> [right] +> text +> [/right] +==== in-list-item +- [right] + text + [/right] +- next +==== in-table-cell +| head | +|---| +| [right]text[/right] | +==== in-heading +## [right]text[/right] +==== around-b +[right][b]text[/b][/right] +==== in-b +[b]before [right]text[/right] after[/b] +==== in-core-quote +[quote] +[right]text[/right] +[/quote] +==== misnested-with-i +[right][i]text[/right] tail[/i] +==== nested-in-itself +[right]outer [right]inner[/right] outer[/right] +==== repeated +[right]one[/right][right]two[/right] [right]three[/right] +==== tail-and-next-line +[right]text[/right] tail +next line +==== blank-lines-around +before + + +[right]text[/right] + + +after +==== unclosed +[right]text +==== unmatched-close +text[/right] +==== escaped +\[right]text[/right] +==== uppercase +[RIGHT]text[/RIGHT] diff --git a/spec/fixtures/recook/tag-row.cooked b/spec/fixtures/recook/tag-row.cooked new file mode 100644 index 0000000..c39f17e --- /dev/null +++ b/spec/fixtures/recook/tag-row.cooked @@ -0,0 +1,121 @@ +==== alone +
a
b
+==== empty +
+==== mid-line +before
a
b
after +==== own-lines +
+
+
a
+
b
+
+
+==== own-lines-between-text +before
+
+
a
+
b
+
+
+
after +==== starts-mid-line-spans-lines +before
+
a
+
b
+
more
+after +==== blank-line-inside +
+
+
a
+
b
+

second paragraph
+
+==== markdown-blocks-inside +
+
+

Heading

+ +
+quoted
+
+
+==== inline-markdown-inside +
bold italic code link :smile:
+==== in-blockquote +
+
+
+
a
+
b
+
+
+
+==== in-list-item + +==== in-table-cell +
+ + + + + + + + + + + +
head
a
b
+
+==== in-heading +

a
b

+==== around-b +
a
b
+==== in-b +before
a
b
after
+==== in-core-quote + +==== misnested-with-i +
a
b
+tail +==== nested-in-itself +
outer
inner
outer
+==== repeated +
one
+
two
+
three
+==== tail-and-next-line +
a
b
+tail
next line +==== blank-lines-around +before


a
b
+


after +==== unclosed +[row]
a
b
+==== unmatched-close +
a
+
b
+[/row] +==== escaped +[row]
a
b
[/row] +==== uppercase +
a
b
diff --git a/spec/fixtures/recook/tag-row.txt b/spec/fixtures/recook/tag-row.txt new file mode 100644 index 0000000..dfc57ee --- /dev/null +++ b/spec/fixtures/recook/tag-row.txt @@ -0,0 +1,85 @@ +Generated by generate.rb; edit that, not this file. +==== alone +[row][column=6]a[/column][column=6]b[/column][/row] +==== empty +[row][/row] +==== mid-line +before [row][column=6]a[/column][column=6]b[/column][/row] after +==== own-lines +[row] +[column=6]a[/column][column=6]b[/column] +[/row] +==== own-lines-between-text +before +[row] +[column=6]a[/column][column=6]b[/column] +[/row] +after +==== starts-mid-line-spans-lines +before [row][column=6]a[/column][column=6]b[/column] +more[/row] after +==== blank-line-inside +[row] +[column=6]a[/column][column=6]b[/column] + +second paragraph +[/row] +==== markdown-blocks-inside +[row] +## Heading + +- one +- two + +> quoted +[/row] +==== inline-markdown-inside +[row]**bold** _italic_ `code` [link](https://example.com) :smile:[/row] +==== in-blockquote +> [row] +> [column=6]a[/column][column=6]b[/column] +> [/row] +==== in-list-item +- [row] + [column=6]a[/column][column=6]b[/column] + [/row] +- next +==== in-table-cell +| head | +|---| +| [row][column=6]a[/column][column=6]b[/column][/row] | +==== in-heading +## [row][column=6]a[/column][column=6]b[/column][/row] +==== around-b +[row][b][column=6]a[/column][column=6]b[/column][/b][/row] +==== in-b +[b]before [row][column=6]a[/column][column=6]b[/column][/row] after[/b] +==== in-core-quote +[quote] +[row][column=6]a[/column][column=6]b[/column][/row] +[/quote] +==== misnested-with-i +[row][i][column=6]a[/column][column=6]b[/column][/row] tail[/i] +==== nested-in-itself +[row]outer [row]inner[/row] outer[/row] +==== repeated +[row]one[/row][row]two[/row] [row]three[/row] +==== tail-and-next-line +[row][column=6]a[/column][column=6]b[/column][/row] tail +next line +==== blank-lines-around +before + + +[row][column=6]a[/column][column=6]b[/column][/row] + + +after +==== unclosed +[row][column=6]a[/column][column=6]b[/column] +==== unmatched-close +[column=6]a[/column][column=6]b[/column][/row] +==== escaped +\[row][column=6]a[/column][column=6]b[/column][/row] +==== uppercase +[ROW][column=6]a[/column][column=6]b[/column][/ROW] diff --git a/spec/fixtures/recook/tag-s.cooked b/spec/fixtures/recook/tag-s.cooked new file mode 100644 index 0000000..424a375 --- /dev/null +++ b/spec/fixtures/recook/tag-s.cooked @@ -0,0 +1,96 @@ +==== alone +text +==== empty + +==== mid-line +before text after +==== own-lines +
+text
+
+==== own-lines-between-text +before
+
+text
+

+after +==== starts-mid-line-spans-lines +before text
+more
after +==== blank-line-inside +
+text
+
+second paragraph
+
+==== markdown-blocks-inside +
+
+

Heading

+ +
+quoted
+
+
+==== inline-markdown-inside +bold italic code link :smile: +==== in-blockquote +
+
+text
+
+==== in-list-item + +==== in-table-cell +
+ + + + + + + + + + + +
head
text
+
+==== in-heading +

text

+==== around-b +text +==== in-b +before text after +==== in-core-quote + +==== misnested-with-i +text tail +==== nested-in-itself +outer inner outer +==== repeated +onetwo three +==== tail-and-next-line +text tail
+next line +==== blank-lines-around +before


text


after +==== unclosed +[s]text +==== unmatched-close +text[/s] +==== escaped +[s]text[/s] +==== uppercase +text diff --git a/spec/fixtures/recook/tag-s.txt b/spec/fixtures/recook/tag-s.txt new file mode 100644 index 0000000..7ca41db --- /dev/null +++ b/spec/fixtures/recook/tag-s.txt @@ -0,0 +1,85 @@ +Generated by generate.rb; edit that, not this file. +==== alone +[s]text[/s] +==== empty +[s][/s] +==== mid-line +before [s]text[/s] after +==== own-lines +[s] +text +[/s] +==== own-lines-between-text +before +[s] +text +[/s] +after +==== starts-mid-line-spans-lines +before [s]text +more[/s] after +==== blank-line-inside +[s] +text + +second paragraph +[/s] +==== markdown-blocks-inside +[s] +## Heading + +- one +- two + +> quoted +[/s] +==== inline-markdown-inside +[s]**bold** _italic_ `code` [link](https://example.com) :smile:[/s] +==== in-blockquote +> [s] +> text +> [/s] +==== in-list-item +- [s] + text + [/s] +- next +==== in-table-cell +| head | +|---| +| [s]text[/s] | +==== in-heading +## [s]text[/s] +==== around-b +[s][b]text[/b][/s] +==== in-b +[b]before [s]text[/s] after[/b] +==== in-core-quote +[quote] +[s]text[/s] +[/quote] +==== misnested-with-i +[s][i]text[/s] tail[/i] +==== nested-in-itself +[s]outer [s]inner[/s] outer[/s] +==== repeated +[s]one[/s][s]two[/s] [s]three[/s] +==== tail-and-next-line +[s]text[/s] tail +next line +==== blank-lines-around +before + + +[s]text[/s] + + +after +==== unclosed +[s]text +==== unmatched-close +text[/s] +==== escaped +\[s]text[/s] +==== uppercase +[S]text[/S] diff --git a/spec/fixtures/recook/tag-script.cooked b/spec/fixtures/recook/tag-script.cooked new file mode 100644 index 0000000..193b54c --- /dev/null +++ b/spec/fixtures/recook/tag-script.cooked @@ -0,0 +1,118 @@ +==== alone + +==== empty + +==== mid-line + +before after +==== own-lines + +==== own-lines-between-text + +before

after +==== starts-mid-line-spans-lines + +before after +==== blank-line-inside + +==== markdown-blocks-inside + +==== inline-markdown-inside + +==== in-blockquote + +
+==== in-list-item + + +==== in-table-cell + +
+ + + + + + + + + + + +
head
+
+==== in-heading + +

+==== around-b + +==== in-b + +before after +==== in-core-quote + + +==== misnested-with-i + +tail[/i] +==== nested-in-itself + +==== repeated + +==== tail-and-next-line + +tail
next line +==== blank-lines-around + +before





after +==== unclosed +script class=box on=click +==== unmatched-close +(print "hi")[/script] +==== escaped +[script class=box on=click](print "hi")[/script] +==== uppercase + +==== [script] alone + +==== [script] own-lines + +==== [script alone +[script(print "hi")[/script] +==== [script own-lines +[script
+(print "hi")
+[/script] +==== on=bogus] alone +on=bogus](print "hi")[/script] +==== on=bogus] own-lines +on=bogus]
+(print "hi")
+[/script] diff --git a/spec/fixtures/recook/tag-script.txt b/spec/fixtures/recook/tag-script.txt new file mode 100644 index 0000000..c146604 --- /dev/null +++ b/spec/fixtures/recook/tag-script.txt @@ -0,0 +1,103 @@ +Generated by generate.rb; edit that, not this file. +==== alone +[script class=box on=click](print "hi")[/script] +==== empty +[script class=box on=click][/script] +==== mid-line +before [script class=box on=click](print "hi")[/script] after +==== own-lines +[script class=box on=click] +(print "hi") +[/script] +==== own-lines-between-text +before +[script class=box on=click] +(print "hi") +[/script] +after +==== starts-mid-line-spans-lines +before [script class=box on=click](print "hi") +more[/script] after +==== blank-line-inside +[script class=box on=click] +(print "hi") + +second paragraph +[/script] +==== markdown-blocks-inside +[script class=box on=click] +## Heading + +- one +- two + +> quoted +[/script] +==== inline-markdown-inside +[script class=box on=click]**bold** _italic_ `code` [link](https://example.com) :smile:[/script] +==== in-blockquote +> [script class=box on=click] +> (print "hi") +> [/script] +==== in-list-item +- [script class=box on=click] + (print "hi") + [/script] +- next +==== in-table-cell +| head | +|---| +| [script class=box on=click](print "hi")[/script] | +==== in-heading +## [script class=box on=click](print "hi")[/script] +==== around-b +[script class=box on=click][b](print "hi")[/b][/script] +==== in-b +[b]before [script class=box on=click](print "hi")[/script] after[/b] +==== in-core-quote +[quote] +[script class=box on=click](print "hi")[/script] +[/quote] +==== misnested-with-i +[script class=box on=click][i](print "hi")[/script] tail[/i] +==== nested-in-itself +[script class=box on=click]outer [script class=box on=click]inner[/script] outer[/script] +==== repeated +[script class=box on=click]one[/script][script class=box on=click]two[/script] [script class=box on=click]three[/script] +==== tail-and-next-line +[script class=box on=click](print "hi")[/script] tail +next line +==== blank-lines-around +before + + +[script class=box on=click](print "hi")[/script] + + +after +==== unclosed +[script class=box on=click](print "hi") +==== unmatched-close +(print "hi")[/script] +==== escaped +\[script class=box on=click](print "hi")[/script] +==== uppercase +[SCRIPT class=box on=click](print "hi")[/SCRIPT] +==== [script] alone +[script](print "hi")[/script] +==== [script] own-lines +[script] +(print "hi") +[/script] +==== [script alone +[script(print "hi")[/script] +==== [script own-lines +[script +(print "hi") +[/script] +==== on=bogus] alone +on=bogus](print "hi")[/script] +==== on=bogus] own-lines +on=bogus] +(print "hi") +[/script] diff --git a/spec/fixtures/recook/tag-scroll.cooked b/spec/fixtures/recook/tag-scroll.cooked new file mode 100644 index 0000000..a1ade60 --- /dev/null +++ b/spec/fixtures/recook/tag-scroll.cooked @@ -0,0 +1,136 @@ +==== alone +
text
+==== empty +
+==== mid-line +before
text
after +==== own-lines +
+
+text
+
+==== own-lines-between-text +before
+
+text
+
+
after +==== starts-mid-line-spans-lines +before
+text
+more
+after +==== blank-line-inside +
+
+text

second paragraph
+
+==== markdown-blocks-inside +
+
+

Heading

+ +
+quoted
+
+
+==== inline-markdown-inside +
bold italic code link :smile:
+==== in-blockquote +
+
+
+text
+
+
+==== in-list-item + +==== in-table-cell +
+ + + + + + + + + + + +
head
text
+
+==== in-heading +

text

+==== around-b +
text
+==== in-b +before
text
after
+==== in-core-quote + +==== misnested-with-i +
text
+tail +==== nested-in-itself +
outer
inner
outer
+==== repeated +
one
+
two
+
three
+==== tail-and-next-line +
text
+tail
next line +==== blank-lines-around +before


text
+


after +==== unclosed +[scroll=200]text +==== unmatched-close +text[/scroll] +==== escaped +[scroll=200]text[/scroll] +==== uppercase +
text
+==== [scroll] alone +
text
+==== [scroll] own-lines +
+
+text
+
+==== [scroll=0] alone +
text
+==== [scroll=0] own-lines +
+
+text
+
+==== [scroll=9999] alone +
text
+==== [scroll=9999] own-lines +
+
+text
+
+==== [scroll=abc] alone +
text
+==== [scroll=abc] own-lines +
+
+text
+
diff --git a/spec/fixtures/recook/tag-scroll.txt b/spec/fixtures/recook/tag-scroll.txt new file mode 100644 index 0000000..f1a9482 --- /dev/null +++ b/spec/fixtures/recook/tag-scroll.txt @@ -0,0 +1,109 @@ +Generated by generate.rb; edit that, not this file. +==== alone +[scroll=200]text[/scroll] +==== empty +[scroll=200][/scroll] +==== mid-line +before [scroll=200]text[/scroll] after +==== own-lines +[scroll=200] +text +[/scroll] +==== own-lines-between-text +before +[scroll=200] +text +[/scroll] +after +==== starts-mid-line-spans-lines +before [scroll=200]text +more[/scroll] after +==== blank-line-inside +[scroll=200] +text + +second paragraph +[/scroll] +==== markdown-blocks-inside +[scroll=200] +## Heading + +- one +- two + +> quoted +[/scroll] +==== inline-markdown-inside +[scroll=200]**bold** _italic_ `code` [link](https://example.com) :smile:[/scroll] +==== in-blockquote +> [scroll=200] +> text +> [/scroll] +==== in-list-item +- [scroll=200] + text + [/scroll] +- next +==== in-table-cell +| head | +|---| +| [scroll=200]text[/scroll] | +==== in-heading +## [scroll=200]text[/scroll] +==== around-b +[scroll=200][b]text[/b][/scroll] +==== in-b +[b]before [scroll=200]text[/scroll] after[/b] +==== in-core-quote +[quote] +[scroll=200]text[/scroll] +[/quote] +==== misnested-with-i +[scroll=200][i]text[/scroll] tail[/i] +==== nested-in-itself +[scroll=200]outer [scroll=200]inner[/scroll] outer[/scroll] +==== repeated +[scroll=200]one[/scroll][scroll=200]two[/scroll] [scroll=200]three[/scroll] +==== tail-and-next-line +[scroll=200]text[/scroll] tail +next line +==== blank-lines-around +before + + +[scroll=200]text[/scroll] + + +after +==== unclosed +[scroll=200]text +==== unmatched-close +text[/scroll] +==== escaped +\[scroll=200]text[/scroll] +==== uppercase +[SCROLL=200]text[/SCROLL] +==== [scroll] alone +[scroll]text[/scroll] +==== [scroll] own-lines +[scroll] +text +[/scroll] +==== [scroll=0] alone +[scroll=0]text[/scroll] +==== [scroll=0] own-lines +[scroll=0] +text +[/scroll] +==== [scroll=9999] alone +[scroll=9999]text[/scroll] +==== [scroll=9999] own-lines +[scroll=9999] +text +[/scroll] +==== [scroll=abc] alone +[scroll=abc]text[/scroll] +==== [scroll=abc] own-lines +[scroll=abc] +text +[/scroll] diff --git a/spec/fixtures/recook/tag-sh.cooked b/spec/fixtures/recook/tag-sh.cooked new file mode 100644 index 0000000..27f62cc --- /dev/null +++ b/spec/fixtures/recook/tag-sh.cooked @@ -0,0 +1,108 @@ +==== alone +

text

+==== empty +

+==== mid-line +before

text

after +==== own-lines +

+
+text
+

+==== own-lines-between-text +before

+
+text
+

+
after +==== starts-mid-line-spans-lines +before

+text
+more

+after +==== blank-line-inside +

+
+text

second paragraph
+

+==== markdown-blocks-inside +

+
+

Heading

+ +
+quoted
+
+ +==== inline-markdown-inside +

bold italic code link :smile:

+==== in-blockquote +
+

+
+text
+

+
+==== in-list-item + +==== in-table-cell +
+ + + + + + + + + + + +
head

text

+
+==== in-heading +

text

+==== around-b +

text

+==== in-b +before

text

after
+==== in-core-quote + +==== misnested-with-i +

text

+tail +==== nested-in-itself +

outer

inner

outer +==== repeated +

one

+

two

+

three

+==== tail-and-next-line +

text

+tail
next line +==== blank-lines-around +before


text

+


after +==== unclosed +[sh]text +==== unmatched-close +text[/sh] +==== escaped +[sh]text[/sh] +==== uppercase +

text

diff --git a/spec/fixtures/recook/tag-sh.txt b/spec/fixtures/recook/tag-sh.txt new file mode 100644 index 0000000..a40da10 --- /dev/null +++ b/spec/fixtures/recook/tag-sh.txt @@ -0,0 +1,85 @@ +Generated by generate.rb; edit that, not this file. +==== alone +[sh]text[/sh] +==== empty +[sh][/sh] +==== mid-line +before [sh]text[/sh] after +==== own-lines +[sh] +text +[/sh] +==== own-lines-between-text +before +[sh] +text +[/sh] +after +==== starts-mid-line-spans-lines +before [sh]text +more[/sh] after +==== blank-line-inside +[sh] +text + +second paragraph +[/sh] +==== markdown-blocks-inside +[sh] +## Heading + +- one +- two + +> quoted +[/sh] +==== inline-markdown-inside +[sh]**bold** _italic_ `code` [link](https://example.com) :smile:[/sh] +==== in-blockquote +> [sh] +> text +> [/sh] +==== in-list-item +- [sh] + text + [/sh] +- next +==== in-table-cell +| head | +|---| +| [sh]text[/sh] | +==== in-heading +## [sh]text[/sh] +==== around-b +[sh][b]text[/b][/sh] +==== in-b +[b]before [sh]text[/sh] after[/b] +==== in-core-quote +[quote] +[sh]text[/sh] +[/quote] +==== misnested-with-i +[sh][i]text[/sh] tail[/i] +==== nested-in-itself +[sh]outer [sh]inner[/sh] outer[/sh] +==== repeated +[sh]one[/sh][sh]two[/sh] [sh]three[/sh] +==== tail-and-next-line +[sh]text[/sh] tail +next line +==== blank-lines-around +before + + +[sh]text[/sh] + + +after +==== unclosed +[sh]text +==== unmatched-close +text[/sh] +==== escaped +\[sh]text[/sh] +==== uppercase +[SH]text[/SH] diff --git a/spec/fixtures/recook/tag-side.cooked b/spec/fixtures/recook/tag-side.cooked new file mode 100644 index 0000000..0d7b234 --- /dev/null +++ b/spec/fixtures/recook/tag-side.cooked @@ -0,0 +1,122 @@ +==== alone +
text
+==== empty +
+==== mid-line +before
text
after +==== own-lines +
+
+text
+
+==== own-lines-between-text +before
+
+text
+
+after +==== starts-mid-line-spans-lines +before
+text
+more
+after +==== blank-line-inside +
+
+text

second paragraph
+
+==== markdown-blocks-inside +
+
+

Heading

+ +
+quoted
+
+
+==== inline-markdown-inside +
bold italic code link :smile:
+==== in-blockquote +
+
+
+text
+
+
+==== in-list-item + +==== in-table-cell +
+ + + + + + + + + + + +
head
text
+
+==== in-heading +

text

+==== around-b +
text
+==== in-b +before
text
after
+==== in-core-quote + +==== misnested-with-i +
text
+tail +==== nested-in-itself +
outer
inner
outer
+==== repeated +
one
+
two
+
three
+==== tail-and-next-line +
text
+tail
next line +==== blank-lines-around +before


text
+

after +==== unclosed +[side=right]text +==== unmatched-close +text[/side] +==== escaped +[side=right]text[/side] +==== uppercase +
text
+==== [side] alone +
text
+==== [side] own-lines +
+
+text
+
+==== [side=left] alone +
text
+==== [side=left] own-lines +
+
+text
+
diff --git a/spec/fixtures/recook/tag-side.txt b/spec/fixtures/recook/tag-side.txt new file mode 100644 index 0000000..1483884 --- /dev/null +++ b/spec/fixtures/recook/tag-side.txt @@ -0,0 +1,97 @@ +Generated by generate.rb; edit that, not this file. +==== alone +[side=right]text[/side] +==== empty +[side=right][/side] +==== mid-line +before [side=right]text[/side] after +==== own-lines +[side=right] +text +[/side] +==== own-lines-between-text +before +[side=right] +text +[/side] +after +==== starts-mid-line-spans-lines +before [side=right]text +more[/side] after +==== blank-line-inside +[side=right] +text + +second paragraph +[/side] +==== markdown-blocks-inside +[side=right] +## Heading + +- one +- two + +> quoted +[/side] +==== inline-markdown-inside +[side=right]**bold** _italic_ `code` [link](https://example.com) :smile:[/side] +==== in-blockquote +> [side=right] +> text +> [/side] +==== in-list-item +- [side=right] + text + [/side] +- next +==== in-table-cell +| head | +|---| +| [side=right]text[/side] | +==== in-heading +## [side=right]text[/side] +==== around-b +[side=right][b]text[/b][/side] +==== in-b +[b]before [side=right]text[/side] after[/b] +==== in-core-quote +[quote] +[side=right]text[/side] +[/quote] +==== misnested-with-i +[side=right][i]text[/side] tail[/i] +==== nested-in-itself +[side=right]outer [side=right]inner[/side] outer[/side] +==== repeated +[side=right]one[/side][side=right]two[/side] [side=right]three[/side] +==== tail-and-next-line +[side=right]text[/side] tail +next line +==== blank-lines-around +before + + +[side=right]text[/side] + + +after +==== unclosed +[side=right]text +==== unmatched-close +text[/side] +==== escaped +\[side=right]text[/side] +==== uppercase +[SIDE=right]text[/SIDE] +==== [side] alone +[side]text[/side] +==== [side] own-lines +[side] +text +[/side] +==== [side=left] alone +[side=left]text[/side] +==== [side=left] own-lines +[side=left] +text +[/side] diff --git a/spec/fixtures/recook/tag-size.cooked b/spec/fixtures/recook/tag-size.cooked new file mode 100644 index 0000000..5cec30f --- /dev/null +++ b/spec/fixtures/recook/tag-size.cooked @@ -0,0 +1,137 @@ +==== alone +text +==== empty + +==== mid-line +before text after +==== own-lines +
+text
+
+==== own-lines-between-text +before
+
+text
+

+after +==== starts-mid-line-spans-lines +before text
+more
after +==== blank-line-inside +
+text
+
+second paragraph
+
+==== markdown-blocks-inside +
+
+

Heading

+ +
+quoted
+
+
+==== inline-markdown-inside +bold italic code link :smile: +==== in-blockquote +
+
+text
+
+==== in-list-item + +==== in-table-cell +
+ + + + + + + + + + + +
head
text
+
+==== in-heading +

text

+==== around-b +text +==== in-b +before text after +==== in-core-quote + +==== misnested-with-i +text tail +==== nested-in-itself +outer inner outer +==== repeated +onetwo three +==== tail-and-next-line +text tail
+next line +==== blank-lines-around +before


text


after +==== unclosed +[size=5]text +==== unmatched-close +text[/size] +==== escaped +[size=5]text[/size] +==== uppercase +text +==== [size=1] alone +text +==== [size=1] own-lines +
+text
+
+==== [size=7] alone +text +==== [size=7] own-lines +
+text
+
+==== [size=0] alone +text +==== [size=0] own-lines +
+text
+
+==== [size=12px] alone +text +==== [size=12px] own-lines +
+text
+
+==== [size=40px] alone +text +==== [size=40px] own-lines +
+text
+
+==== [size=1.5rem] alone +text +==== [size=1.5rem] own-lines +
+text
+
+==== [size=12pt] alone +text +==== [size=12pt] own-lines +
+text
diff --git a/spec/fixtures/recook/tag-size.txt b/spec/fixtures/recook/tag-size.txt new file mode 100644 index 0000000..d163add --- /dev/null +++ b/spec/fixtures/recook/tag-size.txt @@ -0,0 +1,127 @@ +Generated by generate.rb; edit that, not this file. +==== alone +[size=5]text[/size] +==== empty +[size=5][/size] +==== mid-line +before [size=5]text[/size] after +==== own-lines +[size=5] +text +[/size] +==== own-lines-between-text +before +[size=5] +text +[/size] +after +==== starts-mid-line-spans-lines +before [size=5]text +more[/size] after +==== blank-line-inside +[size=5] +text + +second paragraph +[/size] +==== markdown-blocks-inside +[size=5] +## Heading + +- one +- two + +> quoted +[/size] +==== inline-markdown-inside +[size=5]**bold** _italic_ `code` [link](https://example.com) :smile:[/size] +==== in-blockquote +> [size=5] +> text +> [/size] +==== in-list-item +- [size=5] + text + [/size] +- next +==== in-table-cell +| head | +|---| +| [size=5]text[/size] | +==== in-heading +## [size=5]text[/size] +==== around-b +[size=5][b]text[/b][/size] +==== in-b +[b]before [size=5]text[/size] after[/b] +==== in-core-quote +[quote] +[size=5]text[/size] +[/quote] +==== misnested-with-i +[size=5][i]text[/size] tail[/i] +==== nested-in-itself +[size=5]outer [size=5]inner[/size] outer[/size] +==== repeated +[size=5]one[/size][size=5]two[/size] [size=5]three[/size] +==== tail-and-next-line +[size=5]text[/size] tail +next line +==== blank-lines-around +before + + +[size=5]text[/size] + + +after +==== unclosed +[size=5]text +==== unmatched-close +text[/size] +==== escaped +\[size=5]text[/size] +==== uppercase +[SIZE=5]text[/SIZE] +==== [size=1] alone +[size=1]text[/size] +==== [size=1] own-lines +[size=1] +text +[/size] +==== [size=7] alone +[size=7]text[/size] +==== [size=7] own-lines +[size=7] +text +[/size] +==== [size=0] alone +[size=0]text[/size] +==== [size=0] own-lines +[size=0] +text +[/size] +==== [size=12px] alone +[size=12px]text[/size] +==== [size=12px] own-lines +[size=12px] +text +[/size] +==== [size=40px] alone +[size=40px]text[/size] +==== [size=40px] own-lines +[size=40px] +text +[/size] +==== [size=1.5rem] alone +[size=1.5rem]text[/size] +==== [size=1.5rem] own-lines +[size=1.5rem] +text +[/size] +==== [size=12pt] alone +[size=12pt]text[/size] +==== [size=12pt] own-lines +[size=12pt] +text +[/size] diff --git a/spec/fixtures/recook/tag-spoiler.cooked b/spec/fixtures/recook/tag-spoiler.cooked new file mode 100644 index 0000000..4a00063 --- /dev/null +++ b/spec/fixtures/recook/tag-spoiler.cooked @@ -0,0 +1,202 @@ +==== alone +
+ +Spoiler: Title +
text
+
+==== empty +
+ +Spoiler: Title +
+
+==== mid-line +before
Spoiler: Title
text
after +==== own-lines +
+ +Spoiler: Title +
+text
+
+==== own-lines-between-text +before
+ +Spoiler: Title +
+text
+
+after +==== starts-mid-line-spans-lines +before
+ +Spoiler: Title +
+text
+more
+
+after +==== blank-line-inside +
+ +Spoiler: Title +
+text

second paragraph
+
+==== markdown-blocks-inside +
+ +Spoiler: Title +
+

Heading

+
    +
  • one
  • +
  • two
  • +
+
+quoted
+
+
+==== inline-markdown-inside +
+ +Spoiler: Title +
bold italic code link :smile:
+
+==== in-blockquote +
+
+ +Spoiler: Title +
+text
+
+
+==== in-list-item + +==== in-table-cell +
+ + + + + + + + + + + +
head
Spoiler: Title
text
+
+==== in-heading +

Spoiler: Title
text

+==== around-b +
+ +Spoiler: Title +
text
+
+==== in-b +before
Spoiler: Title
text
after
+==== in-core-quote + +==== misnested-with-i +
+ +Spoiler: Title +
text
+
+tail +==== nested-in-itself +
+ +Spoiler: Title +
outer
Spoiler: Title
inner
outer
+
+==== repeated +
+ +Spoiler: Title +
one
+
+
+ +Spoiler: Title +
two
+
+
+ +Spoiler: Title +
three
+
+==== tail-and-next-line +
+ +Spoiler: Title +
text
+
+tail
next line +==== blank-lines-around +before


+ +Spoiler: Title +
text
+
+

after +==== unclosed +[spoiler=Title]text +==== unmatched-close +text[/spoiler] +==== escaped +[spoiler=Title]text[/spoiler] +==== uppercase +
+ +Spoiler: Title +
text
+
+==== [spoiler] alone +
+ +Spoiler +
text
+
+==== [spoiler] own-lines +
+ +Spoiler +
+text
+
+==== [spoiler="Quoted title"] alone +
+ +Spoiler: Quoted title +
text
+
+==== [spoiler="Quoted title"] own-lines +
+ +Spoiler: Quoted title +
+text
+
diff --git a/spec/fixtures/recook/tag-spoiler.txt b/spec/fixtures/recook/tag-spoiler.txt new file mode 100644 index 0000000..4ccbe3c --- /dev/null +++ b/spec/fixtures/recook/tag-spoiler.txt @@ -0,0 +1,97 @@ +Generated by generate.rb; edit that, not this file. +==== alone +[spoiler=Title]text[/spoiler] +==== empty +[spoiler=Title][/spoiler] +==== mid-line +before [spoiler=Title]text[/spoiler] after +==== own-lines +[spoiler=Title] +text +[/spoiler] +==== own-lines-between-text +before +[spoiler=Title] +text +[/spoiler] +after +==== starts-mid-line-spans-lines +before [spoiler=Title]text +more[/spoiler] after +==== blank-line-inside +[spoiler=Title] +text + +second paragraph +[/spoiler] +==== markdown-blocks-inside +[spoiler=Title] +## Heading + +- one +- two + +> quoted +[/spoiler] +==== inline-markdown-inside +[spoiler=Title]**bold** _italic_ `code` [link](https://example.com) :smile:[/spoiler] +==== in-blockquote +> [spoiler=Title] +> text +> [/spoiler] +==== in-list-item +- [spoiler=Title] + text + [/spoiler] +- next +==== in-table-cell +| head | +|---| +| [spoiler=Title]text[/spoiler] | +==== in-heading +## [spoiler=Title]text[/spoiler] +==== around-b +[spoiler=Title][b]text[/b][/spoiler] +==== in-b +[b]before [spoiler=Title]text[/spoiler] after[/b] +==== in-core-quote +[quote] +[spoiler=Title]text[/spoiler] +[/quote] +==== misnested-with-i +[spoiler=Title][i]text[/spoiler] tail[/i] +==== nested-in-itself +[spoiler=Title]outer [spoiler=Title]inner[/spoiler] outer[/spoiler] +==== repeated +[spoiler=Title]one[/spoiler][spoiler=Title]two[/spoiler] [spoiler=Title]three[/spoiler] +==== tail-and-next-line +[spoiler=Title]text[/spoiler] tail +next line +==== blank-lines-around +before + + +[spoiler=Title]text[/spoiler] + + +after +==== unclosed +[spoiler=Title]text +==== unmatched-close +text[/spoiler] +==== escaped +\[spoiler=Title]text[/spoiler] +==== uppercase +[SPOILER=Title]text[/SPOILER] +==== [spoiler] alone +[spoiler]text[/spoiler] +==== [spoiler] own-lines +[spoiler] +text +[/spoiler] +==== [spoiler="Quoted title"] alone +[spoiler="Quoted title"]text[/spoiler] +==== [spoiler="Quoted title"] own-lines +[spoiler="Quoted title"] +text +[/spoiler] diff --git a/spec/fixtures/recook/tag-sub.cooked b/spec/fixtures/recook/tag-sub.cooked new file mode 100644 index 0000000..5db2926 --- /dev/null +++ b/spec/fixtures/recook/tag-sub.cooked @@ -0,0 +1,93 @@ +==== alone +text +==== empty + +==== mid-line +before text after +==== own-lines +
+text
+
+==== own-lines-between-text +before
+
+text
+

+after +==== starts-mid-line-spans-lines +before text
+more
after +==== blank-line-inside +
+text
+
+second paragraph
+
+==== markdown-blocks-inside +
+## Heading
+
+- one
+- two
+
+> quoted
+
+==== inline-markdown-inside +bold italic code link :smile: +==== in-blockquote +
+
+text
+
+==== in-list-item + +==== in-table-cell +
+ + + + + + + + + + + +
head
text
+
+==== in-heading +

text

+==== around-b +text +==== in-b +before text after +==== in-core-quote + +==== misnested-with-i +text tail +==== nested-in-itself +outer inner outer +==== repeated +onetwo three +==== tail-and-next-line +text tail
+next line +==== blank-lines-around +before


text


after +==== unclosed +[sub]text +==== unmatched-close +text[/sub] +==== escaped +[sub]text[/sub] +==== uppercase +text diff --git a/spec/fixtures/recook/tag-sub.txt b/spec/fixtures/recook/tag-sub.txt new file mode 100644 index 0000000..cdfb33f --- /dev/null +++ b/spec/fixtures/recook/tag-sub.txt @@ -0,0 +1,85 @@ +Generated by generate.rb; edit that, not this file. +==== alone +[sub]text[/sub] +==== empty +[sub][/sub] +==== mid-line +before [sub]text[/sub] after +==== own-lines +[sub] +text +[/sub] +==== own-lines-between-text +before +[sub] +text +[/sub] +after +==== starts-mid-line-spans-lines +before [sub]text +more[/sub] after +==== blank-line-inside +[sub] +text + +second paragraph +[/sub] +==== markdown-blocks-inside +[sub] +## Heading + +- one +- two + +> quoted +[/sub] +==== inline-markdown-inside +[sub]**bold** _italic_ `code` [link](https://example.com) :smile:[/sub] +==== in-blockquote +> [sub] +> text +> [/sub] +==== in-list-item +- [sub] + text + [/sub] +- next +==== in-table-cell +| head | +|---| +| [sub]text[/sub] | +==== in-heading +## [sub]text[/sub] +==== around-b +[sub][b]text[/b][/sub] +==== in-b +[b]before [sub]text[/sub] after[/b] +==== in-core-quote +[quote] +[sub]text[/sub] +[/quote] +==== misnested-with-i +[sub][i]text[/sub] tail[/i] +==== nested-in-itself +[sub]outer [sub]inner[/sub] outer[/sub] +==== repeated +[sub]one[/sub][sub]two[/sub] [sub]three[/sub] +==== tail-and-next-line +[sub]text[/sub] tail +next line +==== blank-lines-around +before + + +[sub]text[/sub] + + +after +==== unclosed +[sub]text +==== unmatched-close +text[/sub] +==== escaped +\[sub]text[/sub] +==== uppercase +[SUB]text[/SUB] diff --git a/spec/fixtures/recook/tag-sup.cooked b/spec/fixtures/recook/tag-sup.cooked new file mode 100644 index 0000000..bd652ca --- /dev/null +++ b/spec/fixtures/recook/tag-sup.cooked @@ -0,0 +1,93 @@ +==== alone +text +==== empty + +==== mid-line +before text after +==== own-lines +
+text
+
+==== own-lines-between-text +before
+
+text
+

+after +==== starts-mid-line-spans-lines +before text
+more
after +==== blank-line-inside +
+text
+
+second paragraph
+
+==== markdown-blocks-inside +
+## Heading
+
+- one
+- two
+
+> quoted
+
+==== inline-markdown-inside +bold italic code link :smile: +==== in-blockquote +
+
+text
+
+==== in-list-item + +==== in-table-cell +
+ + + + + + + + + + + +
head
text
+
+==== in-heading +

text

+==== around-b +text +==== in-b +before text after +==== in-core-quote + +==== misnested-with-i +text tail +==== nested-in-itself +outer inner outer +==== repeated +onetwo three +==== tail-and-next-line +text tail
+next line +==== blank-lines-around +before


text


after +==== unclosed +[sup]text +==== unmatched-close +text[/sup] +==== escaped +[sup]text[/sup] +==== uppercase +text diff --git a/spec/fixtures/recook/tag-sup.txt b/spec/fixtures/recook/tag-sup.txt new file mode 100644 index 0000000..a374531 --- /dev/null +++ b/spec/fixtures/recook/tag-sup.txt @@ -0,0 +1,85 @@ +Generated by generate.rb; edit that, not this file. +==== alone +[sup]text[/sup] +==== empty +[sup][/sup] +==== mid-line +before [sup]text[/sup] after +==== own-lines +[sup] +text +[/sup] +==== own-lines-between-text +before +[sup] +text +[/sup] +after +==== starts-mid-line-spans-lines +before [sup]text +more[/sup] after +==== blank-line-inside +[sup] +text + +second paragraph +[/sup] +==== markdown-blocks-inside +[sup] +## Heading + +- one +- two + +> quoted +[/sup] +==== inline-markdown-inside +[sup]**bold** _italic_ `code` [link](https://example.com) :smile:[/sup] +==== in-blockquote +> [sup] +> text +> [/sup] +==== in-list-item +- [sup] + text + [/sup] +- next +==== in-table-cell +| head | +|---| +| [sup]text[/sup] | +==== in-heading +## [sup]text[/sup] +==== around-b +[sup][b]text[/b][/sup] +==== in-b +[b]before [sup]text[/sup] after[/b] +==== in-core-quote +[quote] +[sup]text[/sup] +[/quote] +==== misnested-with-i +[sup][i]text[/sup] tail[/i] +==== nested-in-itself +[sup]outer [sup]inner[/sup] outer[/sup] +==== repeated +[sup]one[/sup][sup]two[/sup] [sup]three[/sup] +==== tail-and-next-line +[sup]text[/sup] tail +next line +==== blank-lines-around +before + + +[sup]text[/sup] + + +after +==== unclosed +[sup]text +==== unmatched-close +text[/sup] +==== escaped +\[sup]text[/sup] +==== uppercase +[SUP]text[/SUP] diff --git a/spec/fixtures/recook/tag-tabs.cooked b/spec/fixtures/recook/tag-tabs.cooked new file mode 100644 index 0000000..c1de0c3 --- /dev/null +++ b/spec/fixtures/recook/tag-tabs.cooked @@ -0,0 +1,184 @@ +==== alone +
+ + +
one
+ + +
two
+
+==== empty +[tabs][/tabs] +==== mid-line +before
one
two
after +==== own-lines +
+ + +
one
+ + +
two
+
+==== own-lines-between-text +before
+ + +
one
+ + +
two
+
+
after +==== starts-mid-line-spans-lines +before
+ + +
one
+ + +
two
+
+after +==== blank-line-inside +
+ + +
one
+ + +
two
+
+==== markdown-blocks-inside +[tabs]

Heading

+ +
+quoted
+[/tabs]
+==== inline-markdown-inside +[tabs]bold italic code link :smile:[/tabs] +==== in-blockquote +
+
+ + +
one
+ + +
two
+
+
+==== in-list-item + +==== in-table-cell +
+ + + + + + + + + + + +
head
one
two
+
+==== in-heading +

one
two

+==== around-b +[tabs][tab=One]one[/tab][tab=Two]two[/tab][/tabs] +==== in-b +before
one
two
after
+==== in-core-quote + +==== misnested-with-i +[tabs][tab=One]one[/tab][tab=Two]two[/tab][/tabs] tail +==== nested-in-itself +[tabs]outer [tabs]inner[/tabs] outer[/tabs] +==== repeated +[tabs]one[/tabs][tabs]two[/tabs] [tabs]three[/tabs] +==== tail-and-next-line +
+ + +
one
+ + +
two
+
+tail
next line +==== blank-lines-around +before


+ + +
one
+ + +
two
+
+


after +==== unclosed +[tabs][tab=One]one[/tab][tab=Two]two[/tab] +==== unmatched-close +[tab=One]one[/tab][tab=Two]two[/tab][/tabs] +==== escaped +[tabs][tab=One]one[/tab][tab=Two]two[/tab][/tabs] +==== uppercase +
+ + +
one
+ + +
two
+
diff --git a/spec/fixtures/recook/tag-tabs.txt b/spec/fixtures/recook/tag-tabs.txt new file mode 100644 index 0000000..178be44 --- /dev/null +++ b/spec/fixtures/recook/tag-tabs.txt @@ -0,0 +1,85 @@ +Generated by generate.rb; edit that, not this file. +==== alone +[tabs][tab=One]one[/tab][tab=Two]two[/tab][/tabs] +==== empty +[tabs][/tabs] +==== mid-line +before [tabs][tab=One]one[/tab][tab=Two]two[/tab][/tabs] after +==== own-lines +[tabs] +[tab=One]one[/tab][tab=Two]two[/tab] +[/tabs] +==== own-lines-between-text +before +[tabs] +[tab=One]one[/tab][tab=Two]two[/tab] +[/tabs] +after +==== starts-mid-line-spans-lines +before [tabs][tab=One]one[/tab][tab=Two]two[/tab] +more[/tabs] after +==== blank-line-inside +[tabs] +[tab=One]one[/tab][tab=Two]two[/tab] + +second paragraph +[/tabs] +==== markdown-blocks-inside +[tabs] +## Heading + +- one +- two + +> quoted +[/tabs] +==== inline-markdown-inside +[tabs]**bold** _italic_ `code` [link](https://example.com) :smile:[/tabs] +==== in-blockquote +> [tabs] +> [tab=One]one[/tab][tab=Two]two[/tab] +> [/tabs] +==== in-list-item +- [tabs] + [tab=One]one[/tab][tab=Two]two[/tab] + [/tabs] +- next +==== in-table-cell +| head | +|---| +| [tabs][tab=One]one[/tab][tab=Two]two[/tab][/tabs] | +==== in-heading +## [tabs][tab=One]one[/tab][tab=Two]two[/tab][/tabs] +==== around-b +[tabs][b][tab=One]one[/tab][tab=Two]two[/tab][/b][/tabs] +==== in-b +[b]before [tabs][tab=One]one[/tab][tab=Two]two[/tab][/tabs] after[/b] +==== in-core-quote +[quote] +[tabs][tab=One]one[/tab][tab=Two]two[/tab][/tabs] +[/quote] +==== misnested-with-i +[tabs][i][tab=One]one[/tab][tab=Two]two[/tab][/tabs] tail[/i] +==== nested-in-itself +[tabs]outer [tabs]inner[/tabs] outer[/tabs] +==== repeated +[tabs]one[/tabs][tabs]two[/tabs] [tabs]three[/tabs] +==== tail-and-next-line +[tabs][tab=One]one[/tab][tab=Two]two[/tab][/tabs] tail +next line +==== blank-lines-around +before + + +[tabs][tab=One]one[/tab][tab=Two]two[/tab][/tabs] + + +after +==== unclosed +[tabs][tab=One]one[/tab][tab=Two]two[/tab] +==== unmatched-close +[tab=One]one[/tab][tab=Two]two[/tab][/tabs] +==== escaped +\[tabs][tab=One]one[/tab][tab=Two]two[/tab][/tabs] +==== uppercase +[TABS][tab=One]one[/tab][tab=Two]two[/tab][/TABS] diff --git a/spec/fixtures/recook/tag-textmessage.cooked b/spec/fixtures/recook/tag-textmessage.cooked new file mode 100644 index 0000000..c8a657a --- /dev/null +++ b/spec/fixtures/recook/tag-textmessage.cooked @@ -0,0 +1,294 @@ +==== alone +
+
+Bob
+
+
hi
yo
+
+
+==== empty +
+
+Bob
+
+
+
+
+==== mid-line +before
Bob
hi
yo
after +==== own-lines +
+
+Bob
+
+
+
+
+
hi
+
+
+
yo
+
+
+
+
+
+==== own-lines-between-text +before
+
+Bob
+
+
+
+
+
hi
+
+
+
yo
+
+
+
+
+
+
after +==== starts-mid-line-spans-lines +before
+
+Bob
+
+
+
+
hi
+
+
+
yo
+
+
more
+
+
+after +==== blank-line-inside +
+
+Bob
+
+
+
+
+
hi
+
+
+
yo
+
+

second paragraph
+
+
+
+==== markdown-blocks-inside +
+
+Bob
+
+
+
+

Heading

+
    +
  • one
  • +
  • two
  • +
+
+quoted
+
+
+
+
+==== inline-markdown-inside +
+
+Bob
+
+
bold italic code link :smile:
+
+
+==== in-blockquote +
+
+
+Bob
+
+
+
+
+
hi
+
+
+
yo
+
+
+
+
+
+
+==== in-list-item + +==== in-table-cell +
+ + + + + + + + + + + +
head
Bob
hi
yo
+
+==== in-heading +

Bob
hi
yo

+==== around-b +
+
+Bob
+
+
hi
yo
+
+
+==== in-b +before
Bob
hi
yo
after
+==== in-core-quote + +==== misnested-with-i +
+
+Bob
+
+
hi
yo
+
+
+tail +==== nested-in-itself +
+
+Bob
+
+
outer
Bob
inner
outer
+
+
+==== repeated +
+
+Bob
+
+
one
+
+
+
+
+Bob
+
+
two
+
+
+
+
+Bob
+
+
three
+
+
+==== tail-and-next-line +
+
+Bob
+
+
hi
yo
+
+
+tail
next line +==== blank-lines-around +before


+
+Bob
+
+
hi
yo
+
+
+


after +==== unclosed +[textmessage=Bob]
hi
yo
+==== unmatched-close +
+
hi
+
+
+
yo
+
+[/textmessage] +==== escaped +[textmessage=Bob]
hi
yo
[/textmessage] +==== uppercase +
+
+Bob
+
+
hi
yo
+
+
+==== [textmessage] alone +
+
+Recipient
+
+
hi
yo
+
+
+==== [textmessage] own-lines +
+
+Recipient
+
+
+
+
+
hi
+
+
+
yo
+
+
+
+
+
diff --git a/spec/fixtures/recook/tag-textmessage.txt b/spec/fixtures/recook/tag-textmessage.txt new file mode 100644 index 0000000..79086ea --- /dev/null +++ b/spec/fixtures/recook/tag-textmessage.txt @@ -0,0 +1,91 @@ +Generated by generate.rb; edit that, not this file. +==== alone +[textmessage=Bob][message=them]hi[/message][message=me]yo[/message][/textmessage] +==== empty +[textmessage=Bob][/textmessage] +==== mid-line +before [textmessage=Bob][message=them]hi[/message][message=me]yo[/message][/textmessage] after +==== own-lines +[textmessage=Bob] +[message=them]hi[/message][message=me]yo[/message] +[/textmessage] +==== own-lines-between-text +before +[textmessage=Bob] +[message=them]hi[/message][message=me]yo[/message] +[/textmessage] +after +==== starts-mid-line-spans-lines +before [textmessage=Bob][message=them]hi[/message][message=me]yo[/message] +more[/textmessage] after +==== blank-line-inside +[textmessage=Bob] +[message=them]hi[/message][message=me]yo[/message] + +second paragraph +[/textmessage] +==== markdown-blocks-inside +[textmessage=Bob] +## Heading + +- one +- two + +> quoted +[/textmessage] +==== inline-markdown-inside +[textmessage=Bob]**bold** _italic_ `code` [link](https://example.com) :smile:[/textmessage] +==== in-blockquote +> [textmessage=Bob] +> [message=them]hi[/message][message=me]yo[/message] +> [/textmessage] +==== in-list-item +- [textmessage=Bob] + [message=them]hi[/message][message=me]yo[/message] + [/textmessage] +- next +==== in-table-cell +| head | +|---| +| [textmessage=Bob][message=them]hi[/message][message=me]yo[/message][/textmessage] | +==== in-heading +## [textmessage=Bob][message=them]hi[/message][message=me]yo[/message][/textmessage] +==== around-b +[textmessage=Bob][b][message=them]hi[/message][message=me]yo[/message][/b][/textmessage] +==== in-b +[b]before [textmessage=Bob][message=them]hi[/message][message=me]yo[/message][/textmessage] after[/b] +==== in-core-quote +[quote] +[textmessage=Bob][message=them]hi[/message][message=me]yo[/message][/textmessage] +[/quote] +==== misnested-with-i +[textmessage=Bob][i][message=them]hi[/message][message=me]yo[/message][/textmessage] tail[/i] +==== nested-in-itself +[textmessage=Bob]outer [textmessage=Bob]inner[/textmessage] outer[/textmessage] +==== repeated +[textmessage=Bob]one[/textmessage][textmessage=Bob]two[/textmessage] [textmessage=Bob]three[/textmessage] +==== tail-and-next-line +[textmessage=Bob][message=them]hi[/message][message=me]yo[/message][/textmessage] tail +next line +==== blank-lines-around +before + + +[textmessage=Bob][message=them]hi[/message][message=me]yo[/message][/textmessage] + + +after +==== unclosed +[textmessage=Bob][message=them]hi[/message][message=me]yo[/message] +==== unmatched-close +[message=them]hi[/message][message=me]yo[/message][/textmessage] +==== escaped +\[textmessage=Bob][message=them]hi[/message][message=me]yo[/message][/textmessage] +==== uppercase +[TEXTMESSAGE=Bob][message=them]hi[/message][message=me]yo[/message][/TEXTMESSAGE] +==== [textmessage] alone +[textmessage][message=them]hi[/message][message=me]yo[/message][/textmessage] +==== [textmessage] own-lines +[textmessage] +[message=them]hi[/message][message=me]yo[/message] +[/textmessage] diff --git a/spec/fixtures/recook/tag-thinprogress.cooked b/spec/fixtures/recook/tag-thinprogress.cooked new file mode 100644 index 0000000..1a59389 --- /dev/null +++ b/spec/fixtures/recook/tag-thinprogress.cooked @@ -0,0 +1,189 @@ +==== alone +
+
text
+
+
+
+==== empty +
+
+
+
+
+==== mid-line +before
text
after +==== own-lines +
+
+text
+
+
+
+==== own-lines-between-text +before
+
+text
+
+
+
+
after +==== starts-mid-line-spans-lines +before
+
+text
+more
+
+
+
+after +==== blank-line-inside +
+
+text

second paragraph
+
+
+
+==== markdown-blocks-inside +
+
+

Heading

+
    +
  • one
  • +
  • two
  • +
+
+quoted
+
+
+
+
+==== inline-markdown-inside +
+
bold italic code link :smile:
+
+
+
+==== in-blockquote +
+
+
+text
+
+
+
+
+==== in-list-item + +==== in-table-cell +
+ + + + + + + + + + + +
head
text
+
+==== in-heading +

text

+==== around-b +
+
text
+
+
+
+==== in-b +before
text
after
+==== in-core-quote + +==== misnested-with-i +
+
text
+
+
+
+tail +==== nested-in-itself +
+
outer
inner
outer
+
+
+
+==== repeated +
+
one
+
+
+
+
+
two
+
+
+
+
+
three
+
+
+
+==== tail-and-next-line +
+
text
+
+
+
+tail
next line +==== blank-lines-around +before


+
text
+
+
+
+


after +==== unclosed +[thinprogress=40]text +==== unmatched-close +text[/thinprogress] +==== escaped +[thinprogress=40]text[/thinprogress] +==== uppercase +
+
text
+
+
+
+==== [thinprogress] alone +
+
text
+
+
+
+==== [thinprogress] own-lines +
+
+text
+
+
+
diff --git a/spec/fixtures/recook/tag-thinprogress.txt b/spec/fixtures/recook/tag-thinprogress.txt new file mode 100644 index 0000000..45608d2 --- /dev/null +++ b/spec/fixtures/recook/tag-thinprogress.txt @@ -0,0 +1,91 @@ +Generated by generate.rb; edit that, not this file. +==== alone +[thinprogress=40]text[/thinprogress] +==== empty +[thinprogress=40][/thinprogress] +==== mid-line +before [thinprogress=40]text[/thinprogress] after +==== own-lines +[thinprogress=40] +text +[/thinprogress] +==== own-lines-between-text +before +[thinprogress=40] +text +[/thinprogress] +after +==== starts-mid-line-spans-lines +before [thinprogress=40]text +more[/thinprogress] after +==== blank-line-inside +[thinprogress=40] +text + +second paragraph +[/thinprogress] +==== markdown-blocks-inside +[thinprogress=40] +## Heading + +- one +- two + +> quoted +[/thinprogress] +==== inline-markdown-inside +[thinprogress=40]**bold** _italic_ `code` [link](https://example.com) :smile:[/thinprogress] +==== in-blockquote +> [thinprogress=40] +> text +> [/thinprogress] +==== in-list-item +- [thinprogress=40] + text + [/thinprogress] +- next +==== in-table-cell +| head | +|---| +| [thinprogress=40]text[/thinprogress] | +==== in-heading +## [thinprogress=40]text[/thinprogress] +==== around-b +[thinprogress=40][b]text[/b][/thinprogress] +==== in-b +[b]before [thinprogress=40]text[/thinprogress] after[/b] +==== in-core-quote +[quote] +[thinprogress=40]text[/thinprogress] +[/quote] +==== misnested-with-i +[thinprogress=40][i]text[/thinprogress] tail[/i] +==== nested-in-itself +[thinprogress=40]outer [thinprogress=40]inner[/thinprogress] outer[/thinprogress] +==== repeated +[thinprogress=40]one[/thinprogress][thinprogress=40]two[/thinprogress] [thinprogress=40]three[/thinprogress] +==== tail-and-next-line +[thinprogress=40]text[/thinprogress] tail +next line +==== blank-lines-around +before + + +[thinprogress=40]text[/thinprogress] + + +after +==== unclosed +[thinprogress=40]text +==== unmatched-close +text[/thinprogress] +==== escaped +\[thinprogress=40]text[/thinprogress] +==== uppercase +[THINPROGRESS=40]text[/THINPROGRESS] +==== [thinprogress] alone +[thinprogress]text[/thinprogress] +==== [thinprogress] own-lines +[thinprogress] +text +[/thinprogress] diff --git a/spec/fixtures/recook/tag-u.cooked b/spec/fixtures/recook/tag-u.cooked new file mode 100644 index 0000000..2575da4 --- /dev/null +++ b/spec/fixtures/recook/tag-u.cooked @@ -0,0 +1,96 @@ +==== alone +text +==== empty + +==== mid-line +before text after +==== own-lines +
+text
+
+==== own-lines-between-text +before
+
+text
+

+after +==== starts-mid-line-spans-lines +before text
+more
after +==== blank-line-inside +
+text
+
+second paragraph
+
+==== markdown-blocks-inside +
+
+

Heading

+ +
+quoted
+
+
+==== inline-markdown-inside +bold italic code link :smile: +==== in-blockquote +
+
+text
+
+==== in-list-item + +==== in-table-cell +
+ + + + + + + + + + + +
head
text
+
+==== in-heading +

text

+==== around-b +text +==== in-b +before text after +==== in-core-quote + +==== misnested-with-i +text tail +==== nested-in-itself +outer inner outer +==== repeated +onetwo three +==== tail-and-next-line +text tail
+next line +==== blank-lines-around +before


text


after +==== unclosed +[u]text +==== unmatched-close +text[/u] +==== escaped +[u]text[/u] +==== uppercase +text diff --git a/spec/fixtures/recook/tag-u.txt b/spec/fixtures/recook/tag-u.txt new file mode 100644 index 0000000..fbb284d --- /dev/null +++ b/spec/fixtures/recook/tag-u.txt @@ -0,0 +1,85 @@ +Generated by generate.rb; edit that, not this file. +==== alone +[u]text[/u] +==== empty +[u][/u] +==== mid-line +before [u]text[/u] after +==== own-lines +[u] +text +[/u] +==== own-lines-between-text +before +[u] +text +[/u] +after +==== starts-mid-line-spans-lines +before [u]text +more[/u] after +==== blank-line-inside +[u] +text + +second paragraph +[/u] +==== markdown-blocks-inside +[u] +## Heading + +- one +- two + +> quoted +[/u] +==== inline-markdown-inside +[u]**bold** _italic_ `code` [link](https://example.com) :smile:[/u] +==== in-blockquote +> [u] +> text +> [/u] +==== in-list-item +- [u] + text + [/u] +- next +==== in-table-cell +| head | +|---| +| [u]text[/u] | +==== in-heading +## [u]text[/u] +==== around-b +[u][b]text[/b][/u] +==== in-b +[b]before [u]text[/u] after[/b] +==== in-core-quote +[quote] +[u]text[/u] +[/quote] +==== misnested-with-i +[u][i]text[/u] tail[/i] +==== nested-in-itself +[u]outer [u]inner[/u] outer[/u] +==== repeated +[u]one[/u][u]two[/u] [u]three[/u] +==== tail-and-next-line +[u]text[/u] tail +next line +==== blank-lines-around +before + + +[u]text[/u] + + +after +==== unclosed +[u]text +==== unmatched-close +text[/u] +==== escaped +\[u]text[/u] +==== uppercase +[U]text[/U] diff --git a/spec/fixtures/recook/tag-url.cooked b/spec/fixtures/recook/tag-url.cooked new file mode 100644 index 0000000..ca36991 --- /dev/null +++ b/spec/fixtures/recook/tag-url.cooked @@ -0,0 +1,97 @@ +==== alone +text +==== empty + +==== mid-line +before text after +==== own-lines +
+text
+
+==== own-lines-between-text +before
+
+text
+

+after +==== starts-mid-line-spans-lines +before text
+more
after +==== blank-line-inside +[url=https://example.com]
+text

second paragraph
+[/url] +==== markdown-blocks-inside +[url=https://example.com]

Heading

+ +
+quoted
+[/url]
+==== inline-markdown-inside +bold italic code link :smile: +==== in-blockquote +
+
+text
+
+==== in-list-item + +==== in-table-cell +
+ + + + + + + + + + + +
head
text
+
+==== in-heading +

text

+==== around-b +text +==== in-b +before text after +==== in-core-quote + +==== misnested-with-i +text tail +==== nested-in-itself +outer [url=https://example.com]inner outer[/url] +==== repeated +onetwo three +==== tail-and-next-line +text tail
+next line +==== blank-lines-around +before


text


after +==== unclosed +[url=https://example.com]text +==== unmatched-close +text[/url] +==== escaped +[url=https://example.com]text[/url] +==== uppercase +text +==== [url] alone +text +==== [url] own-lines +
+text
+
diff --git a/spec/fixtures/recook/tag-url.txt b/spec/fixtures/recook/tag-url.txt new file mode 100644 index 0000000..088ecef --- /dev/null +++ b/spec/fixtures/recook/tag-url.txt @@ -0,0 +1,91 @@ +Generated by generate.rb; edit that, not this file. +==== alone +[url=https://example.com]text[/url] +==== empty +[url=https://example.com][/url] +==== mid-line +before [url=https://example.com]text[/url] after +==== own-lines +[url=https://example.com] +text +[/url] +==== own-lines-between-text +before +[url=https://example.com] +text +[/url] +after +==== starts-mid-line-spans-lines +before [url=https://example.com]text +more[/url] after +==== blank-line-inside +[url=https://example.com] +text + +second paragraph +[/url] +==== markdown-blocks-inside +[url=https://example.com] +## Heading + +- one +- two + +> quoted +[/url] +==== inline-markdown-inside +[url=https://example.com]**bold** _italic_ `code` [link](https://example.com) :smile:[/url] +==== in-blockquote +> [url=https://example.com] +> text +> [/url] +==== in-list-item +- [url=https://example.com] + text + [/url] +- next +==== in-table-cell +| head | +|---| +| [url=https://example.com]text[/url] | +==== in-heading +## [url=https://example.com]text[/url] +==== around-b +[url=https://example.com][b]text[/b][/url] +==== in-b +[b]before [url=https://example.com]text[/url] after[/b] +==== in-core-quote +[quote] +[url=https://example.com]text[/url] +[/quote] +==== misnested-with-i +[url=https://example.com][i]text[/url] tail[/i] +==== nested-in-itself +[url=https://example.com]outer [url=https://example.com]inner[/url] outer[/url] +==== repeated +[url=https://example.com]one[/url][url=https://example.com]two[/url] [url=https://example.com]three[/url] +==== tail-and-next-line +[url=https://example.com]text[/url] tail +next line +==== blank-lines-around +before + + +[url=https://example.com]text[/url] + + +after +==== unclosed +[url=https://example.com]text +==== unmatched-close +text[/url] +==== escaped +\[url=https://example.com]text[/url] +==== uppercase +[URL=https://example.com]text[/URL] +==== [url] alone +[url]text[/url] +==== [url] own-lines +[url] +text +[/url] diff --git a/spec/fixtures/recook/tag-wrap.cooked b/spec/fixtures/recook/tag-wrap.cooked new file mode 100644 index 0000000..6516fdd --- /dev/null +++ b/spec/fixtures/recook/tag-wrap.cooked @@ -0,0 +1,99 @@ +==== alone +
+text
+==== empty + +==== mid-line +before text after +==== own-lines +
+text
+==== own-lines-between-text +before
+text
+after +==== starts-mid-line-spans-lines +before text +more after +==== blank-line-inside +
+text

second paragraph
+==== markdown-blocks-inside +
+

Heading

+ +
+quoted
+
+==== inline-markdown-inside +
+bold italic code link :smile:
+==== in-blockquote +
+
+text
+
+==== in-list-item + +==== in-table-cell +
+ + + + + + + + + + + +
head
text
+
+==== in-heading +

text

+==== around-b +
+text
+==== in-b +before text after +==== in-core-quote + +==== misnested-with-i +[i]text[/i] tail +==== nested-in-itself +
+outer inner outer
+==== repeated +
+one[/wrap]two [wrap=box]three
+==== tail-and-next-line +text tail
+next line +==== blank-lines-around +before
+text
+after +==== unclosed +[wrap=box]text +==== unmatched-close +text[/wrap] +==== escaped +[wrap=box]text[/wrap] +==== uppercase +
+text
diff --git a/spec/fixtures/recook/tag-wrap.txt b/spec/fixtures/recook/tag-wrap.txt new file mode 100644 index 0000000..c29dccf --- /dev/null +++ b/spec/fixtures/recook/tag-wrap.txt @@ -0,0 +1,85 @@ +Generated by generate.rb; edit that, not this file. +==== alone +[wrap=box]text[/wrap] +==== empty +[wrap=box][/wrap] +==== mid-line +before [wrap=box]text[/wrap] after +==== own-lines +[wrap=box] +text +[/wrap] +==== own-lines-between-text +before +[wrap=box] +text +[/wrap] +after +==== starts-mid-line-spans-lines +before [wrap=box]text +more[/wrap] after +==== blank-line-inside +[wrap=box] +text + +second paragraph +[/wrap] +==== markdown-blocks-inside +[wrap=box] +## Heading + +- one +- two + +> quoted +[/wrap] +==== inline-markdown-inside +[wrap=box]**bold** _italic_ `code` [link](https://example.com) :smile:[/wrap] +==== in-blockquote +> [wrap=box] +> text +> [/wrap] +==== in-list-item +- [wrap=box] + text + [/wrap] +- next +==== in-table-cell +| head | +|---| +| [wrap=box]text[/wrap] | +==== in-heading +## [wrap=box]text[/wrap] +==== around-b +[wrap=box][b]text[/b][/wrap] +==== in-b +[b]before [wrap=box]text[/wrap] after[/b] +==== in-core-quote +[quote] +[wrap=box]text[/wrap] +[/quote] +==== misnested-with-i +[wrap=box][i]text[/wrap] tail[/i] +==== nested-in-itself +[wrap=box]outer [wrap=box]inner[/wrap] outer[/wrap] +==== repeated +[wrap=box]one[/wrap][wrap=box]two[/wrap] [wrap=box]three[/wrap] +==== tail-and-next-line +[wrap=box]text[/wrap] tail +next line +==== blank-lines-around +before + + +[wrap=box]text[/wrap] + + +after +==== unclosed +[wrap=box]text +==== unmatched-close +text[/wrap] +==== escaped +\[wrap=box]text[/wrap] +==== uppercase +[WRAP=box]text[/WRAP] diff --git a/spec/fixtures/recook/tags.cooked b/spec/fixtures/recook/tags.cooked new file mode 100644 index 0000000..8fe27f8 --- /dev/null +++ b/spec/fixtures/recook/tags.cooked @@ -0,0 +1,58 @@ +==== boxes +
w
+
p
+
+
+
n +
+
+
+ +Legend +
f
+
+
+
p
+
+
+
+
c
+
s
+
n
+==== fonts +a b c +==== headings +

a

+

b

+

c

+
[h7]d[/h7] +==== inline +xst hidden anchor go h p +==== textmessage +
+
+Bob
+
+
+
+
+
hi
+
+
+
yo
+
+
+
+
+
+
+
bare
+
+==== wrappers +
l
+
r
+
j
+
b
+
g
+
c
+
i
diff --git a/spec/fixtures/recook/tags.txt b/spec/fixtures/recook/tags.txt new file mode 100644 index 0000000..a31bf42 --- /dev/null +++ b/spec/fixtures/recook/tags.txt @@ -0,0 +1,32 @@ +==== boxes +[block=warning]w[/block] +[print=line]p[/print] +[note]n[/note] +[fieldset=Legend]f[/fieldset] +[progress=40]p[/progress] +[check=x]c[/check] +[side=right]s[/side] +[newspaper]n[/newspaper] +==== fonts +[font=Georgia]a[/font] [font=Lato style=bold italic]b[/font] [font family=Roboto wdth=80 style=300]c[/font] +==== headings +[h]a[/h] +[sh]b[/sh] +[h3]c[/h3] +[h7]d[/h7] +==== inline +x[sub]s[/sub][sup]t[/sup] [inlinespoiler] hidden [/inlinespoiler] [a=top]anchor[/a] [goto=top]go[/goto] [highlight]h[/highlight] [pindent]p[/pindent] +==== textmessage +[textmessage=Bob] +[message=them]hi[/message] +[message=me]yo[/message] +[/textmessage] +[message=me]bare[/message] +==== wrappers +[left]l[/left] +[right]r[/right] +[justify]j[/justify] +[border=1px solid red]b[/border] +[bg=red]g[/bg] +[centerblock=40]c[/centerblock] +[imagefloat=left]i[/imagefloat] diff --git a/spec/integration/tags_with_other_features_spec.rb b/spec/integration/tags_with_other_features_spec.rb new file mode 100644 index 0000000..9250678 --- /dev/null +++ b/spec/integration/tags_with_other_features_spec.rb @@ -0,0 +1,282 @@ +# frozen_string_literal: true + +# Other rules and plugins act on a post after it is cooked: they create +# records, notify people, edit it by position, or rewrite it for emails. These +# create real posts with those features inside bbcode tags. The recook +# snapshots show the HTML; this shows the features still work. +RSpec.describe "Other features inside bbcode tags" do + fab!(:user) { Fabricate(:user, refresh_auto_groups: true) } + fab!(:other_user) { Fabricate(:user, username: "other_user", refresh_auto_groups: true) } + + before do + SiteSetting.bbcode_enabled = true + PrettyText.reset_context + Jobs.run_immediately! + # post processing fetches link titles and avatar sizes + stub_request(:any, %r{\Ahttps?://(example\.com|test\.localhost)/}).to_return( + status: 200, + body: "", + ) + end + + after { PrettyText.reset_context } + + def create_post(raw, topic_id: nil, author: user) + title = "A topic with bbcode in it #{SecureRandom.alphanumeric(8)}" + PostCreator.create!(author, raw:, topic_id:, title:) + end + + describe "polls" do + it "creates a poll inside a layout tag, with bbcode in its options, that takes votes" do + post = create_post("[center]\n[poll]\n* [b]one[/b]\n* two\n[/poll]\n[/center]") + poll = Poll.find_by(post:) + + expect(poll.poll_options.map(&:html)).to eq([%(one), "two"]) + + DiscoursePoll::Poll.vote(other_user, post.id, "poll", [poll.poll_options.first.digest]) + + expect(poll.poll_votes.pluck(:user_id)).to eq([other_user.id]) + end + + it "creates every poll in a tabbed post, each under its own name" do + post = + create_post( + "[tabs]\n[tab=Day 1]\n[poll name=day1]\n* yes\n* no\n[/poll]\n[/tab]\n" \ + "[tab=Day 2]\n[poll name=day2]\n* stay\n* go\n[/poll]\n[/tab]\n[/tabs]", + ) + + expect(Poll.where(post:).pluck(:name)).to contain_exactly("day1", "day2") + end + end + + describe "checklists" do + def checkbox_toggled(raw, index) + post = create_post(raw) + boxes = Nokogiri::HTML5.fragment(post.cooked).css("span.chcklst-box") + result = + Checklist::ToggleCheckbox.call( + guardian: user.guardian, + params: { + post_id: post.id, + toggles: [ + { + checkbox_index: index, + checkbox_count: boxes.size, + checkbox_source: boxes[index]&.[]("data-chk-src"), + checked: true, + }, + ], + expected_raw: post.raw, + expected_updated_at: post.updated_at.iso8601(3), + mutation_id: SecureRandom.hex, + }, + ) + expect(result).to be_a_success + post.reload.raw + end + + it "toggles the box clicked when the boxes are inside a block tag" do + expect(checkbox_toggled("intro\n[center]\n[ ] one\n[ ] two\n[/center]", 1)).to eq( + "intro\n[center]\n[ ] one\n[x] two\n[/center]", + ) + end + + it "toggles the box clicked when a block tag comes first" do + expect(checkbox_toggled("[center]\nx\n\ny\n[/center]\n[ ] one\n[ ] two", 1)).to eq( + "[center]\nx\n\ny\n[/center]\n[ ] one\n[x] two", + ) + end + + it "toggles the box clicked after an inline tag spanning lines" do + expect(checkbox_toggled("[b]a\nb[/b]\n[ ] one\n[ ] two", 1)).to eq( + "[b]a\nb[/b]\n[ ] one\n[x] two", + ) + end + + it "toggles the box clicked two tags deep" do + raw = "[center]\n[spoiler=Tasks]\n[ ] one\n[ ] two\n[/spoiler]\n[/center]" + + expect(checkbox_toggled(raw, 1)).to eq(raw.sub("[ ] two", "[x] two")) + end + + it "leaves a box inside an inline tag as text, as inside Markdown emphasis" do + post = create_post("[b][ ] one[/b] **[ ] two** [ ] three") + + expect(Nokogiri::HTML5.fragment(post.cooked).css("span.chcklst-box").size).to eq(1) + end + + it "toggles the box clicked after a block tag that starts mid-line" do + expect(checkbox_toggled("text [center]a\nb[/center]\n[ ] one\n[ ] two", 1)).to eq( + "text [center]a\nb[/center]\n[ ] one\n[x] two", + ) + end + + it "toggles the first box, not the next one, after a block tag that starts mid-line" do + expect(checkbox_toggled("text [center]a\nb[/center]\n[ ] one\n[ ] two", 0)).to eq( + "text [center]a\nb[/center]\n[x] one\n[ ] two", + ) + end + + it "toggles the box clicked inside a block tag in a blockquote" do + expect(checkbox_toggled("> [center]\n> [ ] one\n> [ ] two\n> [/center]", 1)).to eq( + "> [center]\n> [ ] one\n> [x] two\n> [/center]", + ) + end + + it "toggles the box clicked in a to-do list inside a spoiler" do + expect(checkbox_toggled("[spoiler=Tasks]\n[ ] pack\n[ ] leave\n[/spoiler]", 1)).to eq( + "[spoiler=Tasks]\n[ ] pack\n[x] leave\n[/spoiler]", + ) + end + + it "skips a box shown as plain text" do + expect(checkbox_toggled("[plain][ ][/plain] shown\n[ ] one", 0)).to eq( + "[plain][ ][/plain] shown\n[x] one", + ) + end + end + + describe "oneboxes" do + let(:url) { "https://example.com/story" } + + before do + stub_request(:any, url).to_return( + status: 200, + body: + "" \ + "", + ) + end + + it "oneboxes a URL on its own line inside a block tag, as at the top level" do + post = create_post("[center]\n#{url}\n[/center]\n[spoiler=Link]\n#{url}\n[/spoiler]") + doc = Nokogiri::HTML5.fragment(post.reload.cooked) + + expect(doc.css("div.bb-center aside.onebox, div.bb-spoiler-content aside.onebox").size).to eq( + 2, + ) + end + + it "keeps a URL inline when it shares its line with text or a tag, or is in a Markdown quote" do + post = + create_post( + "[center]\nread #{url}\n[/center]\n[center]#{url}[/center]\n\n> [center]\n> #{url}\n> [/center]", + ) + + expect(Nokogiri::HTML5.fragment(post.reload.cooked).css("aside.onebox")).to be_empty + end + end + + describe "details" do + it "reduces details inside a bbcode tag to a link in emails" do + post = create_post("[center]\n[details=Summary]\nsecret [b]text[/b]\n[/details]\n[/center]") + email = PrettyText.format_for_email(post.cooked, post) + + expect(email).to include("Summary", I18n.t("details.excerpt_details")) + expect(email).not_to include("secret") + end + end + + describe "footnotes" do + it "links each footnote reference inside a tag to its footnote" do + post = + create_post("[b]claim[^1][/b] and [center]another[^2][/center]\n\n[^1]: one\n[^2]: two") + doc = Nokogiri::HTML5.fragment(post.cooked) + targets = doc.css("sup.footnote-ref a").map { |link| link["href"].delete_prefix("#") } + + expect(targets.size).to eq(2) + expect(targets).to all(satisfy { |id| doc.at_css("[id='#{id}']") }) + end + end + + describe "emoji" do + it "turns shortcodes and unicode emoji into images inside tags, but not in plain text" do + post = create_post("[center]:smile: 😀[/center] [plain]:smile: 😀[/plain]") + emoji = Nokogiri::HTML5.fragment(post.cooked).css("img.emoji").map { |img| img["title"] } + + expect(emoji).to eq(%w[:smile: :grinning_face:]) + expect(post.cooked).to include(":smile: 😀").or include(":smile: 😀") + end + end + + describe "quotes" do + it "records and notifies a quote inside a tag, with the quoted user's avatar" do + quoted = create_post("original words", author: other_user) + reply = + create_post( + "[center]\n[quote=\"other_user, post:1, topic:#{quoted.topic_id}\"]\noriginal words\n[/quote]\n[/center]", + ) + + expect(QuotedPost.where(post_id: reply.id).pluck(:quoted_post_id)).to eq([quoted.id]) + expect(Nokogiri::HTML5.fragment(reply.cooked).at_css("aside.quote img.avatar")).to be_present + expect( + Notification.where(user: other_user, notification_type: Notification.types[:quoted]), + ).to exist + end + end + + describe "mentions" do + it "notifies a user mentioned in a character sheet's accordion" do + create_post("[accordion]\n[slide=Allies]\nFriends with @other_user\n[/slide]\n[/accordion]") + + expect( + Notification.where(user: other_user, notification_type: Notification.types[:mentioned]), + ).to exist + end + + it "notifies a user mentioned inside a tag, but not one shown as literal text" do + fab_literal = Fabricate(:user, username: "literal_user") + create_post("[center]hi @other_user[/center] [plain]@literal_user[/plain]") + + mentioned = Notification.where(notification_type: Notification.types[:mentioned]) + expect(mentioned.pluck(:user_id)).to eq([other_user.id]) + expect(mentioned.where(user: fab_literal)).not_to exist + end + end + + describe "links" do + it "records the links inside tags, but not a URL shown as literal text" do + post = + create_post( + "[b]https://example.com/bold[/b] [url=https://example.com/url]x[/url] " \ + "[center][text](https://example.com/md)[/center] [plain]https://example.com/plain[/plain]", + ) + + expect(TopicLink.where(post:).pluck(:url)).to contain_exactly( + "https://example.com/bold", + "https://example.com/url", + "https://example.com/md", + ) + end + end + + describe "hashtags" do + fab!(:category) { Fabricate(:category, slug: "rp-lounge") } + + it "links a category hashtag inside a tag" do + post = create_post("[b]see #rp-lounge[/b]") + + expect(Nokogiri::HTML5.fragment(post.cooked).at_css("a.hashtag-cooked")["href"]).to eq( + category.url, + ) + end + end + + describe "uploads" do + fab!(:upload) { Fabricate(:image_upload, user:) } + + it "references an upload shown inside a tag" do + post = create_post("[center]![image|100x100](#{upload.short_url})[/center]") + + expect(UploadReference.where(target: post).pluck(:upload_id)).to eq([upload.id]) + end + end + + describe "local dates" do + it "records a date written inside a tag" do + post = create_post(%([b][date=2030-01-02 time=10:00:00 timezone="UTC"][/b])) + + expect(post.reload.local_dates.map { |date| date["date"] }).to eq(["2030-01-02"]) + end + end +end diff --git a/spec/lib/cleanup_spec.rb b/spec/lib/cleanup_spec.rb new file mode 100644 index 0000000..e95a397 --- /dev/null +++ b/spec/lib/cleanup_spec.rb @@ -0,0 +1,35 @@ +# frozen_string_literal: true + +RSpec.describe BbCode::Cleanup do + before do + SiteSetting.bbcode_enabled = true + PrettyText.reset_context + end + + after { PrettyText.reset_context } + + it "cleans up a cooked post in one wrapper, with the same output as without it" do + html = PrettyText.markdown("[b]a[/b] @someone\nhttps://example.com\n b\n" * 3) + allow(described_class).to receive(:wrapped).and_call_original + wrapped = PrettyText.cleanup(html) + + expect(described_class).to have_received(:wrapped) + SiteSetting.bbcode_enabled = false + expect(wrapped).to eq(PrettyText.cleanup(html)) + end + + it "runs core's cleanup when the post cooks" do + allow(described_class).to receive(:wrapped).and_call_original + + expect(PrettyText.cook("a\nb")).to eq("a
\nb") + expect(described_class).to have_received(:wrapped) + end + + it "cleans up unwrapped when the HTML names the wrapper" do + html = "a b c" + cleaned = PrettyText.cleanup(html) + + SiteSetting.bbcode_enabled = false + expect(cleaned).to eq(PrettyText.cleanup(html)) + end +end diff --git a/spec/lib/comments_spec.rb b/spec/lib/comments_spec.rb new file mode 100644 index 0000000..d50ae7d --- /dev/null +++ b/spec/lib/comments_spec.rb @@ -0,0 +1,25 @@ +# frozen_string_literal: true + +RSpec.describe BbCode::Comments do + before do + SiteSetting.bbcode_enabled = true + PrettyText.reset_context + end + + after { PrettyText.reset_context } + + it "cooks a comment to a template, which the post's cook turns into an HTML comment" do + raw = "a [comment]note --> y & \"q\"[/comment] b" + + expect(PrettyText.cook(raw)).to include("leak[/class]") + + expect(script).to eq( + %(), + ) + expect(style).to eq( + %(), + ) + end + + it "renders heading tags" do + expect(cook("[h1]Title[/h1]")).to match(%r{

\s*Title

}) + expect(cook("x [sh]mid[/sh] y")).to eq("x

mid

y") + end + + it "keeps tags nested in a link working" do + html = cook("[url=https://example.com][b]x[/b][/url]") + + expect(html).to include(%(x)) + end + + it "leaves code blocks and code spans untouched" do + expect(cook("x\n[code]\n [div=x]\n foo\n[/div]\n[/code]")).to include( + " [div=x]\n foo\n[/div]", + ) + expect(cook("`[div=x]\na[/div]` after")).to eq("[div=x] a[/div] after") + expect(cook("```\n[div=x]\n\nq\n[/div]\n```")).to include("[div=x]\n\nq\n[/div]") + end + + it "renders wrapper tags" do + expect(cook("[progress=40]a[/progress]")).to include( + %(
), + %(
), + %(style="width: calc(40% - 6px)"), + ) + expect(cook("[fieldset=Title]a[/fieldset]")).to match( + %r{\s*Title}, + ) + expect(cook("[print=bogus]a[/print]")).to include(%(class="bb-print")) + expect(cook("[column=6]a[/column]")).to include(%(data-span="column-width-span6")) + end + + it "keeps text before a tag that renders no wrapper in place" do + expect(cook("x [color=]a[/color] y")).to eq("x a y") + end + + it "renders block, mail, size and font tags" do + expect(cook("[block=dice]a[/block]")).to match( + %r{
\s*a
}, + ) + expect(cook("[block=bogus]a[/block]")).to include(%(data-bb-block="block")) + mail = cook(%([mail type=receive person="Bob" subject="Hi"]x[/mail])) + expect(mail).to include(%(data-bb-email="receive")) + expect(mail).to match(%r{bb-email-address">\s*Bob
}) + expect(mail).to match(%r{bb-email-subject">\s*Hi
}) + expect(cook("x [size=20px]a[/size] y")).to include(%(a)) + expect(cook("x [size=big]a[/size] y")).to eq("x a y") + expect(cook(%([font family="Roboto Flex" style="bold italic"]a[/font]))).to include( + %(data-font="https://fonts.googleapis.com/css2?family=Roboto+Flex:ital,wght@1,700"), + "font-style: italic", + ) + end + + it "wraps a multi-line font, size or color in a div that renders block markdown" do + html = cook("[font=Poppins]\n# Title\n\n- a\n[/font]") + + expect(html).to start_with(%(
", "
  • a
  • ") + expect(cook("[size=5]\n# T\n[/size]")).to start_with(%(
    )) + expect(cook("[color=red]\n# T\n[/color]")).to start_with(%(
    )) + end + + it "keeps inline styling tags inline across lines unless they hold markdown blocks" do + expect(cook("x [color=red]a\nb[/color] y")).to eq( + %(x a
    \nb
    y), + ) + expect(cook("[b]a\n\nb[/b] tail")).to start_with(%(a
    )) + expect(cook("x [i]# not a heading\nb[/i] y")).to include(%(# not)) + expect(cook("x [b]a\n[plain]\n# literal\n[/plain][/b]")).to include(%()) + + html = cook("[b]\n# heading\n- item\n[/b]") + expect(html).to start_with(%(
    )) + expect(html).to include("

    ", "
  • item
  • ") + expect(cook("x [i]a\n- one\n- two[/i] y")).to include(%(
    ), "
  • one
  • ") + end + + it "counts the blocks markdown-it and other plugins end a paragraph with, and no others" do + SiteSetting.discourse_math_enabled = true + + expect(cook("[b]a\n$$\nx\n$$\nb[/b]")).to include( + %(
    ), + %(
    ), + ) + expect(cook("[b]a\n[wrap=x]\ny\n[/wrap]\nb[/b]")).to include( + %(
    ), + %(
    ), + ) + expect(cook("[b]a\n
    \ns\nx\n
    \nb[/b]")).to start_with( + %(
    ), + ) + expect(cook("[b]a\n-\nb[/b]")).to include("

    ") + # only a list starting at 1 can interrupt text + expect(cook("[b]a\n2. two\nb[/b]")).to start_with(%()) + expect(cook("[b]a\n[bg=red]x[/bg]\nb[/b]")).to start_with(%()) + end + + it "renders markdown blocks in a container nested in an inline tag" do + html = cook("[b]text [div=x]a\n\n# heading\n- item\n[/div] more[/b]") + + expect(html).to start_with(%(
    )) + expect(html).to include(%(
    ), "

    ", "
  • item
  • ") + end + + it "keeps tags spanning lines inside the blockquote or list item they start in" do + expect(cook("> [center]\n> x\n> [/center]")).to eq( + %(
    \n
    \n
    \nx
    \n
    \n
    ), + ) + expect(cook("- [center]\n x\n [/center]")).to eq( + %(
      \n
    • \n
      \n
      \nx
      \n
      \n
    • \n
    ), + ) + expect(cook("> [b]a\n>\n> b[/b]")).to eq( + %(
    \na
    \n
    \nb
    ), + ) + end + + it "keeps a single-line font at the start of a line inline" do + expect(cook("[font=Poppins]hi[/font] there")).to start_with(%(), + "bb-blockquote-left", + "bb-blockquote-right", + ) + expect(quote).to match(%r{bb-blockquote-speaker">\s*- Alice

    }) + expect(cook("x [a=top]t[/a] y")).to include(%(id="user-anchor-top"), %(name="user-anchor-top")) + expect(cook("[goto=top]j[/goto]")).to include(%(href="#user-anchor-top")) + expect(cook("[inlinespoiler]s[/inlinespoiler]")).to include( + %(s), + ) + end + + it "renders tabs from their direct tab children and drops anything between them" do + html = + cook( + "[tabs]junk [tab=One]first[/tab] more[tab name=\"Two\" style=\"color:red\"]**b**[/tab][/tabs]", + ) + + expect(html.scan(%(\s*One}) + expect(html).to include(%(style="color:red"), "b") + expect(html).not_to include("junk", "more") + expect(cook("[tabs]no tabs[/tabs]")).to eq("[tabs]no tabs[/tabs]") + expect(cook("[tab=X]bare[/tab]")).to eq("[tab=X]bare[/tab]") + end + + it "renders accordions from bracket and brace slides with block markdown inside" do + html = cook(<<~BBCODE) + [accordion=bright|300px] + {slide=[b]Old[/b] style|open|right} + # Heading + + text + {/slide} + [slide title="New"]body **two**[/slide] + [/accordion] + BBCODE + + expect(html).to include(%(class="bb-accordion bright"), "width: 300px;") + expect(html).to include(%(
    ", "two") + expect(html.scan("{/slide} after
    ", + ) + end + + it "renders textmessage conversations" do + html = + cook( + "[textmessage=Ann][message=them]Hi[/message][message=me]Hey **you**[/message][/textmessage]", + ) + + expect(html).to include("bb-textmessage-name", "bb-message-them", "bb-message-me") + expect(html).to include("you") + end + + it "keeps the line breaks before a nobr block" do + expect(cook("a\n\n[nobr]b\nc[/nobr]\n\nd")).to start_with("a

    ").and end_with("

    d") + end + + it "keeps a native container flow when it is nested inside [url], even across a blank line" do + html = cook("[url=https://example.com][div=color:red]a\n\nb[/div][/url]") + + expect(html).to start_with(%(a
    )) + expect(html).to match(%r{
    \s*b

    }) + end + + it "renders comments as HTML comments and still loads the Google fonts named inside" do + html = cook("a [comment]note [font=Poppins]x[/font] --> y[/comment] b") + + expect(html).to include( + %(), + "", + ) + expect(html).not_to include("") + end + + it "writes every newline after a tag as a line break" do + expect(cook("[div=x]a[/div]\nnext").scan("
    ").size).to eq(1) + expect(cook("[div=x]a[/div]\n\nnext").scan("
    ").size).to eq(2) + expect(cook("[center]\na\n[/center]\nnext").scan("
    ").size).to eq(3) + end + + it "drops the line break right after tags XenForo trims after, unless text comes first" do + expect(cook("text[divide][/divide]\nnext")).not_to include("
    ") + expect(cook("text[divide][/divide]\n\nnext").scan("
    ").size).to eq(1) + expect(cook("[divide][/divide] tail\nnext").scan("
    ").size).to eq(1) + expect(cook("[quote]\na\n[/quote]\n\nnext").scan("
    ").size).to eq(1) + expect(cook("[code]\na\n[/code]\nnext")).not_to include("
    ") + expect(cook("[spoiler=T]a[/spoiler]\nnext")).not_to include("
    ") + end + + it "trims the line breaks just inside spoilers and quotes" do + expect(cook("[spoiler=T]\n\na\n\n[/spoiler]")).to match(%r{bb-spoiler-content">\s*a
    }) + expect(cook("[quote]\n\na\n\n[/quote]")).to match(%r{
    \s*a
    }) + expect(cook("x [inlinespoiler]\na\n[/inlinespoiler] y")).to include( + %(a), + ) + end + + it "renders a code tag spanning lines as a code block wherever its tags sit" do + expect(cook("[code]a\n\nb[/code] tail")).to include( + %(
    a\n\nb
    ), + ) + expect(cook("x [code]a\nb[/code] y")).to match( + %r{\Ax
    a\nb
    \s*y\z}, + ) + expect(cook("x [code]a[/code] y")).to eq("x a y") + end + + it "never reads content on the same line as both tags as markdown blocks" do + expect(cook("[div=x]+[/div]")).to eq(%(
    +
    )) + expect(cook("[center]# Title[/center]")).to eq(%(
    # Title
    )) + expect(cook("[center]\n# Title\n[/center]")).to include("

    ") + expect(cook("[tabs][tab=A]- x[/tab][/tabs]")).to include( + %(
    - x
    ), + ) + end + + it "trims the line breaks just inside blockquote, ooc and progress" do + expect(cook("[blockquote=Al]\n\nhi\n\n[/blockquote]")).to match( + /bb-blockquote-content">\s*hi
    /, + ) + expect(cook("[ooc]\nx\n[/ooc]")).to match(%r{
    \s*x
    }) + expect(cook("[progress=40]\nx\n[/progress]")).to match(%r{bb-progress-text">\s*x
    }) + expect(cook("[progress=40]x[/progress]")).to include(%(
    ") + expect(cook("[b]x\n- ```\n [/b]\n ```\n\ny[/b]")).to end_with("y

    ") + end + + it "ends a fence in a blockquote with the blockquote" do + expect(cook("> ```\n> [b]x\n\n[i]after[/i]")).to end_with( + %(after), + ) + end + + it "finds a close in a Markdown quote that a code span hides only before the quote's markers are taken out" do + expect(cook("> [div]\n> `x\n>\n> [/div]\n> `")).to start_with("
    \n
    ") + end + + it "doesn't start a code span at an escaped backtick when finding a section's close" do + expect(cook("[accordion]{slide=Title}a \\`{/slide} x`[/accordion]")).to include( + %(Title), + ) + end + + it "ignores tags inside literal tags when matching others" do + expect(cook("[div=x]a [comment]old [div] start[/comment] b[/div]")).to eq( + %(
    a b
    ), + ) + expect(cook("[div=x][script]x[/div]y[/script]z[/div]")).to include( + ">x[/div]y", + %(
    z
    ), + ) + end + + it "reads a literal tag shown in a code span as code, not as the start of literal text" do + expect(cook("`[plain]`\n[color=red]red[/color]\n`[/plain]`")).to eq( + %([plain]
    \nred
    \n[/plain]), + ) + expect(cook("[plain]a `b[/plain] [b]c[/b]`")).to eq(%(a `b c`)) + end + + it "keeps the line break after plain and icode that start a line" do + expect(cook("[icode]a[/icode]\nnext")).to include("a
    ") + expect(cook("[plain]a[/plain]\nnext")).to include("a
    ") + end + + it "keeps the space between a literal tag that starts a line and the text after it" do + expect(cook("[plain]x[/plain] b")).to eq("x b") + expect(cook("[icode]a[/icode] [icode]b[/icode]")).to eq("a b") + end + + it "writes the newlines in plain text as line breaks and drops the one after a fence" do + expect(cook("x\n[plain]\na\n[/plain]\ny").scan("
    ").size).to eq(4) + expect(cook("```\na\n```\nnext")).not_to include("
    ") + end + + it "matches tags regardless of case" do + expect(cook("[CENTER]a[/center]")).to include(%(
    a
    )) + end + + it "leaves tags nested more than 100 deep as text, counting block and inline tags together" do + inline = cook("[color=red]" * 101 + "x" + "[/color]" * 101) + expect(inline.scan("[color=blue]x[/color])) + end + + it "renders any number of tags on one line, and tags around many tokens" do + expect(cook("[div=a]a[/div]" * 150).scan(".txt holds raw posts, +# each after a "==== " line; .cooked holds their HTML as last +# recorded, in the same format. Any change to any case fails here. When the +# change is intended, rewrite the snapshots with +# UPDATE_RECOOK=1 LOAD_PLUGINS=1 bin/rspec plugins/bbcode/spec/lib/recook_spec.rb +# and review the .cooked diff. The tag-*.txt groups are generated by +# spec/fixtures/recook/generate.rb; edit that, not them. +# +# The same run writes test/javascripts/recook-corpus.js: each case with the +# markdown engine's HTML before the server's cleanup, and the settings the +# server gave the engine, which the composer test (bbcode-recook-test.js) +# cooks with and must match. Only its cases are checked here, so a change to +# core's settings alone doesn't fail this spec. +RSpec.describe PrettyText do + before do + SiteSetting.bbcode_enabled = true + PrettyText.reset_context + end + + after { PrettyText.reset_context } + + let(:fixtures) { File.expand_path("../fixtures/recook", __dir__) } + let(:corpus_path) { File.expand_path("../../test/javascripts/recook-corpus.js", __dir__) } + + # the per-post id is random + def normalize(html) + html.gsub(/post-[a-z0-9]{5}/, "post-GUID") + end + + # [cooked as a post is, [comment]s included; the engine's HTML] + def cook(raw) + html = PrettyText.markdown(raw) + [normalize(BbCode::Comments.restore(PrettyText.cleanup(html))), normalize(html)] + end + + # text before the first case is a comment + def read_cases(path) + _comment, *pairs = File.read(path).split(/^==== (.+)\n/, -1) + pairs.each_slice(2).to_h { |name, text| [name, text.delete_suffix("\n")] } + end + + def write_cases(path, cases) + File.write(path, cases.map { |name, text| "==== #{name}\n#{text}\n" }.join) + end + + def corpus_js(cases) + settings = { + siteSettings: SiteSetting.client_settings_hash, + additionalOptions: Site.markdown_additional_options, + } + "// Generated by spec/lib/recook_spec.rb with UPDATE_RECOOK=1; don't edit.\n" \ + "export const options = #{JSON.generate(settings)};\n" \ + "// cases\n" \ + "// { group: { case: [raw, the markdown engine's HTML] } }\n" \ + "export default #{JSON.pretty_generate(cases)};\n" + end + + # the module without its options, which only a settings change alters + def corpus_cases(text) + text && text[text.index("// cases\n").to_i..] + end + + it "cooks every bbcode case as its recook snapshot" do + groups = Dir[File.join(fixtures, "*.txt")].sort + expect(groups).not_to be_empty + + changed = [] + corpus = {} + groups.each do |input| + group = File.basename(input, ".txt") + raws = read_cases(input) + results = raws.transform_values { |raw| cook(raw) } + corpus[group] = raws.to_h { |name, raw| [name, [raw, results[name][1]]] } + cooked = results.transform_values(&:first) + snapshot = input.delete_suffix(".txt") + ".cooked" + if ENV["UPDATE_RECOOK"] + write_cases(snapshot, cooked) + next + end + + expected = File.exist?(snapshot) ? read_cases(snapshot) : {} + (cooked.keys | expected.keys).each do |name| + changed << "#{group}/#{name}" if cooked[name] != expected[name] + end + end + + if ENV["UPDATE_RECOOK"] + File.write(corpus_path, corpus_js(corpus)) + elsif corpus_cases(File.exist?(corpus_path) ? File.read(corpus_path) : nil) != + corpus_cases(corpus_js(corpus)) + changed << "test/javascripts/recook-corpus.js" + end + + expect(changed).to be_empty, + "#{changed.size} cases cooked differently from their snapshot: " \ + "#{changed.first(30).join(", ")}#{changed.size > 30 ? ", ..." : ""}. " \ + "If intended, rerun with UPDATE_RECOOK=1 and review the diff." + end +end diff --git a/test/javascripts/.gitkeep b/test/javascripts/.gitkeep deleted file mode 100644 index e69de29..0000000 diff --git a/test/javascripts/lib/bbcode-native-test.js b/test/javascripts/lib/bbcode-native-test.js new file mode 100644 index 0000000..eb1ea1c --- /dev/null +++ b/test/javascripts/lib/bbcode-native-test.js @@ -0,0 +1,146 @@ +import { setupTest } from "ember-qunit"; +import { module, test } from "qunit"; +import { cook } from "discourse/lib/text"; + +// the server's output, so the composer preview can't drift from the post +module("Unit | Lib | bbcode-native", function (hooks) { + setupTest(hooks); + + hooks.beforeEach(function () { + this.owner.lookup("service:site-settings").bbcode_enabled = true; + }); + + async function assertCooks(assert, input, expected, message) { + assert.strictEqual((await cook(input)).toString(), expected, message); + } + + test("line breaks", async function (assert) { + await assertCooks( + assert, + "[b]para one\n\npara two[/b]", + `para one
    \n
    \npara two
    `, + "an inline tag stays one run across a blank line" + ); + await assertCooks( + assert, + "a\n\n\n# H\n\n\nb", + `a

    H

    \n
    b`, + "a markdown block's margin stands for one blank line" + ); + await assertCooks( + assert, + "[spoiler]secret[/spoiler]\nafter", + `
    \n\nSpoiler\n
    secret
    \n
    \nafter`, + "the line break after a trimAfter tag is dropped" + ); + await assertCooks( + assert, + "[nobr]a\nb[/nobr]", + "a\nb", + "newlines inside nobr are not line breaks" + ); + }); + + test("markdown inside tags", async function (assert) { + await assertCooks( + assert, + "[div=color:red]\n# Heading\n\n- one\n- two\n[/div]", + `
    \n
    \n

    Heading

    \n
      \n
    • one
    • \n
    • two
    • \n
    \n
    \n
    `, + "a container starting its own line holds markdown blocks" + ); + await assertCooks( + assert, + "[b]a\n[wrap=x]\ny\n[/wrap]\nb[/b]", + `
    \na
    \ny
    \nb
    `, + "an inline tag holding another plugin's block renders as a block" + ); + await assertCooks( + assert, + "> [center]\n> x\n> [/center]", + `
    \n
    \n
    \nx
    \n
    \n
    `, + "a block tag spanning lines stays in its blockquote" + ); + }); + + test("tag matching", async function (assert) { + await assertCooks( + assert, + "[b]bold [i]both[/b] italic[/i]", + `bold both italic`, + "a mis-nested tag closes with its parent" + ); + await assertCooks( + assert, + "[quote]\n[b]x\n[/quote]\ny[/b]", + `\ny`, + "a tag left open in a quote closes with it, and the quote still renders" + ); + await assertCooks( + assert, + "[div=a]unclosed", + "[div=a]unclosed", + "an unclosed tag stays literal" + ); + await assertCooks( + assert, + "\\[b][i]x[/b] y[/i]", + `[b]x[/b] y`, + "a backslash-escaped opener is text" + ); + await assertCooks( + assert, + "[b]x [nobr]a\nb[/nobr][/b]", + `x a\nb`, + "a nested nobr keeps its newlines from becoming line breaks" + ); + + const deep = ( + await cook( + "[div=a]\n".repeat(99) + + "[color=red][color=blue]x[/color][/color]\n" + + "[/div]\n".repeat(99) + ) + ).toString(); + assert.strictEqual(deep.split("[color=blue]x[/color]`), + "a tag nested more than 100 deep stays text" + ); + }); + + test("bbcode-plus templates", async function (assert) { + await assertCooks( + assert, + `a b`, + "a b", + "a template written as raw HTML loses its marker" + ); + await assertCooks( + assert, + `[class name="x{} .d-header{display:none} .y"]color:red[/class]`, + "", + "a class name that could escape its rule is dropped" + ); + }); + + test("literal content", async function (assert) { + await assertCooks( + assert, + "x\n[code]\n [div=x]\n[/div]\n[/code]\nafter", + `x
        [div=x]\n[/div]
    \nafter`, + "code keeps its content as written" + ); + await assertCooks( + assert, + "[plain][b]x[/b] :smile:[/plain]", + "[b]x[/b] :smile:", + "plain text is read as neither bbcode nor markdown" + ); + await assertCooks( + assert, + "`[plain]`\n[color=red]red[/color]\n`[/plain]`", + `[plain]
    \nred
    \n[/plain]`, + "a literal tag shown in a code span doesn't start literal text" + ); + }); +}); diff --git a/test/javascripts/lib/bbcode-recook-test.js b/test/javascripts/lib/bbcode-recook-test.js new file mode 100644 index 0000000..6f5f6a7 --- /dev/null +++ b/test/javascripts/lib/bbcode-recook-test.js @@ -0,0 +1,77 @@ +import { setupTest } from "ember-qunit"; +import { module, test } from "qunit"; +import { generateCookFunction } from "discourse/lib/text"; +import corpus, { options } from "discourse/plugins/bbcode/recook-corpus"; + +// A plugin's test run loads no other plugin's markdown, and the bare engine +// has none of the server's lookups, so these cases can't match here. A case +// listed here that starts matching fails too, so the list stays current. +const OTHER_PLUGINS = "needs another plugin's markdown, not loaded here"; +const EMOJI = "unicode emoji become images with the server's table only"; +const AVATAR = "the quote's avatar comes from the server's lookup"; +const DIFFERENT_HERE = { + "tag-details/alone": OTHER_PLUGINS, + "tag-details/own-lines": OTHER_PLUGINS, + "tag-details/own-lines-between-text": OTHER_PLUGINS, + "tag-details/blank-line-inside": OTHER_PLUGINS, + "tag-details/markdown-blocks-inside": OTHER_PLUGINS, + "tag-details/inline-markdown-inside": OTHER_PLUGINS, + "tag-details/in-blockquote": OTHER_PLUGINS, + "tag-details/in-list-item": OTHER_PLUGINS, + "tag-details/around-b": OTHER_PLUGINS, + "tag-details/in-core-quote": OTHER_PLUGINS, + "tag-details/misnested-with-i": OTHER_PLUGINS, + "tag-details/nested-in-itself": OTHER_PLUGINS, + "tag-details/repeated": OTHER_PLUGINS, + "tag-details/blank-lines-around": OTHER_PLUGINS, + "tag-details/[details] alone": OTHER_PLUGINS, + "tag-details/[details] own-lines": OTHER_PLUGINS, + "matching/repair-core-details": OTHER_PLUGINS, + "features/details-in-center": OTHER_PLUGINS, + "features/center-in-details": OTHER_PLUGINS, + "features/poll-in-center": OTHER_PLUGINS, + "features/poll-around-tags": OTHER_PLUGINS, + "features/footnote-like": OTHER_PLUGINS, + "features/task-like-list": OTHER_PLUGINS, + "malformed/brackets-alone": OTHER_PLUGINS, + "features/emoji-unicode-and-shortcode-in-plain": EMOJI, + "malformed/unicode-and-rtl": EMOJI, + "features/quote-with-attribution": AVATAR, + "scenarios/reply-quoting-with-bbcode": AVATAR, + 'tag-quote/[quote="system, post:1, topic:1"] alone': AVATAR, + 'tag-quote/[quote="system, post:1, topic:1"] own-lines': AVATAR, +}; + +// The recook baseline (spec/lib/recook_spec.rb) cooked by the composer, which +// must match the server's markdown engine before its cleanup, given the same +// settings. One engine for every case, as the composer keeps, so state left by +// one cook shows too. +module("Unit | Lib | bbcode recook corpus", function (hooks) { + setupTest(hooks); + + hooks.beforeEach(function () { + this.owner.lookup("service:site-settings").bbcode_enabled = true; + }); + + // the per-post id is random + const normalize = (html) => html.replace(/post-[a-z0-9]{5}/g, "post-GUID"); + + for (const [group, cases] of Object.entries(corpus)) { + test(group, async function (assert) { + const cookFn = await generateCookFunction(options); + const entries = Object.entries(cases); + const reason = ([name]) => DIFFERENT_HERE[`${group}/${name}`]; + for (const [name, [raw, expected]] of entries.filter((e) => !reason(e))) { + assert.strictEqual(normalize(cookFn(raw)), expected, name); + } + for (const entry of entries.filter(reason)) { + const [name, [raw, expected]] = entry; + assert.notStrictEqual( + normalize(cookFn(raw)), + expected, + `${name}: ${reason(entry)}` + ); + } + }); + } +}); diff --git a/test/javascripts/lib/bbscript-test.js b/test/javascripts/lib/bbscript-test.js new file mode 100644 index 0000000..90254a8 --- /dev/null +++ b/test/javascripts/lib/bbscript-test.js @@ -0,0 +1,238 @@ +import { setupTest } from "ember-qunit"; +import { module, test } from "qunit"; +import loadScript from "discourse/lib/load-script"; + +const PARSER_URL = "/plugins/bbcode/javascripts/bbscript-parser.min.js"; +const CALLER_ID = "post-test1"; + +const wait = (ms) => new Promise((resolve) => setTimeout(resolve, ms)); + +// exercises the built bundle, so rebuild it (pnpm build) after changing bbscript-src +module("Unit | Lib | bbscript", function (hooks) { + setupTest(hooks); + + let parser; + + hooks.before(async function () { + await loadScript(PARSER_URL); + parser = window.bbscriptParser; + }); + + function runV2(source, options = {}) { + const data = options.data ?? parser.createStore(); + parser.bbscriptProcessorV2.execAll( + parser.bbscript2Parser.parse(source).ast, + options.callerId ?? CALLER_ID, + "", + { ...options, data } + ); + return data; + } + + async function runV1(source, options = {}) { + const data = options.data ?? parser.createStore(); + await parser.bbscriptProcessorV1.execAll( + parser.bbscriptProcessorV1.parse(source), + options.callerId ?? CALLER_ID, + "", + { ...options, data } + ); + return data; + } + + function fixture(html) { + const root = document.createElement("div"); + root.innerHTML = html; + document.querySelector("#qunit-fixture").append(root); + return root; + } + + test("syntax", function (assert) { + assert.deepEqual( + { ...runV2("(= a 1) (stop) (= b 2)") }, + { a: 1 }, + "stop ends the script" + ); + assert.deepEqual( + { ...runV2("; a comment\n(= a 1) // trailing\n(= b ; inner\n 2)") }, + { a: 1, b: 2 }, + "; and // start comments" + ); + assert.strictEqual( + runV2('(= s "a\\nb\\tc\\"d\\\\e\\qf")').s, + 'a\nb\tc"d\\e\\qf', + "known escapes are decoded and unknown ones are kept" + ); + assert.strictEqual( + runV2('(= x 5) (= s "x=${x} y=${y}")').s, + "x=5 y=${y}", + "${name} interpolates set variables only" + ); + assert.strictEqual( + runV2('(= f false) (= r (if f "yes" "no"))').r, + "no", + "false is falsy" + ); + assert.deepEqual( + { ...runV2("(= true 5)") }, + {}, + "true and false can't be assigned" + ); + assert.deepEqual( + parser.bbscript2Parser.parse("(addClass is-open item1)").formattedErrors, + [], + "names may contain digits and hyphens" + ); + }); + + test("functions", function (assert) { + const data = runV2(` + (= n (+ (number "5") 1)) + (= empty (number "")) + (= r (range 1 7 2)) + (= tooLong (range 1000000)) + (= tail (slice "hello" 1)) + (= at (find "hello" "l")) + (= has (contain "hello" "x")) + (= neg (not true)) + (= _ "kept") + (each [1 2] (= last _)) + (= missing (slice)) + `); + + assert.strictEqual(data.n, 6, "number converts text"); + assert.true(Number.isNaN(data.empty), "number of blank text is NaN"); + assert.deepEqual(data.r, [1, 3, 5], "range takes a start, end and step"); + assert.strictEqual(data.tooLong, undefined, "range refuses huge lists"); + assert.strictEqual(data.tail, "ello", "slice's end is optional"); + assert.strictEqual(data.at, 2, "find works on text"); + assert.false(data.has, "contain works on text"); + assert.false(data.neg, "not negates"); + assert.strictEqual(data._, "kept", "each restores its loop variable"); + assert.strictEqual(data.last, 2, "each visits every item"); + assert.strictEqual( + data.missing, + undefined, + "a call without its required arguments does nothing" + ); + }); + + test("v1", async function (assert) { + const data = await runV1( + 'set a 5\nif (leq a 1) (set wrong "yes")\nif (leq 1 a) (set right "yes")' + ); + assert.deepEqual( + { ...data }, + { a: 5, right: "yes" }, + "leq compares less than or equal" + ); + + await runV1('print "unterminated', { data }); + assert.true(true, "a missing closing quote doesn't throw"); + }); + + test("v1 and v2 share a post's variables", async function (assert) { + const data = parser.createStore(); + await runV1("set a 5", { data }); + runV2('(++ a) (= b "from v2") (= s "${a}")', { data }); + await runV1('inc a\nset joined "${a} ${b}"', { data }); + + assert.deepEqual( + { ...data }, + { a: 7, b: "from v2", s: "6", joined: "7 from v2" } + ); + }); + + test("isolation", function (assert) { + assert.deepEqual( + { ...runV2("(= a 1)", { callerId: "__proto__" }) }, + {}, + "ids cooking can't produce are refused" + ); + + const data = runV2("(= __proto__ 1) (= c (constructor))"); + assert.true( + Object.hasOwn(data, "__proto__"), + "__proto__ is an ordinary name" + ); + assert.strictEqual(data.c, undefined, "constructor isn't a function"); + assert.strictEqual( + {}.polluted, + undefined, + "nothing reaches Object.prototype" + ); + + const other = runV2("(= seen a)"); + assert.strictEqual(other.seen, "a", "another store can't see a variable"); + }); + + test("elements are looked up inside the post only", function (assert) { + const outside = fixture( + `
    outside
    ` + ).firstElementChild; + const root = fixture(` +
    + + `); + + runV2('(setText "hijacked" "a, .box__post-test1") (setText "ok" out)', { + root, + }); + assert.strictEqual( + outside.textContent, + "outside", + "selectors can't be injected" + ); + assert + .dom(`.out__${CALLER_ID}`, root) + .hasText("ok", "a class in the post is found"); + + runV2('(addDiv (+ "x\\"> (foreignFired = true), 20); + + const data = runV2( + `(clearTimeout ${foreign}) (= n 0) (setInterval 0.005 (++ n))`, + { root, timers } + ); + await wait(40); + assert.true(foreignFired, "a script can't clear timers it doesn't own"); + assert.true(data.n > 0, "the interval runs while the post is on the page"); + + root.remove(); + await wait(20); + const afterRemoval = data.n; + await wait(30); + assert.strictEqual( + data.n, + afterRemoval, + "the interval stops once the post leaves the page" + ); + assert.strictEqual(timers.size, 0, "and releases its handle"); + }); +}); diff --git a/test/javascripts/lib/inlinespoiler-test.js b/test/javascripts/lib/inlinespoiler-test.js new file mode 100644 index 0000000..03c468a --- /dev/null +++ b/test/javascripts/lib/inlinespoiler-test.js @@ -0,0 +1,45 @@ +import { module, test } from "qunit"; +import { addInlineSpoilerCode } from "discourse/plugins/bbcode/discourse/api-initializers/inlinespoiler"; + +module("Unit | Lib | bbcode inline spoiler", function () { + function press(element, key) { + const event = new KeyboardEvent("keydown", { + key, + bubbles: true, + cancelable: true, + }); + element.dispatchEvent(event); + return event; + } + + function spoilerWithLink() { + const post = document.createElement("div"); + post.innerHTML = `open link`; + addInlineSpoilerCode(post); + return post; + } + + test("Enter on the spoiler toggles it", function (assert) { + const spoiler = spoilerWithLink().querySelector(".bb-inline-spoiler"); + + const event = press(spoiler, "Enter"); + + assert.true(event.defaultPrevented); + assert.strictEqual(spoiler.getAttribute("aria-expanded"), "true"); + }); + + test("Enter on a link inside the spoiler follows the link", function (assert) { + const post = spoilerWithLink(); + const spoiler = post.querySelector(".bb-inline-spoiler"); + press(spoiler, "Enter"); + + const event = press(post.querySelector("a"), "Enter"); + + assert.false(event.defaultPrevented, "the link's default isn't prevented"); + assert.strictEqual( + spoiler.getAttribute("aria-expanded"), + "true", + "the spoiler stays open" + ); + }); +}); diff --git a/test/javascripts/recook-corpus.js b/test/javascripts/recook-corpus.js new file mode 100644 index 0000000..a499a82 --- /dev/null +++ b/test/javascripts/recook-corpus.js @@ -0,0 +1,8602 @@ +// Generated by spec/lib/recook_spec.rb with UPDATE_RECOOK=1; don't edit. +export const options = {"siteSettings":{"default_locale":"en","title":"Discourse","short_site_description":"","contact_email":"","exclude_rel_nofollow_domains":"","logo":"/images/discourse-logo-sketch.png","logo_small":"/images/discourse-logo-sketch-small.png","digest_logo":"","mobile_logo":"","logo_dark":"","logo_small_dark":"","mobile_logo_dark":"","large_icon":"","manifest_icon":"","manifest_screenshots":"","favicon":"","apple_touch_icon":"","generate_topic_og_image":false,"opengraph_image":"","x_summary_large_image":"","display_local_time_in_user_card":false,"support_mixed_text_direction":false,"suggested_topics":5,"ga_universal_tracking_code":"","ga_universal_domain_name":"auto","gtm_container_id":"","top_menu":"latest|new|hot|categories","default_homepage":"","post_menu":"read|like|copyLink|flag|edit|bookmark|delete|admin|reply","post_menu_hidden_items":"flag|bookmark|edit|delete|admin","share_links":"twitter|facebook|email","allow_username_in_share_links":true,"share_quote_visibility":"all","share_quote_buttons":"twitter|email","desktop_category_page_style":"categories_and_latest_topics","mobile_category_page_style":"categories_with_featured_topics","category_colors":"BF1E2E|F1592A|F7941D|9EB83B|3AB54A|12A89D|25AAE2|0E76BD|652D90|92278F|ED207B|8C6238|231F20|808281|B3B5B4|E45735","max_category_nesting":2,"enable_direct_s3_uploads":false,"enable_upload_debug_mode":false,"relative_date_duration":30,"top_page_default_timeframe":"yearly","fixed_category_positions":false,"fixed_category_positions_on_create":false,"enable_badges":true,"show_badges_in_post_header":true,"enable_badge_sql":false,"max_favorite_badges":2,"push_notifications_prompt":true,"enable_desktop_push_notifications":true,"vapid_public_key_bytes":"4|233|189|37|93|2|64|222|82|102|219|10|40|22|132|243|106|138|123|77|112|157|239|133|85|49|26|140|182|71|224|118|91|134|113|236|66|81|187|67|214|106|21|142|41|150|206|182|14|179|188|188|247|56|198|121|28|159|211|77|155|78|240|35|51","base_font":"inter","heading_font":"inter","enable_user_tips":false,"page_loading_indicator":"slider","show_user_menu_avatars":false,"about_page_extra_groups":"","about_page_extra_groups_initial_members":6,"about_page_extra_groups_order":"alphabetically","about_page_extra_groups_show_description":false,"use_legacy_pageviews":false,"browser_pageview_max_engaged_seconds":1800,"interface_color_selector":"disabled","login_required":false,"must_approve_users":false,"invite_only":false,"enable_local_logins":true,"enable_local_logins_via_email":true,"enable_local_logins_via_code":true,"enable_random_usernames":false,"enable_passkeys":true,"allow_passkeys_for_2fa":false,"allow_new_registrations":true,"enable_signup_cta":true,"facebook_app_id":"","auth_skip_create_confirm":false,"auth_immediately":true,"auth_overrides_email":false,"enable_discourse_connect":false,"discourse_connect_overrides_avatar":false,"hide_email_address_taken":true,"show_signup_form_email_instructions":true,"show_signup_form_username_instructions":false,"show_signup_form_full_name_instructions":false,"show_signup_form_password_instructions":false,"min_username_length":3,"max_username_length":20,"unicode_usernames":false,"min_password_length":10,"min_admin_password_length":15,"email_editable":true,"logout_redirect":"","enable_names":true,"invite_expiry_days":90,"invites_per_page":40,"delete_user_max_post_age":60,"delete_all_posts_max":15,"delete_all_posts_background_threshold":200,"prioritize_username_in_ux":true,"prioritize_full_name_in_ux":false,"enable_user_directory":true,"allow_anonymous_mode":false,"allow_likes_in_anonymous_mode":false,"allow_users_to_hide_profile":true,"hide_user_profiles_from_public":false,"allow_featured_topic_on_user_profiles":true,"hide_suspension_reasons":false,"hide_silencing_reasons":false,"ignored_users_count_message_threshold":5,"ignored_users_message_gap_days":365,"user_selected_primary_groups":false,"gravatar_enabled":true,"gravatar_name":"Gravatar","gravatar_base_url":"www.gravatar.com","gravatar_login_url":"/emails","hide_user_activity_tab":false,"enable_user_status":false,"enable_group_directory":true,"enable_category_group_moderation":false,"min_post_length":5,"min_first_post_length":5,"prevent_uploads_only_posts":false,"min_personal_message_post_length":10,"max_post_length":32000,"topic_featured_link_enabled":true,"min_topic_views_for_delete_confirm":5000,"min_topic_title_length":15,"max_topic_title_length":255,"enable_filtered_replies_view":false,"min_personal_message_title_length":2,"default_emoji_reactions":"+1|heart|tada","allow_uncategorized_topics":true,"remove_and_replace_uncategorized":true,"min_title_similar_length":10,"edit_history_visible_to_public":true,"delete_removed_posts_after":24,"traditional_markdown_linebreaks":false,"enable_markdown_typographer":false,"enable_markdown_linkify":true,"markdown_linkify_tlds":"com|net|org|io|onion|co|tv|ru|cn|us|uk|me|de|fr|fi|gov","markdown_typographer_quotation_marks":false,"suppress_reply_directly_below":true,"suppress_reply_directly_above":true,"max_reply_history":1,"enable_mentions":true,"max_users_notified_per_group_mention":100,"here_mention":"here","newuser_max_embedded_media":5,"newuser_max_attachments":0,"default_subcategory_on_read_only_category":false,"hide_disabled_create_topic_button":false,"show_pinned_excerpt_mobile":true,"show_pinned_excerpt_desktop":true,"display_name_on_posts":false,"show_time_gap_days":7,"short_progress_text_threshold":10000,"default_code_lang":"auto","autohighlight_all_code":false,"highlighted_languages":"bash|c|cpp|csharp|css|diff|go|graphql|ini|java|javascript|json|kotlin|lua|makefile|markdown|objectivec|perl|php|php-template|plaintext|python|python-repl|r|ruby|rust|scss|shell|sql|swift|typescript|xml|yaml|wasm","show_copy_button_on_codeblocks":true,"enable_emoji":true,"enable_emoji_shortcuts":true,"emoji_set":"twitter","emoji_autocomplete_min_chars":0,"enable_inline_emoji_translation":false,"emoji_deny_list":"","emoji_picker_pinned_groups":"","enable_gifs":false,"klipy_file_detail":"webp","klipy_content_filter":"high","klipy_country":"US","klipy_locale":"en_US","klipy_limit_infinite_search_results":false,"klipy_max_results_limit":240,"code_formatting_style":"code-fences","allowed_href_schemes":"","watched_words_regular_expressions":false,"enable_fast_edit":true,"old_post_notice_days":14,"blur_tl0_flagged_posts_media":true,"show_preview_for_form_templates":true,"allow_user_locale":true,"content_localization_enabled":false,"content_localization_supported_locales":"","content_localization_language_switcher":"none","content_localization_allowed_groups":"1|2","content_localization_allow_author_localization":true,"content_localization_max_locales":10,"set_locale_from_accept_language_header":false,"set_locale_from_cookie":false,"set_locale_from_param":false,"nested_replies_enabled":false,"nested_replies_default":false,"nested_replies_hot_sort_enabled":false,"nested_replies_default_sort":"top","nested_replies_max_depth":3,"nested_replies_cap_nesting_depth":true,"email_time_window_mins":10,"disable_digest_emails":false,"simple_email_subject":false,"email_in":false,"enable_smtp":false,"disable_emails":"no","bounce_score_threshold":4,"enable_secondary_emails":true,"allow_email_invites":true,"max_image_size_kb":10240,"max_attachment_size_kb":10240,"authorized_extensions":"jpg|jpeg|png|gif|heic|heif|webp|avif|svg|jxl","authorized_extensions_for_staff":"","max_image_width":690,"max_image_height":500,"prevent_anons_from_downloading_files":false,"secure_uploads":false,"secure_uploads_pm_only":false,"enable_s3_uploads":false,"allow_profile_backgrounds":true,"default_avatars":"","avatar_sizes":"24|48|72|96|144|288","external_system_avatars_enabled":true,"external_system_avatars_url":"/letter_avatar_proxy/v4/letter/{first_letter}/{color}/{size}.png","external_emoji_url":"","selectable_avatars_mode":"disabled","selectable_avatars":[],"image_quality":90,"allow_staff_to_upload_any_file_in_pm":true,"simultaneous_uploads":15,"composer_media_optimization_image_enabled":true,"composer_media_optimization_image_bytes_optimization_threshold":524288,"composer_media_optimization_image_resize_dimensions_threshold":1920,"composer_media_optimization_image_resize_width_target":1920,"composer_media_optimization_image_resize_pre_multiply":false,"composer_media_optimization_image_resize_linear_rgb":false,"composer_media_optimization_image_encode_quality":0,"composer_media_optimization_image_convert_enabled":false,"composer_media_optimization_gif_conversion_threshold":512000,"composer_media_optimization_debug_mode":false,"composer_ios_media_optimisation_image_enabled":true,"video_thumbnails_enabled":true,"allow_all_users_to_flag_illegal_content":false,"email_address_to_report_illegal_content":"","tl1_requires_read_posts":30,"tl3_links_no_follow":false,"enforce_second_factor_on_external_auth":true,"enforce_second_factor":"no","moderators_manage_categories":false,"moderators_manage_groups":false,"moderators_change_post_ownership":false,"moderators_view_emails":false,"moderators_view_ips":true,"moderators_view_sso_details":false,"use_admin_ip_allowlist":false,"allowed_iframes":"https://www.google.com/maps/embed?|https://www.openstreetmap.org/export/embed.html?|https://calendar.google.com/calendar/embed?|https://codepen.io/*/embed/preview/|https://www.instagram.com/|https://open.spotify.com/","can_permanently_delete":false,"cache_control_bfcache_compatibility":false,"max_oneboxes_per_post":50,"reviewable_claiming":"disabled","reviewable_default_topics":false,"reviewable_default_visibility":"low","reviewable_revision_reasons":"Duplicate|Does not meet posting guidelines","alert_admins_if_errors_per_minute":0,"alert_admins_if_errors_per_hour":0,"max_prints_per_hour_per_user":5,"invite_link_max_redemptions_limit":5000,"invite_link_max_redemptions_limit_users":10,"max_allowed_secondary_emails":10,"enable_chunked_encoding":true,"long_polling_base_url":"/","background_polling_interval":60000,"polling_interval":3000,"anon_polling_interval":25000,"verbose_localization":false,"max_new_topics":500,"enable_safe_mode":true,"warn_critical_js_deprecations":true,"warn_critical_js_deprecations_message":"","custom_flags_limit":50,"site_setting_verbose_client_logging":false,"navigation_menu":"sidebar","default_navigation_menu_categories":"","default_navigation_menu_tags":"","default_sidebar_switch_panel_position":"bottom","embed_full_app":false,"embed_full_app_signin_flow":true,"tos_url":"","privacy_policy_url":"","faq_url":"","display_eu_visitor_stats":false,"site_archived":false,"enable_backups":true,"backup_location":"local","maximum_backups":5,"remove_older_backups":"","include_s3_uploads_in_backups":false,"use_pg_headlines_for_excerpt":false,"min_search_term_length":3,"log_search_queries":true,"search_default_sort_order":0,"version_checks":true,"suppress_uncategorized_badge":true,"header_dropdown_category_count":8,"slug_generation_method":"ascii","summary_timeline_button":false,"topic_views_heat_low":1000,"topic_views_heat_medium":2000,"topic_views_heat_high":3500,"topic_post_like_heat_low":0.5,"topic_post_like_heat_medium":1.0,"topic_post_like_heat_high":2.0,"history_hours_low":12,"history_hours_medium":24,"history_hours_high":48,"cold_age_days_low":14,"cold_age_days_medium":90,"cold_age_days_high":180,"global_notice":"Congratulations, you installed Discourse! Unfortunately, no administrator emails were defined during setup, so finalizing the configuration may be difficult.","general_category_id":-1,"staff_category_id":-1,"default_composer_category":"","moderator_guide_topic":"","view_user_route":"summary","admin_quick_start_topic_id":-1,"automatically_unpin_topics":true,"read_time_word_count":500,"topic_page_title_includes_category":true,"enable_powered_by_discourse":true,"penalty_include_post_message":false,"svg_icon_subset":"","allow_bulk_invite":true,"show_category_definitions_in_topic_lists":false,"suggest_weekends_in_date_pickers":true,"show_bottom_topic_map":true,"show_topic_map_in_topics_without_replies":true,"enable_site_owner_onboarding":true,"welcome_banner_image":"","welcome_banner_text_color":"","welcome_banner_location":"above_topic_content","welcome_banner_page_visibility":"top_menu_pages","disable_mailing_list_mode":true,"default_topics_automatic_unpin":true,"mute_all_categories_by_default":false,"default_text_size":"normal","enable_offline_indicator":false,"default_watched_precedence_over_muted":false,"mcp_server_enabled":false,"tagging_enabled":true,"tag_style":"simple","max_tags_per_topic":5,"enable_max_tags_per_email_subject":false,"max_tags_per_email_subject":5,"max_tag_length":20,"tag_topic_allowed_groups":"1|2|10","max_tag_search_results":5,"max_tags_in_filter_list":30,"tags_sort_alphabetically":false,"tags_listed_by_group":false,"suppress_overlapping_tags_in_list":false,"remove_muted_tags_from_latest":"always","force_lowercase_tags":true,"dashboard_hidden_reports":"","dashboard_visible_tabs":"moderation|security|reports|features","dashboard_general_tab_activity_metrics":"page_view_total_reqs|visits|time_to_first_response|likes|flags|user_to_user_private_messages_with_replies","admin_allow_filter_untranslated_text":false,"enable_markdown_endpoints":true,"enable_generated_llms_txt":true,"reporting_improvements":true,"enable_auto_grid_images":true,"enable_new_checkbox_style":true,"enable_new_post_reactions_menu":true,"enable_composer_redesign":false,"enable_composer_toolbar_customization":false,"enable_category_hashtag_cards":false,"prioritize_recently_used_tags":false,"rename_faq_to_guidelines":true,"enable_form_templates":true,"enable_unified_new":true,"enable_rich_text_paste":true,"reviewable_old_moderator_actions":true,"floating_dismiss_topics_on_mobile":true,"enable_simplified_category_creation":true,"enable_new_defaults_for_trust_level_3_requirements":true,"modernize_foundation_theme":true,"enable_horizon_high_context_topic_cards":true,"granular_anonymous_and_logged_in_groups_permissions":true,"dashboard_improvements":true,"improved_crawler_detection":false,"enable_invite_modal_with_roles":true,"update_pending_users_reminder_default":false,"sidebar_user_navigation":false,"enable_experimental_sample_plugin_feature":false,"discourse_automation_enabled":false,"bbcode_enabled":true,"discourse_normalize_whitespace":true,"enable_bbscript":false,"fontawesome_kit_url":"","boards_enabled":false,"boards_manage_board_allowed_groups":"1|2","chat_enabled":true,"chat_pinned_messages":true,"enable_new_chat_reactions_popup":true,"enable_public_channels":true,"chat_allowed_groups":"1|2|11","chat_threads_enabled":false,"chat_search_enabled":true,"chat_channel_retention_days":90,"chat_max_direct_message_users":20,"chat_dm_retention_days":0,"chat_allow_archiving_channels":false,"chat_minimum_message_length":1,"chat_maximum_message_length":6000,"chat_allow_uploads":true,"chat_show_copy_button_on_codeblocks":true,"max_chat_auto_joined_users":10000,"max_mentions_per_chat_message":5,"chat_separate_sidebar_mode":"never","chat_editing_grace_period":30,"chat_editing_grace_period_max_diff_low_trust":10,"chat_editing_grace_period_max_diff_high_trust":40,"chat_preferred_index":"channels","checklist_enabled":true,"discourse_adplugin_enabled":false,"no_ads_for_personal_messages":true,"no_ads_for_restricted_categories":false,"no_ads_for_categories":"","no_ads_for_tags":"","house_ads_after_nth_topic":20,"house_ads_after_nth_post":20,"house_ads_after_nth_root":5,"house_ads_frequency":100,"ad_plugin_enable_tracking":false,"ad_plugin_routes_enabled":false,"adsense_publisher_code":"","adsense_through_trust_level":2,"adsense_topic_list_top_code":"","adsense_topic_list_top_ad_sizes":"728*90 - leaderboard","adsense_mobile_topic_list_top_code":"","adsense_mobile_topic_list_top_ad_size":"responsive","adsense_above_site_header_code":"","adsense_above_site_header_ad_sizes":"728*90 - leaderboard","adsense_mobile_above_site_header_code":"","adsense_mobile_above_site_header_ad_size":"responsive","adsense_topic_above_post_stream_code":"","adsense_topic_above_post_stream_ad_sizes":"728*90 - leaderboard","adsense_mobile_topic_above_post_stream_code":"","adsense_mobile_topic_above_post_stream_ad_size":"responsive","adsense_topic_above_suggested_code":"","adsense_topic_above_suggested_ad_sizes":"728*90 - leaderboard","adsense_mobile_topic_above_suggested_code":"","adsense_mobile_topic_above_suggested_ad_size":"responsive","adsense_post_bottom_code":"","adsense_post_bottom_ad_sizes":"728*90 - leaderboard","adsense_mobile_post_bottom_code":"","adsense_mobile_post_bottom_ad_size":"responsive","adsense_nth_post_code":"","dfp_publisher_id":"","dfp_publisher_id_mobile":"","dfp_through_trust_level":2,"dfp_topic_list_top_code":"","dfp_topic_list_top_ad_sizes":"728*90 - leaderboard","dfp_mobile_topic_list_top_code":"","dfp_mobile_topic_list_top_ad_sizes":"320*50 - mobile leaderboard","dfp_target_topic_list_top_key_code":"","dfp_target_topic_list_top_value_code":"","dfp_above_site_header_code":"","dfp_above_site_header_ad_sizes":"728*90 - leaderboard","dfp_mobile_above_site_header_code":"","dfp_mobile_above_site_header_ad_sizes":"320*50 - mobile leaderboard","dfp_target_above_site_header_key_code":"","dfp_target_above_site_header_value_code":"","dfp_topic_above_post_stream_code":"","dfp_topic_above_post_stream_ad_sizes":"728*90 - leaderboard","dfp_mobile_topic_above_post_stream_code":"","dfp_mobile_topic_above_post_stream_ad_sizes":"320*50 - mobile leaderboard","dfp_target_topic_above_post_stream_key_code":"","dfp_target_topic_above_post_stream_value_code":"","dfp_topic_above_suggested_code":"","dfp_topic_above_suggested_ad_sizes":"728*90 - leaderboard","dfp_mobile_topic_above_suggested_code":"","dfp_mobile_topic_above_suggested_ad_sizes":"320*50 - mobile leaderboard","dfp_target_topic_above_suggested_key_code":"","dfp_target_topic_above_suggested_value_code":"","dfp_nth_post_code":"","dfp_post_bottom_code":"","dfp_post_bottom_ad_sizes":"728*90 - leaderboard","dfp_mobile_post_bottom_code":"","dfp_mobile_post_bottom_ad_sizes":"320*50 - mobile leaderboard","dfp_target_post_bottom_key_code":"","dfp_target_post_bottom_value_code":"","amazon_through_trust_level":2,"amazon_display_groups":"10|11|12","amazon_topic_list_top_src_code":"","amazon_topic_list_top_ad_width_code":"","amazon_topic_list_top_ad_height_code":"","amazon_mobile_topic_list_top_src_code":"","amazon_mobile_topic_list_top_ad_width_code":"","amazon_mobile_topic_list_top_ad_height_code":"","amazon_above_site_header_src_code":"","amazon_above_site_header_ad_width_code":"","amazon_above_site_header_ad_height_code":"","amazon_mobile_above_site_header_src_code":"","amazon_mobile_above_site_header_ad_width_code":"","amazon_mobile_above_site_header_ad_height_code":"","amazon_topic_above_post_stream_src_code":"","amazon_topic_above_post_stream_ad_width_code":"","amazon_topic_above_post_stream_ad_height_code":"","amazon_mobile_topic_above_post_stream_src_code":"","amazon_mobile_topic_above_post_stream_ad_width_code":"","amazon_mobile_topic_above_post_stream_ad_height_code":"","amazon_topic_above_suggested_src_code":"","amazon_topic_above_suggested_ad_width_code":"","amazon_topic_above_suggested_ad_height_code":"","amazon_mobile_topic_above_suggested_src_code":"","amazon_mobile_topic_above_suggested_ad_width_code":"","amazon_mobile_topic_above_suggested_ad_height_code":"","amazon_post_bottom_src_code":"","amazon_nth_post_code":"","amazon_post_bottom_ad_width_code":"","amazon_post_bottom_ad_height_code":"","amazon_mobile_post_bottom_src_code":"","amazon_mobile_post_bottom_ad_width_code":"","amazon_mobile_post_bottom_ad_height_code":"","carbonads_serve_id":"","carbonads_placement":"","carbonads_through_trust_level":2,"carbonads_display_groups":"10|11|12","carbonads_above_site_header_enabled":false,"carbonads_topic_list_top_enabled":false,"carbonads_above_post_stream_enabled":false,"adbutler_publisher_id":"","adbutler_through_trust_level":2,"adbutler_display_groups":"10|11|12","adbutler_topic_list_top_zone_id":"","adbutler_mobile_topic_list_top_zone_id":"","adbutler_above_site_header_zone_id":"","adbutler_mobile_above_site_header_zone_id":"","adbutler_topic_above_post_stream_zone_id":"","adbutler_mobile_topic_above_post_stream_zone_id":"","adbutler_topic_above_suggested_zone_id":"","adbutler_mobile_topic_above_suggested_zone_id":"","adbutler_post_bottom_zone_id":"","adbutler_mobile_post_bottom_zone_id":"","adbutler_nth_post":4,"adbutler_adserver_hostname":"servedbyadbutler.com","affiliate_enabled":false,"affiliate_amazon_ca":"","affiliate_amazon_cn":"","affiliate_amazon_co_jp":"","affiliate_amazon_co_uk":"","affiliate_amazon_com":"","affiliate_amazon_com_au":"","affiliate_amazon_com_br":"","affiliate_amazon_com_mx":"","affiliate_amazon_de":"","affiliate_amazon_es":"","affiliate_amazon_fr":"","affiliate_amazon_in":"","affiliate_amazon_it":"","affiliate_amazon_nl":"","affiliate_amazon_eu":"","affiliate_ldlc_com":"","discourse_ai_enabled":false,"ai_artifact_security":"strict","ai_sentiment_enabled":false,"ai_llm_temperature_top_p_enabled":false,"ai_helper_enabled":false,"ai_helper_allowed_in_pm":false,"ai_helper_enabled_features":"suggestions|context_menu","ai_post_image_captions_enabled":false,"ai_embeddings_enabled":false,"ai_embeddings_semantic_related_topics_enabled":false,"ai_embeddings_semantic_search_enabled":false,"ai_embeddings_semantic_quick_search_enabled":false,"ai_admin_dashboard_enabled":false,"ai_summarization_enabled":false,"ai_summary_gists_enabled":false,"ai_bot_enabled":false,"enable_ai_bot_starred_conversations":false,"ai_bot_enabled_llms":"","ai_bot_enable_chat_warning":false,"ai_bot_add_to_header":false,"ai_bot_add_to_community_section":true,"ai_bot_enable_docked_composer":false,"ai_discover_enabled":false,"ai_discover_agent":"-34","ai_ask_ai_enabled":false,"ai_ask_ai_summary_detail":"balanced","ai_ask_ai_related_count":2,"ai_ask_ai_agent":"-41","ai_ask_ai_follow_up_agent":"-1","ai_discord_search_enabled":false,"ai_translation_enabled":false,"inferred_concepts_enabled":false,"assign_enabled":false,"assigns_public":false,"assigns_user_url_path":"/u/{username}/activity/assigned","remind_assigns_frequency":0,"pending_assign_reminder_threshold":2,"max_assigned_topics":10,"assign_allowed_on_groups":"3","enable_assign_status":false,"assign_statuses":"New|In Progress|Done","cakeday_enabled":false,"cakeday_emoji":"cake","cakeday_birthday_enabled":false,"cakeday_birthday_emoji":"birthday","discourse_captcha_enabled":false,"discourse_captcha_provider":"none","hcaptcha_site_key":"","recaptcha_site_key":"","data_explorer_enabled":false,"data_explorer_ai_queries_enabled":true,"details_enabled":true,"discourse_events_enabled":false,"holiday_calendar_topic_id":"","holiday_status_emoji":"date","all_day_event_start_time":"","all_day_event_end_time":"","calendar_categories":"","calendar_event_display":"auto","calendar_categories_outlet":"discovery-list-container-top","working_days":"Monday|Tuesday|Wednesday|Thursday|Friday","working_day_start_hour":8,"working_day_end_hour":17,"close_to_working_day_hours_extension":2,"split_grouped_events_by_timezone_threshold":0,"event_participation_buttons":"going|interested|not going","discourse_post_event_enabled":false,"discourse_post_event_allowed_on_groups":"1|2","display_post_event_date_on_topic_title":true,"use_local_event_date":false,"discourse_post_event_allowed_custom_fields":"","events_calendar_categories":"","sort_categories_by_event_start_date_enabled":false,"disable_resorting_on_categories_enabled":false,"sidebar_show_upcoming_events":true,"map_events_to_color":"[]","map_events_title":"","calendar_first_day_of_week":"monday","calendar_upcoming_events_default_view":"month","enable_events_category_type_setup":true,"enable_improved_event_reminders":false,"livestream_allowed_hosts":"youtube.com|youtu.be|twitch.tv|zoom.us|kick.com|tiktok.com|instagram.com|facebook.com","livestream_zoom_enabled":false,"livestream_embeddable_chat_allowed_paths":"/t","livestream_enable_modal_chat_on_mobile":true,"discourse_gamification_enabled":false,"discourse_graphviz_enabled":false,"lazy_videos_enabled":true,"lazy_youtube_enabled":true,"lazy_vimeo_enabled":true,"lazy_tiktok_enabled":false,"discourse_local_dates_email_timezone":"Etc/UTC","discourse_local_dates_email_format":"llll z","discourse_local_dates_enabled":true,"discourse_local_dates_default_formats":"LLL|LTS|LL|LLLL","discourse_local_dates_default_timezones":"Europe/Paris|America/Los_Angeles","discourse_math_enabled":false,"discourse_math_provider":"mathjax","discourse_math_enable_latex_delimiters":true,"discourse_math_mathjax_output":"html","discourse_math_enable_menu":true,"discourse_math_zoom_on_click":false,"discourse_math_enable_accessibility":false,"discourse_math_enable_asciimath":false,"microsoft_auth_enabled":false,"discourse_narrative_bot_enabled":false,"oauth2_enabled":false,"oauth2_button_title":"with OAuth2","patreon_enabled":false,"patreon_login_enabled":false,"patreon_donation_prompt_enabled":false,"patreon_donation_prompt_show_after_topics":20,"patreon_donation_prompt_campaign_url":"","policy_enabled":false,"policy_restrict_to_staff_posts":true,"create_policy_allowed_groups":"1|2","post_voting_enabled":true,"post_voting_comment_enabled":true,"post_voting_comment_limit_per_post":10,"post_voting_comment_max_raw_length":600,"post_voting_enable_likes_on_answers":false,"presence_enabled":true,"presence_max_users_shown":5,"discourse_reactions_enabled":true,"discourse_reactions_like_icon":"heart","discourse_reactions_reaction_for_like":"heart","discourse_reactions_enabled_reactions":"+1|laughing|open_mouth|clap|confetti_ball|hugs","discourse_reactions_desaturated_reaction_panel":false,"discourse_reactions_allow_any_emoji":false,"enable_discourse_reactions_by_default":true,"enable_new_post_reply_count_position":true,"discourse_rewind_enabled":false,"solved_enabled":true,"solved_allow_multiple_solutions":false,"show_who_marked_solved":false,"allow_solved_on_all_topics":false,"accept_all_solutions_trust_level":4,"solved_quote_length":700,"show_filter_by_solved_status":false,"enable_solved_tags":"","enable_support_category_type_setup":true,"enable_solved_shared_issues":true,"discourse_subscriptions_extra_nav_subscribe":false,"discourse_subscriptions_pricing_table_id":"","discourse_subscriptions_pricing_table_enabled":false,"discourse_subscriptions_public_key":"","discourse_subscriptions_currency":"USD","discourse_subscriptions_campaign_enabled":false,"discourse_subscriptions_campaign_goal":100,"discourse_subscriptions_campaign_type":"Amount","discourse_subscriptions_campaign_banner_location":"Top","discourse_subscriptions_campaign_banner_bg_image":"","discourse_subscriptions_campaign_banner_shadow_color":"2F70AC","discourse_subscriptions_campaign_show_contributors":true,"discourse_subscriptions_campaign_product":"","discourse_subscriptions_campaign_amount_raised":0.0,"discourse_subscriptions_campaign_subscribers":0,"discourse_templates_enabled":true,"topic_voting_enabled":true,"topic_voting_enable_vote_limits":true,"topic_voting_show_who_voted":true,"topic_voting_show_votes_on_profile":true,"enable_ideas_category_type_setup":true,"user_notes_enabled":false,"user_notes_icon_placement":"name","enable_discourse_workflows":true,"discourse_workflows_ai_authoring_enabled":false,"zendesk_url":"https://your-url.zendesk.com/api/v2","zendesk_enabled":false,"enable_markdown_footnotes":true,"display_footnotes_inline":true,"poll_enabled":true,"poll_maximum_options":20,"poll_minimum_trust_level_to_create":1,"poll_groupable_user_fields":"","poll_export_data_explorer_query_id":-16,"poll_export_ranked_choice_data_explorer_query_id":-19,"poll_default_public":true,"spoiler_enabled":true,"voice_enabled":false,"voice_verbose_logging":false,"voice_livekit_recording_enabled":false,"voice_video_enabled":true,"voice_video_max_publishers":8,"voice_video_background_blur_enabled":true,"voice_subtitles_enabled":false,"voice_stt_model_base_url":"","voice_max_voice_quality":"maximum","voice_max_camera_quality":"maximum","voice_max_screen_share_quality":"maximum","voice_idle_threshold_minutes":5,"voice_afk_auto_mute_threshold_minutes":15,"voice_afk_disconnect_threshold_minutes":30,"voice_auto_status_enabled":true,"voice_mesh_privacy_warning_enabled":true,"voice_chat_enabled":true,"available_locales":"[{\"native_name\":\"اللغة العربية\",\"value\":\"ar\",\"name\":\"languages.ar.name\"},{\"native_name\":\"беларуская мова\",\"value\":\"be\",\"name\":\"languages.be.name\"},{\"native_name\":\"български език\",\"value\":\"bg\",\"name\":\"languages.bg.name\"},{\"native_name\":\"bosanski jezik\",\"value\":\"bs_BA\",\"name\":\"languages.bs_BA.name\"},{\"native_name\":\"català\",\"value\":\"ca\",\"name\":\"languages.ca.name\"},{\"native_name\":\"čeština\",\"value\":\"cs\",\"name\":\"languages.cs.name\"},{\"native_name\":\"dansk\",\"value\":\"da\",\"name\":\"languages.da.name\"},{\"native_name\":\"Deutsch\",\"value\":\"de\",\"name\":\"languages.de.name\"},{\"native_name\":\"ελληνικά\",\"value\":\"el\",\"name\":\"languages.el.name\"},{\"native_name\":\"English\",\"value\":\"en\",\"name\":\"languages.en.name\"},{\"native_name\":\"English (UK)\",\"value\":\"en_GB\",\"name\":\"languages.en_GB.name\"},{\"native_name\":\"Español\",\"value\":\"es\",\"name\":\"languages.es.name\"},{\"native_name\":\"eesti\",\"value\":\"et\",\"name\":\"languages.et.name\"},{\"native_name\":\"فارسی\",\"value\":\"fa_IR\",\"name\":\"languages.fa_IR.name\"},{\"native_name\":\"suomi\",\"value\":\"fi\",\"name\":\"languages.fi.name\"},{\"native_name\":\"Français\",\"value\":\"fr\",\"name\":\"languages.fr.name\"},{\"native_name\":\"galego\",\"value\":\"gl\",\"name\":\"languages.gl.name\"},{\"native_name\":\"עברית\",\"value\":\"he\",\"name\":\"languages.he.name\"},{\"native_name\":\"hrvatski jezik\",\"value\":\"hr\",\"name\":\"languages.hr.name\"},{\"native_name\":\"magyar\",\"value\":\"hu\",\"name\":\"languages.hu.name\"},{\"native_name\":\"Հայերեն\",\"value\":\"hy\",\"name\":\"languages.hy.name\"},{\"native_name\":\"Indonesian\",\"value\":\"id\",\"name\":\"languages.id.name\"},{\"native_name\":\"Italiano\",\"value\":\"it\",\"name\":\"languages.it.name\"},{\"native_name\":\"日本語\",\"value\":\"ja\",\"name\":\"languages.ja.name\"},{\"native_name\":\"한국어\",\"value\":\"ko\",\"name\":\"languages.ko.name\"},{\"native_name\":\"lietuvių kalba\",\"value\":\"lt\",\"name\":\"languages.lt.name\"},{\"native_name\":\"latviešu valoda\",\"value\":\"lv\",\"name\":\"languages.lv.name\"},{\"native_name\":\"Norsk bokmål\",\"value\":\"nb_NO\",\"name\":\"languages.nb_NO.name\"},{\"native_name\":\"Nederlands\",\"value\":\"nl\",\"name\":\"languages.nl.name\"},{\"native_name\":\"polski\",\"value\":\"pl_PL\",\"name\":\"languages.pl_PL.name\"},{\"native_name\":\"Português\",\"value\":\"pt\",\"name\":\"languages.pt.name\"},{\"native_name\":\"Português (BR)\",\"value\":\"pt_BR\",\"name\":\"languages.pt_BR.name\"},{\"native_name\":\"limba română\",\"value\":\"ro\",\"name\":\"languages.ro.name\"},{\"native_name\":\"Русский\",\"value\":\"ru\",\"name\":\"languages.ru.name\"},{\"native_name\":\"slovenčina\",\"value\":\"sk\",\"name\":\"languages.sk.name\"},{\"native_name\":\"slovenščina\",\"value\":\"sl\",\"name\":\"languages.sl.name\"},{\"native_name\":\"Shqip\",\"value\":\"sq\",\"name\":\"languages.sq.name\"},{\"native_name\":\"српски језик\",\"value\":\"sr\",\"name\":\"languages.sr.name\"},{\"native_name\":\"svenska\",\"value\":\"sv\",\"name\":\"languages.sv.name\"},{\"native_name\":\"Kiswahili\",\"value\":\"sw\",\"name\":\"languages.sw.name\"},{\"native_name\":\"తెలుగు\",\"value\":\"te\",\"name\":\"languages.te.name\"},{\"native_name\":\"ไทย\",\"value\":\"th\",\"name\":\"languages.th.name\"},{\"native_name\":\"Türkçe\",\"value\":\"tr_TR\",\"name\":\"languages.tr_TR.name\"},{\"native_name\":\"ئۇيغۇرچە\",\"value\":\"ug\",\"name\":\"languages.ug.name\"},{\"native_name\":\"українська мова\",\"value\":\"uk\",\"name\":\"languages.uk.name\"},{\"native_name\":\"اردو\",\"value\":\"ur\",\"name\":\"languages.ur.name\"},{\"native_name\":\"tiếng Việt\",\"value\":\"vi\",\"name\":\"languages.vi.name\"},{\"native_name\":\"简体中文\",\"value\":\"zh_CN\",\"name\":\"languages.zh_CN.name\"},{\"native_name\":\"繁體中文\",\"value\":\"zh_TW\",\"name\":\"languages.zh_TW.name\"}]","available_content_localization_locales":[],"require_invite_code":false,"site_logo_url":"http://test.localhost/images/discourse-logo-sketch.png","site_logo_small_url":"http://test.localhost/images/discourse-logo-sketch-small.png","site_mobile_logo_url":"http://test.localhost/images/discourse-logo-sketch.png","site_favicon_url":"http://test.localhost/uploads/default/test_0/optimized/1X/_129430568242d1b7f853bb13ebea28b3f6af4e7_2_32x32.png","site_logo_dark_url":"","site_logo_small_dark_url":"","site_mobile_logo_dark_url":""},"additionalOptions":{"chat":{"limited_pretty_text_features":["anchor","bbcode-block","bbcode-inline","code","category-hashtag","censored","chat-transcript","discourse-local-dates","emoji","inlineEmoji","html-img","hashtag-autocomplete","mentions","unicodeUsernames","onebox","quotes","spoiler-alert","table","text-post-process","upload-protocol","watched-words","chat-html-inline"],"limited_pretty_text_markdown_rules":["autolink","list","backticks","newline","code","fence","image","table","linkify","link","strikethrough","blockquote","emphasis","replacements","escape","entity"],"hashtag_configurations":{"topic-composer":["category","tag","channel"],"chat-composer":["channel","category","tag"]}}}}; +// cases +// { group: { case: [raw, the markdown engine's HTML] } } +export default { + "attrs": { + "bracket-in-quoted-value": [ + "[div style=\"background:url(a[1].png)\"]x[/div]", + "
    x
    " + ], + "class-media-key-case": [ + "[class name=x minWidth=10px]color:red[/class][class name=y minwidth=10px]color:blue[/class][div class=x]y[/div]", + "\n
    y
    " + ], + "close-bracket-in-quoted-value": [ + "[div style=\"a]b\"]x[/div]", + "
    x
    " + ], + "default-multi-token": [ + "[div=height:auto; width:100%;\n\npadding:7px]text[/div]", + "
    text
    " + ], + "default-until-known-key": [ + "[font=Open Sans style=bold]a[/font]\n[font=\"Open Sans style=x\"]b[/font]\n[div=color:red CLASS=box]c[/div]\n[tabs]\n[tab=First tab STYLE=color:red]1[/tab]\n[/tabs]\n[mail person=Bob subject=Hello there]d[/mail]", + "a
    \nb
    c
    \n
    \n\n\n
    1
    \n
    \n
    \n
    \n
    \nBob
    \n
    \nHello
    \n
    d
    \n
    \n
    \n
    \n
    " + ], + "empty-and-quoted-default": [ + "[color=]x[/color] [color=\"red\"]y[/color]", + "x y" + ], + "equals-in-unquoted-value": [ + "[div style=background:url(a.png?x=1)]x[/div]", + "
    x
    " + ], + "escaped-quote": [ + "[mail subject=\"a \\\"b\\\" c\"]x[/mail]", + "
    \n
    \n
    \nUnknown
    \n
    \na \\
    \n
    x
    \n
    \n
    \n
    \n
    " + ], + "flag-with-key-value": [ + "[accordion]\n[slide title=T open]body[/slide]\n[/accordion]", + "
    \n
    \nT\n
    body
    \n
    \n
    " + ], + "flags-edges": [ + "some [center is cool] text [/center]\n[accordion]\n[slide OPEN center]body[/slide]\n[slide nope]literal[/slide]\n[/accordion]", + "some [center is cool] text [/center]
    \n
    \nSlide\n
    body
    \n
    \n
    " + ], + "flags-only": [ + "[accordion]\n[slide open]body[/slide]\n[/accordion]", + "
    \n
    \nSlide\n
    body
    \n
    \n
    " + ], + "font-default-then-key": [ + "[font=Arial size=3]x[/font]", + "x" + ], + "height-values": [ + "[heightrestrict=-5]x[/heightrestrict]\n[scroll=abc]y[/scroll]", + "
    x
    \n
    y
    " + ], + "key-case": [ + "[mail Person=Bob Subject=Hi]body[/mail]\n[div Style=\"color:red\"]x[/div]", + "
    \n
    \n
    \nBob
    \n
    \nHi
    \n
    body
    \n
    \n
    \n
    \n
    \n
    x
    " + ], + "nested-quotes": [ + "[div style=\"font-family:'A b'\"]x[/div]", + "
    x
    " + ], + "newline-in-quoted-value": [ + "[mail person=\"Bo\nb\"]x[/mail]", + "
    \n
    \n
    \nBo\nb
    \n
    \nEmpty
    \n
    x
    \n
    \n
    \n
    \n
    " + ], + "quoted-key-values": [ + "[div class=\"a b\" style=\"color:blue\"]hi[/div]", + "
    hi
    " + ], + "quoted-value-edges": [ + "[div style=\"a]b\" class=box]x[/div]\n[spoiler=\"abc]text \"quoted\" more[/spoiler]\n[spoiler=Don't]x[/spoiler]\n[div style=\"a\n\nb]c[/div]\n[comment=\"a]b\"]hidden[/comment] after", + "
    x
    \n
    \n\nSpoiler: "abc\n
    text "quoted" more
    \n
    \n
    \n\nSpoiler: Don't\n
    x
    \n
    \n
    c
    \n
    after" + ], + "single-quotes": [ + "[div style='color:red']x[/div]", + "
    x
    " + ], + "size-units": [ + "[size=4]x[/size] [size=40px]y[/size] [size=12pt]z[/size]", + "x y z" + ], + "unquoted-value-with-spaces": [ + "[mail type=send person=Bob subject=Hello there]body[/mail]", + "
    \n
    \n
    \nBob
    \n
    \nHello
    \n
    body
    \n
    \n
    \n
    \n
    " + ] + }, + "breaks": { + "br": [ + "a[br]b a[br][/br]b", + "a[br]b a
    \nb" + ], + "inline-across-blank-line": [ + "[b]para one\n\npara two[/b]", + "para one
    \n
    \npara two
    " + ], + "markdown-margins": [ + "a\n\n\n# H\n\n\nb", + "a

    H

    \n
    b" + ], + "nobr": [ + "[nobr]a\nb[/nobr]\n[b]x [nobr]a\nb[/nobr][/b]\nbefore\n\n[nobr]\na\n[/nobr]", + "a\nb
    x a\nb
    \nbefore

    \na" + ], + "trim-after": [ + "[spoiler]secret[/spoiler]\nafter\n[divide][/divide]\nx\n[center]c[/center]\ny", + "
    \n\nSpoiler\n
    secret
    \n
    \nafter
    \nx
    c
    \n
    y" + ], + "trim-inside": [ + "[spoiler]\nsecret\n[/spoiler]\n[blockquote=Me]\nq\n[/blockquote]\n[ooc]\no\n[/ooc]", + "
    \n\nSpoiler\n
    \nsecret
    \n
    \n
    \n
    \n
    \nq
    \n- Me
    \n
    \n
    \n
    \n
    \no
    " + ], + "single-newlines": [ + "a\nb\nc", + "a
    \nb
    \nc" + ], + "blank-lines": [ + "a\n\nb\n\n\nc\n\n\n\nd", + "a

    b


    c



    d" + ], + "leading-and-trailing-blank-lines": [ + "\n\na\n\n", + "a" + ], + "windows-newlines": [ + "a\r\nb\r\n\r\nc", + "a
    \nb

    c" + ], + "breaks-around-block-tags": [ + "a\n[center]c[/center]\nb\n\n[center]d[/center]\n\ne", + "a
    c
    \n
    b

    d
    \n

    e" + ], + "breaks-inside-block-tags": [ + "[center]\n\na\n\n[/center]", + "
    \n

    \na

    \n
    " + ], + "breaks-around-inline-tags": [ + "a\n[b]b[/b]\nc\n\n[b]d[/b]\n\ne", + "a
    \nb
    \nc

    d

    e" + ], + "breaks-around-markdown-blocks": [ + "a\n# H\nb\n\n- list\n\nc\n> quote\nd", + "a

    H

    \nb
      \n
    • list
    • \n
    \nc
    \nquote
    \nd
    " + ], + "breaks-after-trim-after-tags": [ + "[spoiler]s[/spoiler]\na\n[divide][/divide]\n\nb\n[ooc]o[/ooc]\n\n\nc", + "
    \n\nSpoiler\n
    s
    \n
    \na
    \n
    b
    o
    \n

    c" + ], + "breaks-trim-inside": [ + "[spoiler]\n\ns\n\n[/spoiler]\n[blockquote]\n\nq\n\n[/blockquote]", + "
    \n\nSpoiler\n
    \ns
    \n
    \n
    \n
    \n
    \nq
    \n
    \n
    \n
    " + ], + "nobr-mixed": [ + "[nobr]a\nb\n\nc[/nobr]\nd\n[nobr]\ne\n[/nobr]\nf", + "a\nb\n\nc
    d
    \ne\n
    f" + ], + "br-tags": [ + "a[br][/br]b[br][/br][br][/br]c", + "a
    \nb
    \n
    \nc" + ], + "trailing-spaces": [ + "a \nb\t\nc", + "a
    \nb\t
    \nc" + ] + }, + "containers": { + "block-in-blockquote-with-markdown": [ + "> [center]\n> x\n>\n> - item\n> [/center]\n> after", + "
    \n
    \n
    \nx
      \n
    • item
    • \n
    \n
    \n
    \n
    after
    " + ], + "block-in-blockquote": [ + "> [center]\n> x\n> [/center]", + "
    \n
    \n
    \nx
    \n
    \n
    " + ], + "block-in-list": [ + "- [center]\n x\n [/center]", + "
      \n
    • \n
      \n
      \nx
      \n
      \n
    • \n
    " + ], + "block-in-nested-list": [ + "1. one\n2. [center]\n x\n [/center]\n3. three\n\n- a\n - [div=color:red]\n nested\n [/div]", + "
      \n
    1. one
    2. \n
    3. \n
      \n
      \nx
      \n
      \n
    4. \n
    5. three
    6. \n
    \n
      \n
    • a\n
        \n
      • \n
        \n
        \nnested
        \n
        \n
      • \n
      \n
    • \n
    " + ], + "block-mid-line": [ + "hello [center]a\nb[/center] after", + "hello
    \na
    \nb
    \nafter" + ], + "block-tail": [ + "[center]x[/center] b\n[div=a]\nx\n[/div] tail", + "
    x
    \nb
    \n
    \nx
    \n
    \ntail" + ], + "code": [ + "> a [code]x\n> y[/code] b\n\n- [code]\n z\n [/code]", + "
    \na
    x\ny
    \nb
    \n
      \n
    • \n
        z
      \n
    • \n
    " + ], + "core-quote-holds-tags": [ + "[quote]\n[b]x[/b]\n[center]\ny\n[/center]\n[/quote]", + "" + ], + "inline-across-lines-in-blockquote": [ + "> [b]a\n> b[/b]", + "
    \na
    \nb
    " + ], + "inline-across-lines": [ + "> [b]a\n>\n> b[/b]\n\n- [i]a\n b[/i]\n\n> text [color=red]a\n> b[/color] c", + "
    \na
    \n
    \nb
    \n
      \n
    • a
      \nb
    • \n
    \n
    \ntext a
    \nb
    c
    " + ], + "mid-line-and-lazy": [ + "> hello [center]a\n> b[/center] after\n\n> [b]lazy\ncontinuation[/b]", + "
    \nhello
    \na
    \nb
    \nafter
    \n
    \nlazy
    \ncontinuation
    " + ], + "nested-quote": [ + "> [quote]\n> [b]x\n> [/quote]\n\n> > [center]\n> > deep\n> > [/center]", + "
    \n\n
    \n
    \n
    \n
    \n
    \ndeep
    \n
    \n
    \n
    " + ], + "nesting-cap": [ + "[div=a]\n[div=a]\n[div=a]\n[div=a]\n[div=a]\n[div=a]\n[div=a]\n[div=a]\n[div=a]\n[div=a]\n[div=a]\n[div=a]\n[div=a]\n[div=a]\n[div=a]\n[div=a]\n[div=a]\n[div=a]\n[div=a]\n[div=a]\n[div=a]\n[div=a]\n[div=a]\n[div=a]\n[div=a]\n[div=a]\n[div=a]\n[div=a]\n[div=a]\n[div=a]\n[div=a]\n[div=a]\n[div=a]\n[div=a]\n[div=a]\n[div=a]\n[div=a]\n[div=a]\n[div=a]\n[div=a]\n[div=a]\n[div=a]\n[div=a]\n[div=a]\n[div=a]\n[div=a]\n[div=a]\n[div=a]\n[div=a]\n[div=a]\n[div=a]\n[div=a]\n[div=a]\n[div=a]\n[div=a]\n[div=a]\n[div=a]\n[div=a]\n[div=a]\n[div=a]\n[div=a]\n[div=a]\n[div=a]\n[div=a]\n[div=a]\n[div=a]\n[div=a]\n[div=a]\n[div=a]\n[div=a]\n[div=a]\n[div=a]\n[div=a]\n[div=a]\n[div=a]\n[div=a]\n[div=a]\n[div=a]\n[div=a]\n[div=a]\n[div=a]\n[div=a]\n[div=a]\n[div=a]\n[div=a]\n[div=a]\n[div=a]\n[div=a]\n[div=a]\n[div=a]\n[div=a]\n[div=a]\n[div=a]\n[div=a]\n[div=a]\n[div=a]\n[div=a]\n[div=a]\n[div=a]\n[color=red][color=blue]x[/color][/color]\n[/div]\n[/div]\n[/div]\n[/div]\n[/div]\n[/div]\n[/div]\n[/div]\n[/div]\n[/div]\n[/div]\n[/div]\n[/div]\n[/div]\n[/div]\n[/div]\n[/div]\n[/div]\n[/div]\n[/div]\n[/div]\n[/div]\n[/div]\n[/div]\n[/div]\n[/div]\n[/div]\n[/div]\n[/div]\n[/div]\n[/div]\n[/div]\n[/div]\n[/div]\n[/div]\n[/div]\n[/div]\n[/div]\n[/div]\n[/div]\n[/div]\n[/div]\n[/div]\n[/div]\n[/div]\n[/div]\n[/div]\n[/div]\n[/div]\n[/div]\n[/div]\n[/div]\n[/div]\n[/div]\n[/div]\n[/div]\n[/div]\n[/div]\n[/div]\n[/div]\n[/div]\n[/div]\n[/div]\n[/div]\n[/div]\n[/div]\n[/div]\n[/div]\n[/div]\n[/div]\n[/div]\n[/div]\n[/div]\n[/div]\n[/div]\n[/div]\n[/div]\n[/div]\n[/div]\n[/div]\n[/div]\n[/div]\n[/div]\n[/div]\n[/div]\n[/div]\n[/div]\n[/div]\n[/div]\n[/div]\n[/div]\n[/div]\n[/div]\n[/div]\n[/div]\n[/div]\n[/div]\n[/div]\n[/div]\n", + "
    \n
    \n
    \n
    \n
    \n
    \n
    \n
    \n
    \n
    \n
    \n
    \n
    \n
    \n
    \n
    \n
    \n
    \n
    \n
    \n
    \n
    \n
    \n
    \n
    \n
    \n
    \n
    \n
    \n
    \n
    \n
    \n
    \n
    \n
    \n
    \n
    \n
    \n
    \n
    \n
    \n
    \n
    \n
    \n
    \n
    \n
    \n
    \n
    \n
    \n
    \n
    \n
    \n
    \n
    \n
    \n
    \n
    \n
    \n
    \n
    \n
    \n
    \n
    \n
    \n
    \n
    \n
    \n
    \n
    \n
    \n
    \n
    \n
    \n
    \n
    \n
    \n
    \n
    \n
    \n
    \n
    \n
    \n
    \n
    \n
    \n
    \n
    \n
    \n
    \n
    \n
    \n
    \n
    \n
    \n
    \n
    \n
    \n
    \n
    \n
    \n
    \n
    \n
    \n
    \n
    \n
    \n
    \n
    \n
    \n
    \n
    \n
    \n
    \n
    \n
    \n
    \n
    \n
    \n
    \n
    \n
    \n
    \n
    \n
    \n
    \n
    \n
    \n
    \n
    \n
    \n
    \n
    \n
    \n
    \n
    \n
    \n
    \n
    \n
    \n
    \n
    \n
    \n
    \n
    \n
    \n
    \n
    \n
    \n
    \n
    \n
    \n
    \n
    \n
    \n
    \n
    \n
    \n
    \n
    \n
    \n
    \n
    \n
    \n
    \n
    \n
    \n
    \n
    \n
    \n
    \n
    \n
    \n
    \n
    \n
    \n
    \n
    \n
    \n
    \n
    \n
    \n
    \n
    \n
    \n
    \n
    \n
    \n
    \n
    \n
    \n
    \n
    \n
    \n
    \n
    \n
    \n
    \n[color=blue]x[/color]
    \n
    \n
    \n
    \n
    \n
    \n
    \n
    \n
    \n
    \n
    \n
    \n
    \n
    \n
    \n
    \n
    \n
    \n
    \n
    \n
    \n
    \n
    \n
    \n
    \n
    \n
    \n
    \n
    \n
    \n
    \n
    \n
    \n
    \n
    \n
    \n
    \n
    \n
    \n
    \n
    \n
    \n
    \n
    \n
    \n
    \n
    \n
    \n
    \n
    \n
    \n
    \n
    \n
    \n
    \n
    \n
    \n
    \n
    \n
    \n
    \n
    \n
    \n
    \n
    \n
    \n
    \n
    \n
    \n
    \n
    \n
    \n
    \n
    \n
    \n
    \n
    \n
    \n
    \n
    \n
    \n
    \n
    \n
    \n
    \n
    \n
    \n
    \n
    \n
    \n
    \n
    \n
    \n
    \n
    \n
    \n
    \n
    \n
    \n
    \n
    \n
    \n
    \n
    \n
    \n
    \n
    \n
    \n
    \n
    \n
    \n
    \n
    \n
    \n
    \n
    \n
    \n
    \n
    \n
    \n
    \n
    \n
    \n
    \n
    \n
    \n
    \n
    \n
    \n
    \n
    \n
    \n
    \n
    \n
    \n
    \n
    \n
    \n
    \n
    \n
    \n
    \n
    \n
    \n
    \n
    \n
    \n
    \n
    \n
    \n
    \n
    \n
    \n
    \n
    \n
    \n
    \n
    \n
    \n
    \n
    \n
    \n
    \n
    \n
    \n
    \n
    \n
    \n
    \n
    \n
    \n
    \n
    \n
    \n
    \n
    \n
    \n
    \n
    \n
    \n
    \n
    \n
    \n
    \n
    \n
    \n
    \n
    \n
    \n
    \n
    \n
    \n
    \n
    \n
    \n
    \n
    \n
    " + ], + "not-markers": [ + "-[center]\nx\n[/center]\n\n2024. [center]\ny\n[/center]\n\n [center]\nz\n[/center]", + "-
    \n
    \nx
    \n
    \n
      \n
    1. \n
      \n
      \ny
      \n
      \n
    2. \n
    \n
    \n
    \nz
    \n
    " + ], + "url-wrapping-block": [ + "[url=https://e.com][div=a]x[/div][/url]\n[url=https://e.com][center]a\n\nb[/center][/url]", + "
    x

    \n
    a
    \n
    \nb
    " + ], + "review-code-span-across-stripped-quote": [ + "> [div]\n> `x\n>\n> [/div]\n> `", + "
    \n
    \n
    \n`x

    \n
    \n
    `
    " + ] + }, + "features": { + "emoji": [ + "[center]:smile: :heart:[/center] [b]:+1:[/b]", + "
    \":smile:\" \":heart:\"
    " + ], + "emoji-unicode-and-shortcode-in-plain": [ + "[plain]:smile: 😀[/plain] :smile: 😀", + ":smile: 😀 \":smile:\" \":grinning_face:\"" + ], + "mentions": [ + "[b]@system[/b] [center]\n@system\n[/center]", + "@system
    \n
    \n@system
    \n
    " + ], + "mention-in-literal": [ + "[plain]@system[/plain] [icode]@system[/icode]", + "@system @system" + ], + "hashtags": [ + "[b]#general[/b] #bug", + "#general #bug" + ], + "onebox-top-level": [ + "https://www.youtube.com/watch?v=dQw4w9WgXcQ", + "https://www.youtube.com/watch?v=dQw4w9WgXcQ" + ], + "onebox-in-center": [ + "[center]\nhttps://www.youtube.com/watch?v=dQw4w9WgXcQ\n[/center]", + "" + ], + "onebox-in-inline-tag": [ + "[b]https://example.com/page[/b]", + "https://example.com/page" + ], + "linkify": [ + "[b]see example.com and https://example.com/x?y=1[/b]", + "see example.com and https://example.com/x?y=1" + ], + "markdown-links": [ + "[center][text](https://example.com) ![alt](https://example.com/a.png)[/center]", + "" + ], + "image-sizes": [ + "[center]![alt|200x100](https://example.com/a.png)[/center]", + "
    \"alt\"
    " + ], + "poll-in-center": [ + "[center]\n[poll]\n* [b]one[/b]\n* two\n[/poll]\n[/center]", + "
    \n
    \n
    \n
    \n
      \n
    • one
    • \n
    • two
    • \n
    \n
    \n
    \n
    \n
    \n0\nvoters\n
    \n
    \n
    \n
    \n
    \n
    " + ], + "poll-around-tags": [ + "[poll]\n* [color=red]red[/color]\n* [plain][b][/plain]\n[/poll]", + "
    \n
    \n
      \n
    • red
    • \n
    • [b]
    • \n
    \n
    \n
    \n
    \n
    \n0\nvoters\n
    \n
    \n
    \n
    " + ], + "details-in-center": [ + "[center]\n[details=\"Summary\"]\nbody [b]bold[/b]\n[/details]\n[/center]", + "
    \n
    \n
    \n\nSummary\nbody bold
    \n
    \n
    " + ], + "center-in-details": [ + "[details=\"Summary\"]\n[center]centered[/center]\n[/details]", + "
    \n\nSummary\n
    centered
    \n
    " + ], + "wrap-with-tags": [ + "[wrap=box]\n[center]x[/center]\n[/wrap]", + "
    \n
    x
    \n
    " + ], + "quote-with-attribution": [ + "[quote=\"system, post:1, topic:1\"]\n[center]x[/center] [b]y[/b]\n[/quote]", + "" + ], + "nested-quotes": [ + "[quote]\nouter [b]bold\n[quote]\ninner[/b]\n[/quote]\n[/quote]", + "[quote]
    \nouter
    \nbold
    [quote]
    \ninner[/quote]
    \n
    [/quote]" + ], + "fenced-code-with-language": [ + "```ruby\n[b]x[/b] # not bold\n```", + "
    [b]x[/b] # not bold\n
    " + ], + "fence-in-center": [ + "[center]\n```\n[b]x[/b]\n```\n[/center]", + "
    \n
    \n
    [b]x[/b]\n
    \n\n
    " + ], + "code-tag-with-language": [ + "[code=ruby]\nputs \"[b]x[/b]\"\n[/code]", + "
    puts "[b]x[/b]"
    " + ], + "math-inline": [ + "[b]$x^2$[/b] and $[b]y[/b]$", + "$x^2$ and $y$" + ], + "math-block": [ + "[center]\n$$\nx^2\n$$\n[/center]", + "
    \n
    \n$$
    \nx^2
    \n$$
    \n
    " + ], + "table-with-tags": [ + "| [b]head[/b] | [color=red]red[/color] |\n|---|---|\n| [center]c[/center] | [plain]|[/plain] |", + "
    \n\n\n\n\n\n\n\n\n\n\n\n\n\n
    headred
    c
    [plain]
    \n
    " + ], + "headings-markdown-and-tags": [ + "# [color=red]Title[/color]\n## plain\n[h1]Tag heading[/h1]", + "

    Title

    \n

    plain

    \n

    Tag heading

    " + ], + "html-inline-with-tags": [ + "[i]x[/i] [b]y[/b] [u]k[/u]", + "x y k" + ], + "html-block-with-tags": [ + "
    \n[b]x[/b]\n
    ", + "
    \n[b]x[/b]\n
    " + ], + "typographer": [ + "[b]\"quotes\" -- dashes... (c)[/b]", + ""quotes" -- dashes... (c)" + ], + "hard-and-soft-breaks": [ + "[b]line one \nline two\\\nline three[/b]", + "line one
    \nline two
    \nline three
    " + ], + "horizontal-rules": [ + "[center]\n---\n***\n[/center]", + "
    \n
    \n
    \n
    \n
    \n
    " + ], + "reference-links": [ + "[b][ref][/b]\n\n[ref]: https://example.com", + "ref" + ], + "footnote-like": [ + "[b]x[^1][/b]\n\n[^1]: note", + "x[1]
    \n\n
      \n
    1. note ↩︎
    2. \n
    " + ], + "censored-and-watched-words": [ + "[b]some text[/b]", + "some text" + ], + "markdown-lists-with-tags": [ + "1. [b]one[/b]\n2. [center]two[/center]\n - [i]nested[/i]", + "
      \n
    1. one
    2. \n
    3. \n
      two
      \n
        \n
      • nested
      • \n
      \n
    4. \n
    " + ], + "task-like-list": [ + "- [ ] not a tag\n- [x] also not a tag\n- [b]bold[/b]", + "
      \n
    • not a tag
    • \n
    • also not a tag
    • \n
    • bold
    • \n
    " + ], + "onebox-in-spoiler": [ + "[spoiler=Video]\nhttps://www.youtube.com/watch?v=dQw4w9WgXcQ\n[/spoiler]", + "
    \n\nSpoiler: Video\n\n
    " + ], + "onebox-after-text-line": [ + "[center]\nwatch this:\nhttps://www.youtube.com/watch?v=dQw4w9WgXcQ\n[/center]", + "" + ], + "onebox-sharing-a-line-stays-inline": [ + "[center]\nwatch https://www.youtube.com/watch?v=dQw4w9WgXcQ now\n[/center]", + "" + ], + "onebox-in-markdown-quote-stays-inline": [ + "> [center]\n> https://www.youtube.com/watch?v=dQw4w9WgXcQ\n> [/center]", + "
    \n\n
    " + ] + }, + "literal": { + "code-block": [ + "x\n[code]\n [div=x]\n[/div]\n[/code]\nafter", + "x
        [div=x]\n[/div]
    \nafter" + ], + "code-inside-plain": [ + "[plain][code]\nx[/plain]\n[/code]", + "[code]
    \nx
    [/code]" + ], + "code-mid-line": [ + "a [code]x\ny[/code] b", + "a
    x\ny
    \nb" + ], + "code-not-nested": [ + "[code]\na [code] b\n[/code]\nc\n[/code]", + "
    a [code] b
    \nc
    \n[/code]" + ], + "comment": [ + "[comment]\nhidden [font=Lato]x[/font]\n[/comment]\nafter\na [comment]x --> y[/comment] b", + "
    \nafter
    \na b" + ], + "fence-container-ends": [ + "> ```\n> [b]unclosed quoted fence\n\n[i]after the quote[/i]\n\n- ```\n [i]x\n ```\n- [b]y[/b]", + "
    \n
    [b]unclosed quoted fence\n
    \n
    \nafter the quote
      \n
    • \n
      [i]x\n
      \n
    • \n
    • y
    • \n
    " + ], + "fence-in-blockquote": [ + "[b]x\n> ```\n> [/b]\n> ```\ny[/b]", + "
    \nx
    \n
    [/b]\n
    \n
    \ny
    " + ], + "fence-in-list": [ + "[b]x\n- ```\n [/b]\n ```\n\ny[/b]", + "
    \nx
      \n
    • \n
      [/b]\n
      \n
    • \n
    \ny
    " + ], + "fence-top-level": [ + "```\n[b]x\n```\n\n[/b]\n[b]x\n```\n[/b]\n```\ny[/b]", + "
    [b]x\n
    \n
    [/b]
    \nx
    [/b]\n
    \ny
    " + ], + "html-blocks": [ + "[b]x\n\ny[/b]\n\n[i]a\n\nb[/i]\n\n
    [b]same line
    [b]after[/b]", + "
    \nx\ny
    \n

    \na\n[/i]\n\nb
    \n
    [b]same line
    [b]after[/b]" + ], + "icode": [ + "[icode]a[/icode] [icode]b[/icode]\nx [icode]c\n\nd[/icode] y", + "a b
    x c\n\nd y" + ], + "inline-html-and-autolinks": [ + "[b]a b[/b]\n[i]x y[/i]\n[b]1 < 2 [/b] and html\n y[/b]", + "x y" + ], + "close-in-link-text": [ + "[b][a [/b] b](https://e.com) y[/b]", + "[a b](https://e.com) y[/b]" + ], + "close-with-space": [ + "[b]x[/b ]", + "[b]x[/b ]" + ], + "escapes": [ + "\\[b][i]x[/b] y[/i]\n[b]a \\[b] c[/b] d[/b]\n\\\\[b]x[/b]\n[div=x]a \\[/div] b", + "[b]x[/b] y
    \na [b] c d[/b]
    \n\\x
    a \\
    \nb" + ], + "misnested": [ + "[b]bold [i]both[/b] italic[/i]\n[center][b]x[/center] y[/b]\n[url=https://e.com][b]x[/url] y[/b]", + "bold both italic
    x
    \ny
    x y" + ], + "nested-across-blank-line": [ + "[b]outer [b]nested\n\nacross[/b] more[/b]", + "outer nested
    \n
    \nacross
    more
    " + ], + "repair-core-details": [ + "[details=a]\n[b]x\n[/details]\ny[/b]", + "
    \n\na\nx
    \n
    y" + ], + "repair-core-quote-edges": [ + "[quote]\n[b]x\n\n[/quote]\ny[/b]\n\n[quote]\n[i][b]\n[/quote][/b][/i]", + "\ny

    " + ], + "repair-core-quote-inline": [ + "[quote]\nhi [b]x\n[/quote]\nafter[/b]", + "\nafter" + ], + "repair-core-quote": [ + "[quote]\n[b]x\n[/quote]\ny[/b]", + "\ny" + ], + "repair-core-wrap": [ + "[wrap=x]\n[b]x\n[/wrap]\ny[/b]", + "
    \nx
    \ny" + ], + "repair-line-start-close": [ + "[center]\n[b]x\n[/center]\ny[/b]\n[div=a]\n[i]x\n [/div] z[/i]", + "
    \n
    \nx
    \n
    \n
    y
    \n
    \nx
    \n
    \nz" + ], + "unclosed-and-unmatched": [ + "[div=a:b]unclosed\ntext [/b] more\n[b]a [b]b[/b] c", + "[div=a:b]unclosed
    \ntext [/b] more
    \n[b]a b c" + ] + }, + "plus": { + "class-and-script": [ + "[class name=box state=hover]color:red[/class]\n[div class=box]x[/div]\n[script class=box on=click]x[/script]\n[animation=spin][keyframe=0]a:b[/keyframe][keyframe=100]c:d[/keyframe][/animation]", + "\n
    x
    " + ], + "fa": [ + "[fa style=\"color:red\" primary-color=blue fa-transform=grow-2]fas fa-dice[/fa]", + "" + ], + "forged-marker": [ + "a b", + "a b" + ], + "review-fractional-keyframe": [ + "[animation=fade]\n[keyframe=.5%]opacity:0;[/keyframe]\n[keyframe=100%]opacity:1;[/keyframe]\n[/animation]", + "" + ], + "review-link-in-inline-spoiler": [ + "[inlinespoiler][url=https://example.com]open link[/url][/inlinespoiler]", + "open link" + ] + }, + "scenarios": { + "character-sheet": [ + "[center][size=6][font=Cinzel][color=#8b0000]Aldric Thorne[/color][/font][/size]\n[img]https://example.com/aldric.png[/img]\n[i]\"The road remembers every step.\"[/i][/center]\n\n[divide][/divide]\n\n[b]Age:[/b] 34\n[b]Race:[/b] Human\n[b]Occupation:[/b] Wandering knight\n\n[fieldset=Appearance]\nTall, scarred, with [color=gray]ash-grey[/color] hair.\n[/fieldset]\n\n[fieldset=Personality]\n- Loyal to a fault\n- Quick to anger\n- [s]Trusting[/s] Wary of strangers\n[/fieldset]\n\n[spoiler=Backstory]\nBorn in the northern marches...\n\nHe left home at sixteen.\n[/spoiler]", + "
    \nAldric Thorne
    \n
    \n"The road remembers every step."
    \n

    \n
    Age: 34
    \nRace: Human
    \nOccupation: Wandering knight

    \n\nAppearance\n
    \n
    \nTall, scarred, with ash-grey hair.
    \n
    \n
    \n

    \n\nPersonality\n
    \n
    \n
      \n
    • Loyal to a fault
    • \n
    • Quick to anger
    • \n
    • Trusting Wary of strangers
    • \n
    \n
    \n
    \n
    \n

    \n\nSpoiler: Backstory\n
    \nBorn in the northern marches...

    He left home at sixteen.
    \n
    " + ], + "tabbed-profile": [ + "[tabs]\n[tab=Overview]\n[center][b]Mira Vale[/b][/center]\nA cartographer from the coast.\n[/tab]\n[tab=Stats]\n| Stat | Value |\n|---|---|\n| STR | 8 |\n| INT | 16 |\n[/tab]\n[tab=Relationships]\n[list]\n@system - mentor\n[/list]\n[/tab]\n[/tabs]", + "
    \n\n\n
    \n
    \n
    Mira Vale
    \n
    A cartographer from the coast.
    \n
    \n\n\n
    \n
    \n
    \n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n
    StatValue
    STR8
    INT16
    \n

    \n
    \n\n\n
    \n
    \n[list]
    \n@system - mentor
    \n[/list]
    \n
    \n
    " + ], + "lore-accordion": [ + "[accordion]\n[slide=The First Age]\nBefore the sun, there was the [i]Long Dark[/i].\n[/slide]\n[slide=The Sundering open]\n[quote]The mountains fell into the sea.[/quote]\n[/slide]\n{slide=Legacy format|right}Older posts wrote slides like this.{/slide}\n[/accordion]", + "
    \n
    \nThe First Age\n
    \n
    \nBefore the sun, there was the Long Dark.
    \n
    \n
    \n
    \nThe Sundering open\n
    \n
    \n\n\n
    \n
    \n
    \nLegacy format\n
    Older posts wrote slides like this.
    \n
    \n
    " + ], + "styled-card-with-class": [ + "[class name=card]\nbackground: #222;\ncolor: #eee;\npadding: 12px;\nborder-radius: 8px;\n[/class]\n[class name=card state=hover]\nbackground: #333;\n[/class]\n[div class=card]\n[h3]Guild Notice[/h3]\nAll members report to the hall at dusk.\n[/div]", + "\n
    \n
    \n

    Guild Notice

    \n
    All members report to the hall at dusk.
    \n
    " + ], + "text-message-conversation": [ + "[textmessage=Jess]\n[message=them]where are you??[/message]\n[message=me]almost there[/message]\n[message=them]hurry up :sweat_smile:[/message]\n[/textmessage]", + "
    \n
    \nJess
    \n
    \n
    \n
    \n
    \n
    where are you??
    \n
    \n
    \n
    almost there
    \n
    \n
    \n
    hurry up \":sweat_smile:\"
    \n
    \n
    \n
    \n
    \n
    " + ], + "dice-roll-block": [ + "[block=dice]\n[b]Roll:[/b] 1d20 + 3 = [color=green]17[/color]\n[/block]\n[ooc]Rolling for perception, hope that's okay![/ooc]", + "
    \n
    \nRoll: 1d20 + 3 = 17
    \n
    \n
    Rolling for perception, hope that's okay!
    " + ], + "ooc-and-in-character": [ + "[ooc]Sorry for the late post, busy week![/ooc]\n\nRain hammered the shutters as she stepped inside.\n\n\"[i]You're late,[/i]\" he said.", + "
    Sorry for the late post, busy week!
    \n
    Rain hammered the shutters as she stepped inside.

    "You're late," he said." + ], + "image-float-with-text": [ + "[imagefloat=left][img]https://example.com/portrait.png[/img][/imagefloat]\n[justify]Lorem ipsum dolor sit amet, the text wraps around the portrait on the left and keeps going for several lines.[/justify]", + "
    \n
    Lorem ipsum dolor sit amet, the text wraps around the portrait on the left and keeps going for several lines.
    " + ], + "columns-layout": [ + "[row]\n[column=span6]\n[b]Left side[/b]\nSome text.\n[/column]\n[column=span6]\n[b]Right side[/b]\nMore text.\n[/column]\n[/row]", + "
    \n
    \n
    \n
    \nLeft side
    \nSome text.
    \n
    \n
    \n
    \nRight side
    \nMore text.
    \n
    \n
    \n
    " + ], + "nested-font-color-size": [ + "[font=Georgia][size=4][color=#4a90d9]Chapter [b]One[/b][/color][/size][/font]", + "Chapter One" + ], + "newspaper-and-note": [ + "[newspaper]\n[h1]The Daily Crier[/h1]\n[b]Dragon sighted over harbor[/b]\n[/newspaper]\n[note]Remember to buy bread.[/note]", + "
    \n
    \n

    The Daily Crier

    \n
    Dragon sighted over harbor
    \n
    \n
    \n
    \n
    Remember to buy bread.
    \n
    \n
    " + ], + "progress-stats": [ + "[b]HP[/b] [progress=80]80/100[/progress]\n[b]MP[/b] [thinprogress=35]35/100[/thinprogress]", + "HP
    80/100

    \nMP
    35/100
    " + ], + "scroll-box-log": [ + "[scroll=200]\nDay 1: Arrived at the village.\nDay 2: Met the elder.\nDay 3: The well was poisoned.\nDay 4: Found the culprit.\nDay 5: Left at dawn.\n[/scroll]", + "
    \n
    \nDay 1: Arrived at the village.
    \nDay 2: Met the elder.
    \nDay 3: The well was poisoned.
    \nDay 4: Found the culprit.
    \nDay 5: Left at dawn.
    \n
    " + ], + "spoiler-with-heading-and-list": [ + "[spoiler=Rules]\n## Posting rules\n1. Stay in character\n2. Use [ooc] for out of character\n3. No godmodding\n[/spoiler]", + "
    \n\nSpoiler: Rules\n
    \n

    Posting rules

    \n
      \n
    1. Stay in character
    2. \n
    3. Use [ooc] for out of character
    4. \n
    5. No godmodding
    6. \n
    \n
    \n
    " + ], + "linked-image": [ + "[url=https://example.com/gallery][img]https://example.com/thumb.png[/img][/url]", + "" + ], + "centered-video-link": [ + "[center]https://www.youtube.com/watch?v=dQw4w9WgXcQ[/center]", + "" + ], + "anchors-table-of-contents": [ + "[goto=ch1]Chapter 1[/goto] | [goto=ch2]Chapter 2[/goto]\n\n[a=ch1][h2]Chapter 1[/h2][/a]\nText.\n[a=ch2][h2]Chapter 2[/h2][/a]\nMore text.", + "Chapter 1 | Chapter 2

    Chapter 1


    \nText.
    \n

    Chapter 2


    \nMore text." + ], + "reply-quoting-with-bbcode": [ + "[quote=\"system, post:1, topic:1\"]\n[b]Bold claim[/b] in the quote.\n[/quote]\n[color=red]I disagree![/color]", + "\nI disagree!" + ], + "mixed-markdown-and-bbcode": [ + "**Markdown bold** and [b]bbcode bold[/b].\n- a [i]list[/i] item\n- [center]centered in a list[/center]\n\n> a quote with [u]underline[/u]", + "Markdown bold and bbcode bold.
      \n
    • a list item
    • \n
    • \n
      centered in a list
      \n
    • \n
    \n
    \na quote with underline
    " + ], + "forgotten-close": [ + "[b]This bold never closes.\n[center]but this one does[/center]", + "[b]This bold never closes.
    but this one does
    " + ], + "mismatched-close-case": [ + "[B]bold[/b] [Color=Red]red[/COLOR]", + "bold red" + ], + "wrong-close-tag": [ + "[b]bold[/i] text[/b]", + "bold[/i] text" + ], + "extra-spaces-in-attributes": [ + "[color = red]a[/color] [size= 5]b[/size] [div style = \"color:red\"]c[/div]", + "a b
    c
    " + ], + "xenforo-style-quote-and-attach": [ + "[QUOTE=\"Someone, post: 123, member: 45\"]old quote[/QUOTE]\n[ATTACH=full]6789[/ATTACH]", + "\n[ATTACH=full]6789[/ATTACH]" + ], + "xenforo-url-and-email": [ + "[URL='https://example.com']link[/URL] [EMAIL]a@example.com[/EMAIL]", + "link a@example.com" + ], + "comment-for-authors": [ + "[comment]TODO: update stats after the arc[/comment]\nVisible text.", + "
    \nVisible text." + ], + "plain-and-icode-teaching": [ + "To make text bold, write [icode][b]text[/b][/icode].\n[plain]Example: [color=red]red[/color][/plain]", + "To make text bold, write [b]text[/b].
    Example: [color=red]red[/color]" + ], + "long-post-many-sections": [ + "[center][h1]Session Log[/h1][/center]\n[spoiler=Part 1]\n[b]Scene:[/b] The tavern.\n[/spoiler]\n[spoiler=Part 2]\n[b]Scene:[/b] The road.\n[/spoiler]\n[spoiler=Part 3]\n[b]Scene:[/b] The castle.\n[/spoiler]\n[divide][/divide]\n[right][i]- End of log -[/i][/right]", + "

    Session Log

    \n
    \n\nSpoiler: Part 1\n
    \nScene: The tavern.
    \n
    \n
    \n\nSpoiler: Part 2\n
    \nScene: The road.
    \n
    \n
    \n\nSpoiler: Part 3\n
    \nScene: The castle.
    \n
    \n
    \n
    - End of log -
    " + ], + "nobr-poetry": [ + "[nobr]\nRoses are red,\nviolets are blue.\n[/nobr]", + "Roses are red,\nviolets are blue." + ], + "inline-spoilers-in-dialogue": [ + "\"The killer is [inlinespoiler]the butler[/inlinespoiler],\" she whispered.", + ""The killer is the butler," she whispered." + ], + "mail-in-character": [ + "[mail type=receive person=\"The Duke\" subject=\"Summons\"]\nYou are to appear before the court at noon.\n[/mail]", + "
    \n
    \n
    \nThe Duke
    \n
    \nSummons
    \n
    \n
    \nYou are to appear before the court at noon.
    \n
    \n
    \n
    \n
    \n
    " + ], + "fa-icons-in-headers": [ + "[h3][fa]fas fa-scroll[/fa] Quest Log[/h3]", + "

    Quest Log

    " + ], + "blockquote-with-speaker": [ + "[blockquote=The Oracle]\nWhat was lost shall be found.\n[/blockquote]", + "
    \n
    \n
    \nWhat was lost shall be found.
    \n- The Oracle
    \n
    \n
    \n
    " + ] + }, + "sections": { + "accordion": [ + "[accordion=bright|50%]\n[slide=One]\n- a\n[/slide]\n{slide=Two|open|center}two{/slide}\n[/accordion]", + "
    \n
    \nOne\n
    \n
    \n
      \n
    • a
    • \n
    \n
    \n
    \n
    \n
    \nTwo\n
    two
    \n
    \n
    " + ], + "tab-code-span": [ + "[tabs]\n[tab=A]`{/slide}` [/tab]\n[/tabs]", + "
    \n\n\n
    {/slide}
    \n
    " + ], + "tab-names": [ + "[tabs]\n[tab=a b]1[/tab]\n[tab=a_b]2[/tab]\n[tab=Ünï]3[/tab]\n[/tabs]", + "
    \n\n\n
    1
    \n\n\n
    2
    \n\n\n
    3
    \n
    " + ], + "tab-standalone": [ + "[tab=A]x[/tab]", + "[tab=A]x[/tab]" + ], + "tabs": [ + "[tabs]\n[tab=A]a[/tab]\n[tab=B style=color:red]**b**[/tab]\nignored\n[/tabs]", + "
    \n\n\n
    a
    \n\n\n
    b
    \n
    " + ], + "review-escaped-backtick-hides-slide-close": [ + "[accordion]{slide=Title}a \\`{/slide} x`[/accordion]", + "
    \n
    \nTitle\n
    a `
    \n
    \n
    " + ] + }, + "security": { + "style-attribute-breakout": [ + "[color=red\" onmouseover=\"alert(1)]x[/color]", + "x" + ], + "style-attribute-single-quote-breakout": [ + "[div=color:red' onclick='alert(1)]x[/div]", + "
    x y" + ] + }, + "tag-a": { + "alone": [ + "[a=top]text[/a]", + "text" + ], + "empty": [ + "[a=top][/a]", + "" + ], + "mid-line": [ + "before [a=top]text[/a] after", + "before text after" + ], + "own-lines": [ + "[a=top]\ntext\n[/a]", + "
    \ntext
    \n
    " + ], + "own-lines-between-text": [ + "before\n[a=top]\ntext\n[/a]\nafter", + "before
    \n
    \ntext
    \n

    \nafter" + ], + "starts-mid-line-spans-lines": [ + "before [a=top]text\nmore[/a] after", + "before text
    \nmore
    after" + ], + "blank-line-inside": [ + "[a=top]\ntext\n\nsecond paragraph\n[/a]", + "
    \ntext
    \n
    \nsecond paragraph
    \n
    " + ], + "markdown-blocks-inside": [ + "[a=top]\n## Heading\n\n- one\n- two\n\n> quoted\n[/a]", + "
    \n## Heading
    \n
    \n- one
    \n- two
    \n
    \n> quoted
    \n
    " + ], + "inline-markdown-inside": [ + "[a=top]**bold** _italic_ `code` [link](https://example.com) :smile:[/a]", + "bold italic code link \":smile:\"" + ], + "in-blockquote": [ + "> [a=top]\n> text\n> [/a]", + "
    \n
    \ntext
    \n
    " + ], + "in-list-item": [ + "- [a=top]\n text\n [/a]\n- next", + "" + ], + "in-table-cell": [ + "| head |\n|---|\n| [a=top]text[/a] |", + "
    \n\n\n\n\n\n\n\n\n\n\n\n
    head
    text
    \n
    " + ], + "in-heading": [ + "## [a=top]text[/a]", + "

    text

    " + ], + "around-b": [ + "[a=top][b]text[/b][/a]", + "text" + ], + "in-b": [ + "[b]before [a=top]text[/a] after[/b]", + "before text after" + ], + "in-core-quote": [ + "[quote]\n[a=top]text[/a]\n[/quote]", + "" + ], + "misnested-with-i": [ + "[a=top][i]text[/a] tail[/i]", + "text tail" + ], + "nested-in-itself": [ + "[a=top]outer [a=top]inner[/a] outer[/a]", + "outer inner outer" + ], + "repeated": [ + "[a=top]one[/a][a=top]two[/a] [a=top]three[/a]", + "onetwo three" + ], + "tail-and-next-line": [ + "[a=top]text[/a] tail\nnext line", + "text tail
    \nnext line" + ], + "blank-lines-around": [ + "before\n\n\n[a=top]text[/a]\n\n\nafter", + "before


    text


    after" + ], + "unclosed": [ + "[a=top]text", + "[a=top]text" + ], + "unmatched-close": [ + "text[/a]", + "text[/a]" + ], + "escaped": [ + "\\[a=top]text[/a]", + "[a=top]text[/a]" + ], + "uppercase": [ + "[A=top]text[/A]", + "text" + ] + }, + "tag-accordion": { + "alone": [ + "[accordion][slide=One]one[/slide][slide=Two open]two[/slide][/accordion]", + "
    \n
    \nOne\n
    one
    \n
    \n
    \nTwo open\n
    two
    \n
    \n
    " + ], + "empty": [ + "[accordion][/accordion]", + "[accordion][/accordion]" + ], + "mid-line": [ + "before [accordion][slide=One]one[/slide][slide=Two open]two[/slide][/accordion] after", + "before
    One
    one
    Two open
    two
    after" + ], + "own-lines": [ + "[accordion]\n[slide=One]one[/slide][slide=Two open]two[/slide]\n[/accordion]", + "
    \n
    \nOne\n
    one
    \n
    \n
    \nTwo open\n
    two
    \n
    \n
    " + ], + "own-lines-between-text": [ + "before\n[accordion]\n[slide=One]one[/slide][slide=Two open]two[/slide]\n[/accordion]\nafter", + "before
    \n
    \nOne\n
    one
    \n
    \n
    \nTwo open\n
    two
    \n
    \n
    \n
    after" + ], + "starts-mid-line-spans-lines": [ + "before [accordion][slide=One]one[/slide][slide=Two open]two[/slide]\nmore[/accordion] after", + "before
    \n
    \nOne\n
    one
    \n
    \n
    \nTwo open\n
    two
    \n
    \n
    \nafter" + ], + "blank-line-inside": [ + "[accordion]\n[slide=One]one[/slide][slide=Two open]two[/slide]\n\nsecond paragraph\n[/accordion]", + "
    \n
    \nOne\n
    one
    \n
    \n
    \nTwo open\n
    two
    \n
    \n
    " + ], + "markdown-blocks-inside": [ + "[accordion]\n## Heading\n\n- one\n- two\n\n> quoted\n[/accordion]", + "[accordion]

    Heading

    \n
      \n
    • one
    • \n
    • two
    • \n
    \n
    \nquoted
    \n[/accordion]
    " + ], + "inline-markdown-inside": [ + "[accordion]**bold** _italic_ `code` [link](https://example.com) :smile:[/accordion]", + "[accordion]bold italic code link \":smile:\"[/accordion]" + ], + "in-blockquote": [ + "> [accordion]\n> [slide=One]one[/slide][slide=Two open]two[/slide]\n> [/accordion]", + "
    \n
    \n
    \nOne\n
    one
    \n
    \n
    \nTwo open\n
    two
    \n
    \n
    \n
    " + ], + "in-list-item": [ + "- [accordion]\n [slide=One]one[/slide][slide=Two open]two[/slide]\n [/accordion]\n- next", + "
      \n
    • \n
      \n
      \nOne\n
      one
      \n
      \n
      \nTwo open\n
      two
      \n
      \n
      \n
    • \n
    • next
    • \n
    " + ], + "in-table-cell": [ + "| head |\n|---|\n| [accordion][slide=One]one[/slide][slide=Two open]two[/slide][/accordion] |", + "
    \n\n\n\n\n\n\n\n\n\n\n\n
    head
    One
    one
    Two open
    two
    \n
    " + ], + "in-heading": [ + "## [accordion][slide=One]one[/slide][slide=Two open]two[/slide][/accordion]", + "

    One
    one
    Two open
    two

    " + ], + "around-b": [ + "[accordion][b][slide=One]one[/slide][slide=Two open]two[/slide][/b][/accordion]", + "[accordion][slide=One]one[/slide][slide=Two open]two[/slide][/accordion]" + ], + "in-b": [ + "[b]before [accordion][slide=One]one[/slide][slide=Two open]two[/slide][/accordion] after[/b]", + "before
    One
    one
    Two open
    two
    after
    " + ], + "in-core-quote": [ + "[quote]\n[accordion][slide=One]one[/slide][slide=Two open]two[/slide][/accordion]\n[/quote]", + "" + ], + "misnested-with-i": [ + "[accordion][i][slide=One]one[/slide][slide=Two open]two[/slide][/accordion] tail[/i]", + "[accordion][slide=One]one[/slide][slide=Two open]two[/slide][/accordion] tail" + ], + "nested-in-itself": [ + "[accordion]outer [accordion]inner[/accordion] outer[/accordion]", + "[accordion]outer [accordion]inner[/accordion] outer[/accordion]" + ], + "repeated": [ + "[accordion]one[/accordion][accordion]two[/accordion] [accordion]three[/accordion]", + "[accordion]one[/accordion][accordion]two[/accordion] [accordion]three[/accordion]" + ], + "tail-and-next-line": [ + "[accordion][slide=One]one[/slide][slide=Two open]two[/slide][/accordion] tail\nnext line", + "
    \n
    \nOne\n
    one
    \n
    \n
    \nTwo open\n
    two
    \n
    \n
    \ntail
    next line" + ], + "blank-lines-around": [ + "before\n\n\n[accordion][slide=One]one[/slide][slide=Two open]two[/slide][/accordion]\n\n\nafter", + "before


    \n
    \nOne\n
    one
    \n
    \n
    \nTwo open\n
    two
    \n
    \n
    \n


    after" + ], + "unclosed": [ + "[accordion][slide=One]one[/slide][slide=Two open]two[/slide]", + "[accordion][slide=One]one[/slide][slide=Two open]two[/slide]" + ], + "unmatched-close": [ + "[slide=One]one[/slide][slide=Two open]two[/slide][/accordion]", + "[slide=One]one[/slide][slide=Two open]two[/slide][/accordion]" + ], + "escaped": [ + "\\[accordion][slide=One]one[/slide][slide=Two open]two[/slide][/accordion]", + "[accordion][slide=One]one[/slide][slide=Two open]two[/slide][/accordion]" + ], + "uppercase": [ + "[ACCORDION][slide=One]one[/slide][slide=Two open]two[/slide][/ACCORDION]", + "
    \n
    \nOne\n
    one
    \n
    \n
    \nTwo open\n
    two
    \n
    \n
    " + ], + "[accordion=bright|50%] alone": [ + "[accordion=bright|50%][slide=One]one[/slide][slide=Two open]two[/slide][/accordion]", + "
    \n
    \nOne\n
    one
    \n
    \n
    \nTwo open\n
    two
    \n
    \n
    " + ], + "[accordion=bright|50%] own-lines": [ + "[accordion=bright|50%]\n[slide=One]one[/slide][slide=Two open]two[/slide]\n[/accordion]", + "
    \n
    \nOne\n
    one
    \n
    \n
    \nTwo open\n
    two
    \n
    \n
    " + ], + "[accordion width=300px align=bcenter] alone": [ + "[accordion width=300px align=bcenter][slide=One]one[/slide][slide=Two open]two[/slide][/accordion]", + "
    \n
    \nOne\n
    one
    \n
    \n
    \nTwo open\n
    two
    \n
    \n
    " + ], + "[accordion width=300px align=bcenter] own-lines": [ + "[accordion width=300px align=bcenter]\n[slide=One]one[/slide][slide=Two open]two[/slide]\n[/accordion]", + "
    \n
    \nOne\n
    one
    \n
    \n
    \nTwo open\n
    two
    \n
    \n
    " + ] + }, + "tag-animation": { + "alone": [ + "[animation=spin][keyframe=0]opacity: 0;[/keyframe][keyframe=100]opacity: 1;[/keyframe][/animation]", + "" + ], + "empty": [ + "[animation=spin][/animation]", + "" + ], + "mid-line": [ + "before [animation=spin][keyframe=0]opacity: 0;[/keyframe][keyframe=100]opacity: 1;[/keyframe][/animation] after", + "\nbefore after" + ], + "own-lines": [ + "[animation=spin]\n[keyframe=0]opacity: 0;[/keyframe][keyframe=100]opacity: 1;[/keyframe]\n[/animation]", + "" + ], + "own-lines-between-text": [ + "before\n[animation=spin]\n[keyframe=0]opacity: 0;[/keyframe][keyframe=100]opacity: 1;[/keyframe]\n[/animation]\nafter", + "\nbefore

    after" + ], + "starts-mid-line-spans-lines": [ + "before [animation=spin][keyframe=0]opacity: 0;[/keyframe][keyframe=100]opacity: 1;[/keyframe]\nmore[/animation] after", + "\nbefore after" + ], + "blank-line-inside": [ + "[animation=spin]\n[keyframe=0]opacity: 0;[/keyframe][keyframe=100]opacity: 1;[/keyframe]\n\nsecond paragraph\n[/animation]", + "" + ], + "markdown-blocks-inside": [ + "[animation=spin]\n## Heading\n\n- one\n- two\n\n> quoted\n[/animation]", + "" + ], + "inline-markdown-inside": [ + "[animation=spin]**bold** _italic_ `code` [link](https://example.com) :smile:[/animation]", + "" + ], + "in-blockquote": [ + "> [animation=spin]\n> [keyframe=0]opacity: 0;[/keyframe][keyframe=100]opacity: 1;[/keyframe]\n> [/animation]", + "\n
    " + ], + "in-list-item": [ + "- [animation=spin]\n [keyframe=0]opacity: 0;[/keyframe][keyframe=100]opacity: 1;[/keyframe]\n [/animation]\n- next", + "\n
      \n
    • \n
    • next
    • \n
    " + ], + "in-table-cell": [ + "| head |\n|---|\n| [animation=spin][keyframe=0]opacity: 0;[/keyframe][keyframe=100]opacity: 1;[/keyframe][/animation] |", + "\n
    \n\n\n\n\n\n\n\n\n\n\n\n
    head
    \n
    " + ], + "in-heading": [ + "## [animation=spin][keyframe=0]opacity: 0;[/keyframe][keyframe=100]opacity: 1;[/keyframe][/animation]", + "\n

    " + ], + "around-b": [ + "[animation=spin][b][keyframe=0]opacity: 0;[/keyframe][keyframe=100]opacity: 1;[/keyframe][/b][/animation]", + "" + ], + "in-b": [ + "[b]before [animation=spin][keyframe=0]opacity: 0;[/keyframe][keyframe=100]opacity: 1;[/keyframe][/animation] after[/b]", + "\nbefore after" + ], + "in-core-quote": [ + "[quote]\n[animation=spin][keyframe=0]opacity: 0;[/keyframe][keyframe=100]opacity: 1;[/keyframe][/animation]\n[/quote]", + "\n" + ], + "misnested-with-i": [ + "[animation=spin][i][keyframe=0]opacity: 0;[/keyframe][keyframe=100]opacity: 1;[/keyframe][/animation] tail[/i]", + "\ntail[/i]" + ], + "nested-in-itself": [ + "[animation=spin]outer [animation=spin]inner[/animation] outer[/animation]", + "" + ], + "repeated": [ + "[animation=spin]one[/animation][animation=spin]two[/animation] [animation=spin]three[/animation]", + "" + ], + "tail-and-next-line": [ + "[animation=spin][keyframe=0]opacity: 0;[/keyframe][keyframe=100]opacity: 1;[/keyframe][/animation] tail\nnext line", + "\ntail
    next line" + ], + "blank-lines-around": [ + "before\n\n\n[animation=spin][keyframe=0]opacity: 0;[/keyframe][keyframe=100]opacity: 1;[/keyframe][/animation]\n\n\nafter", + "\nbefore





    after" + ], + "unclosed": [ + "[animation=spin][keyframe=0]opacity: 0;[/keyframe][keyframe=100]opacity: 1;[/keyframe]", + "[animation=spin][keyframe=0]opacity: 0;[/keyframe][keyframe=100]opacity: 1;[/keyframe]" + ], + "unmatched-close": [ + "[keyframe=0]opacity: 0;[/keyframe][keyframe=100]opacity: 1;[/keyframe][/animation]", + "[keyframe=0]opacity: 0;[/keyframe][keyframe=100]opacity: 1;[/keyframe][/animation]" + ], + "escaped": [ + "\\[animation=spin][keyframe=0]opacity: 0;[/keyframe][keyframe=100]opacity: 1;[/keyframe][/animation]", + "[animation=spin][keyframe=0]opacity: 0;[/keyframe][keyframe=100]opacity: 1;[/keyframe][/animation]" + ], + "uppercase": [ + "[ANIMATION=spin][keyframe=0]opacity: 0;[/keyframe][keyframe=100]opacity: 1;[/keyframe][/ANIMATION]", + "" + ] + }, + "tag-b": { + "alone": [ + "[b]text[/b]", + "text" + ], + "empty": [ + "[b][/b]", + "" + ], + "mid-line": [ + "before [b]text[/b] after", + "before text after" + ], + "own-lines": [ + "[b]\ntext\n[/b]", + "
    \ntext
    \n
    " + ], + "own-lines-between-text": [ + "before\n[b]\ntext\n[/b]\nafter", + "before
    \n
    \ntext
    \n

    \nafter" + ], + "starts-mid-line-spans-lines": [ + "before [b]text\nmore[/b] after", + "before text
    \nmore
    after" + ], + "blank-line-inside": [ + "[b]\ntext\n\nsecond paragraph\n[/b]", + "
    \ntext
    \n
    \nsecond paragraph
    \n
    " + ], + "markdown-blocks-inside": [ + "[b]\n## Heading\n\n- one\n- two\n\n> quoted\n[/b]", + "
    \n
    \n

    Heading

    \n
      \n
    • one
    • \n
    • two
    • \n
    \n
    \nquoted
    \n
    \n
    " + ], + "inline-markdown-inside": [ + "[b]**bold** _italic_ `code` [link](https://example.com) :smile:[/b]", + "bold italic code link \":smile:\"" + ], + "in-blockquote": [ + "> [b]\n> text\n> [/b]", + "
    \n
    \ntext
    \n
    " + ], + "in-list-item": [ + "- [b]\n text\n [/b]\n- next", + "
      \n

    • \ntext
      \n
    • \n
    • next
    • \n
    " + ], + "in-table-cell": [ + "| head |\n|---|\n| [b]text[/b] |", + "
    \n\n\n\n\n\n\n\n\n\n\n\n
    head
    text
    \n
    " + ], + "in-heading": [ + "## [b]text[/b]", + "

    text

    " + ], + "around-b": [ + "[b][b]text[/b][/b]", + "text" + ], + "in-b": [ + "[b]before [b]text[/b] after[/b]", + "before text after" + ], + "in-core-quote": [ + "[quote]\n[b]text[/b]\n[/quote]", + "" + ], + "misnested-with-i": [ + "[b][i]text[/b] tail[/i]", + "text tail" + ], + "nested-in-itself": [ + "[b]outer [b]inner[/b] outer[/b]", + "outer inner outer" + ], + "repeated": [ + "[b]one[/b][b]two[/b] [b]three[/b]", + "onetwo three" + ], + "tail-and-next-line": [ + "[b]text[/b] tail\nnext line", + "text tail
    \nnext line" + ], + "blank-lines-around": [ + "before\n\n\n[b]text[/b]\n\n\nafter", + "before


    text


    after" + ], + "unclosed": [ + "[b]text", + "[b]text" + ], + "unmatched-close": [ + "text[/b]", + "text[/b]" + ], + "escaped": [ + "\\[b]text[/b]", + "[b]text[/b]" + ], + "uppercase": [ + "[B]text[/B]", + "text" + ] + }, + "tag-bg": { + "alone": [ + "[bg=red]text[/bg]", + "
    text
    " + ], + "empty": [ + "[bg=red][/bg]", + "
    " + ], + "mid-line": [ + "before [bg=red]text[/bg] after", + "before
    text
    after" + ], + "own-lines": [ + "[bg=red]\ntext\n[/bg]", + "
    \n
    \ntext
    \n
    " + ], + "own-lines-between-text": [ + "before\n[bg=red]\ntext\n[/bg]\nafter", + "before
    \n
    \ntext
    \n
    \n
    after" + ], + "starts-mid-line-spans-lines": [ + "before [bg=red]text\nmore[/bg] after", + "before
    text
    \nmore
    \nafter" + ], + "blank-line-inside": [ + "[bg=red]\ntext\n\nsecond paragraph\n[/bg]", + "
    \n
    \ntext
    \n
    \nsecond paragraph
    \n
    " + ], + "markdown-blocks-inside": [ + "[bg=red]\n## Heading\n\n- one\n- two\n\n> quoted\n[/bg]", + "
    \n
    \n## Heading
    \n
    \n- one
    \n- two
    \n
    \n> quoted
    \n
    " + ], + "inline-markdown-inside": [ + "[bg=red]**bold** _italic_ `code` [link](https://example.com) :smile:[/bg]", + "
    bold italic code link \":smile:\"
    " + ], + "in-blockquote": [ + "> [bg=red]\n> text\n> [/bg]", + "
    \n
    \n
    \ntext
    \n
    \n
    " + ], + "in-list-item": [ + "- [bg=red]\n text\n [/bg]\n- next", + "
      \n
    • \n
      \n
      \ntext
      \n
      \n
    • \n
    • next
    • \n
    " + ], + "in-table-cell": [ + "| head |\n|---|\n| [bg=red]text[/bg] |", + "
    \n\n\n\n\n\n\n\n\n\n\n\n
    head
    text
    \n
    " + ], + "in-heading": [ + "## [bg=red]text[/bg]", + "

    text

    " + ], + "around-b": [ + "[bg=red][b]text[/b][/bg]", + "
    text
    " + ], + "in-b": [ + "[b]before [bg=red]text[/bg] after[/b]", + "before
    text
    after
    " + ], + "in-core-quote": [ + "[quote]\n[bg=red]text[/bg]\n[/quote]", + "" + ], + "misnested-with-i": [ + "[bg=red][i]text[/bg] tail[/i]", + "
    text
    \ntail" + ], + "nested-in-itself": [ + "[bg=red]outer [bg=red]inner[/bg] outer[/bg]", + "
    outer
    inner
    outer
    " + ], + "repeated": [ + "[bg=red]one[/bg][bg=red]two[/bg] [bg=red]three[/bg]", + "
    one
    \n
    two
    \n
    three
    " + ], + "tail-and-next-line": [ + "[bg=red]text[/bg] tail\nnext line", + "
    text
    \ntail
    next line" + ], + "blank-lines-around": [ + "before\n\n\n[bg=red]text[/bg]\n\n\nafter", + "before


    text
    \n


    after" + ], + "unclosed": [ + "[bg=red]text", + "[bg=red]text" + ], + "unmatched-close": [ + "text[/bg]", + "text[/bg]" + ], + "escaped": [ + "\\[bg=red]text[/bg]", + "[bg=red]text[/bg]" + ], + "uppercase": [ + "[BG=red]text[/BG]", + "
    text
    " + ], + "[bg] alone": [ + "[bg]text[/bg]", + "
    text
    " + ], + "[bg] own-lines": [ + "[bg]\ntext\n[/bg]", + "
    \n
    \ntext
    \n
    " + ] + }, + "tag-block": { + "alone": [ + "[block=warning]text[/block]", + "
    text
    " + ], + "empty": [ + "[block=warning][/block]", + "
    " + ], + "mid-line": [ + "before [block=warning]text[/block] after", + "before
    text
    after" + ], + "own-lines": [ + "[block=warning]\ntext\n[/block]", + "
    \n
    \ntext
    \n
    " + ], + "own-lines-between-text": [ + "before\n[block=warning]\ntext\n[/block]\nafter", + "before
    \n
    \ntext
    \n
    \nafter" + ], + "starts-mid-line-spans-lines": [ + "before [block=warning]text\nmore[/block] after", + "before
    \ntext
    \nmore
    \nafter" + ], + "blank-line-inside": [ + "[block=warning]\ntext\n\nsecond paragraph\n[/block]", + "
    \n
    \ntext

    second paragraph
    \n
    " + ], + "markdown-blocks-inside": [ + "[block=warning]\n## Heading\n\n- one\n- two\n\n> quoted\n[/block]", + "
    \n
    \n

    Heading

    \n
      \n
    • one
    • \n
    • two
    • \n
    \n
    \nquoted
    \n
    \n
    " + ], + "inline-markdown-inside": [ + "[block=warning]**bold** _italic_ `code` [link](https://example.com) :smile:[/block]", + "
    bold italic code link \":smile:\"
    " + ], + "in-blockquote": [ + "> [block=warning]\n> text\n> [/block]", + "
    \n
    \n
    \ntext
    \n
    \n
    " + ], + "in-list-item": [ + "- [block=warning]\n text\n [/block]\n- next", + "
      \n
    • \n
      \n
      \ntext
      \n
      \n
    • \n
    • next
    • \n
    " + ], + "in-table-cell": [ + "| head |\n|---|\n| [block=warning]text[/block] |", + "
    \n\n\n\n\n\n\n\n\n\n\n\n
    head
    text
    \n
    " + ], + "in-heading": [ + "## [block=warning]text[/block]", + "

    text

    " + ], + "around-b": [ + "[block=warning][b]text[/b][/block]", + "
    text
    " + ], + "in-b": [ + "[b]before [block=warning]text[/block] after[/b]", + "before
    text
    after
    " + ], + "in-core-quote": [ + "[quote]\n[block=warning]text[/block]\n[/quote]", + "" + ], + "misnested-with-i": [ + "[block=warning][i]text[/block] tail[/i]", + "
    text
    \ntail" + ], + "nested-in-itself": [ + "[block=warning]outer [block=warning]inner[/block] outer[/block]", + "
    outer
    inner
    outer
    " + ], + "repeated": [ + "[block=warning]one[/block][block=warning]two[/block] [block=warning]three[/block]", + "
    one
    \n
    two
    \n
    three
    " + ], + "tail-and-next-line": [ + "[block=warning]text[/block] tail\nnext line", + "
    text
    \ntail
    next line" + ], + "blank-lines-around": [ + "before\n\n\n[block=warning]text[/block]\n\n\nafter", + "before


    text
    \n

    after" + ], + "unclosed": [ + "[block=warning]text", + "[block=warning]text" + ], + "unmatched-close": [ + "text[/block]", + "text[/block]" + ], + "escaped": [ + "\\[block=warning]text[/block]", + "[block=warning]text[/block]" + ], + "uppercase": [ + "[BLOCK=warning]text[/BLOCK]", + "
    text
    " + ], + "[block] alone": [ + "[block]text[/block]", + "
    text
    " + ], + "[block] own-lines": [ + "[block]\ntext\n[/block]", + "
    \n
    \ntext
    \n
    " + ], + "[block=DICE] alone": [ + "[block=DICE]text[/block]", + "
    text
    " + ], + "[block=DICE] own-lines": [ + "[block=DICE]\ntext\n[/block]", + "
    \n
    \ntext
    \n
    " + ], + "[block=unknown] alone": [ + "[block=unknown]text[/block]", + "
    text
    " + ], + "[block=unknown] own-lines": [ + "[block=unknown]\ntext\n[/block]", + "
    \n
    \ntext
    \n
    " + ] + }, + "tag-blockquote": { + "alone": [ + "[blockquote=Speaker]text[/blockquote]", + "
    \n
    \n
    text
    \n- Speaker
    \n
    \n
    \n
    " + ], + "empty": [ + "[blockquote=Speaker][/blockquote]", + "
    \n
    \n
    \n- Speaker
    \n
    \n
    \n
    " + ], + "mid-line": [ + "before [blockquote=Speaker]text[/blockquote] after", + "before
    text
    - Speaker
    after" + ], + "own-lines": [ + "[blockquote=Speaker]\ntext\n[/blockquote]", + "
    \n
    \n
    \ntext
    \n- Speaker
    \n
    \n
    \n
    " + ], + "own-lines-between-text": [ + "before\n[blockquote=Speaker]\ntext\n[/blockquote]\nafter", + "before
    \n
    \n
    \ntext
    \n- Speaker
    \n
    \n
    \n
    \n
    after" + ], + "starts-mid-line-spans-lines": [ + "before [blockquote=Speaker]text\nmore[/blockquote] after", + "before
    \n
    \n
    \ntext
    \nmore
    \n- Speaker
    \n
    \n
    \n
    \nafter" + ], + "blank-line-inside": [ + "[blockquote=Speaker]\ntext\n\nsecond paragraph\n[/blockquote]", + "
    \n
    \n
    \ntext

    second paragraph
    \n- Speaker
    \n
    \n
    \n
    " + ], + "markdown-blocks-inside": [ + "[blockquote=Speaker]\n## Heading\n\n- one\n- two\n\n> quoted\n[/blockquote]", + "
    \n
    \n
    \n

    Heading

    \n
      \n
    • one
    • \n
    • two
    • \n
    \n
    \nquoted
    \n
    \n- Speaker
    \n
    \n
    \n
    " + ], + "inline-markdown-inside": [ + "[blockquote=Speaker]**bold** _italic_ `code` [link](https://example.com) :smile:[/blockquote]", + "
    \n
    \n
    bold italic code link \":smile:\"
    \n- Speaker
    \n
    \n
    \n
    " + ], + "in-blockquote": [ + "> [blockquote=Speaker]\n> text\n> [/blockquote]", + "
    \n
    \n
    \n
    \ntext
    \n- Speaker
    \n
    \n
    \n
    \n
    " + ], + "in-list-item": [ + "- [blockquote=Speaker]\n text\n [/blockquote]\n- next", + "
      \n
    • \n
      \n
      \n
      \ntext
      \n- Speaker
      \n
      \n
      \n
      \n
    • \n
    • next
    • \n
    " + ], + "in-table-cell": [ + "| head |\n|---|\n| [blockquote=Speaker]text[/blockquote] |", + "
    \n\n\n\n\n\n\n\n\n\n\n\n
    head
    text
    - Speaker
    \n
    " + ], + "in-heading": [ + "## [blockquote=Speaker]text[/blockquote]", + "

    text
    - Speaker

    " + ], + "around-b": [ + "[blockquote=Speaker][b]text[/b][/blockquote]", + "
    \n
    \n
    text
    \n- Speaker
    \n
    \n
    \n
    " + ], + "in-b": [ + "[b]before [blockquote=Speaker]text[/blockquote] after[/b]", + "before
    text
    - Speaker
    after
    " + ], + "in-core-quote": [ + "[quote]\n[blockquote=Speaker]text[/blockquote]\n[/quote]", + "" + ], + "misnested-with-i": [ + "[blockquote=Speaker][i]text[/blockquote] tail[/i]", + "
    \n
    \n
    text
    \n- Speaker
    \n
    \n
    \n
    \ntail" + ], + "nested-in-itself": [ + "[blockquote=Speaker]outer [blockquote=Speaker]inner[/blockquote] outer[/blockquote]", + "
    \n
    \n
    outer
    inner
    - Speaker
    outer
    \n- Speaker
    \n
    \n
    \n
    " + ], + "repeated": [ + "[blockquote=Speaker]one[/blockquote][blockquote=Speaker]two[/blockquote] [blockquote=Speaker]three[/blockquote]", + "
    \n
    \n
    one
    \n- Speaker
    \n
    \n
    \n
    \n
    \n
    \n
    two
    \n- Speaker
    \n
    \n
    \n
    \n
    \n
    \n
    three
    \n- Speaker
    \n
    \n
    \n
    " + ], + "tail-and-next-line": [ + "[blockquote=Speaker]text[/blockquote] tail\nnext line", + "
    \n
    \n
    text
    \n- Speaker
    \n
    \n
    \n
    \ntail
    next line" + ], + "blank-lines-around": [ + "before\n\n\n[blockquote=Speaker]text[/blockquote]\n\n\nafter", + "before


    \n
    \n
    text
    \n- Speaker
    \n
    \n
    \n
    \n


    after" + ], + "unclosed": [ + "[blockquote=Speaker]text", + "[blockquote=Speaker]text" + ], + "unmatched-close": [ + "text[/blockquote]", + "text[/blockquote]" + ], + "escaped": [ + "\\[blockquote=Speaker]text[/blockquote]", + "[blockquote=Speaker]text[/blockquote]" + ], + "uppercase": [ + "[BLOCKQUOTE=Speaker]text[/BLOCKQUOTE]", + "
    \n
    \n
    text
    \n- Speaker
    \n
    \n
    \n
    " + ], + "[blockquote] alone": [ + "[blockquote]text[/blockquote]", + "
    \n
    \n
    text
    \n
    \n
    \n
    " + ], + "[blockquote] own-lines": [ + "[blockquote]\ntext\n[/blockquote]", + "
    \n
    \n
    \ntext
    \n
    \n
    \n
    " + ] + }, + "tag-border": { + "alone": [ + "[border=1px solid red]text[/border]", + "
    text
    " + ], + "empty": [ + "[border=1px solid red][/border]", + "
    " + ], + "mid-line": [ + "before [border=1px solid red]text[/border] after", + "before
    text
    after" + ], + "own-lines": [ + "[border=1px solid red]\ntext\n[/border]", + "
    \n
    \ntext
    \n
    " + ], + "own-lines-between-text": [ + "before\n[border=1px solid red]\ntext\n[/border]\nafter", + "before
    \n
    \ntext
    \n
    \n
    after" + ], + "starts-mid-line-spans-lines": [ + "before [border=1px solid red]text\nmore[/border] after", + "before
    \ntext
    \nmore
    \nafter" + ], + "blank-line-inside": [ + "[border=1px solid red]\ntext\n\nsecond paragraph\n[/border]", + "
    \n
    \ntext

    second paragraph
    \n
    " + ], + "markdown-blocks-inside": [ + "[border=1px solid red]\n## Heading\n\n- one\n- two\n\n> quoted\n[/border]", + "
    \n
    \n

    Heading

    \n
      \n
    • one
    • \n
    • two
    • \n
    \n
    \nquoted
    \n
    \n
    " + ], + "inline-markdown-inside": [ + "[border=1px solid red]**bold** _italic_ `code` [link](https://example.com) :smile:[/border]", + "
    bold italic code link \":smile:\"
    " + ], + "in-blockquote": [ + "> [border=1px solid red]\n> text\n> [/border]", + "
    \n
    \n
    \ntext
    \n
    \n
    " + ], + "in-list-item": [ + "- [border=1px solid red]\n text\n [/border]\n- next", + "
      \n
    • \n
      \n
      \ntext
      \n
      \n
    • \n
    • next
    • \n
    " + ], + "in-table-cell": [ + "| head |\n|---|\n| [border=1px solid red]text[/border] |", + "
    \n\n\n\n\n\n\n\n\n\n\n\n
    head
    text
    \n
    " + ], + "in-heading": [ + "## [border=1px solid red]text[/border]", + "

    text

    " + ], + "around-b": [ + "[border=1px solid red][b]text[/b][/border]", + "
    text
    " + ], + "in-b": [ + "[b]before [border=1px solid red]text[/border] after[/b]", + "before
    text
    after
    " + ], + "in-core-quote": [ + "[quote]\n[border=1px solid red]text[/border]\n[/quote]", + "" + ], + "misnested-with-i": [ + "[border=1px solid red][i]text[/border] tail[/i]", + "
    text
    \ntail" + ], + "nested-in-itself": [ + "[border=1px solid red]outer [border=1px solid red]inner[/border] outer[/border]", + "
    outer
    inner
    outer
    " + ], + "repeated": [ + "[border=1px solid red]one[/border][border=1px solid red]two[/border] [border=1px solid red]three[/border]", + "
    one
    \n
    two
    \n
    three
    " + ], + "tail-and-next-line": [ + "[border=1px solid red]text[/border] tail\nnext line", + "
    text
    \ntail
    next line" + ], + "blank-lines-around": [ + "before\n\n\n[border=1px solid red]text[/border]\n\n\nafter", + "before


    text
    \n


    after" + ], + "unclosed": [ + "[border=1px solid red]text", + "[border=1px solid red]text" + ], + "unmatched-close": [ + "text[/border]", + "text[/border]" + ], + "escaped": [ + "\\[border=1px solid red]text[/border]", + "[border=1px solid red]text[/border]" + ], + "uppercase": [ + "[BORDER=1px solid red]text[/BORDER]", + "
    text
    " + ], + "[border] alone": [ + "[border]text[/border]", + "
    text
    " + ], + "[border] own-lines": [ + "[border]\ntext\n[/border]", + "
    \n
    \ntext
    \n
    " + ] + }, + "tag-br": { + "alone": [ + "[br][/br]", + "
    " + ], + "empty": [ + "[br][/br]", + "
    " + ], + "mid-line": [ + "before [br][/br] after", + "before
    \n after" + ], + "own-lines": [ + "[br]\n\n[/br]", + "
    \n
    \n
    " + ], + "own-lines-between-text": [ + "before\n[br]\n\n[/br]\nafter", + "before
    \n
    \n
    \n
    \n
    \nafter" + ], + "starts-mid-line-spans-lines": [ + "before [br]\nmore[/br] after", + "before
    \n
    \nmore after" + ], + "blank-line-inside": [ + "[br]\n\n\nsecond paragraph\n[/br]", + "
    \n
    \n
    \n
    \nsecond paragraph
    " + ], + "markdown-blocks-inside": [ + "[br]\n## Heading\n\n- one\n- two\n\n> quoted\n[/br]", + "
    \n
    \n## Heading
    \n
    \n- one
    \n- two
    \n
    \n> quoted
    " + ], + "inline-markdown-inside": [ + "[br]**bold** _italic_ `code` [link](https://example.com) :smile:[/br]", + "
    \nbold italic code link \":smile:\"" + ], + "in-blockquote": [ + "> [br]\n> \n> [/br]", + "
    \n
    \n
    \n
    \n
    " + ], + "in-list-item": [ + "- [br]\n \n [/br]\n- next", + "
      \n

    • \n
      \n
      \n
    • \n
    • next
    • \n
    " + ], + "in-table-cell": [ + "| head |\n|---|\n| [br][/br] |", + "
    \n\n\n\n\n\n\n\n\n\n\n\n
    head

    \n
    \n
    " + ], + "in-heading": [ + "## [br][/br]", + "


    \n

    " + ], + "around-b": [ + "[br][b][/b][/br]", + "
    \n" + ], + "in-b": [ + "[b]before [br][/br] after[/b]", + "before
    \n after
    " + ], + "in-core-quote": [ + "[quote]\n[br][/br]\n[/quote]", + "" + ], + "misnested-with-i": [ + "[br][i][/br] tail[/i]", + "
    \n tail" + ], + "nested-in-itself": [ + "[br]outer [br]inner[/br] outer[/br]", + "
    \nouter
    \ninner outer" + ], + "repeated": [ + "[br]one[/br][br]two[/br] [br]three[/br]", + "
    \none
    \ntwo
    \nthree" + ], + "tail-and-next-line": [ + "[br][/br] tail\nnext line", + "
    \n tail
    \nnext line" + ], + "blank-lines-around": [ + "before\n\n\n[br][/br]\n\n\nafter", + "before



    \n


    after" + ], + "unclosed": [ + "[br]", + "[br]" + ], + "unmatched-close": [ + "[/br]", + "[/br]" + ], + "escaped": [ + "\\[br][/br]", + "[br][/br]" + ], + "uppercase": [ + "[BR][/BR]", + "
    " + ] + }, + "tag-center": { + "alone": [ + "[center]text[/center]", + "
    text
    " + ], + "empty": [ + "[center][/center]", + "
    " + ], + "mid-line": [ + "before [center]text[/center] after", + "before
    text
    after" + ], + "own-lines": [ + "[center]\ntext\n[/center]", + "
    \n
    \ntext
    \n
    " + ], + "own-lines-between-text": [ + "before\n[center]\ntext\n[/center]\nafter", + "before
    \n
    \ntext
    \n
    \n
    after" + ], + "starts-mid-line-spans-lines": [ + "before [center]text\nmore[/center] after", + "before
    \ntext
    \nmore
    \nafter" + ], + "blank-line-inside": [ + "[center]\ntext\n\nsecond paragraph\n[/center]", + "
    \n
    \ntext

    second paragraph
    \n
    " + ], + "markdown-blocks-inside": [ + "[center]\n## Heading\n\n- one\n- two\n\n> quoted\n[/center]", + "
    \n
    \n

    Heading

    \n
      \n
    • one
    • \n
    • two
    • \n
    \n
    \nquoted
    \n
    \n
    " + ], + "inline-markdown-inside": [ + "[center]**bold** _italic_ `code` [link](https://example.com) :smile:[/center]", + "
    bold italic code link \":smile:\"
    " + ], + "in-blockquote": [ + "> [center]\n> text\n> [/center]", + "
    \n
    \n
    \ntext
    \n
    \n
    " + ], + "in-list-item": [ + "- [center]\n text\n [/center]\n- next", + "
      \n
    • \n
      \n
      \ntext
      \n
      \n
    • \n
    • next
    • \n
    " + ], + "in-table-cell": [ + "| head |\n|---|\n| [center]text[/center] |", + "
    \n\n\n\n\n\n\n\n\n\n\n\n
    head
    text
    \n
    " + ], + "in-heading": [ + "## [center]text[/center]", + "

    text

    " + ], + "around-b": [ + "[center][b]text[/b][/center]", + "
    text
    " + ], + "in-b": [ + "[b]before [center]text[/center] after[/b]", + "before
    text
    after
    " + ], + "in-core-quote": [ + "[quote]\n[center]text[/center]\n[/quote]", + "" + ], + "misnested-with-i": [ + "[center][i]text[/center] tail[/i]", + "
    text
    \ntail" + ], + "nested-in-itself": [ + "[center]outer [center]inner[/center] outer[/center]", + "
    outer
    inner
    outer
    " + ], + "repeated": [ + "[center]one[/center][center]two[/center] [center]three[/center]", + "
    one
    \n
    two
    \n
    three
    " + ], + "tail-and-next-line": [ + "[center]text[/center] tail\nnext line", + "
    text
    \ntail
    next line" + ], + "blank-lines-around": [ + "before\n\n\n[center]text[/center]\n\n\nafter", + "before


    text
    \n


    after" + ], + "unclosed": [ + "[center]text", + "[center]text" + ], + "unmatched-close": [ + "text[/center]", + "text[/center]" + ], + "escaped": [ + "\\[center]text[/center]", + "[center]text[/center]" + ], + "uppercase": [ + "[CENTER]text[/CENTER]", + "
    text
    " + ] + }, + "tag-centerblock": { + "alone": [ + "[centerblock=40]text[/centerblock]", + "
    text
    " + ], + "empty": [ + "[centerblock=40][/centerblock]", + "
    " + ], + "mid-line": [ + "before [centerblock=40]text[/centerblock] after", + "before
    text
    after" + ], + "own-lines": [ + "[centerblock=40]\ntext\n[/centerblock]", + "
    \n
    \ntext
    \n
    " + ], + "own-lines-between-text": [ + "before\n[centerblock=40]\ntext\n[/centerblock]\nafter", + "before
    \n
    \ntext
    \n
    \n
    after" + ], + "starts-mid-line-spans-lines": [ + "before [centerblock=40]text\nmore[/centerblock] after", + "before
    \ntext
    \nmore
    \nafter" + ], + "blank-line-inside": [ + "[centerblock=40]\ntext\n\nsecond paragraph\n[/centerblock]", + "
    \n
    \ntext

    second paragraph
    \n
    " + ], + "markdown-blocks-inside": [ + "[centerblock=40]\n## Heading\n\n- one\n- two\n\n> quoted\n[/centerblock]", + "
    \n
    \n

    Heading

    \n
      \n
    • one
    • \n
    • two
    • \n
    \n
    \nquoted
    \n
    \n
    " + ], + "inline-markdown-inside": [ + "[centerblock=40]**bold** _italic_ `code` [link](https://example.com) :smile:[/centerblock]", + "
    bold italic code link \":smile:\"
    " + ], + "in-blockquote": [ + "> [centerblock=40]\n> text\n> [/centerblock]", + "
    \n
    \n
    \ntext
    \n
    \n
    " + ], + "in-list-item": [ + "- [centerblock=40]\n text\n [/centerblock]\n- next", + "
      \n
    • \n
      \n
      \ntext
      \n
      \n
    • \n
    • next
    • \n
    " + ], + "in-table-cell": [ + "| head |\n|---|\n| [centerblock=40]text[/centerblock] |", + "
    \n\n\n\n\n\n\n\n\n\n\n\n
    head
    text
    \n
    " + ], + "in-heading": [ + "## [centerblock=40]text[/centerblock]", + "

    text

    " + ], + "around-b": [ + "[centerblock=40][b]text[/b][/centerblock]", + "
    text
    " + ], + "in-b": [ + "[b]before [centerblock=40]text[/centerblock] after[/b]", + "before
    text
    after
    " + ], + "in-core-quote": [ + "[quote]\n[centerblock=40]text[/centerblock]\n[/quote]", + "" + ], + "misnested-with-i": [ + "[centerblock=40][i]text[/centerblock] tail[/i]", + "
    text
    \ntail" + ], + "nested-in-itself": [ + "[centerblock=40]outer [centerblock=40]inner[/centerblock] outer[/centerblock]", + "
    outer
    inner
    outer
    " + ], + "repeated": [ + "[centerblock=40]one[/centerblock][centerblock=40]two[/centerblock] [centerblock=40]three[/centerblock]", + "
    one
    \n
    two
    \n
    three
    " + ], + "tail-and-next-line": [ + "[centerblock=40]text[/centerblock] tail\nnext line", + "
    text
    \ntail
    next line" + ], + "blank-lines-around": [ + "before\n\n\n[centerblock=40]text[/centerblock]\n\n\nafter", + "before


    text
    \n


    after" + ], + "unclosed": [ + "[centerblock=40]text", + "[centerblock=40]text" + ], + "unmatched-close": [ + "text[/centerblock]", + "text[/centerblock]" + ], + "escaped": [ + "\\[centerblock=40]text[/centerblock]", + "[centerblock=40]text[/centerblock]" + ], + "uppercase": [ + "[CENTERBLOCK=40]text[/CENTERBLOCK]", + "
    text
    " + ], + "[centerblock] alone": [ + "[centerblock]text[/centerblock]", + "
    text
    " + ], + "[centerblock] own-lines": [ + "[centerblock]\ntext\n[/centerblock]", + "
    \n
    \ntext
    \n
    " + ] + }, + "tag-check": { + "alone": [ + "[check=x]text[/check]", + "
    text
    " + ], + "empty": [ + "[check=x][/check]", + "
    " + ], + "mid-line": [ + "before [check=x]text[/check] after", + "before
    text
    after" + ], + "own-lines": [ + "[check=x]\ntext\n[/check]", + "
    \n
    \ntext
    \n
    " + ], + "own-lines-between-text": [ + "before\n[check=x]\ntext\n[/check]\nafter", + "before
    \n
    \ntext
    \n
    \nafter" + ], + "starts-mid-line-spans-lines": [ + "before [check=x]text\nmore[/check] after", + "before
    \ntext
    \nmore
    \nafter" + ], + "blank-line-inside": [ + "[check=x]\ntext\n\nsecond paragraph\n[/check]", + "
    \n
    \ntext

    second paragraph
    \n
    " + ], + "markdown-blocks-inside": [ + "[check=x]\n## Heading\n\n- one\n- two\n\n> quoted\n[/check]", + "
    \n
    \n

    Heading

    \n
      \n
    • one
    • \n
    • two
    • \n
    \n
    \nquoted
    \n
    \n
    " + ], + "inline-markdown-inside": [ + "[check=x]**bold** _italic_ `code` [link](https://example.com) :smile:[/check]", + "
    bold italic code link \":smile:\"
    " + ], + "in-blockquote": [ + "> [check=x]\n> text\n> [/check]", + "
    \n
    \n
    \ntext
    \n
    \n
    " + ], + "in-list-item": [ + "- [check=x]\n text\n [/check]\n- next", + "
      \n
    • \n
      \n
      \ntext
      \n
      \n
    • \n
    • next
    • \n
    " + ], + "in-table-cell": [ + "| head |\n|---|\n| [check=x]text[/check] |", + "
    \n\n\n\n\n\n\n\n\n\n\n\n
    head
    text
    \n
    " + ], + "in-heading": [ + "## [check=x]text[/check]", + "

    text

    " + ], + "around-b": [ + "[check=x][b]text[/b][/check]", + "
    text
    " + ], + "in-b": [ + "[b]before [check=x]text[/check] after[/b]", + "before
    text
    after
    " + ], + "in-core-quote": [ + "[quote]\n[check=x]text[/check]\n[/quote]", + "" + ], + "misnested-with-i": [ + "[check=x][i]text[/check] tail[/i]", + "
    text
    \ntail" + ], + "nested-in-itself": [ + "[check=x]outer [check=x]inner[/check] outer[/check]", + "
    outer
    inner
    outer
    " + ], + "repeated": [ + "[check=x]one[/check][check=x]two[/check] [check=x]three[/check]", + "
    one
    \n
    two
    \n
    three
    " + ], + "tail-and-next-line": [ + "[check=x]text[/check] tail\nnext line", + "
    text
    \ntail
    next line" + ], + "blank-lines-around": [ + "before\n\n\n[check=x]text[/check]\n\n\nafter", + "before


    text
    \n

    after" + ], + "unclosed": [ + "[check=x]text", + "[check=x]text" + ], + "unmatched-close": [ + "text[/check]", + "text[/check]" + ], + "escaped": [ + "\\[check=x]text[/check]", + "[check=x]text[/check]" + ], + "uppercase": [ + "[CHECK=x]text[/CHECK]", + "
    text
    " + ], + "[check] alone": [ + "[check]text[/check]", + "
    text
    " + ], + "[check] own-lines": [ + "[check]\ntext\n[/check]", + "
    \n
    \ntext
    \n
    " + ] + }, + "tag-class": { + "alone": [ + "[class name=box]color: red;[/class]", + "" + ], + "empty": [ + "[class name=box][/class]", + "" + ], + "mid-line": [ + "before [class name=box]color: red;[/class] after", + "\nbefore after" + ], + "own-lines": [ + "[class name=box]\ncolor: red;\n[/class]", + "" + ], + "own-lines-between-text": [ + "before\n[class name=box]\ncolor: red;\n[/class]\nafter", + "\nbefore

    after" + ], + "starts-mid-line-spans-lines": [ + "before [class name=box]color: red;\nmore[/class] after", + "\nbefore after" + ], + "blank-line-inside": [ + "[class name=box]\ncolor: red;\n\nsecond paragraph\n[/class]", + "" + ], + "markdown-blocks-inside": [ + "[class name=box]\n## Heading\n\n- one\n- two\n\n> quoted\n[/class]", + "" + ], + "inline-markdown-inside": [ + "[class name=box]**bold** _italic_ `code` [link](https://example.com) :smile:[/class]", + "" + ], + "in-blockquote": [ + "> [class name=box]\n> color: red;\n> [/class]", + "\n
    " + ], + "in-list-item": [ + "- [class name=box]\n color: red;\n [/class]\n- next", + "\n
      \n
    • \n
    • next
    • \n
    " + ], + "in-table-cell": [ + "| head |\n|---|\n| [class name=box]color: red;[/class] |", + "\n
    \n\n\n\n\n\n\n\n\n\n\n\n
    head
    \n
    " + ], + "in-heading": [ + "## [class name=box]color: red;[/class]", + "\n

    " + ], + "around-b": [ + "[class name=box][b]color: red;[/b][/class]", + "" + ], + "in-b": [ + "[b]before [class name=box]color: red;[/class] after[/b]", + "\nbefore after" + ], + "in-core-quote": [ + "[quote]\n[class name=box]color: red;[/class]\n[/quote]", + "\n" + ], + "misnested-with-i": [ + "[class name=box][i]color: red;[/class] tail[/i]", + "\ntail[/i]" + ], + "nested-in-itself": [ + "[class name=box]outer [class name=box]inner[/class] outer[/class]", + "" + ], + "repeated": [ + "[class name=box]one[/class][class name=box]two[/class] [class name=box]three[/class]", + "" + ], + "tail-and-next-line": [ + "[class name=box]color: red;[/class] tail\nnext line", + "\ntail
    next line" + ], + "blank-lines-around": [ + "before\n\n\n[class name=box]color: red;[/class]\n\n\nafter", + "\nbefore





    after" + ], + "unclosed": [ + "[class name=box]color: red;", + "[class name=box]color: red;" + ], + "unmatched-close": [ + "color: red;[/class]", + "color: red;[/class]" + ], + "escaped": [ + "\\[class name=box]color: red;[/class]", + "[class name=box]color: red;[/class]" + ], + "uppercase": [ + "[CLASS name=box]color: red;[/CLASS]", + "" + ], + "[class name=box state=hover] alone": [ + "[class name=box state=hover]color: red;[/class]", + "" + ], + "[class name=box state=hover] own-lines": [ + "[class name=box state=hover]\ncolor: red;\n[/class]", + "" + ], + "[class name=box selector=\" p\"] alone": [ + "[class name=box selector=\" p\"]color: red;[/class]", + "" + ], + "[class name=box selector=\" p\"] own-lines": [ + "[class name=box selector=\" p\"]\ncolor: red;\n[/class]", + "" + ], + "[class name=box minWidth=100px] alone": [ + "[class name=box minWidth=100px]color: red;[/class]", + "" + ], + "[class name=box minWidth=100px] own-lines": [ + "[class name=box minWidth=100px]\ncolor: red;\n[/class]", + "" + ], + "[class name=\"bad name\"] alone": [ + "[class name=\"bad name\"]color: red;[/class]", + "" + ], + "[class name=\"bad name\"] own-lines": [ + "[class name=\"bad name\"]\ncolor: red;\n[/class]", + "" + ] + }, + "tag-code": { + "alone": [ + "[code][b]x[/b][/code]", + "
    [b]x[/b]
    " + ], + "empty": [ + "[code][/code]", + "" + ], + "mid-line": [ + "before [code][b]x[/b][/code] after", + "before [b]x[/b] after" + ], + "own-lines": [ + "[code]\n[b]x[/b]\n[/code]", + "
    [b]x[/b]
    " + ], + "own-lines-between-text": [ + "before\n[code]\n[b]x[/b]\n[/code]\nafter", + "before
    [b]x[/b]
    \nafter" + ], + "starts-mid-line-spans-lines": [ + "before [code][b]x[/b]\nmore[/code] after", + "before
    [b]x[/b]\nmore
    \nafter" + ], + "blank-line-inside": [ + "[code]\n[b]x[/b]\n\nsecond paragraph\n[/code]", + "
    [b]x[/b]\n\nsecond paragraph
    " + ], + "markdown-blocks-inside": [ + "[code]\n## Heading\n\n- one\n- two\n\n> quoted\n[/code]", + "
    ## Heading\n\n- one\n- two\n\n> quoted
    " + ], + "inline-markdown-inside": [ + "[code]**bold** _italic_ `code` [link](https://example.com) :smile:[/code]", + "
    **bold** _italic_ `code` [link](https://example.com) :smile:
    " + ], + "in-blockquote": [ + "> [code]\n> [b]x[/b]\n> [/code]", + "
    \n
    [b]x[/b]
    \n
    " + ], + "in-list-item": [ + "- [code]\n [b]x[/b]\n [/code]\n- next", + "
      \n
    • \n
        [b]x[/b]
      \n
    • \n
    • next
    • \n
    " + ], + "in-table-cell": [ + "| head |\n|---|\n| [code][b]x[/b][/code] |", + "
    \n\n\n\n\n\n\n\n\n\n\n\n
    head
    [b]x[/b]
    \n
    " + ], + "in-heading": [ + "## [code][b]x[/b][/code]", + "

    [b]x[/b]

    " + ], + "around-b": [ + "[code][b][b]x[/b][/b][/code]", + "
    [b][b]x[/b][/b]
    " + ], + "in-b": [ + "[b]before [code][b]x[/b][/code] after[/b]", + "before [b]x[/b] after" + ], + "in-core-quote": [ + "[quote]\n[code][b]x[/b][/code]\n[/quote]", + "" + ], + "misnested-with-i": [ + "[code][i][b]x[/b][/code] tail[/i]", + "[i][b]x[/b] tail[/i]" + ], + "nested-in-itself": [ + "[code]outer [code]inner[/code] outer[/code]", + "
    outer [code]inner[/code] outer
    " + ], + "repeated": [ + "[code]one[/code][code]two[/code] [code]three[/code]", + "
    one[/code][code]two[/code] [code]three
    " + ], + "tail-and-next-line": [ + "[code][b]x[/b][/code] tail\nnext line", + "[b]x[/b] tail
    \nnext line" + ], + "blank-lines-around": [ + "before\n\n\n[code][b]x[/b][/code]\n\n\nafter", + "before


    [b]x[/b]
    \n

    after" + ], + "unclosed": [ + "[code][b]x[/b]", + "[code]x" + ], + "unmatched-close": [ + "[b]x[/b][/code]", + "x[/code]" + ], + "escaped": [ + "\\[code][b]x[/b][/code]", + "[code]x[/code]" + ], + "uppercase": [ + "[CODE][b]x[/b][/CODE]", + "
    [b]x[/b]
    " + ] + }, + "tag-color": { + "alone": [ + "[color=red]text[/color]", + "text" + ], + "empty": [ + "[color=red][/color]", + "" + ], + "mid-line": [ + "before [color=red]text[/color] after", + "before text after" + ], + "own-lines": [ + "[color=red]\ntext\n[/color]", + "
    \ntext
    \n
    " + ], + "own-lines-between-text": [ + "before\n[color=red]\ntext\n[/color]\nafter", + "before
    \n
    \ntext
    \n

    \nafter" + ], + "starts-mid-line-spans-lines": [ + "before [color=red]text\nmore[/color] after", + "before text
    \nmore
    after" + ], + "blank-line-inside": [ + "[color=red]\ntext\n\nsecond paragraph\n[/color]", + "
    \ntext
    \n
    \nsecond paragraph
    \n
    " + ], + "markdown-blocks-inside": [ + "[color=red]\n## Heading\n\n- one\n- two\n\n> quoted\n[/color]", + "
    \n
    \n

    Heading

    \n
      \n
    • one
    • \n
    • two
    • \n
    \n
    \nquoted
    \n
    \n
    " + ], + "inline-markdown-inside": [ + "[color=red]**bold** _italic_ `code` [link](https://example.com) :smile:[/color]", + "bold italic code link \":smile:\"" + ], + "in-blockquote": [ + "> [color=red]\n> text\n> [/color]", + "
    \n
    \ntext
    \n
    " + ], + "in-list-item": [ + "- [color=red]\n text\n [/color]\n- next", + "
      \n

    • \ntext
      \n
    • \n
    • next
    • \n
    " + ], + "in-table-cell": [ + "| head |\n|---|\n| [color=red]text[/color] |", + "
    \n\n\n\n\n\n\n\n\n\n\n\n
    head
    text
    \n
    " + ], + "in-heading": [ + "## [color=red]text[/color]", + "

    text

    " + ], + "around-b": [ + "[color=red][b]text[/b][/color]", + "text" + ], + "in-b": [ + "[b]before [color=red]text[/color] after[/b]", + "before text after" + ], + "in-core-quote": [ + "[quote]\n[color=red]text[/color]\n[/quote]", + "" + ], + "misnested-with-i": [ + "[color=red][i]text[/color] tail[/i]", + "text tail" + ], + "nested-in-itself": [ + "[color=red]outer [color=red]inner[/color] outer[/color]", + "outer inner outer" + ], + "repeated": [ + "[color=red]one[/color][color=red]two[/color] [color=red]three[/color]", + "onetwo three" + ], + "tail-and-next-line": [ + "[color=red]text[/color] tail\nnext line", + "text tail
    \nnext line" + ], + "blank-lines-around": [ + "before\n\n\n[color=red]text[/color]\n\n\nafter", + "before


    text


    after" + ], + "unclosed": [ + "[color=red]text", + "[color=red]text" + ], + "unmatched-close": [ + "text[/color]", + "text[/color]" + ], + "escaped": [ + "\\[color=red]text[/color]", + "[color=red]text[/color]" + ], + "uppercase": [ + "[COLOR=red]text[/COLOR]", + "text" + ], + "[color=#ff0000] alone": [ + "[color=#ff0000]text[/color]", + "text" + ], + "[color=#ff0000] own-lines": [ + "[color=#ff0000]\ntext\n[/color]", + "
    \ntext
    \n
    " + ], + "[color] alone": [ + "[color]text[/color]", + "text" + ], + "[color] own-lines": [ + "[color]\ntext\n[/color]", + "
    \ntext
    " + ], + "[color=\"blue\"] alone": [ + "[color=\"blue\"]text[/color]", + "text" + ], + "[color=\"blue\"] own-lines": [ + "[color=\"blue\"]\ntext\n[/color]", + "
    \ntext
    \n
    " + ] + }, + "tag-column": { + "alone": [ + "[column=6]text[/column]", + "
    text
    " + ], + "empty": [ + "[column=6][/column]", + "
    " + ], + "mid-line": [ + "before [column=6]text[/column] after", + "before
    text
    after" + ], + "own-lines": [ + "[column=6]\ntext\n[/column]", + "
    \n
    \ntext
    \n
    " + ], + "own-lines-between-text": [ + "before\n[column=6]\ntext\n[/column]\nafter", + "before
    \n
    \ntext
    \n
    \n
    after" + ], + "starts-mid-line-spans-lines": [ + "before [column=6]text\nmore[/column] after", + "before
    \ntext
    \nmore
    \nafter" + ], + "blank-line-inside": [ + "[column=6]\ntext\n\nsecond paragraph\n[/column]", + "
    \n
    \ntext

    second paragraph
    \n
    " + ], + "markdown-blocks-inside": [ + "[column=6]\n## Heading\n\n- one\n- two\n\n> quoted\n[/column]", + "
    \n
    \n

    Heading

    \n
      \n
    • one
    • \n
    • two
    • \n
    \n
    \nquoted
    \n
    \n
    " + ], + "inline-markdown-inside": [ + "[column=6]**bold** _italic_ `code` [link](https://example.com) :smile:[/column]", + "
    bold italic code link \":smile:\"
    " + ], + "in-blockquote": [ + "> [column=6]\n> text\n> [/column]", + "
    \n
    \n
    \ntext
    \n
    \n
    " + ], + "in-list-item": [ + "- [column=6]\n text\n [/column]\n- next", + "
      \n
    • \n
      \n
      \ntext
      \n
      \n
    • \n
    • next
    • \n
    " + ], + "in-table-cell": [ + "| head |\n|---|\n| [column=6]text[/column] |", + "
    \n\n\n\n\n\n\n\n\n\n\n\n
    head
    text
    \n
    " + ], + "in-heading": [ + "## [column=6]text[/column]", + "

    text

    " + ], + "around-b": [ + "[column=6][b]text[/b][/column]", + "
    text
    " + ], + "in-b": [ + "[b]before [column=6]text[/column] after[/b]", + "before
    text
    after
    " + ], + "in-core-quote": [ + "[quote]\n[column=6]text[/column]\n[/quote]", + "" + ], + "misnested-with-i": [ + "[column=6][i]text[/column] tail[/i]", + "
    text
    \ntail" + ], + "nested-in-itself": [ + "[column=6]outer [column=6]inner[/column] outer[/column]", + "
    outer
    inner
    outer
    " + ], + "repeated": [ + "[column=6]one[/column][column=6]two[/column] [column=6]three[/column]", + "
    one
    \n
    two
    \n
    three
    " + ], + "tail-and-next-line": [ + "[column=6]text[/column] tail\nnext line", + "
    text
    \ntail
    next line" + ], + "blank-lines-around": [ + "before\n\n\n[column=6]text[/column]\n\n\nafter", + "before


    text
    \n


    after" + ], + "unclosed": [ + "[column=6]text", + "[column=6]text" + ], + "unmatched-close": [ + "text[/column]", + "text[/column]" + ], + "escaped": [ + "\\[column=6]text[/column]", + "[column=6]text[/column]" + ], + "uppercase": [ + "[COLUMN=6]text[/COLUMN]", + "
    text
    " + ], + "[column] alone": [ + "[column]text[/column]", + "
    text
    " + ], + "[column] own-lines": [ + "[column]\ntext\n[/column]", + "
    \n
    \ntext
    \n
    " + ], + "[column=span4] alone": [ + "[column=span4]text[/column]", + "
    text
    " + ], + "[column=span4] own-lines": [ + "[column=span4]\ntext\n[/column]", + "
    \n
    \ntext
    \n
    " + ] + }, + "tag-comment": { + "alone": [ + "[comment]hidden [b]x[/b][/comment]", + "" + ], + "empty": [ + "[comment][/comment]", + "" + ], + "mid-line": [ + "before [comment]hidden [b]x[/b][/comment] after", + "before after" + ], + "own-lines": [ + "[comment]\nhidden [b]x[/b]\n[/comment]", + "" + ], + "own-lines-between-text": [ + "before\n[comment]\nhidden [b]x[/b]\n[/comment]\nafter", + "before
    \n
    \nafter" + ], + "starts-mid-line-spans-lines": [ + "before [comment]hidden [b]x[/b]\nmore[/comment] after", + "before after" + ], + "blank-line-inside": [ + "[comment]\nhidden [b]x[/b]\n\nsecond paragraph\n[/comment]", + "" + ], + "markdown-blocks-inside": [ + "[comment]\n## Heading\n\n- one\n- two\n\n> quoted\n[/comment]", + "" + ], + "inline-markdown-inside": [ + "[comment]**bold** _italic_ `code` [link](https://example.com) :smile:[/comment]", + "" + ], + "in-blockquote": [ + "> [comment]\n> hidden [b]x[/b]\n> [/comment]", + "
    \n
    " + ], + "in-list-item": [ + "- [comment]\n hidden [b]x[/b]\n [/comment]\n- next", + "
      \n
    • \n
    • next
    • \n
    " + ], + "in-table-cell": [ + "| head |\n|---|\n| [comment]hidden [b]x[/b][/comment] |", + "
    \n\n\n\n\n\n\n\n\n\n\n\n
    head
    \n
    " + ], + "in-heading": [ + "## [comment]hidden [b]x[/b][/comment]", + "

    " + ], + "around-b": [ + "[comment][b]hidden [b]x[/b][/b][/comment]", + "" + ], + "in-b": [ + "[b]before [comment]hidden [b]x[/b][/comment] after[/b]", + "before after" + ], + "in-core-quote": [ + "[quote]\n[comment]hidden [b]x[/b][/comment]\n[/quote]", + "" + ], + "misnested-with-i": [ + "[comment][i]hidden [b]x[/b][/comment] tail[/i]", + " tail[/i]" + ], + "nested-in-itself": [ + "[comment]outer [comment]inner[/comment] outer[/comment]", + "" + ], + "repeated": [ + "[comment]one[/comment][comment]two[/comment] [comment]three[/comment]", + " " + ], + "tail-and-next-line": [ + "[comment]hidden [b]x[/b][/comment] tail\nnext line", + " tail
    \nnext line" + ], + "blank-lines-around": [ + "before\n\n\n[comment]hidden [b]x[/b][/comment]\n\n\nafter", + "before





    after" + ], + "unclosed": [ + "[comment]hidden [b]x[/b]", + "[comment]hidden x" + ], + "unmatched-close": [ + "hidden [b]x[/b][/comment]", + "hidden x[/comment]" + ], + "escaped": [ + "\\[comment]hidden [b]x[/b][/comment]", + "[comment]hidden x[/comment]" + ], + "uppercase": [ + "[COMMENT]hidden [b]x[/b][/COMMENT]", + "" + ] + }, + "tag-details": { + "alone": [ + "[details=Summary]text[/details]", + "
    \n\nSummary\ntext
    " + ], + "empty": [ + "[details=Summary][/details]", + "[details=Summary][/details]" + ], + "mid-line": [ + "before [details=Summary]text[/details] after", + "before [details=Summary]text[/details] after" + ], + "own-lines": [ + "[details=Summary]\ntext\n[/details]", + "
    \n\nSummary\ntext
    " + ], + "own-lines-between-text": [ + "before\n[details=Summary]\ntext\n[/details]\nafter", + "before
    \n\nSummary\ntext
    \n
    after" + ], + "starts-mid-line-spans-lines": [ + "before [details=Summary]text\nmore[/details] after", + "before [details=Summary]text
    \nmore[/details] after" + ], + "blank-line-inside": [ + "[details=Summary]\ntext\n\nsecond paragraph\n[/details]", + "
    \n\nSummary\ntext

    second paragraph
    " + ], + "markdown-blocks-inside": [ + "[details=Summary]\n## Heading\n\n- one\n- two\n\n> quoted\n[/details]", + "
    \n\nSummary\n

    Heading

    \n
      \n
    • one
    • \n
    • two
    • \n
    \n
    \nquoted
    \n
    " + ], + "inline-markdown-inside": [ + "[details=Summary]**bold** _italic_ `code` [link](https://example.com) :smile:[/details]", + "
    \n\nSummary\nbold italic code link \":smile:\"
    " + ], + "in-blockquote": [ + "> [details=Summary]\n> text\n> [/details]", + "
    \n
    \n\nSummary\ntext
    \n
    " + ], + "in-list-item": [ + "- [details=Summary]\n text\n [/details]\n- next", + "
      \n
    • \n
      \n\nSummary\ntext
      \n
    • \n
    • next
    • \n
    " + ], + "in-table-cell": [ + "| head |\n|---|\n| [details=Summary]text[/details] |", + "
    \n\n\n\n\n\n\n\n\n\n\n\n
    head
    [details=Summary]text[/details]
    \n
    " + ], + "in-heading": [ + "## [details=Summary]text[/details]", + "

    [details=Summary]text[/details]

    " + ], + "around-b": [ + "[details=Summary][b]text[/b][/details]", + "
    \n\nSummary\ntext
    " + ], + "in-b": [ + "[b]before [details=Summary]text[/details] after[/b]", + "before [details=Summary]text[/details] after" + ], + "in-core-quote": [ + "[quote]\n[details=Summary]text[/details]\n[/quote]", + "" + ], + "misnested-with-i": [ + "[details=Summary][i]text[/details] tail[/i]", + "[details=Summary]text[/details] tail" + ], + "nested-in-itself": [ + "[details=Summary]outer [details=Summary]inner[/details] outer[/details]", + "
    \n\nSummary\nouter [details=Summary]inner[/details] outer
    " + ], + "repeated": [ + "[details=Summary]one[/details][details=Summary]two[/details] [details=Summary]three[/details]", + "
    \n\nSummary\none[/details][details=Summary]two[/details] [details=Summary]three
    " + ], + "tail-and-next-line": [ + "[details=Summary]text[/details] tail\nnext line", + "[details=Summary]text[/details] tail
    \nnext line" + ], + "blank-lines-around": [ + "before\n\n\n[details=Summary]text[/details]\n\n\nafter", + "before


    \n\nSummary\ntext
    \n


    after" + ], + "unclosed": [ + "[details=Summary]text", + "[details=Summary]text" + ], + "unmatched-close": [ + "text[/details]", + "text[/details]" + ], + "escaped": [ + "\\[details=Summary]text[/details]", + "[details=Summary]text[/details]" + ], + "uppercase": [ + "[DETAILS=Summary]text[/DETAILS]", + "[DETAILS=Summary]text[/DETAILS]" + ], + "[details] alone": [ + "[details]text[/details]", + "
    \n\n\ntext
    " + ], + "[details] own-lines": [ + "[details]\ntext\n[/details]", + "
    \n\n\ntext
    " + ] + }, + "tag-div": { + "alone": [ + "[div=color:red]text[/div]", + "
    text
    " + ], + "empty": [ + "[div=color:red][/div]", + "
    " + ], + "mid-line": [ + "before [div=color:red]text[/div] after", + "before
    text
    after" + ], + "own-lines": [ + "[div=color:red]\ntext\n[/div]", + "
    \n
    \ntext
    \n
    " + ], + "own-lines-between-text": [ + "before\n[div=color:red]\ntext\n[/div]\nafter", + "before
    \n
    \ntext
    \n
    \n
    after" + ], + "starts-mid-line-spans-lines": [ + "before [div=color:red]text\nmore[/div] after", + "before
    \ntext
    \nmore
    \nafter" + ], + "blank-line-inside": [ + "[div=color:red]\ntext\n\nsecond paragraph\n[/div]", + "
    \n
    \ntext

    second paragraph
    \n
    " + ], + "markdown-blocks-inside": [ + "[div=color:red]\n## Heading\n\n- one\n- two\n\n> quoted\n[/div]", + "
    \n
    \n

    Heading

    \n
      \n
    • one
    • \n
    • two
    • \n
    \n
    \nquoted
    \n
    \n
    " + ], + "inline-markdown-inside": [ + "[div=color:red]**bold** _italic_ `code` [link](https://example.com) :smile:[/div]", + "
    bold italic code link \":smile:\"
    " + ], + "in-blockquote": [ + "> [div=color:red]\n> text\n> [/div]", + "
    \n
    \n
    \ntext
    \n
    \n
    " + ], + "in-list-item": [ + "- [div=color:red]\n text\n [/div]\n- next", + "
      \n
    • \n
      \n
      \ntext
      \n
      \n
    • \n
    • next
    • \n
    " + ], + "in-table-cell": [ + "| head |\n|---|\n| [div=color:red]text[/div] |", + "
    \n\n\n\n\n\n\n\n\n\n\n\n
    head
    text
    \n
    " + ], + "in-heading": [ + "## [div=color:red]text[/div]", + "

    text

    " + ], + "around-b": [ + "[div=color:red][b]text[/b][/div]", + "
    text
    " + ], + "in-b": [ + "[b]before [div=color:red]text[/div] after[/b]", + "before
    text
    after
    " + ], + "in-core-quote": [ + "[quote]\n[div=color:red]text[/div]\n[/quote]", + "" + ], + "misnested-with-i": [ + "[div=color:red][i]text[/div] tail[/i]", + "
    text
    \ntail" + ], + "nested-in-itself": [ + "[div=color:red]outer [div=color:red]inner[/div] outer[/div]", + "
    outer
    inner
    outer
    " + ], + "repeated": [ + "[div=color:red]one[/div][div=color:red]two[/div] [div=color:red]three[/div]", + "
    one
    \n
    two
    \n
    three
    " + ], + "tail-and-next-line": [ + "[div=color:red]text[/div] tail\nnext line", + "
    text
    \ntail
    next line" + ], + "blank-lines-around": [ + "before\n\n\n[div=color:red]text[/div]\n\n\nafter", + "before


    text
    \n


    after" + ], + "unclosed": [ + "[div=color:red]text", + "[div=color:red]text" + ], + "unmatched-close": [ + "text[/div]", + "text[/div]" + ], + "escaped": [ + "\\[div=color:red]text[/div]", + "[div=color:red]text[/div]" + ], + "uppercase": [ + "[DIV=color:red]text[/DIV]", + "
    text
    " + ], + "[div] alone": [ + "[div]text[/div]", + "
    text
    " + ], + "[div] own-lines": [ + "[div]\ntext\n[/div]", + "
    \n
    \ntext
    \n
    " + ], + "[div=color:red; padding: 4px] alone": [ + "[div=color:red; padding: 4px]text[/div]", + "
    text
    " + ], + "[div=color:red; padding: 4px] own-lines": [ + "[div=color:red; padding: 4px]\ntext\n[/div]", + "
    \n
    \ntext
    \n
    " + ], + "[div style=\"color:red\" class=\"box\"] alone": [ + "[div style=\"color:red\" class=\"box\"]text[/div]", + "
    text
    " + ], + "[div style=\"color:red\" class=\"box\"] own-lines": [ + "[div style=\"color:red\" class=\"box\"]\ntext\n[/div]", + "
    \n
    \ntext
    \n
    " + ], + "[div class=box] alone": [ + "[div class=box]text[/div]", + "
    text
    " + ], + "[div class=box] own-lines": [ + "[div class=box]\ntext\n[/div]", + "
    \n
    \ntext
    \n
    " + ], + "[div class=\"a b\"] alone": [ + "[div class=\"a b\"]text[/div]", + "
    text
    " + ], + "[div class=\"a b\"] own-lines": [ + "[div class=\"a b\"]\ntext\n[/div]", + "
    \n
    \ntext
    \n
    " + ] + }, + "tag-divide": { + "alone": [ + "[divide=dotted]text[/divide]", + "
    text
    " + ], + "empty": [ + "[divide=dotted][/divide]", + "
    " + ], + "mid-line": [ + "before [divide=dotted]text[/divide] after", + "before
    text
    after" + ], + "own-lines": [ + "[divide=dotted]\ntext\n[/divide]", + "
    \n
    \ntext
    \n
    " + ], + "own-lines-between-text": [ + "before\n[divide=dotted]\ntext\n[/divide]\nafter", + "before
    \n
    \ntext
    \n
    \nafter" + ], + "starts-mid-line-spans-lines": [ + "before [divide=dotted]text\nmore[/divide] after", + "before
    \ntext
    \nmore
    \nafter" + ], + "blank-line-inside": [ + "[divide=dotted]\ntext\n\nsecond paragraph\n[/divide]", + "
    \n
    \ntext

    second paragraph
    \n
    " + ], + "markdown-blocks-inside": [ + "[divide=dotted]\n## Heading\n\n- one\n- two\n\n> quoted\n[/divide]", + "
    \n
    \n

    Heading

    \n
      \n
    • one
    • \n
    • two
    • \n
    \n
    \nquoted
    \n
    \n
    " + ], + "inline-markdown-inside": [ + "[divide=dotted]**bold** _italic_ `code` [link](https://example.com) :smile:[/divide]", + "
    bold italic code link \":smile:\"
    " + ], + "in-blockquote": [ + "> [divide=dotted]\n> text\n> [/divide]", + "
    \n
    \n
    \ntext
    \n
    \n
    " + ], + "in-list-item": [ + "- [divide=dotted]\n text\n [/divide]\n- next", + "
      \n
    • \n
      \n
      \ntext
      \n
      \n
    • \n
    • next
    • \n
    " + ], + "in-table-cell": [ + "| head |\n|---|\n| [divide=dotted]text[/divide] |", + "
    \n\n\n\n\n\n\n\n\n\n\n\n
    head
    text
    \n
    " + ], + "in-heading": [ + "## [divide=dotted]text[/divide]", + "

    text

    " + ], + "around-b": [ + "[divide=dotted][b]text[/b][/divide]", + "
    text
    " + ], + "in-b": [ + "[b]before [divide=dotted]text[/divide] after[/b]", + "before
    text
    after
    " + ], + "in-core-quote": [ + "[quote]\n[divide=dotted]text[/divide]\n[/quote]", + "" + ], + "misnested-with-i": [ + "[divide=dotted][i]text[/divide] tail[/i]", + "
    text
    \ntail" + ], + "nested-in-itself": [ + "[divide=dotted]outer [divide=dotted]inner[/divide] outer[/divide]", + "
    outer
    inner
    outer
    " + ], + "repeated": [ + "[divide=dotted]one[/divide][divide=dotted]two[/divide] [divide=dotted]three[/divide]", + "
    one
    \n
    two
    \n
    three
    " + ], + "tail-and-next-line": [ + "[divide=dotted]text[/divide] tail\nnext line", + "
    text
    \ntail
    next line" + ], + "blank-lines-around": [ + "before\n\n\n[divide=dotted]text[/divide]\n\n\nafter", + "before


    text
    \n

    after" + ], + "unclosed": [ + "[divide=dotted]text", + "[divide=dotted]text" + ], + "unmatched-close": [ + "text[/divide]", + "text[/divide]" + ], + "escaped": [ + "\\[divide=dotted]text[/divide]", + "[divide=dotted]text[/divide]" + ], + "uppercase": [ + "[DIVIDE=dotted]text[/DIVIDE]", + "
    text
    " + ], + "[divide] alone": [ + "[divide]text[/divide]", + "
    text
    " + ], + "[divide] own-lines": [ + "[divide]\ntext\n[/divide]", + "
    \n
    \ntext
    \n
    " + ], + "[divide=DASHED] alone": [ + "[divide=DASHED]text[/divide]", + "
    text
    " + ], + "[divide=DASHED] own-lines": [ + "[divide=DASHED]\ntext\n[/divide]", + "
    \n
    \ntext
    \n
    " + ] + }, + "tag-email": { + "alone": [ + "[email]someone@example.com[/email]", + "someone@example.com" + ], + "empty": [ + "[email][/email]", + "" + ], + "mid-line": [ + "before [email]someone@example.com[/email] after", + "before someone@example.com after" + ], + "own-lines": [ + "[email]\nsomeone@example.com\n[/email]", + "\nsomeone@example.com\n" + ], + "own-lines-between-text": [ + "before\n[email]\nsomeone@example.com\n[/email]\nafter", + "before
    \n\nsomeone@example.com\n
    \nafter" + ], + "starts-mid-line-spans-lines": [ + "before [email]someone@example.com\nmore[/email] after", + "before someone@example.com\nmore after" + ], + "blank-line-inside": [ + "[email]\nsomeone@example.com\n\nsecond paragraph\n[/email]", + "[email]
    \nsomeone@example.com

    second paragraph
    \n[/email]" + ], + "markdown-blocks-inside": [ + "[email]\n## Heading\n\n- one\n- two\n\n> quoted\n[/email]", + "[email]

    Heading

    \n
      \n
    • one
    • \n
    • two
    • \n
    \n
    \nquoted
    \n[/email]
    " + ], + "inline-markdown-inside": [ + "[email]**bold** _italic_ `code` [link](https://example.com) :smile:[/email]", + "**bold** _italic_ `code` [link](https://example.com) \":smile:\"" + ], + "in-blockquote": [ + "> [email]\n> someone@example.com\n> [/email]", + "
    \n\nsomeone@example.com\n
    " + ], + "in-list-item": [ + "- [email]\n someone@example.com\n [/email]\n- next", + "" + ], + "in-table-cell": [ + "| head |\n|---|\n| [email]someone@example.com[/email] |", + "
    \n\n\n\n\n\n\n\n\n\n\n\n
    head
    someone@example.com
    \n
    " + ], + "in-heading": [ + "## [email]someone@example.com[/email]", + "

    someone@example.com

    " + ], + "around-b": [ + "[email][b]someone@example.com[/b][/email]", + "[b]someone@example.com[/b]" + ], + "in-b": [ + "[b]before [email]someone@example.com[/email] after[/b]", + "before someone@example.com after" + ], + "in-core-quote": [ + "[quote]\n[email]someone@example.com[/email]\n[/quote]", + "" + ], + "misnested-with-i": [ + "[email][i]someone@example.com[/email] tail[/i]", + "[i]someone@example.com tail[/i]" + ], + "nested-in-itself": [ + "[email]outer [email]inner[/email] outer[/email]", + "outer [email]inner outer[/email]" + ], + "repeated": [ + "[email]one[/email][email]two[/email] [email]three[/email]", + "onetwo three" + ], + "tail-and-next-line": [ + "[email]someone@example.com[/email] tail\nnext line", + "someone@example.com tail
    \nnext line" + ], + "blank-lines-around": [ + "before\n\n\n[email]someone@example.com[/email]\n\n\nafter", + "before


    someone@example.com


    after" + ], + "unclosed": [ + "[email]someone@example.com", + "[email]someone@example.com" + ], + "unmatched-close": [ + "someone@example.com[/email]", + "someone@example.com[/email]" + ], + "escaped": [ + "\\[email]someone@example.com[/email]", + "[email]someone@example.com[/email]" + ], + "uppercase": [ + "[EMAIL]someone@example.com[/EMAIL]", + "someone@example.com" + ] + }, + "tag-fa": { + "alone": [ + "[fa]fas fa-dice[/fa]", + "" + ], + "empty": [ + "[fa][/fa]", + "" + ], + "mid-line": [ + "before [fa]fas fa-dice[/fa] after", + "before after" + ], + "own-lines": [ + "[fa]\nfas fa-dice\n[/fa]", + "" + ], + "own-lines-between-text": [ + "before\n[fa]\nfas fa-dice\n[/fa]\nafter", + "before

    after" + ], + "starts-mid-line-spans-lines": [ + "before [fa]fas fa-dice\nmore[/fa] after", + "before after" + ], + "blank-line-inside": [ + "[fa]\nfas fa-dice\n\nsecond paragraph\n[/fa]", + "" + ], + "markdown-blocks-inside": [ + "[fa]\n## Heading\n\n- one\n- two\n\n> quoted\n[/fa]", + "" + ], + "inline-markdown-inside": [ + "[fa]**bold** _italic_ `code` [link](https://example.com) :smile:[/fa]", + "" + ], + "in-blockquote": [ + "> [fa]\n> fas fa-dice\n> [/fa]", + "
    " + ], + "in-list-item": [ + "- [fa]\n fas fa-dice\n [/fa]\n- next", + "
      \n
    • \n
    • next
    • \n
    " + ], + "in-table-cell": [ + "| head |\n|---|\n| [fa]fas fa-dice[/fa] |", + "
    \n\n\n\n\n\n\n\n\n\n\n\n
    head
    \n
    " + ], + "in-heading": [ + "## [fa]fas fa-dice[/fa]", + "

    " + ], + "around-b": [ + "[fa][b]fas fa-dice[/b][/fa]", + "" + ], + "in-b": [ + "[b]before [fa]fas fa-dice[/fa] after[/b]", + "before after" + ], + "in-core-quote": [ + "[quote]\n[fa]fas fa-dice[/fa]\n[/quote]", + "" + ], + "misnested-with-i": [ + "[fa][i]fas fa-dice[/fa] tail[/i]", + " tail[/i]" + ], + "nested-in-itself": [ + "[fa]outer [fa]inner[/fa] outer[/fa]", + "" + ], + "repeated": [ + "[fa]one[/fa][fa]two[/fa] [fa]three[/fa]", + " " + ], + "tail-and-next-line": [ + "[fa]fas fa-dice[/fa] tail\nnext line", + " tail
    next line" + ], + "blank-lines-around": [ + "before\n\n\n[fa]fas fa-dice[/fa]\n\n\nafter", + "before





    after" + ], + "unclosed": [ + "[fa]fas fa-dice", + "[fa]fas fa-dice" + ], + "unmatched-close": [ + "fas fa-dice[/fa]", + "fas fa-dice[/fa]" + ], + "escaped": [ + "\\[fa]fas fa-dice[/fa]", + "[fa]fas fa-dice[/fa]" + ], + "uppercase": [ + "[FA]fas fa-dice[/FA]", + "" + ], + "[fa style=\"color:red\" fa-transform=grow-2] alone": [ + "[fa style=\"color:red\" fa-transform=grow-2]fas fa-dice[/fa]", + "" + ], + "[fa style=\"color:red\" fa-transform=grow-2] own-lines": [ + "[fa style=\"color:red\" fa-transform=grow-2]\nfas fa-dice\n[/fa]", + "" + ] + }, + "tag-fieldset": { + "alone": [ + "[fieldset=Legend]text[/fieldset]", + "
    \n\nLegend\n
    text
    \n
    " + ], + "empty": [ + "[fieldset=Legend][/fieldset]", + "
    \n\nLegend\n
    \n
    " + ], + "mid-line": [ + "before [fieldset=Legend]text[/fieldset] after", + "before
    Legend
    text
    after" + ], + "own-lines": [ + "[fieldset=Legend]\ntext\n[/fieldset]", + "
    \n\nLegend\n
    \n
    \ntext
    \n
    \n
    " + ], + "own-lines-between-text": [ + "before\n[fieldset=Legend]\ntext\n[/fieldset]\nafter", + "before
    \n\nLegend\n
    \n
    \ntext
    \n
    \n
    \n
    after" + ], + "starts-mid-line-spans-lines": [ + "before [fieldset=Legend]text\nmore[/fieldset] after", + "before
    \n\nLegend\n
    \ntext
    \nmore
    \n
    \nafter" + ], + "blank-line-inside": [ + "[fieldset=Legend]\ntext\n\nsecond paragraph\n[/fieldset]", + "
    \n\nLegend\n
    \n
    \ntext

    second paragraph
    \n
    \n
    " + ], + "markdown-blocks-inside": [ + "[fieldset=Legend]\n## Heading\n\n- one\n- two\n\n> quoted\n[/fieldset]", + "
    \n\nLegend\n
    \n
    \n

    Heading

    \n
      \n
    • one
    • \n
    • two
    • \n
    \n
    \nquoted
    \n
    \n
    \n
    " + ], + "inline-markdown-inside": [ + "[fieldset=Legend]**bold** _italic_ `code` [link](https://example.com) :smile:[/fieldset]", + "
    \n\nLegend\n
    bold italic code link \":smile:\"
    \n
    " + ], + "in-blockquote": [ + "> [fieldset=Legend]\n> text\n> [/fieldset]", + "
    \n
    \n\nLegend\n
    \n
    \ntext
    \n
    \n
    \n
    " + ], + "in-list-item": [ + "- [fieldset=Legend]\n text\n [/fieldset]\n- next", + "
      \n
    • \n
      \n\nLegend\n
      \n
      \ntext
      \n
      \n
      \n
    • \n
    • next
    • \n
    " + ], + "in-table-cell": [ + "| head |\n|---|\n| [fieldset=Legend]text[/fieldset] |", + "
    \n\n\n\n\n\n\n\n\n\n\n\n
    head
    Legend
    text
    \n
    " + ], + "in-heading": [ + "## [fieldset=Legend]text[/fieldset]", + "

    Legend
    text

    " + ], + "around-b": [ + "[fieldset=Legend][b]text[/b][/fieldset]", + "
    \n\nLegend\n
    text
    \n
    " + ], + "in-b": [ + "[b]before [fieldset=Legend]text[/fieldset] after[/b]", + "before
    Legend
    text
    after
    " + ], + "in-core-quote": [ + "[quote]\n[fieldset=Legend]text[/fieldset]\n[/quote]", + "" + ], + "misnested-with-i": [ + "[fieldset=Legend][i]text[/fieldset] tail[/i]", + "
    \n\nLegend\n
    text
    \n
    \ntail" + ], + "nested-in-itself": [ + "[fieldset=Legend]outer [fieldset=Legend]inner[/fieldset] outer[/fieldset]", + "
    \n\nLegend\n
    outer
    Legend
    inner
    outer
    \n
    " + ], + "repeated": [ + "[fieldset=Legend]one[/fieldset][fieldset=Legend]two[/fieldset] [fieldset=Legend]three[/fieldset]", + "
    \n\nLegend\n
    one
    \n
    \n
    \n\nLegend\n
    two
    \n
    \n
    \n\nLegend\n
    three
    \n
    " + ], + "tail-and-next-line": [ + "[fieldset=Legend]text[/fieldset] tail\nnext line", + "
    \n\nLegend\n
    text
    \n
    \ntail
    next line" + ], + "blank-lines-around": [ + "before\n\n\n[fieldset=Legend]text[/fieldset]\n\n\nafter", + "before


    \n\nLegend\n
    text
    \n
    \n


    after" + ], + "unclosed": [ + "[fieldset=Legend]text", + "[fieldset=Legend]text" + ], + "unmatched-close": [ + "text[/fieldset]", + "text[/fieldset]" + ], + "escaped": [ + "\\[fieldset=Legend]text[/fieldset]", + "[fieldset=Legend]text[/fieldset]" + ], + "uppercase": [ + "[FIELDSET=Legend]text[/FIELDSET]", + "
    \n\nLegend\n
    text
    \n
    " + ], + "[fieldset] alone": [ + "[fieldset]text[/fieldset]", + "
    \n\n
    text
    \n
    " + ], + "[fieldset] own-lines": [ + "[fieldset]\ntext\n[/fieldset]", + "
    \n\n
    \n
    \ntext
    \n
    \n
    " + ] + }, + "tag-font": { + "alone": [ + "[font=Georgia]text[/font]", + "text" + ], + "empty": [ + "[font=Georgia][/font]", + "" + ], + "mid-line": [ + "before [font=Georgia]text[/font] after", + "before text after" + ], + "own-lines": [ + "[font=Georgia]\ntext\n[/font]", + "
    \ntext
    \n
    " + ], + "own-lines-between-text": [ + "before\n[font=Georgia]\ntext\n[/font]\nafter", + "before
    \n
    \ntext
    \n

    \nafter" + ], + "starts-mid-line-spans-lines": [ + "before [font=Georgia]text\nmore[/font] after", + "before text
    \nmore
    after" + ], + "blank-line-inside": [ + "[font=Georgia]\ntext\n\nsecond paragraph\n[/font]", + "
    \ntext
    \n
    \nsecond paragraph
    \n
    " + ], + "markdown-blocks-inside": [ + "[font=Georgia]\n## Heading\n\n- one\n- two\n\n> quoted\n[/font]", + "
    \n
    \n

    Heading

    \n
      \n
    • one
    • \n
    • two
    • \n
    \n
    \nquoted
    \n
    \n
    " + ], + "inline-markdown-inside": [ + "[font=Georgia]**bold** _italic_ `code` [link](https://example.com) :smile:[/font]", + "bold italic code link \":smile:\"" + ], + "in-blockquote": [ + "> [font=Georgia]\n> text\n> [/font]", + "
    \n
    \ntext
    \n
    " + ], + "in-list-item": [ + "- [font=Georgia]\n text\n [/font]\n- next", + "
      \n

    • \ntext
      \n
    • \n
    • next
    • \n
    " + ], + "in-table-cell": [ + "| head |\n|---|\n| [font=Georgia]text[/font] |", + "
    \n\n\n\n\n\n\n\n\n\n\n\n
    head
    text
    \n
    " + ], + "in-heading": [ + "## [font=Georgia]text[/font]", + "

    text

    " + ], + "around-b": [ + "[font=Georgia][b]text[/b][/font]", + "text" + ], + "in-b": [ + "[b]before [font=Georgia]text[/font] after[/b]", + "before text after" + ], + "in-core-quote": [ + "[quote]\n[font=Georgia]text[/font]\n[/quote]", + "" + ], + "misnested-with-i": [ + "[font=Georgia][i]text[/font] tail[/i]", + "text tail" + ], + "nested-in-itself": [ + "[font=Georgia]outer [font=Georgia]inner[/font] outer[/font]", + "outer inner outer" + ], + "repeated": [ + "[font=Georgia]one[/font][font=Georgia]two[/font] [font=Georgia]three[/font]", + "onetwo three" + ], + "tail-and-next-line": [ + "[font=Georgia]text[/font] tail\nnext line", + "text tail
    \nnext line" + ], + "blank-lines-around": [ + "before\n\n\n[font=Georgia]text[/font]\n\n\nafter", + "before


    text


    after" + ], + "unclosed": [ + "[font=Georgia]text", + "[font=Georgia]text" + ], + "unmatched-close": [ + "text[/font]", + "text[/font]" + ], + "escaped": [ + "\\[font=Georgia]text[/font]", + "[font=Georgia]text[/font]" + ], + "uppercase": [ + "[FONT=Georgia]text[/FONT]", + "text" + ], + "[font=Open Sans] alone": [ + "[font=Open Sans]text[/font]", + "text" + ], + "[font=Open Sans] own-lines": [ + "[font=Open Sans]\ntext\n[/font]", + "
    \ntext
    \n
    " + ], + "[font=Lato style=bold] alone": [ + "[font=Lato style=bold]text[/font]", + "text" + ], + "[font=Lato style=bold] own-lines": [ + "[font=Lato style=bold]\ntext\n[/font]", + "
    \ntext
    \n
    " + ], + "[font family=Roboto wght=300] alone": [ + "[font family=Roboto wght=300]text[/font]", + "text" + ], + "[font family=Roboto wght=300] own-lines": [ + "[font family=Roboto wght=300]\ntext\n[/font]", + "
    \ntext
    \n
    " + ], + "[font=Arial size=3] alone": [ + "[font=Arial size=3]text[/font]", + "text" + ], + "[font=Arial size=3] own-lines": [ + "[font=Arial size=3]\ntext\n[/font]", + "
    \ntext
    \n
    " + ] + }, + "tag-goto": { + "alone": [ + "[goto=top]text[/goto]", + "text" + ], + "empty": [ + "[goto=top][/goto]", + "" + ], + "mid-line": [ + "before [goto=top]text[/goto] after", + "before text after" + ], + "own-lines": [ + "[goto=top]\ntext\n[/goto]", + "
    \ntext
    \n
    " + ], + "own-lines-between-text": [ + "before\n[goto=top]\ntext\n[/goto]\nafter", + "before
    \n
    \ntext
    \n

    \nafter" + ], + "starts-mid-line-spans-lines": [ + "before [goto=top]text\nmore[/goto] after", + "before text
    \nmore
    after" + ], + "blank-line-inside": [ + "[goto=top]\ntext\n\nsecond paragraph\n[/goto]", + "
    \ntext
    \n
    \nsecond paragraph
    \n
    " + ], + "markdown-blocks-inside": [ + "[goto=top]\n## Heading\n\n- one\n- two\n\n> quoted\n[/goto]", + "
    \n## Heading
    \n
    \n- one
    \n- two
    \n
    \n> quoted
    \n
    " + ], + "inline-markdown-inside": [ + "[goto=top]**bold** _italic_ `code` [link](https://example.com) :smile:[/goto]", + "bold italic code link \":smile:\"" + ], + "in-blockquote": [ + "> [goto=top]\n> text\n> [/goto]", + "
    \n
    \ntext
    \n
    " + ], + "in-list-item": [ + "- [goto=top]\n text\n [/goto]\n- next", + "" + ], + "in-table-cell": [ + "| head |\n|---|\n| [goto=top]text[/goto] |", + "
    \n\n\n\n\n\n\n\n\n\n\n\n
    head
    text
    \n
    " + ], + "in-heading": [ + "## [goto=top]text[/goto]", + "

    text

    " + ], + "around-b": [ + "[goto=top][b]text[/b][/goto]", + "text" + ], + "in-b": [ + "[b]before [goto=top]text[/goto] after[/b]", + "before text after" + ], + "in-core-quote": [ + "[quote]\n[goto=top]text[/goto]\n[/quote]", + "" + ], + "misnested-with-i": [ + "[goto=top][i]text[/goto] tail[/i]", + "text tail" + ], + "nested-in-itself": [ + "[goto=top]outer [goto=top]inner[/goto] outer[/goto]", + "outer inner outer" + ], + "repeated": [ + "[goto=top]one[/goto][goto=top]two[/goto] [goto=top]three[/goto]", + "onetwo three" + ], + "tail-and-next-line": [ + "[goto=top]text[/goto] tail\nnext line", + "text tail
    \nnext line" + ], + "blank-lines-around": [ + "before\n\n\n[goto=top]text[/goto]\n\n\nafter", + "before


    text


    after" + ], + "unclosed": [ + "[goto=top]text", + "[goto=top]text" + ], + "unmatched-close": [ + "text[/goto]", + "text[/goto]" + ], + "escaped": [ + "\\[goto=top]text[/goto]", + "[goto=top]text[/goto]" + ], + "uppercase": [ + "[GOTO=top]text[/GOTO]", + "text" + ] + }, + "tag-h": { + "alone": [ + "[h]text[/h]", + "

    text

    " + ], + "empty": [ + "[h][/h]", + "

    " + ], + "mid-line": [ + "before [h]text[/h] after", + "before

    text

    after" + ], + "own-lines": [ + "[h]\ntext\n[/h]", + "

    \n
    \ntext
    \n

    " + ], + "own-lines-between-text": [ + "before\n[h]\ntext\n[/h]\nafter", + "before

    \n
    \ntext
    \n

    \n
    after" + ], + "starts-mid-line-spans-lines": [ + "before [h]text\nmore[/h] after", + "before

    \ntext
    \nmore

    \nafter" + ], + "blank-line-inside": [ + "[h]\ntext\n\nsecond paragraph\n[/h]", + "

    \n
    \ntext

    second paragraph
    \n

    " + ], + "markdown-blocks-inside": [ + "[h]\n## Heading\n\n- one\n- two\n\n> quoted\n[/h]", + "

    \n
    \n

    Heading

    \n
      \n
    • one
    • \n
    • two
    • \n
    \n
    \nquoted
    \n
    \n

    " + ], + "inline-markdown-inside": [ + "[h]**bold** _italic_ `code` [link](https://example.com) :smile:[/h]", + "

    bold italic code link \":smile:\"

    " + ], + "in-blockquote": [ + "> [h]\n> text\n> [/h]", + "
    \n

    \n
    \ntext
    \n

    \n
    " + ], + "in-list-item": [ + "- [h]\n text\n [/h]\n- next", + "
      \n
    • \n

      \n
      \ntext
      \n

      \n
    • \n
    • next
    • \n
    " + ], + "in-table-cell": [ + "| head |\n|---|\n| [h]text[/h] |", + "
    \n\n\n\n\n\n\n\n\n\n\n\n
    head

    text

    \n
    " + ], + "in-heading": [ + "## [h]text[/h]", + "

    text

    " + ], + "around-b": [ + "[h][b]text[/b][/h]", + "

    text

    " + ], + "in-b": [ + "[b]before [h]text[/h] after[/b]", + "before

    text

    after
    " + ], + "in-core-quote": [ + "[quote]\n[h]text[/h]\n[/quote]", + "" + ], + "misnested-with-i": [ + "[h][i]text[/h] tail[/i]", + "

    text

    \ntail" + ], + "nested-in-itself": [ + "[h]outer [h]inner[/h] outer[/h]", + "

    outer

    inner

    outer" + ], + "repeated": [ + "[h]one[/h][h]two[/h] [h]three[/h]", + "

    one

    \n

    two

    \n

    three

    " + ], + "tail-and-next-line": [ + "[h]text[/h] tail\nnext line", + "

    text

    \ntail
    next line" + ], + "blank-lines-around": [ + "before\n\n\n[h]text[/h]\n\n\nafter", + "before


    text

    \n


    after" + ], + "unclosed": [ + "[h]text", + "[h]text" + ], + "unmatched-close": [ + "text[/h]", + "text[/h]" + ], + "escaped": [ + "\\[h]text[/h]", + "[h]text[/h]" + ], + "uppercase": [ + "[H]text[/H]", + "

    text

    " + ] + }, + "tag-h1": { + "alone": [ + "[h1]text[/h1]", + "

    text

    " + ], + "empty": [ + "[h1][/h1]", + "

    " + ], + "mid-line": [ + "before [h1]text[/h1] after", + "before

    text

    after" + ], + "own-lines": [ + "[h1]\ntext\n[/h1]", + "

    \n
    \ntext
    \n

    " + ], + "own-lines-between-text": [ + "before\n[h1]\ntext\n[/h1]\nafter", + "before

    \n
    \ntext
    \n

    \n
    after" + ], + "starts-mid-line-spans-lines": [ + "before [h1]text\nmore[/h1] after", + "before

    \ntext
    \nmore

    \nafter" + ], + "blank-line-inside": [ + "[h1]\ntext\n\nsecond paragraph\n[/h1]", + "

    \n
    \ntext

    second paragraph
    \n

    " + ], + "markdown-blocks-inside": [ + "[h1]\n## Heading\n\n- one\n- two\n\n> quoted\n[/h1]", + "

    \n
    \n

    Heading

    \n
      \n
    • one
    • \n
    • two
    • \n
    \n
    \nquoted
    \n
    \n" + ], + "inline-markdown-inside": [ + "[h1]**bold** _italic_ `code` [link](https://example.com) :smile:[/h1]", + "

    bold italic code link \":smile:\"

    " + ], + "in-blockquote": [ + "> [h1]\n> text\n> [/h1]", + "
    \n

    \n
    \ntext
    \n

    \n
    " + ], + "in-list-item": [ + "- [h1]\n text\n [/h1]\n- next", + "
      \n
    • \n

      \n
      \ntext
      \n

      \n
    • \n
    • next
    • \n
    " + ], + "in-table-cell": [ + "| head |\n|---|\n| [h1]text[/h1] |", + "
    \n\n\n\n\n\n\n\n\n\n\n\n
    head

    text

    \n
    " + ], + "in-heading": [ + "## [h1]text[/h1]", + "

    text

    " + ], + "around-b": [ + "[h1][b]text[/b][/h1]", + "

    text

    " + ], + "in-b": [ + "[b]before [h1]text[/h1] after[/b]", + "before

    text

    after
    " + ], + "in-core-quote": [ + "[quote]\n[h1]text[/h1]\n[/quote]", + "" + ], + "misnested-with-i": [ + "[h1][i]text[/h1] tail[/i]", + "

    text

    \ntail" + ], + "nested-in-itself": [ + "[h1]outer [h1]inner[/h1] outer[/h1]", + "

    outer

    inner

    outer" + ], + "repeated": [ + "[h1]one[/h1][h1]two[/h1] [h1]three[/h1]", + "

    one

    \n

    two

    \n

    three

    " + ], + "tail-and-next-line": [ + "[h1]text[/h1] tail\nnext line", + "

    text

    \ntail
    next line" + ], + "blank-lines-around": [ + "before\n\n\n[h1]text[/h1]\n\n\nafter", + "before


    text

    \n


    after" + ], + "unclosed": [ + "[h1]text", + "[h1]text" + ], + "unmatched-close": [ + "text[/h1]", + "text[/h1]" + ], + "escaped": [ + "\\[h1]text[/h1]", + "[h1]text[/h1]" + ], + "uppercase": [ + "[H1]text[/H1]", + "

    text

    " + ] + }, + "tag-h2": { + "alone": [ + "[h2]text[/h2]", + "

    text

    " + ], + "empty": [ + "[h2][/h2]", + "

    " + ], + "mid-line": [ + "before [h2]text[/h2] after", + "before

    text

    after" + ], + "own-lines": [ + "[h2]\ntext\n[/h2]", + "

    \n
    \ntext
    \n

    " + ], + "own-lines-between-text": [ + "before\n[h2]\ntext\n[/h2]\nafter", + "before

    \n
    \ntext
    \n

    \n
    after" + ], + "starts-mid-line-spans-lines": [ + "before [h2]text\nmore[/h2] after", + "before

    \ntext
    \nmore

    \nafter" + ], + "blank-line-inside": [ + "[h2]\ntext\n\nsecond paragraph\n[/h2]", + "

    \n
    \ntext

    second paragraph
    \n

    " + ], + "markdown-blocks-inside": [ + "[h2]\n## Heading\n\n- one\n- two\n\n> quoted\n[/h2]", + "

    \n
    \n

    Heading

    \n
      \n
    • one
    • \n
    • two
    • \n
    \n
    \nquoted
    \n
    \n" + ], + "inline-markdown-inside": [ + "[h2]**bold** _italic_ `code` [link](https://example.com) :smile:[/h2]", + "

    bold italic code link \":smile:\"

    " + ], + "in-blockquote": [ + "> [h2]\n> text\n> [/h2]", + "
    \n

    \n
    \ntext
    \n

    \n
    " + ], + "in-list-item": [ + "- [h2]\n text\n [/h2]\n- next", + "
      \n
    • \n

      \n
      \ntext
      \n

      \n
    • \n
    • next
    • \n
    " + ], + "in-table-cell": [ + "| head |\n|---|\n| [h2]text[/h2] |", + "
    \n\n\n\n\n\n\n\n\n\n\n\n
    head

    text

    \n
    " + ], + "in-heading": [ + "## [h2]text[/h2]", + "

    text

    " + ], + "around-b": [ + "[h2][b]text[/b][/h2]", + "

    text

    " + ], + "in-b": [ + "[b]before [h2]text[/h2] after[/b]", + "before

    text

    after
    " + ], + "in-core-quote": [ + "[quote]\n[h2]text[/h2]\n[/quote]", + "" + ], + "misnested-with-i": [ + "[h2][i]text[/h2] tail[/i]", + "

    text

    \ntail" + ], + "nested-in-itself": [ + "[h2]outer [h2]inner[/h2] outer[/h2]", + "

    outer

    inner

    outer" + ], + "repeated": [ + "[h2]one[/h2][h2]two[/h2] [h2]three[/h2]", + "

    one

    \n

    two

    \n

    three

    " + ], + "tail-and-next-line": [ + "[h2]text[/h2] tail\nnext line", + "

    text

    \ntail
    next line" + ], + "blank-lines-around": [ + "before\n\n\n[h2]text[/h2]\n\n\nafter", + "before


    text

    \n


    after" + ], + "unclosed": [ + "[h2]text", + "[h2]text" + ], + "unmatched-close": [ + "text[/h2]", + "text[/h2]" + ], + "escaped": [ + "\\[h2]text[/h2]", + "[h2]text[/h2]" + ], + "uppercase": [ + "[H2]text[/H2]", + "

    text

    " + ] + }, + "tag-h3": { + "alone": [ + "[h3]text[/h3]", + "

    text

    " + ], + "empty": [ + "[h3][/h3]", + "

    " + ], + "mid-line": [ + "before [h3]text[/h3] after", + "before

    text

    after" + ], + "own-lines": [ + "[h3]\ntext\n[/h3]", + "

    \n
    \ntext
    \n

    " + ], + "own-lines-between-text": [ + "before\n[h3]\ntext\n[/h3]\nafter", + "before

    \n
    \ntext
    \n

    \n
    after" + ], + "starts-mid-line-spans-lines": [ + "before [h3]text\nmore[/h3] after", + "before

    \ntext
    \nmore

    \nafter" + ], + "blank-line-inside": [ + "[h3]\ntext\n\nsecond paragraph\n[/h3]", + "

    \n
    \ntext

    second paragraph
    \n

    " + ], + "markdown-blocks-inside": [ + "[h3]\n## Heading\n\n- one\n- two\n\n> quoted\n[/h3]", + "

    \n
    \n

    Heading

    \n
      \n
    • one
    • \n
    • two
    • \n
    \n
    \nquoted
    \n
    \n" + ], + "inline-markdown-inside": [ + "[h3]**bold** _italic_ `code` [link](https://example.com) :smile:[/h3]", + "

    bold italic code link \":smile:\"

    " + ], + "in-blockquote": [ + "> [h3]\n> text\n> [/h3]", + "
    \n

    \n
    \ntext
    \n

    \n
    " + ], + "in-list-item": [ + "- [h3]\n text\n [/h3]\n- next", + "
      \n
    • \n

      \n
      \ntext
      \n

      \n
    • \n
    • next
    • \n
    " + ], + "in-table-cell": [ + "| head |\n|---|\n| [h3]text[/h3] |", + "
    \n\n\n\n\n\n\n\n\n\n\n\n
    head

    text

    \n
    " + ], + "in-heading": [ + "## [h3]text[/h3]", + "

    text

    " + ], + "around-b": [ + "[h3][b]text[/b][/h3]", + "

    text

    " + ], + "in-b": [ + "[b]before [h3]text[/h3] after[/b]", + "before

    text

    after
    " + ], + "in-core-quote": [ + "[quote]\n[h3]text[/h3]\n[/quote]", + "" + ], + "misnested-with-i": [ + "[h3][i]text[/h3] tail[/i]", + "

    text

    \ntail" + ], + "nested-in-itself": [ + "[h3]outer [h3]inner[/h3] outer[/h3]", + "

    outer

    inner

    outer" + ], + "repeated": [ + "[h3]one[/h3][h3]two[/h3] [h3]three[/h3]", + "

    one

    \n

    two

    \n

    three

    " + ], + "tail-and-next-line": [ + "[h3]text[/h3] tail\nnext line", + "

    text

    \ntail
    next line" + ], + "blank-lines-around": [ + "before\n\n\n[h3]text[/h3]\n\n\nafter", + "before


    text

    \n


    after" + ], + "unclosed": [ + "[h3]text", + "[h3]text" + ], + "unmatched-close": [ + "text[/h3]", + "text[/h3]" + ], + "escaped": [ + "\\[h3]text[/h3]", + "[h3]text[/h3]" + ], + "uppercase": [ + "[H3]text[/H3]", + "

    text

    " + ] + }, + "tag-h4": { + "alone": [ + "[h4]text[/h4]", + "

    text

    " + ], + "empty": [ + "[h4][/h4]", + "

    " + ], + "mid-line": [ + "before [h4]text[/h4] after", + "before

    text

    after" + ], + "own-lines": [ + "[h4]\ntext\n[/h4]", + "

    \n
    \ntext
    \n

    " + ], + "own-lines-between-text": [ + "before\n[h4]\ntext\n[/h4]\nafter", + "before

    \n
    \ntext
    \n

    \n
    after" + ], + "starts-mid-line-spans-lines": [ + "before [h4]text\nmore[/h4] after", + "before

    \ntext
    \nmore

    \nafter" + ], + "blank-line-inside": [ + "[h4]\ntext\n\nsecond paragraph\n[/h4]", + "

    \n
    \ntext

    second paragraph
    \n

    " + ], + "markdown-blocks-inside": [ + "[h4]\n## Heading\n\n- one\n- two\n\n> quoted\n[/h4]", + "

    \n
    \n

    Heading

    \n
      \n
    • one
    • \n
    • two
    • \n
    \n
    \nquoted
    \n
    \n" + ], + "inline-markdown-inside": [ + "[h4]**bold** _italic_ `code` [link](https://example.com) :smile:[/h4]", + "

    bold italic code link \":smile:\"

    " + ], + "in-blockquote": [ + "> [h4]\n> text\n> [/h4]", + "
    \n

    \n
    \ntext
    \n

    \n
    " + ], + "in-list-item": [ + "- [h4]\n text\n [/h4]\n- next", + "
      \n
    • \n

      \n
      \ntext
      \n

      \n
    • \n
    • next
    • \n
    " + ], + "in-table-cell": [ + "| head |\n|---|\n| [h4]text[/h4] |", + "
    \n\n\n\n\n\n\n\n\n\n\n\n
    head

    text

    \n
    " + ], + "in-heading": [ + "## [h4]text[/h4]", + "

    text

    " + ], + "around-b": [ + "[h4][b]text[/b][/h4]", + "

    text

    " + ], + "in-b": [ + "[b]before [h4]text[/h4] after[/b]", + "before

    text

    after
    " + ], + "in-core-quote": [ + "[quote]\n[h4]text[/h4]\n[/quote]", + "" + ], + "misnested-with-i": [ + "[h4][i]text[/h4] tail[/i]", + "

    text

    \ntail" + ], + "nested-in-itself": [ + "[h4]outer [h4]inner[/h4] outer[/h4]", + "

    outer

    inner

    outer" + ], + "repeated": [ + "[h4]one[/h4][h4]two[/h4] [h4]three[/h4]", + "

    one

    \n

    two

    \n

    three

    " + ], + "tail-and-next-line": [ + "[h4]text[/h4] tail\nnext line", + "

    text

    \ntail
    next line" + ], + "blank-lines-around": [ + "before\n\n\n[h4]text[/h4]\n\n\nafter", + "before


    text

    \n


    after" + ], + "unclosed": [ + "[h4]text", + "[h4]text" + ], + "unmatched-close": [ + "text[/h4]", + "text[/h4]" + ], + "escaped": [ + "\\[h4]text[/h4]", + "[h4]text[/h4]" + ], + "uppercase": [ + "[H4]text[/H4]", + "

    text

    " + ] + }, + "tag-h5": { + "alone": [ + "[h5]text[/h5]", + "
    text
    " + ], + "empty": [ + "[h5][/h5]", + "
    " + ], + "mid-line": [ + "before [h5]text[/h5] after", + "before
    text
    after" + ], + "own-lines": [ + "[h5]\ntext\n[/h5]", + "
    \n
    \ntext
    \n
    " + ], + "own-lines-between-text": [ + "before\n[h5]\ntext\n[/h5]\nafter", + "before
    \n
    \ntext
    \n
    \n
    after" + ], + "starts-mid-line-spans-lines": [ + "before [h5]text\nmore[/h5] after", + "before
    \ntext
    \nmore
    \nafter" + ], + "blank-line-inside": [ + "[h5]\ntext\n\nsecond paragraph\n[/h5]", + "
    \n
    \ntext

    second paragraph
    \n
    " + ], + "markdown-blocks-inside": [ + "[h5]\n## Heading\n\n- one\n- two\n\n> quoted\n[/h5]", + "
    \n
    \n

    Heading

    \n
      \n
    • one
    • \n
    • two
    • \n
    \n
    \nquoted
    \n
    \n" + ], + "inline-markdown-inside": [ + "[h5]**bold** _italic_ `code` [link](https://example.com) :smile:[/h5]", + "
    bold italic code link \":smile:\"
    " + ], + "in-blockquote": [ + "> [h5]\n> text\n> [/h5]", + "
    \n
    \n
    \ntext
    \n
    \n
    " + ], + "in-list-item": [ + "- [h5]\n text\n [/h5]\n- next", + "
      \n
    • \n
      \n
      \ntext
      \n
      \n
    • \n
    • next
    • \n
    " + ], + "in-table-cell": [ + "| head |\n|---|\n| [h5]text[/h5] |", + "
    \n\n\n\n\n\n\n\n\n\n\n\n
    head
    text
    \n
    " + ], + "in-heading": [ + "## [h5]text[/h5]", + "

    text
    " + ], + "around-b": [ + "[h5][b]text[/b][/h5]", + "
    text
    " + ], + "in-b": [ + "[b]before [h5]text[/h5] after[/b]", + "before
    text
    after
    " + ], + "in-core-quote": [ + "[quote]\n[h5]text[/h5]\n[/quote]", + "" + ], + "misnested-with-i": [ + "[h5][i]text[/h5] tail[/i]", + "
    text
    \ntail" + ], + "nested-in-itself": [ + "[h5]outer [h5]inner[/h5] outer[/h5]", + "
    outer
    inner
    outer" + ], + "repeated": [ + "[h5]one[/h5][h5]two[/h5] [h5]three[/h5]", + "
    one
    \n
    two
    \n
    three
    " + ], + "tail-and-next-line": [ + "[h5]text[/h5] tail\nnext line", + "
    text
    \ntail
    next line" + ], + "blank-lines-around": [ + "before\n\n\n[h5]text[/h5]\n\n\nafter", + "before


    text
    \n


    after" + ], + "unclosed": [ + "[h5]text", + "[h5]text" + ], + "unmatched-close": [ + "text[/h5]", + "text[/h5]" + ], + "escaped": [ + "\\[h5]text[/h5]", + "[h5]text[/h5]" + ], + "uppercase": [ + "[H5]text[/H5]", + "
    text
    " + ] + }, + "tag-h6": { + "alone": [ + "[h6]text[/h6]", + "
    text
    " + ], + "empty": [ + "[h6][/h6]", + "
    " + ], + "mid-line": [ + "before [h6]text[/h6] after", + "before
    text
    after" + ], + "own-lines": [ + "[h6]\ntext\n[/h6]", + "
    \n
    \ntext
    \n
    " + ], + "own-lines-between-text": [ + "before\n[h6]\ntext\n[/h6]\nafter", + "before
    \n
    \ntext
    \n
    \n
    after" + ], + "starts-mid-line-spans-lines": [ + "before [h6]text\nmore[/h6] after", + "before
    \ntext
    \nmore
    \nafter" + ], + "blank-line-inside": [ + "[h6]\ntext\n\nsecond paragraph\n[/h6]", + "
    \n
    \ntext

    second paragraph
    \n
    " + ], + "markdown-blocks-inside": [ + "[h6]\n## Heading\n\n- one\n- two\n\n> quoted\n[/h6]", + "
    \n
    \n

    Heading

    \n
      \n
    • one
    • \n
    • two
    • \n
    \n
    \nquoted
    \n
    \n" + ], + "inline-markdown-inside": [ + "[h6]**bold** _italic_ `code` [link](https://example.com) :smile:[/h6]", + "
    bold italic code link \":smile:\"
    " + ], + "in-blockquote": [ + "> [h6]\n> text\n> [/h6]", + "
    \n
    \n
    \ntext
    \n
    \n
    " + ], + "in-list-item": [ + "- [h6]\n text\n [/h6]\n- next", + "
      \n
    • \n
      \n
      \ntext
      \n
      \n
    • \n
    • next
    • \n
    " + ], + "in-table-cell": [ + "| head |\n|---|\n| [h6]text[/h6] |", + "
    \n\n\n\n\n\n\n\n\n\n\n\n
    head
    text
    \n
    " + ], + "in-heading": [ + "## [h6]text[/h6]", + "

    text
    " + ], + "around-b": [ + "[h6][b]text[/b][/h6]", + "
    text
    " + ], + "in-b": [ + "[b]before [h6]text[/h6] after[/b]", + "before
    text
    after
    " + ], + "in-core-quote": [ + "[quote]\n[h6]text[/h6]\n[/quote]", + "" + ], + "misnested-with-i": [ + "[h6][i]text[/h6] tail[/i]", + "
    text
    \ntail" + ], + "nested-in-itself": [ + "[h6]outer [h6]inner[/h6] outer[/h6]", + "
    outer
    inner
    outer" + ], + "repeated": [ + "[h6]one[/h6][h6]two[/h6] [h6]three[/h6]", + "
    one
    \n
    two
    \n
    three
    " + ], + "tail-and-next-line": [ + "[h6]text[/h6] tail\nnext line", + "
    text
    \ntail
    next line" + ], + "blank-lines-around": [ + "before\n\n\n[h6]text[/h6]\n\n\nafter", + "before


    text
    \n


    after" + ], + "unclosed": [ + "[h6]text", + "[h6]text" + ], + "unmatched-close": [ + "text[/h6]", + "text[/h6]" + ], + "escaped": [ + "\\[h6]text[/h6]", + "[h6]text[/h6]" + ], + "uppercase": [ + "[H6]text[/H6]", + "
    text
    " + ] + }, + "tag-heightrestrict": { + "alone": [ + "[heightrestrict=100]text[/heightrestrict]", + "
    text
    " + ], + "empty": [ + "[heightrestrict=100][/heightrestrict]", + "
    " + ], + "mid-line": [ + "before [heightrestrict=100]text[/heightrestrict] after", + "before
    text
    after" + ], + "own-lines": [ + "[heightrestrict=100]\ntext\n[/heightrestrict]", + "
    \n
    \ntext
    \n
    " + ], + "own-lines-between-text": [ + "before\n[heightrestrict=100]\ntext\n[/heightrestrict]\nafter", + "before
    \n
    \ntext
    \n
    \n
    after" + ], + "starts-mid-line-spans-lines": [ + "before [heightrestrict=100]text\nmore[/heightrestrict] after", + "before
    \ntext
    \nmore
    \nafter" + ], + "blank-line-inside": [ + "[heightrestrict=100]\ntext\n\nsecond paragraph\n[/heightrestrict]", + "
    \n
    \ntext

    second paragraph
    \n
    " + ], + "markdown-blocks-inside": [ + "[heightrestrict=100]\n## Heading\n\n- one\n- two\n\n> quoted\n[/heightrestrict]", + "
    \n
    \n

    Heading

    \n
      \n
    • one
    • \n
    • two
    • \n
    \n
    \nquoted
    \n
    \n
    " + ], + "inline-markdown-inside": [ + "[heightrestrict=100]**bold** _italic_ `code` [link](https://example.com) :smile:[/heightrestrict]", + "
    bold italic code link \":smile:\"
    " + ], + "in-blockquote": [ + "> [heightrestrict=100]\n> text\n> [/heightrestrict]", + "
    \n
    \n
    \ntext
    \n
    \n
    " + ], + "in-list-item": [ + "- [heightrestrict=100]\n text\n [/heightrestrict]\n- next", + "
      \n
    • \n
      \n
      \ntext
      \n
      \n
    • \n
    • next
    • \n
    " + ], + "in-table-cell": [ + "| head |\n|---|\n| [heightrestrict=100]text[/heightrestrict] |", + "
    \n\n\n\n\n\n\n\n\n\n\n\n
    head
    text
    \n
    " + ], + "in-heading": [ + "## [heightrestrict=100]text[/heightrestrict]", + "

    text

    " + ], + "around-b": [ + "[heightrestrict=100][b]text[/b][/heightrestrict]", + "
    text
    " + ], + "in-b": [ + "[b]before [heightrestrict=100]text[/heightrestrict] after[/b]", + "before
    text
    after
    " + ], + "in-core-quote": [ + "[quote]\n[heightrestrict=100]text[/heightrestrict]\n[/quote]", + "" + ], + "misnested-with-i": [ + "[heightrestrict=100][i]text[/heightrestrict] tail[/i]", + "
    text
    \ntail" + ], + "nested-in-itself": [ + "[heightrestrict=100]outer [heightrestrict=100]inner[/heightrestrict] outer[/heightrestrict]", + "
    outer
    inner
    outer
    " + ], + "repeated": [ + "[heightrestrict=100]one[/heightrestrict][heightrestrict=100]two[/heightrestrict] [heightrestrict=100]three[/heightrestrict]", + "
    one
    \n
    two
    \n
    three
    " + ], + "tail-and-next-line": [ + "[heightrestrict=100]text[/heightrestrict] tail\nnext line", + "
    text
    \ntail
    next line" + ], + "blank-lines-around": [ + "before\n\n\n[heightrestrict=100]text[/heightrestrict]\n\n\nafter", + "before


    text
    \n


    after" + ], + "unclosed": [ + "[heightrestrict=100]text", + "[heightrestrict=100]text" + ], + "unmatched-close": [ + "text[/heightrestrict]", + "text[/heightrestrict]" + ], + "escaped": [ + "\\[heightrestrict=100]text[/heightrestrict]", + "[heightrestrict=100]text[/heightrestrict]" + ], + "uppercase": [ + "[HEIGHTRESTRICT=100]text[/HEIGHTRESTRICT]", + "
    text
    " + ], + "[heightrestrict] alone": [ + "[heightrestrict]text[/heightrestrict]", + "
    text
    " + ], + "[heightrestrict] own-lines": [ + "[heightrestrict]\ntext\n[/heightrestrict]", + "
    \n
    \ntext
    \n
    " + ], + "[heightrestrict=0] alone": [ + "[heightrestrict=0]text[/heightrestrict]", + "
    text
    " + ], + "[heightrestrict=0] own-lines": [ + "[heightrestrict=0]\ntext\n[/heightrestrict]", + "
    \n
    \ntext
    \n
    " + ], + "[heightrestrict=9999] alone": [ + "[heightrestrict=9999]text[/heightrestrict]", + "
    text
    " + ], + "[heightrestrict=9999] own-lines": [ + "[heightrestrict=9999]\ntext\n[/heightrestrict]", + "
    \n
    \ntext
    \n
    " + ], + "[heightrestrict=-5] alone": [ + "[heightrestrict=-5]text[/heightrestrict]", + "
    text
    " + ], + "[heightrestrict=-5] own-lines": [ + "[heightrestrict=-5]\ntext\n[/heightrestrict]", + "
    \n
    \ntext
    \n
    " + ], + "[heightrestrict=abc] alone": [ + "[heightrestrict=abc]text[/heightrestrict]", + "
    text
    " + ], + "[heightrestrict=abc] own-lines": [ + "[heightrestrict=abc]\ntext\n[/heightrestrict]", + "
    \n
    \ntext
    \n
    " + ] + }, + "tag-highlight": { + "alone": [ + "[highlight]text[/highlight]", + "text" + ], + "empty": [ + "[highlight][/highlight]", + "" + ], + "mid-line": [ + "before [highlight]text[/highlight] after", + "before text after" + ], + "own-lines": [ + "[highlight]\ntext\n[/highlight]", + "
    \ntext
    \n
    " + ], + "own-lines-between-text": [ + "before\n[highlight]\ntext\n[/highlight]\nafter", + "before
    \n
    \ntext
    \n

    \nafter" + ], + "starts-mid-line-spans-lines": [ + "before [highlight]text\nmore[/highlight] after", + "before text
    \nmore
    after" + ], + "blank-line-inside": [ + "[highlight]\ntext\n\nsecond paragraph\n[/highlight]", + "
    \ntext
    \n
    \nsecond paragraph
    \n
    " + ], + "markdown-blocks-inside": [ + "[highlight]\n## Heading\n\n- one\n- two\n\n> quoted\n[/highlight]", + "
    \n
    \n

    Heading

    \n
      \n
    • one
    • \n
    • two
    • \n
    \n
    \nquoted
    \n
    \n
    " + ], + "inline-markdown-inside": [ + "[highlight]**bold** _italic_ `code` [link](https://example.com) :smile:[/highlight]", + "bold italic code link \":smile:\"" + ], + "in-blockquote": [ + "> [highlight]\n> text\n> [/highlight]", + "
    \n
    \ntext
    \n
    " + ], + "in-list-item": [ + "- [highlight]\n text\n [/highlight]\n- next", + "
      \n

    • \ntext
      \n
    • \n
    • next
    • \n
    " + ], + "in-table-cell": [ + "| head |\n|---|\n| [highlight]text[/highlight] |", + "
    \n\n\n\n\n\n\n\n\n\n\n\n
    head
    text
    \n
    " + ], + "in-heading": [ + "## [highlight]text[/highlight]", + "

    text

    " + ], + "around-b": [ + "[highlight][b]text[/b][/highlight]", + "text" + ], + "in-b": [ + "[b]before [highlight]text[/highlight] after[/b]", + "before text after" + ], + "in-core-quote": [ + "[quote]\n[highlight]text[/highlight]\n[/quote]", + "" + ], + "misnested-with-i": [ + "[highlight][i]text[/highlight] tail[/i]", + "text tail" + ], + "nested-in-itself": [ + "[highlight]outer [highlight]inner[/highlight] outer[/highlight]", + "outer inner outer" + ], + "repeated": [ + "[highlight]one[/highlight][highlight]two[/highlight] [highlight]three[/highlight]", + "onetwo three" + ], + "tail-and-next-line": [ + "[highlight]text[/highlight] tail\nnext line", + "text tail
    \nnext line" + ], + "blank-lines-around": [ + "before\n\n\n[highlight]text[/highlight]\n\n\nafter", + "before


    text


    after" + ], + "unclosed": [ + "[highlight]text", + "[highlight]text" + ], + "unmatched-close": [ + "text[/highlight]", + "text[/highlight]" + ], + "escaped": [ + "\\[highlight]text[/highlight]", + "[highlight]text[/highlight]" + ], + "uppercase": [ + "[HIGHLIGHT]text[/HIGHLIGHT]", + "text" + ] + }, + "tag-i": { + "alone": [ + "[i]text[/i]", + "text" + ], + "empty": [ + "[i][/i]", + "" + ], + "mid-line": [ + "before [i]text[/i] after", + "before text after" + ], + "own-lines": [ + "[i]\ntext\n[/i]", + "
    \ntext
    \n
    " + ], + "own-lines-between-text": [ + "before\n[i]\ntext\n[/i]\nafter", + "before
    \n
    \ntext
    \n

    \nafter" + ], + "starts-mid-line-spans-lines": [ + "before [i]text\nmore[/i] after", + "before text
    \nmore
    after" + ], + "blank-line-inside": [ + "[i]\ntext\n\nsecond paragraph\n[/i]", + "
    \ntext
    \n
    \nsecond paragraph
    \n
    " + ], + "markdown-blocks-inside": [ + "[i]\n## Heading\n\n- one\n- two\n\n> quoted\n[/i]", + "
    \n
    \n

    Heading

    \n
      \n
    • one
    • \n
    • two
    • \n
    \n
    \nquoted
    \n
    \n
    " + ], + "inline-markdown-inside": [ + "[i]**bold** _italic_ `code` [link](https://example.com) :smile:[/i]", + "bold italic code link \":smile:\"" + ], + "in-blockquote": [ + "> [i]\n> text\n> [/i]", + "
    \n
    \ntext
    \n
    " + ], + "in-list-item": [ + "- [i]\n text\n [/i]\n- next", + "
      \n

    • \ntext
      \n
    • \n
    • next
    • \n
    " + ], + "in-table-cell": [ + "| head |\n|---|\n| [i]text[/i] |", + "
    \n\n\n\n\n\n\n\n\n\n\n\n
    head
    text
    \n
    " + ], + "in-heading": [ + "## [i]text[/i]", + "

    text

    " + ], + "around-b": [ + "[i][b]text[/b][/i]", + "text" + ], + "in-b": [ + "[b]before [i]text[/i] after[/b]", + "before text after" + ], + "in-core-quote": [ + "[quote]\n[i]text[/i]\n[/quote]", + "" + ], + "misnested-with-i": [ + "[i][i]text[/i] tail[/i]", + "text tail" + ], + "nested-in-itself": [ + "[i]outer [i]inner[/i] outer[/i]", + "outer inner outer" + ], + "repeated": [ + "[i]one[/i][i]two[/i] [i]three[/i]", + "onetwo three" + ], + "tail-and-next-line": [ + "[i]text[/i] tail\nnext line", + "text tail
    \nnext line" + ], + "blank-lines-around": [ + "before\n\n\n[i]text[/i]\n\n\nafter", + "before


    text


    after" + ], + "unclosed": [ + "[i]text", + "[i]text" + ], + "unmatched-close": [ + "text[/i]", + "text[/i]" + ], + "escaped": [ + "\\[i]text[/i]", + "[i]text[/i]" + ], + "uppercase": [ + "[I]text[/I]", + "text" + ] + }, + "tag-icode": { + "alone": [ + "[icode][b]x[/b] y[/icode]", + "[b]x[/b] <b>y</b>" + ], + "empty": [ + "[icode][/icode]", + "" + ], + "mid-line": [ + "before [icode][b]x[/b] y[/icode] after", + "before [b]x[/b] <b>y</b> after" + ], + "own-lines": [ + "[icode]\n[b]x[/b] y\n[/icode]", + "[b]x[/b] <b>y</b>" + ], + "own-lines-between-text": [ + "before\n[icode]\n[b]x[/b] y\n[/icode]\nafter", + "before
    [b]x[/b] <b>y</b>
    after" + ], + "starts-mid-line-spans-lines": [ + "before [icode][b]x[/b] y\nmore[/icode] after", + "before [b]x[/b] <b>y</b>\nmore after" + ], + "blank-line-inside": [ + "[icode]\n[b]x[/b] y\n\nsecond paragraph\n[/icode]", + "[b]x[/b] <b>y</b>\n\nsecond paragraph" + ], + "markdown-blocks-inside": [ + "[icode]\n## Heading\n\n- one\n- two\n\n> quoted\n[/icode]", + "## Heading\n\n- one\n- two\n\n> quoted" + ], + "inline-markdown-inside": [ + "[icode]**bold** _italic_ `code` [link](https://example.com) :smile:[/icode]", + "**bold** _italic_ `code` [link](https://example.com) :smile:" + ], + "in-blockquote": [ + "> [icode]\n> [b]x[/b] y\n> [/icode]", + "
    [b]x[/b] <b>y</b>
    " + ], + "in-list-item": [ + "- [icode]\n [b]x[/b] y\n [/icode]\n- next", + "
      \n
    • [b]x[/b] <b>y</b>
    • \n
    • next
    • \n
    " + ], + "in-table-cell": [ + "| head |\n|---|\n| [icode][b]x[/b] y[/icode] |", + "
    \n\n\n\n\n\n\n\n\n\n\n\n
    head
    [b]x[/b] <b>y</b>
    \n
    " + ], + "in-heading": [ + "## [icode][b]x[/b] y[/icode]", + "

    [b]x[/b] <b>y</b>

    " + ], + "around-b": [ + "[icode][b][b]x[/b] y[/b][/icode]", + "[b][b]x[/b] <b>y</b>[/b]" + ], + "in-b": [ + "[b]before [icode][b]x[/b] y[/icode] after[/b]", + "before [b]x[/b] <b>y</b> after" + ], + "in-core-quote": [ + "[quote]\n[icode][b]x[/b] y[/icode]\n[/quote]", + "" + ], + "misnested-with-i": [ + "[icode][i][b]x[/b] y[/icode] tail[/i]", + "[i][b]x[/b] <b>y</b> tail[/i]" + ], + "nested-in-itself": [ + "[icode]outer [icode]inner[/icode] outer[/icode]", + "outer [icode]inner[/icode] outer" + ], + "repeated": [ + "[icode]one[/icode][icode]two[/icode] [icode]three[/icode]", + "onetwo three" + ], + "tail-and-next-line": [ + "[icode][b]x[/b] y[/icode] tail\nnext line", + "[b]x[/b] <b>y</b> tail
    next line" + ], + "blank-lines-around": [ + "before\n\n\n[icode][b]x[/b] y[/icode]\n\n\nafter", + "before


    [b]x[/b] <b>y</b>


    after" + ], + "unclosed": [ + "[icode][b]x[/b] y", + "[icode]x y" + ], + "unmatched-close": [ + "[b]x[/b] y[/icode]", + "x y[/icode]" + ], + "escaped": [ + "\\[icode][b]x[/b] y[/icode]", + "[icode]x y[/icode]" + ], + "uppercase": [ + "[ICODE][b]x[/b] y[/ICODE]", + "[b]x[/b] <b>y</b>" + ] + }, + "tag-imagefloat": { + "alone": [ + "[imagefloat=left]text[/imagefloat]", + "
    text
    " + ], + "empty": [ + "[imagefloat=left][/imagefloat]", + "
    " + ], + "mid-line": [ + "before [imagefloat=left]text[/imagefloat] after", + "before
    text
    after" + ], + "own-lines": [ + "[imagefloat=left]\ntext\n[/imagefloat]", + "
    \n
    \ntext
    \n
    " + ], + "own-lines-between-text": [ + "before\n[imagefloat=left]\ntext\n[/imagefloat]\nafter", + "before
    \n
    \ntext
    \n
    \nafter" + ], + "starts-mid-line-spans-lines": [ + "before [imagefloat=left]text\nmore[/imagefloat] after", + "before
    \ntext
    \nmore
    \nafter" + ], + "blank-line-inside": [ + "[imagefloat=left]\ntext\n\nsecond paragraph\n[/imagefloat]", + "
    \n
    \ntext

    second paragraph
    \n
    " + ], + "markdown-blocks-inside": [ + "[imagefloat=left]\n## Heading\n\n- one\n- two\n\n> quoted\n[/imagefloat]", + "
    \n
    \n

    Heading

    \n
      \n
    • one
    • \n
    • two
    • \n
    \n
    \nquoted
    \n
    \n
    " + ], + "inline-markdown-inside": [ + "[imagefloat=left]**bold** _italic_ `code` [link](https://example.com) :smile:[/imagefloat]", + "
    bold italic code link \":smile:\"
    " + ], + "in-blockquote": [ + "> [imagefloat=left]\n> text\n> [/imagefloat]", + "
    \n
    \n
    \ntext
    \n
    \n
    " + ], + "in-list-item": [ + "- [imagefloat=left]\n text\n [/imagefloat]\n- next", + "
      \n
    • \n
      \n
      \ntext
      \n
      \n
    • \n
    • next
    • \n
    " + ], + "in-table-cell": [ + "| head |\n|---|\n| [imagefloat=left]text[/imagefloat] |", + "
    \n\n\n\n\n\n\n\n\n\n\n\n
    head
    text
    \n
    " + ], + "in-heading": [ + "## [imagefloat=left]text[/imagefloat]", + "

    text

    " + ], + "around-b": [ + "[imagefloat=left][b]text[/b][/imagefloat]", + "
    text
    " + ], + "in-b": [ + "[b]before [imagefloat=left]text[/imagefloat] after[/b]", + "before
    text
    after
    " + ], + "in-core-quote": [ + "[quote]\n[imagefloat=left]text[/imagefloat]\n[/quote]", + "" + ], + "misnested-with-i": [ + "[imagefloat=left][i]text[/imagefloat] tail[/i]", + "
    text
    \ntail" + ], + "nested-in-itself": [ + "[imagefloat=left]outer [imagefloat=left]inner[/imagefloat] outer[/imagefloat]", + "
    outer
    inner
    outer
    " + ], + "repeated": [ + "[imagefloat=left]one[/imagefloat][imagefloat=left]two[/imagefloat] [imagefloat=left]three[/imagefloat]", + "
    one
    \n
    two
    \n
    three
    " + ], + "tail-and-next-line": [ + "[imagefloat=left]text[/imagefloat] tail\nnext line", + "
    text
    \ntail
    next line" + ], + "blank-lines-around": [ + "before\n\n\n[imagefloat=left]text[/imagefloat]\n\n\nafter", + "before


    text
    \n

    after" + ], + "unclosed": [ + "[imagefloat=left]text", + "[imagefloat=left]text" + ], + "unmatched-close": [ + "text[/imagefloat]", + "text[/imagefloat]" + ], + "escaped": [ + "\\[imagefloat=left]text[/imagefloat]", + "[imagefloat=left]text[/imagefloat]" + ], + "uppercase": [ + "[IMAGEFLOAT=left]text[/IMAGEFLOAT]", + "
    text
    " + ], + "[imagefloat] alone": [ + "[imagefloat]text[/imagefloat]", + "
    text
    " + ], + "[imagefloat] own-lines": [ + "[imagefloat]\ntext\n[/imagefloat]", + "
    \n
    \ntext
    \n
    " + ], + "[imagefloat=right] alone": [ + "[imagefloat=right]text[/imagefloat]", + "
    text
    " + ], + "[imagefloat=right] own-lines": [ + "[imagefloat=right]\ntext\n[/imagefloat]", + "
    \n
    \ntext
    \n
    " + ] + }, + "tag-img": { + "alone": [ + "[img]https://example.com/a.png[/img]", + "" + ], + "empty": [ + "[img][/img]", + "" + ], + "mid-line": [ + "before [img]https://example.com/a.png[/img] after", + "before after" + ], + "own-lines": [ + "[img]\nhttps://example.com/a.png\n[/img]", + "" + ], + "own-lines-between-text": [ + "before\n[img]\nhttps://example.com/a.png\n[/img]\nafter", + "before
    \n
    \nafter" + ], + "starts-mid-line-spans-lines": [ + "before [img]https://example.com/a.png\nmore[/img] after", + "before after" + ], + "blank-line-inside": [ + "[img]\nhttps://example.com/a.png\n\nsecond paragraph\n[/img]", + "[img]
    \nhttps://example.com/a.png

    second paragraph
    \n[/img]" + ], + "markdown-blocks-inside": [ + "[img]\n## Heading\n\n- one\n- two\n\n> quoted\n[/img]", + "[img]

    Heading

    \n
      \n
    • one
    • \n
    • two
    • \n
    \n
    \nquoted
    \n[/img]
    " + ], + "inline-markdown-inside": [ + "[img]**bold** _italic_ `code` [link](https://example.com) :smile:[/img]", + "" + ], + "in-blockquote": [ + "> [img]\n> https://example.com/a.png\n> [/img]", + "
    \n
    " + ], + "in-list-item": [ + "- [img]\n https://example.com/a.png\n [/img]\n- next", + "
      \n
    • \n
    • next
    • \n
    " + ], + "in-table-cell": [ + "| head |\n|---|\n| [img]https://example.com/a.png[/img] |", + "
    \n\n\n\n\n\n\n\n\n\n\n\n
    head
    \n
    " + ], + "in-heading": [ + "## [img]https://example.com/a.png[/img]", + "

    " + ], + "around-b": [ + "[img][b]https://example.com/a.png[/b][/img]", + "" + ], + "in-b": [ + "[b]before [img]https://example.com/a.png[/img] after[/b]", + "before after" + ], + "in-core-quote": [ + "[quote]\n[img]https://example.com/a.png[/img]\n[/quote]", + "" + ], + "misnested-with-i": [ + "[img][i]https://example.com/a.png[/img] tail[/i]", + " tail[/i]" + ], + "nested-in-itself": [ + "[img]outer [img]inner[/img] outer[/img]", + " outer[/img]" + ], + "repeated": [ + "[img]one[/img][img]two[/img] [img]three[/img]", + " " + ], + "tail-and-next-line": [ + "[img]https://example.com/a.png[/img] tail\nnext line", + " tail
    \nnext line" + ], + "blank-lines-around": [ + "before\n\n\n[img]https://example.com/a.png[/img]\n\n\nafter", + "before





    after" + ], + "unclosed": [ + "[img]https://example.com/a.png", + "[img]https://example.com/a.png" + ], + "unmatched-close": [ + "https://example.com/a.png[/img]", + "https://example.com/a.png[/img]" + ], + "escaped": [ + "\\[img]https://example.com/a.png[/img]", + "[img]https://example.com/a.png[/img]" + ], + "uppercase": [ + "[IMG]https://example.com/a.png[/IMG]", + "" + ] + }, + "tag-inlinespoiler": { + "alone": [ + "[inlinespoiler]text[/inlinespoiler]", + "text" + ], + "empty": [ + "[inlinespoiler][/inlinespoiler]", + "" + ], + "mid-line": [ + "before [inlinespoiler]text[/inlinespoiler] after", + "before text after" + ], + "own-lines": [ + "[inlinespoiler]\ntext\n[/inlinespoiler]", + "text" + ], + "own-lines-between-text": [ + "before\n[inlinespoiler]\ntext\n[/inlinespoiler]\nafter", + "before
    \ntext
    \nafter" + ], + "starts-mid-line-spans-lines": [ + "before [inlinespoiler]text\nmore[/inlinespoiler] after", + "before text
    \nmore
    after" + ], + "blank-line-inside": [ + "[inlinespoiler]\ntext\n\nsecond paragraph\n[/inlinespoiler]", + "text
    \n
    \nsecond paragraph
    " + ], + "markdown-blocks-inside": [ + "[inlinespoiler]\n## Heading\n\n- one\n- two\n\n> quoted\n[/inlinespoiler]", + "## Heading
    \n
    \n- one
    \n- two
    \n
    \n> quoted
    " + ], + "inline-markdown-inside": [ + "[inlinespoiler]**bold** _italic_ `code` [link](https://example.com) :smile:[/inlinespoiler]", + "bold italic code link \":smile:\"" + ], + "in-blockquote": [ + "> [inlinespoiler]\n> text\n> [/inlinespoiler]", + "
    \ntext
    " + ], + "in-list-item": [ + "- [inlinespoiler]\n text\n [/inlinespoiler]\n- next", + "
      \n
    • text
    • \n
    • next
    • \n
    " + ], + "in-table-cell": [ + "| head |\n|---|\n| [inlinespoiler]text[/inlinespoiler] |", + "
    \n\n\n\n\n\n\n\n\n\n\n\n
    head
    text
    \n
    " + ], + "in-heading": [ + "## [inlinespoiler]text[/inlinespoiler]", + "

    text

    " + ], + "around-b": [ + "[inlinespoiler][b]text[/b][/inlinespoiler]", + "text" + ], + "in-b": [ + "[b]before [inlinespoiler]text[/inlinespoiler] after[/b]", + "before text after" + ], + "in-core-quote": [ + "[quote]\n[inlinespoiler]text[/inlinespoiler]\n[/quote]", + "" + ], + "misnested-with-i": [ + "[inlinespoiler][i]text[/inlinespoiler] tail[/i]", + "text tail" + ], + "nested-in-itself": [ + "[inlinespoiler]outer [inlinespoiler]inner[/inlinespoiler] outer[/inlinespoiler]", + "outer inner outer" + ], + "repeated": [ + "[inlinespoiler]one[/inlinespoiler][inlinespoiler]two[/inlinespoiler] [inlinespoiler]three[/inlinespoiler]", + "onetwo three" + ], + "tail-and-next-line": [ + "[inlinespoiler]text[/inlinespoiler] tail\nnext line", + "text tail
    \nnext line" + ], + "blank-lines-around": [ + "before\n\n\n[inlinespoiler]text[/inlinespoiler]\n\n\nafter", + "before


    text


    after" + ], + "unclosed": [ + "[inlinespoiler]text", + "[inlinespoiler]text" + ], + "unmatched-close": [ + "text[/inlinespoiler]", + "text[/inlinespoiler]" + ], + "escaped": [ + "\\[inlinespoiler]text[/inlinespoiler]", + "[inlinespoiler]text[/inlinespoiler]" + ], + "uppercase": [ + "[INLINESPOILER]text[/INLINESPOILER]", + "text" + ] + }, + "tag-justify": { + "alone": [ + "[justify]text[/justify]", + "
    text
    " + ], + "empty": [ + "[justify][/justify]", + "
    " + ], + "mid-line": [ + "before [justify]text[/justify] after", + "before
    text
    after" + ], + "own-lines": [ + "[justify]\ntext\n[/justify]", + "
    \n
    \ntext
    \n
    " + ], + "own-lines-between-text": [ + "before\n[justify]\ntext\n[/justify]\nafter", + "before
    \n
    \ntext
    \n
    \nafter" + ], + "starts-mid-line-spans-lines": [ + "before [justify]text\nmore[/justify] after", + "before
    \ntext
    \nmore
    \nafter" + ], + "blank-line-inside": [ + "[justify]\ntext\n\nsecond paragraph\n[/justify]", + "
    \n
    \ntext

    second paragraph
    \n
    " + ], + "markdown-blocks-inside": [ + "[justify]\n## Heading\n\n- one\n- two\n\n> quoted\n[/justify]", + "
    \n
    \n

    Heading

    \n
      \n
    • one
    • \n
    • two
    • \n
    \n
    \nquoted
    \n
    \n
    " + ], + "inline-markdown-inside": [ + "[justify]**bold** _italic_ `code` [link](https://example.com) :smile:[/justify]", + "
    bold italic code link \":smile:\"
    " + ], + "in-blockquote": [ + "> [justify]\n> text\n> [/justify]", + "
    \n
    \n
    \ntext
    \n
    \n
    " + ], + "in-list-item": [ + "- [justify]\n text\n [/justify]\n- next", + "
      \n
    • \n
      \n
      \ntext
      \n
      \n
    • \n
    • next
    • \n
    " + ], + "in-table-cell": [ + "| head |\n|---|\n| [justify]text[/justify] |", + "
    \n\n\n\n\n\n\n\n\n\n\n\n
    head
    text
    \n
    " + ], + "in-heading": [ + "## [justify]text[/justify]", + "

    text

    " + ], + "around-b": [ + "[justify][b]text[/b][/justify]", + "
    text
    " + ], + "in-b": [ + "[b]before [justify]text[/justify] after[/b]", + "before
    text
    after
    " + ], + "in-core-quote": [ + "[quote]\n[justify]text[/justify]\n[/quote]", + "" + ], + "misnested-with-i": [ + "[justify][i]text[/justify] tail[/i]", + "
    text
    \ntail" + ], + "nested-in-itself": [ + "[justify]outer [justify]inner[/justify] outer[/justify]", + "
    outer
    inner
    outer
    " + ], + "repeated": [ + "[justify]one[/justify][justify]two[/justify] [justify]three[/justify]", + "
    one
    \n
    two
    \n
    three
    " + ], + "tail-and-next-line": [ + "[justify]text[/justify] tail\nnext line", + "
    text
    \ntail
    next line" + ], + "blank-lines-around": [ + "before\n\n\n[justify]text[/justify]\n\n\nafter", + "before


    text
    \n

    after" + ], + "unclosed": [ + "[justify]text", + "[justify]text" + ], + "unmatched-close": [ + "text[/justify]", + "text[/justify]" + ], + "escaped": [ + "\\[justify]text[/justify]", + "[justify]text[/justify]" + ], + "uppercase": [ + "[JUSTIFY]text[/JUSTIFY]", + "
    text
    " + ] + }, + "tag-left": { + "alone": [ + "[left]text[/left]", + "
    text
    " + ], + "empty": [ + "[left][/left]", + "
    " + ], + "mid-line": [ + "before [left]text[/left] after", + "before
    text
    after" + ], + "own-lines": [ + "[left]\ntext\n[/left]", + "
    \n
    \ntext
    \n
    " + ], + "own-lines-between-text": [ + "before\n[left]\ntext\n[/left]\nafter", + "before
    \n
    \ntext
    \n
    \n
    after" + ], + "starts-mid-line-spans-lines": [ + "before [left]text\nmore[/left] after", + "before
    \ntext
    \nmore
    \nafter" + ], + "blank-line-inside": [ + "[left]\ntext\n\nsecond paragraph\n[/left]", + "
    \n
    \ntext

    second paragraph
    \n
    " + ], + "markdown-blocks-inside": [ + "[left]\n## Heading\n\n- one\n- two\n\n> quoted\n[/left]", + "
    \n
    \n

    Heading

    \n
      \n
    • one
    • \n
    • two
    • \n
    \n
    \nquoted
    \n
    \n
    " + ], + "inline-markdown-inside": [ + "[left]**bold** _italic_ `code` [link](https://example.com) :smile:[/left]", + "
    bold italic code link \":smile:\"
    " + ], + "in-blockquote": [ + "> [left]\n> text\n> [/left]", + "
    \n
    \n
    \ntext
    \n
    \n
    " + ], + "in-list-item": [ + "- [left]\n text\n [/left]\n- next", + "
      \n
    • \n
      \n
      \ntext
      \n
      \n
    • \n
    • next
    • \n
    " + ], + "in-table-cell": [ + "| head |\n|---|\n| [left]text[/left] |", + "
    \n\n\n\n\n\n\n\n\n\n\n\n
    head
    text
    \n
    " + ], + "in-heading": [ + "## [left]text[/left]", + "

    text

    " + ], + "around-b": [ + "[left][b]text[/b][/left]", + "
    text
    " + ], + "in-b": [ + "[b]before [left]text[/left] after[/b]", + "before
    text
    after
    " + ], + "in-core-quote": [ + "[quote]\n[left]text[/left]\n[/quote]", + "" + ], + "misnested-with-i": [ + "[left][i]text[/left] tail[/i]", + "
    text
    \ntail" + ], + "nested-in-itself": [ + "[left]outer [left]inner[/left] outer[/left]", + "
    outer
    inner
    outer
    " + ], + "repeated": [ + "[left]one[/left][left]two[/left] [left]three[/left]", + "
    one
    \n
    two
    \n
    three
    " + ], + "tail-and-next-line": [ + "[left]text[/left] tail\nnext line", + "
    text
    \ntail
    next line" + ], + "blank-lines-around": [ + "before\n\n\n[left]text[/left]\n\n\nafter", + "before


    text
    \n


    after" + ], + "unclosed": [ + "[left]text", + "[left]text" + ], + "unmatched-close": [ + "text[/left]", + "text[/left]" + ], + "escaped": [ + "\\[left]text[/left]", + "[left]text[/left]" + ], + "uppercase": [ + "[LEFT]text[/LEFT]", + "
    text
    " + ] + }, + "tag-mail": { + "alone": [ + "[mail person=Bob subject=Hi]text[/mail]", + "
    \n
    \n
    \nBob
    \n
    \nHi
    \n
    text
    \n
    \n
    \n
    \n
    " + ], + "empty": [ + "[mail person=Bob subject=Hi][/mail]", + "
    \n
    \n
    \nBob
    \n
    \nHi
    \n
    \n
    \n
    \n
    \n
    " + ], + "mid-line": [ + "before [mail person=Bob subject=Hi]text[/mail] after", + "before
    Bob
    Hi
    text
    after" + ], + "own-lines": [ + "[mail person=Bob subject=Hi]\ntext\n[/mail]", + "
    \n
    \n
    \nBob
    \n
    \nHi
    \n
    \n
    \ntext
    \n
    \n
    \n
    \n
    \n
    " + ], + "own-lines-between-text": [ + "before\n[mail person=Bob subject=Hi]\ntext\n[/mail]\nafter", + "before
    \n
    \n
    \nBob
    \n
    \nHi
    \n
    \n
    \ntext
    \n
    \n
    \n
    \n
    \n
    \n
    after" + ], + "starts-mid-line-spans-lines": [ + "before [mail person=Bob subject=Hi]text\nmore[/mail] after", + "before
    \n
    \n
    \nBob
    \n
    \nHi
    \n
    \ntext
    \nmore
    \n
    \n
    \n
    \n
    \nafter" + ], + "blank-line-inside": [ + "[mail person=Bob subject=Hi]\ntext\n\nsecond paragraph\n[/mail]", + "
    \n
    \n
    \nBob
    \n
    \nHi
    \n
    \n
    \ntext

    second paragraph
    \n
    \n
    \n
    \n
    \n
    " + ], + "markdown-blocks-inside": [ + "[mail person=Bob subject=Hi]\n## Heading\n\n- one\n- two\n\n> quoted\n[/mail]", + "
    \n
    \n
    \nBob
    \n
    \nHi
    \n
    \n
    \n

    Heading

    \n
      \n
    • one
    • \n
    • two
    • \n
    \n
    \nquoted
    \n
    \n
    \n
    \n
    \n
    \n
    " + ], + "inline-markdown-inside": [ + "[mail person=Bob subject=Hi]**bold** _italic_ `code` [link](https://example.com) :smile:[/mail]", + "
    \n
    \n
    \nBob
    \n
    \nHi
    \n
    bold italic code link \":smile:\"
    \n
    \n
    \n
    \n
    " + ], + "in-blockquote": [ + "> [mail person=Bob subject=Hi]\n> text\n> [/mail]", + "
    \n
    \n
    \n
    \nBob
    \n
    \nHi
    \n
    \n
    \ntext
    \n
    \n
    \n
    \n
    \n
    \n
    " + ], + "in-list-item": [ + "- [mail person=Bob subject=Hi]\n text\n [/mail]\n- next", + "
      \n
    • \n
      \n
      \n
      \nBob
      \n
      \nHi
      \n
      \n
      \ntext
      \n
      \n
      \n
      \n
      \n
      \n
    • \n
    • next
    • \n
    " + ], + "in-table-cell": [ + "| head |\n|---|\n| [mail person=Bob subject=Hi]text[/mail] |", + "
    \n\n\n\n\n\n\n\n\n\n\n\n
    head
    Bob
    Hi
    text
    \n
    " + ], + "in-heading": [ + "## [mail person=Bob subject=Hi]text[/mail]", + "

    Bob
    Hi
    text

    " + ], + "around-b": [ + "[mail person=Bob subject=Hi][b]text[/b][/mail]", + "
    \n
    \n
    \nBob
    \n
    \nHi
    \n
    text
    \n
    \n
    \n
    \n
    " + ], + "in-b": [ + "[b]before [mail person=Bob subject=Hi]text[/mail] after[/b]", + "before
    Bob
    Hi
    text
    after
    " + ], + "in-core-quote": [ + "[quote]\n[mail person=Bob subject=Hi]text[/mail]\n[/quote]", + "" + ], + "misnested-with-i": [ + "[mail person=Bob subject=Hi][i]text[/mail] tail[/i]", + "
    \n
    \n
    \nBob
    \n
    \nHi
    \n
    text
    \n
    \n
    \n
    \n
    \ntail" + ], + "nested-in-itself": [ + "[mail person=Bob subject=Hi]outer [mail person=Bob subject=Hi]inner[/mail] outer[/mail]", + "
    \n
    \n
    \nBob
    \n
    \nHi
    \n
    outer
    Bob
    Hi
    inner
    outer
    \n
    \n
    \n
    \n
    " + ], + "repeated": [ + "[mail person=Bob subject=Hi]one[/mail][mail person=Bob subject=Hi]two[/mail] [mail person=Bob subject=Hi]three[/mail]", + "
    \n
    \n
    \nBob
    \n
    \nHi
    \n
    one
    \n
    \n
    \n
    \n
    \n
    \n
    \n
    \nBob
    \n
    \nHi
    \n
    two
    \n
    \n
    \n
    \n
    \n
    \n
    \n
    \nBob
    \n
    \nHi
    \n
    three
    \n
    \n
    \n
    \n
    " + ], + "tail-and-next-line": [ + "[mail person=Bob subject=Hi]text[/mail] tail\nnext line", + "
    \n
    \n
    \nBob
    \n
    \nHi
    \n
    text
    \n
    \n
    \n
    \n
    \ntail
    next line" + ], + "blank-lines-around": [ + "before\n\n\n[mail person=Bob subject=Hi]text[/mail]\n\n\nafter", + "before


    \n
    \n
    \nBob
    \n
    \nHi
    \n
    text
    \n
    \n
    \n
    \n
    \n


    after" + ], + "unclosed": [ + "[mail person=Bob subject=Hi]text", + "[mail person=Bob subject=Hi]text" + ], + "unmatched-close": [ + "text[/mail]", + "text[/mail]" + ], + "escaped": [ + "\\[mail person=Bob subject=Hi]text[/mail]", + "[mail person=Bob subject=Hi]text[/mail]" + ], + "uppercase": [ + "[MAIL person=Bob subject=Hi]text[/MAIL]", + "
    \n
    \n
    \nBob
    \n
    \nHi
    \n
    text
    \n
    \n
    \n
    \n
    " + ], + "[mail] alone": [ + "[mail]text[/mail]", + "
    \n
    \n
    \nUnknown
    \n
    \nEmpty
    \n
    text
    \n
    \n
    \n
    \n
    " + ], + "[mail] own-lines": [ + "[mail]\ntext\n[/mail]", + "
    \n
    \n
    \nUnknown
    \n
    \nEmpty
    \n
    \n
    \ntext
    \n
    \n
    \n
    \n
    \n
    " + ], + "[mail type=receive person=\"Bob Smith\" subject=\"Re: hi\"] alone": [ + "[mail type=receive person=\"Bob Smith\" subject=\"Re: hi\"]text[/mail]", + "
    \n
    \n
    \nBob Smith
    \n
    \nRe: hi
    \n
    text
    \n
    \n
    \n
    \n
    " + ], + "[mail type=receive person=\"Bob Smith\" subject=\"Re: hi\"] own-lines": [ + "[mail type=receive person=\"Bob Smith\" subject=\"Re: hi\"]\ntext\n[/mail]", + "
    \n
    \n
    \nBob Smith
    \n
    \nRe: hi
    \n
    \n
    \ntext
    \n
    \n
    \n
    \n
    \n
    " + ] + }, + "tag-message": { + "alone": [ + "[message=me]text[/message]", + "
    \n
    text
    \n
    " + ], + "empty": [ + "[message=me][/message]", + "
    \n
    \n
    " + ], + "mid-line": [ + "before [message=me]text[/message] after", + "before
    text
    after" + ], + "own-lines": [ + "[message=me]\ntext\n[/message]", + "
    \n
    \n
    \ntext
    \n
    \n
    " + ], + "own-lines-between-text": [ + "before\n[message=me]\ntext\n[/message]\nafter", + "before
    \n
    \n
    \ntext
    \n
    \n
    \n
    after" + ], + "starts-mid-line-spans-lines": [ + "before [message=me]text\nmore[/message] after", + "before
    \n
    \ntext
    \nmore
    \n
    \nafter" + ], + "blank-line-inside": [ + "[message=me]\ntext\n\nsecond paragraph\n[/message]", + "
    \n
    \n
    \ntext

    second paragraph
    \n
    \n
    " + ], + "markdown-blocks-inside": [ + "[message=me]\n## Heading\n\n- one\n- two\n\n> quoted\n[/message]", + "
    \n
    \n
    \n

    Heading

    \n
      \n
    • one
    • \n
    • two
    • \n
    \n
    \nquoted
    \n
    \n
    \n
    " + ], + "inline-markdown-inside": [ + "[message=me]**bold** _italic_ `code` [link](https://example.com) :smile:[/message]", + "
    \n
    bold italic code link \":smile:\"
    \n
    " + ], + "in-blockquote": [ + "> [message=me]\n> text\n> [/message]", + "
    \n
    \n
    \n
    \ntext
    \n
    \n
    \n
    " + ], + "in-list-item": [ + "- [message=me]\n text\n [/message]\n- next", + "
      \n
    • \n
      \n
      \n
      \ntext
      \n
      \n
      \n
    • \n
    • next
    • \n
    " + ], + "in-table-cell": [ + "| head |\n|---|\n| [message=me]text[/message] |", + "
    \n\n\n\n\n\n\n\n\n\n\n\n
    head
    text
    \n
    " + ], + "in-heading": [ + "## [message=me]text[/message]", + "

    text

    " + ], + "around-b": [ + "[message=me][b]text[/b][/message]", + "
    \n
    text
    \n
    " + ], + "in-b": [ + "[b]before [message=me]text[/message] after[/b]", + "before
    text
    after
    " + ], + "in-core-quote": [ + "[quote]\n[message=me]text[/message]\n[/quote]", + "" + ], + "misnested-with-i": [ + "[message=me][i]text[/message] tail[/i]", + "
    \n
    text
    \n
    \ntail" + ], + "nested-in-itself": [ + "[message=me]outer [message=me]inner[/message] outer[/message]", + "
    \n
    outer
    inner
    outer
    \n
    " + ], + "repeated": [ + "[message=me]one[/message][message=me]two[/message] [message=me]three[/message]", + "
    \n
    one
    \n
    \n
    \n
    two
    \n
    \n
    \n
    three
    \n
    " + ], + "tail-and-next-line": [ + "[message=me]text[/message] tail\nnext line", + "
    \n
    text
    \n
    \ntail
    next line" + ], + "blank-lines-around": [ + "before\n\n\n[message=me]text[/message]\n\n\nafter", + "before


    \n
    text
    \n
    \n


    after" + ], + "unclosed": [ + "[message=me]text", + "[message=me]text" + ], + "unmatched-close": [ + "text[/message]", + "text[/message]" + ], + "escaped": [ + "\\[message=me]text[/message]", + "[message=me]text[/message]" + ], + "uppercase": [ + "[MESSAGE=me]text[/MESSAGE]", + "
    \n
    text
    \n
    " + ], + "[message] alone": [ + "[message]text[/message]", + "
    \n
    text
    \n
    " + ], + "[message] own-lines": [ + "[message]\ntext\n[/message]", + "
    \n
    \n
    \ntext
    \n
    \n
    " + ], + "[message=them] alone": [ + "[message=them]text[/message]", + "
    \n
    text
    \n
    " + ], + "[message=them] own-lines": [ + "[message=them]\ntext\n[/message]", + "
    \n
    \n
    \ntext
    \n
    \n
    " + ], + "[message=left] alone": [ + "[message=left]text[/message]", + "
    \n
    text
    \n
    " + ], + "[message=left] own-lines": [ + "[message=left]\ntext\n[/message]", + "
    \n
    \n
    \ntext
    \n
    \n
    " + ] + }, + "tag-newspaper": { + "alone": [ + "[newspaper]text[/newspaper]", + "
    text
    " + ], + "empty": [ + "[newspaper][/newspaper]", + "
    " + ], + "mid-line": [ + "before [newspaper]text[/newspaper] after", + "before
    text
    after" + ], + "own-lines": [ + "[newspaper]\ntext\n[/newspaper]", + "
    \n
    \ntext
    \n
    " + ], + "own-lines-between-text": [ + "before\n[newspaper]\ntext\n[/newspaper]\nafter", + "before
    \n
    \ntext
    \n
    \nafter" + ], + "starts-mid-line-spans-lines": [ + "before [newspaper]text\nmore[/newspaper] after", + "before
    \ntext
    \nmore
    \nafter" + ], + "blank-line-inside": [ + "[newspaper]\ntext\n\nsecond paragraph\n[/newspaper]", + "
    \n
    \ntext

    second paragraph
    \n
    " + ], + "markdown-blocks-inside": [ + "[newspaper]\n## Heading\n\n- one\n- two\n\n> quoted\n[/newspaper]", + "
    \n
    \n

    Heading

    \n
      \n
    • one
    • \n
    • two
    • \n
    \n
    \nquoted
    \n
    \n
    " + ], + "inline-markdown-inside": [ + "[newspaper]**bold** _italic_ `code` [link](https://example.com) :smile:[/newspaper]", + "
    bold italic code link \":smile:\"
    " + ], + "in-blockquote": [ + "> [newspaper]\n> text\n> [/newspaper]", + "
    \n
    \n
    \ntext
    \n
    \n
    " + ], + "in-list-item": [ + "- [newspaper]\n text\n [/newspaper]\n- next", + "
      \n
    • \n
      \n
      \ntext
      \n
      \n
    • \n
    • next
    • \n
    " + ], + "in-table-cell": [ + "| head |\n|---|\n| [newspaper]text[/newspaper] |", + "
    \n\n\n\n\n\n\n\n\n\n\n\n
    head
    text
    \n
    " + ], + "in-heading": [ + "## [newspaper]text[/newspaper]", + "

    text

    " + ], + "around-b": [ + "[newspaper][b]text[/b][/newspaper]", + "
    text
    " + ], + "in-b": [ + "[b]before [newspaper]text[/newspaper] after[/b]", + "before
    text
    after
    " + ], + "in-core-quote": [ + "[quote]\n[newspaper]text[/newspaper]\n[/quote]", + "" + ], + "misnested-with-i": [ + "[newspaper][i]text[/newspaper] tail[/i]", + "
    text
    \ntail" + ], + "nested-in-itself": [ + "[newspaper]outer [newspaper]inner[/newspaper] outer[/newspaper]", + "
    outer
    inner
    outer
    " + ], + "repeated": [ + "[newspaper]one[/newspaper][newspaper]two[/newspaper] [newspaper]three[/newspaper]", + "
    one
    \n
    two
    \n
    three
    " + ], + "tail-and-next-line": [ + "[newspaper]text[/newspaper] tail\nnext line", + "
    text
    \ntail
    next line" + ], + "blank-lines-around": [ + "before\n\n\n[newspaper]text[/newspaper]\n\n\nafter", + "before


    text
    \n

    after" + ], + "unclosed": [ + "[newspaper]text", + "[newspaper]text" + ], + "unmatched-close": [ + "text[/newspaper]", + "text[/newspaper]" + ], + "escaped": [ + "\\[newspaper]text[/newspaper]", + "[newspaper]text[/newspaper]" + ], + "uppercase": [ + "[NEWSPAPER]text[/NEWSPAPER]", + "
    text
    " + ] + }, + "tag-nobr": { + "alone": [ + "[nobr]one\ntwo[/nobr]", + "one\ntwo" + ], + "empty": [ + "[nobr][/nobr]", + "" + ], + "mid-line": [ + "before [nobr]one\ntwo[/nobr] after", + "before one\ntwo after" + ], + "own-lines": [ + "[nobr]\none\ntwo\n[/nobr]", + "one\ntwo" + ], + "own-lines-between-text": [ + "before\n[nobr]\none\ntwo\n[/nobr]\nafter", + "before
    \none\ntwo\n
    after" + ], + "starts-mid-line-spans-lines": [ + "before [nobr]one\ntwo\nmore[/nobr] after", + "before one\ntwo\nmore after" + ], + "blank-line-inside": [ + "[nobr]\none\ntwo\n\nsecond paragraph\n[/nobr]", + "one\ntwo\n\nsecond paragraph" + ], + "markdown-blocks-inside": [ + "[nobr]\n## Heading\n\n- one\n- two\n\n> quoted\n[/nobr]", + "

    Heading

    \n\n\n
      \n
    • one
    • \n
    • two
    • \n
    \n\n\n
    \nquoted
    " + ], + "inline-markdown-inside": [ + "[nobr]**bold** _italic_ `code` [link](https://example.com) :smile:[/nobr]", + "bold italic code link \":smile:\"" + ], + "in-blockquote": [ + "> [nobr]\n> one\ntwo\n> [/nobr]", + "
    \n\none\ntwo\n
    " + ], + "in-list-item": [ + "- [nobr]\n one\ntwo\n [/nobr]\n- next", + "
      \n
    • \n\none\ntwo\n
    • \n
    • next
    • \n
    " + ], + "in-table-cell": [ + "| head |\n|---|\n| [nobr]one\ntwo[/nobr] |", + "
    \n\n\n\n\n\n\n\n\n\n\n\n
    head
    one\ntwo
    \n
    " + ], + "in-heading": [ + "## [nobr]one\ntwo[/nobr]", + "

    one\ntwo

    " + ], + "around-b": [ + "[nobr][b]one\ntwo[/b][/nobr]", + "one\ntwo" + ], + "in-b": [ + "[b]before [nobr]one\ntwo[/nobr] after[/b]", + "before one\ntwo after" + ], + "in-core-quote": [ + "[quote]\n[nobr]one\ntwo[/nobr]\n[/quote]", + "" + ], + "misnested-with-i": [ + "[nobr][i]one\ntwo[/nobr] tail[/i]", + "one\ntwotail" + ], + "nested-in-itself": [ + "[nobr]outer [nobr]inner[/nobr] outer[/nobr]", + "outer inner outer" + ], + "repeated": [ + "[nobr]one[/nobr][nobr]two[/nobr] [nobr]three[/nobr]", + "onetwothree" + ], + "tail-and-next-line": [ + "[nobr]one\ntwo[/nobr] tail\nnext line", + "one\ntwotail
    next line" + ], + "blank-lines-around": [ + "before\n\n\n[nobr]one\ntwo[/nobr]\n\n\nafter", + "before


    one\ntwo


    after" + ], + "unclosed": [ + "[nobr]one\ntwo", + "[nobr]one
    \ntwo" + ], + "unmatched-close": [ + "one\ntwo[/nobr]", + "one
    \ntwo[/nobr]" + ], + "escaped": [ + "\\[nobr]one\ntwo[/nobr]", + "[nobr]one
    \ntwo[/nobr]" + ], + "uppercase": [ + "[NOBR]one\ntwo[/NOBR]", + "one\ntwo" + ] + }, + "tag-note": { + "alone": [ + "[note]text[/note]", + "
    \n
    \n
    text
    \n
    \n
    " + ], + "empty": [ + "[note][/note]", + "
    \n
    \n
    \n
    \n
    " + ], + "mid-line": [ + "before [note]text[/note] after", + "before
    text
    after" + ], + "own-lines": [ + "[note]\ntext\n[/note]", + "
    \n
    \n
    \n
    \ntext
    \n
    \n
    \n
    " + ], + "own-lines-between-text": [ + "before\n[note]\ntext\n[/note]\nafter", + "before
    \n
    \n
    \n
    \ntext
    \n
    \n
    \n
    \n
    after" + ], + "starts-mid-line-spans-lines": [ + "before [note]text\nmore[/note] after", + "before
    \n
    \n
    \ntext
    \nmore
    \n
    \n
    \nafter" + ], + "blank-line-inside": [ + "[note]\ntext\n\nsecond paragraph\n[/note]", + "
    \n
    \n
    \n
    \ntext

    second paragraph
    \n
    \n
    \n
    " + ], + "markdown-blocks-inside": [ + "[note]\n## Heading\n\n- one\n- two\n\n> quoted\n[/note]", + "
    \n
    \n
    \n
    \n

    Heading

    \n
      \n
    • one
    • \n
    • two
    • \n
    \n
    \nquoted
    \n
    \n
    \n
    \n
    " + ], + "inline-markdown-inside": [ + "[note]**bold** _italic_ `code` [link](https://example.com) :smile:[/note]", + "
    \n
    \n
    bold italic code link \":smile:\"
    \n
    \n
    " + ], + "in-blockquote": [ + "> [note]\n> text\n> [/note]", + "
    \n
    \n
    \n
    \n
    \ntext
    \n
    \n
    \n
    \n
    " + ], + "in-list-item": [ + "- [note]\n text\n [/note]\n- next", + "
      \n
    • \n
      \n
      \n
      \n
      \ntext
      \n
      \n
      \n
      \n
    • \n
    • next
    • \n
    " + ], + "in-table-cell": [ + "| head |\n|---|\n| [note]text[/note] |", + "
    \n\n\n\n\n\n\n\n\n\n\n\n
    head
    text
    \n
    " + ], + "in-heading": [ + "## [note]text[/note]", + "

    text

    " + ], + "around-b": [ + "[note][b]text[/b][/note]", + "
    \n
    \n
    text
    \n
    \n
    " + ], + "in-b": [ + "[b]before [note]text[/note] after[/b]", + "before
    text
    after
    " + ], + "in-core-quote": [ + "[quote]\n[note]text[/note]\n[/quote]", + "" + ], + "misnested-with-i": [ + "[note][i]text[/note] tail[/i]", + "
    \n
    \n
    text
    \n
    \n
    \ntail" + ], + "nested-in-itself": [ + "[note]outer [note]inner[/note] outer[/note]", + "
    \n
    \n
    outer
    inner
    outer
    \n
    \n
    " + ], + "repeated": [ + "[note]one[/note][note]two[/note] [note]three[/note]", + "
    \n
    \n
    one
    \n
    \n
    \n
    \n
    \n
    two
    \n
    \n
    \n
    \n
    \n
    three
    \n
    \n
    " + ], + "tail-and-next-line": [ + "[note]text[/note] tail\nnext line", + "
    \n
    \n
    text
    \n
    \n
    \ntail
    next line" + ], + "blank-lines-around": [ + "before\n\n\n[note]text[/note]\n\n\nafter", + "before


    \n
    \n
    text
    \n
    \n
    \n


    after" + ], + "unclosed": [ + "[note]text", + "[note]text" + ], + "unmatched-close": [ + "text[/note]", + "text[/note]" + ], + "escaped": [ + "\\[note]text[/note]", + "[note]text[/note]" + ], + "uppercase": [ + "[NOTE]text[/NOTE]", + "
    \n
    \n
    text
    \n
    \n
    " + ] + }, + "tag-ooc": { + "alone": [ + "[ooc]text[/ooc]", + "
    text
    " + ], + "empty": [ + "[ooc][/ooc]", + "
    " + ], + "mid-line": [ + "before [ooc]text[/ooc] after", + "before
    text
    after" + ], + "own-lines": [ + "[ooc]\ntext\n[/ooc]", + "
    \ntext
    " + ], + "own-lines-between-text": [ + "before\n[ooc]\ntext\n[/ooc]\nafter", + "before
    \ntext
    \nafter" + ], + "starts-mid-line-spans-lines": [ + "before [ooc]text\nmore[/ooc] after", + "before
    \ntext
    \nmore
    \nafter" + ], + "blank-line-inside": [ + "[ooc]\ntext\n\nsecond paragraph\n[/ooc]", + "
    \ntext

    second paragraph
    " + ], + "markdown-blocks-inside": [ + "[ooc]\n## Heading\n\n- one\n- two\n\n> quoted\n[/ooc]", + "
    \n

    Heading

    \n
      \n
    • one
    • \n
    • two
    • \n
    \n
    \nquoted
    \n
    " + ], + "inline-markdown-inside": [ + "[ooc]**bold** _italic_ `code` [link](https://example.com) :smile:[/ooc]", + "
    bold italic code link \":smile:\"
    " + ], + "in-blockquote": [ + "> [ooc]\n> text\n> [/ooc]", + "
    \n
    \ntext
    \n
    " + ], + "in-list-item": [ + "- [ooc]\n text\n [/ooc]\n- next", + "
      \n
    • \n
      \ntext
      \n
    • \n
    • next
    • \n
    " + ], + "in-table-cell": [ + "| head |\n|---|\n| [ooc]text[/ooc] |", + "
    \n\n\n\n\n\n\n\n\n\n\n\n
    head
    text
    \n
    " + ], + "in-heading": [ + "## [ooc]text[/ooc]", + "

    text

    " + ], + "around-b": [ + "[ooc][b]text[/b][/ooc]", + "
    text
    " + ], + "in-b": [ + "[b]before [ooc]text[/ooc] after[/b]", + "before
    text
    after
    " + ], + "in-core-quote": [ + "[quote]\n[ooc]text[/ooc]\n[/quote]", + "" + ], + "misnested-with-i": [ + "[ooc][i]text[/ooc] tail[/i]", + "
    text
    \ntail" + ], + "nested-in-itself": [ + "[ooc]outer [ooc]inner[/ooc] outer[/ooc]", + "
    outer
    inner
    outer
    " + ], + "repeated": [ + "[ooc]one[/ooc][ooc]two[/ooc] [ooc]three[/ooc]", + "
    one
    \n
    two
    \n
    three
    " + ], + "tail-and-next-line": [ + "[ooc]text[/ooc] tail\nnext line", + "
    text
    \ntail
    next line" + ], + "blank-lines-around": [ + "before\n\n\n[ooc]text[/ooc]\n\n\nafter", + "before


    text
    \n

    after" + ], + "unclosed": [ + "[ooc]text", + "[ooc]text" + ], + "unmatched-close": [ + "text[/ooc]", + "text[/ooc]" + ], + "escaped": [ + "\\[ooc]text[/ooc]", + "[ooc]text[/ooc]" + ], + "uppercase": [ + "[OOC]text[/OOC]", + "
    text
    " + ] + }, + "tag-pindent": { + "alone": [ + "[pindent]text[/pindent]", + "text" + ], + "empty": [ + "[pindent][/pindent]", + "" + ], + "mid-line": [ + "before [pindent]text[/pindent] after", + "before text after" + ], + "own-lines": [ + "[pindent]\ntext\n[/pindent]", + "
    \ntext
    \n
    " + ], + "own-lines-between-text": [ + "before\n[pindent]\ntext\n[/pindent]\nafter", + "before
    \n
    \ntext
    \n

    \nafter" + ], + "starts-mid-line-spans-lines": [ + "before [pindent]text\nmore[/pindent] after", + "before text
    \nmore
    after" + ], + "blank-line-inside": [ + "[pindent]\ntext\n\nsecond paragraph\n[/pindent]", + "
    \ntext
    \n
    \nsecond paragraph
    \n
    " + ], + "markdown-blocks-inside": [ + "[pindent]\n## Heading\n\n- one\n- two\n\n> quoted\n[/pindent]", + "
    \n
    \n

    Heading

    \n
      \n
    • one
    • \n
    • two
    • \n
    \n
    \nquoted
    \n
    \n
    " + ], + "inline-markdown-inside": [ + "[pindent]**bold** _italic_ `code` [link](https://example.com) :smile:[/pindent]", + "bold italic code link \":smile:\"" + ], + "in-blockquote": [ + "> [pindent]\n> text\n> [/pindent]", + "
    \n
    \ntext
    \n
    " + ], + "in-list-item": [ + "- [pindent]\n text\n [/pindent]\n- next", + "
      \n

    • \ntext
      \n
    • \n
    • next
    • \n
    " + ], + "in-table-cell": [ + "| head |\n|---|\n| [pindent]text[/pindent] |", + "
    \n\n\n\n\n\n\n\n\n\n\n\n
    head
    text
    \n
    " + ], + "in-heading": [ + "## [pindent]text[/pindent]", + "

    text

    " + ], + "around-b": [ + "[pindent][b]text[/b][/pindent]", + "text" + ], + "in-b": [ + "[b]before [pindent]text[/pindent] after[/b]", + "before text after" + ], + "in-core-quote": [ + "[quote]\n[pindent]text[/pindent]\n[/quote]", + "" + ], + "misnested-with-i": [ + "[pindent][i]text[/pindent] tail[/i]", + "text tail" + ], + "nested-in-itself": [ + "[pindent]outer [pindent]inner[/pindent] outer[/pindent]", + "outer inner outer" + ], + "repeated": [ + "[pindent]one[/pindent][pindent]two[/pindent] [pindent]three[/pindent]", + "onetwo three" + ], + "tail-and-next-line": [ + "[pindent]text[/pindent] tail\nnext line", + "text tail
    \nnext line" + ], + "blank-lines-around": [ + "before\n\n\n[pindent]text[/pindent]\n\n\nafter", + "before


    text


    after" + ], + "unclosed": [ + "[pindent]text", + "[pindent]text" + ], + "unmatched-close": [ + "text[/pindent]", + "text[/pindent]" + ], + "escaped": [ + "\\[pindent]text[/pindent]", + "[pindent]text[/pindent]" + ], + "uppercase": [ + "[PINDENT]text[/PINDENT]", + "text" + ] + }, + "tag-plain": { + "alone": [ + "[plain][b]not bold[/b] :smile:[/plain]", + "[b]not bold[/b] :smile:" + ], + "empty": [ + "[plain][/plain]", + "" + ], + "mid-line": [ + "before [plain][b]not bold[/b] :smile:[/plain] after", + "before [b]not bold[/b] :smile: after" + ], + "own-lines": [ + "[plain]\n[b]not bold[/b] :smile:\n[/plain]", + "
    \n[b]not bold[/b] :smile:
    " + ], + "own-lines-between-text": [ + "before\n[plain]\n[b]not bold[/b] :smile:\n[/plain]\nafter", + "before

    \n[b]not bold[/b] :smile:
    \n
    after" + ], + "starts-mid-line-spans-lines": [ + "before [plain][b]not bold[/b] :smile:\nmore[/plain] after", + "before [b]not bold[/b] :smile:
    \nmore after" + ], + "blank-line-inside": [ + "[plain]\n[b]not bold[/b] :smile:\n\nsecond paragraph\n[/plain]", + "
    \n[b]not bold[/b] :smile:
    \n
    \nsecond paragraph
    " + ], + "markdown-blocks-inside": [ + "[plain]\n## Heading\n\n- one\n- two\n\n> quoted\n[/plain]", + "
    \n## Heading
    \n
    \n- one
    \n- two
    \n
    \n> quoted
    " + ], + "inline-markdown-inside": [ + "[plain]**bold** _italic_ `code` [link](https://example.com) :smile:[/plain]", + "**bold** _italic_ `code` [link](https://example.com) :smile:" + ], + "in-blockquote": [ + "> [plain]\n> [b]not bold[/b] :smile:\n> [/plain]", + "

    \n[b]not bold[/b] :smile:
    \n
    " + ], + "in-list-item": [ + "- [plain]\n [b]not bold[/b] :smile:\n [/plain]\n- next", + "
      \n

    • \n[b]not bold[/b] :smile:
      \n
    • \n
    • next
    • \n
    " + ], + "in-table-cell": [ + "| head |\n|---|\n| [plain][b]not bold[/b] :smile:[/plain] |", + "
    \n\n\n\n\n\n\n\n\n\n\n\n
    head
    [b]not bold[/b] :smile:
    \n
    " + ], + "in-heading": [ + "## [plain][b]not bold[/b] :smile:[/plain]", + "

    [b]not bold[/b] :smile:

    " + ], + "around-b": [ + "[plain][b][b]not bold[/b] :smile:[/b][/plain]", + "[b][b]not bold[/b] :smile:[/b]" + ], + "in-b": [ + "[b]before [plain][b]not bold[/b] :smile:[/plain] after[/b]", + "before [b]not bold[/b] :smile: after" + ], + "in-core-quote": [ + "[quote]\n[plain][b]not bold[/b] :smile:[/plain]\n[/quote]", + "" + ], + "misnested-with-i": [ + "[plain][i][b]not bold[/b] :smile:[/plain] tail[/i]", + "[i][b]not bold[/b] :smile: tail[/i]" + ], + "nested-in-itself": [ + "[plain]outer [plain]inner[/plain] outer[/plain]", + "outer [plain]inner[/plain] outer" + ], + "repeated": [ + "[plain]one[/plain][plain]two[/plain] [plain]three[/plain]", + "onetwo three" + ], + "tail-and-next-line": [ + "[plain][b]not bold[/b] :smile:[/plain] tail\nnext line", + "[b]not bold[/b] :smile: tail
    next line" + ], + "blank-lines-around": [ + "before\n\n\n[plain][b]not bold[/b] :smile:[/plain]\n\n\nafter", + "before


    [b]not bold[/b] :smile:


    after" + ], + "unclosed": [ + "[plain][b]not bold[/b] :smile:", + "[plain]not bold \":smile:\"" + ], + "unmatched-close": [ + "[b]not bold[/b] :smile:[/plain]", + "not bold \":smile:\"[/plain]" + ], + "escaped": [ + "\\[plain][b]not bold[/b] :smile:[/plain]", + "[plain]not bold \":smile:\"[/plain]" + ], + "uppercase": [ + "[PLAIN][b]not bold[/b] :smile:[/PLAIN]", + "[b]not bold[/b] :smile:" + ] + }, + "tag-print": { + "alone": [ + "[print=line]text[/print]", + "
    text
    " + ], + "empty": [ + "[print=line][/print]", + "
    " + ], + "mid-line": [ + "before [print=line]text[/print] after", + "before
    text
    after" + ], + "own-lines": [ + "[print=line]\ntext\n[/print]", + "
    \n
    \ntext
    \n
    " + ], + "own-lines-between-text": [ + "before\n[print=line]\ntext\n[/print]\nafter", + "before
    \n
    \ntext
    \n
    \nafter" + ], + "starts-mid-line-spans-lines": [ + "before [print=line]text\nmore[/print] after", + "before
    \ntext
    \nmore
    \nafter" + ], + "blank-line-inside": [ + "[print=line]\ntext\n\nsecond paragraph\n[/print]", + "
    \n
    \ntext

    second paragraph
    \n
    " + ], + "markdown-blocks-inside": [ + "[print=line]\n## Heading\n\n- one\n- two\n\n> quoted\n[/print]", + "
    \n
    \n

    Heading

    \n
      \n
    • one
    • \n
    • two
    • \n
    \n
    \nquoted
    \n
    \n
    " + ], + "inline-markdown-inside": [ + "[print=line]**bold** _italic_ `code` [link](https://example.com) :smile:[/print]", + "
    bold italic code link \":smile:\"
    " + ], + "in-blockquote": [ + "> [print=line]\n> text\n> [/print]", + "
    \n
    \n
    \ntext
    \n
    \n
    " + ], + "in-list-item": [ + "- [print=line]\n text\n [/print]\n- next", + "
      \n
    • \n
      \n
      \ntext
      \n
      \n
    • \n
    • next
    • \n
    " + ], + "in-table-cell": [ + "| head |\n|---|\n| [print=line]text[/print] |", + "
    \n\n\n\n\n\n\n\n\n\n\n\n
    head
    text
    \n
    " + ], + "in-heading": [ + "## [print=line]text[/print]", + "

    text

    " + ], + "around-b": [ + "[print=line][b]text[/b][/print]", + "
    text
    " + ], + "in-b": [ + "[b]before [print=line]text[/print] after[/b]", + "before
    text
    after
    " + ], + "in-core-quote": [ + "[quote]\n[print=line]text[/print]\n[/quote]", + "" + ], + "misnested-with-i": [ + "[print=line][i]text[/print] tail[/i]", + "
    text
    \ntail" + ], + "nested-in-itself": [ + "[print=line]outer [print=line]inner[/print] outer[/print]", + "
    outer
    inner
    outer
    " + ], + "repeated": [ + "[print=line]one[/print][print=line]two[/print] [print=line]three[/print]", + "
    one
    \n
    two
    \n
    three
    " + ], + "tail-and-next-line": [ + "[print=line]text[/print] tail\nnext line", + "
    text
    \ntail
    next line" + ], + "blank-lines-around": [ + "before\n\n\n[print=line]text[/print]\n\n\nafter", + "before


    text
    \n

    after" + ], + "unclosed": [ + "[print=line]text", + "[print=line]text" + ], + "unmatched-close": [ + "text[/print]", + "text[/print]" + ], + "escaped": [ + "\\[print=line]text[/print]", + "[print=line]text[/print]" + ], + "uppercase": [ + "[PRINT=line]text[/PRINT]", + "
    text
    " + ], + "[print] alone": [ + "[print]text[/print]", + "
    text
    " + ], + "[print] own-lines": [ + "[print]\ntext\n[/print]", + "
    \n
    \ntext
    \n
    " + ], + "[print=graph] alone": [ + "[print=graph]text[/print]", + "
    text
    " + ], + "[print=graph] own-lines": [ + "[print=graph]\ntext\n[/print]", + "
    \n
    \ntext
    \n
    " + ], + "[print=parchment] alone": [ + "[print=parchment]text[/print]", + "
    text
    " + ], + "[print=parchment] own-lines": [ + "[print=parchment]\ntext\n[/print]", + "
    \n
    \ntext
    \n
    " + ], + "[print=unknown] alone": [ + "[print=unknown]text[/print]", + "
    text
    " + ], + "[print=unknown] own-lines": [ + "[print=unknown]\ntext\n[/print]", + "
    \n
    \ntext
    \n
    " + ] + }, + "tag-progress": { + "alone": [ + "[progress=40]text[/progress]", + "
    \n
    text
    \n
    \n
    \n
    " + ], + "empty": [ + "[progress=40][/progress]", + "
    \n
    \n
    \n
    \n
    " + ], + "mid-line": [ + "before [progress=40]text[/progress] after", + "before
    text
    after" + ], + "own-lines": [ + "[progress=40]\ntext\n[/progress]", + "
    \n
    \ntext
    \n
    \n
    \n
    " + ], + "own-lines-between-text": [ + "before\n[progress=40]\ntext\n[/progress]\nafter", + "before
    \n
    \ntext
    \n
    \n
    \n
    \n
    after" + ], + "starts-mid-line-spans-lines": [ + "before [progress=40]text\nmore[/progress] after", + "before
    \n
    \ntext
    \nmore
    \n
    \n
    \n
    \nafter" + ], + "blank-line-inside": [ + "[progress=40]\ntext\n\nsecond paragraph\n[/progress]", + "
    \n
    \ntext

    second paragraph
    \n
    \n
    \n
    " + ], + "markdown-blocks-inside": [ + "[progress=40]\n## Heading\n\n- one\n- two\n\n> quoted\n[/progress]", + "
    \n
    \n

    Heading

    \n
      \n
    • one
    • \n
    • two
    • \n
    \n
    \nquoted
    \n
    \n
    \n
    \n
    " + ], + "inline-markdown-inside": [ + "[progress=40]**bold** _italic_ `code` [link](https://example.com) :smile:[/progress]", + "
    \n
    bold italic code link \":smile:\"
    \n
    \n
    \n
    " + ], + "in-blockquote": [ + "> [progress=40]\n> text\n> [/progress]", + "
    \n
    \n
    \ntext
    \n
    \n
    \n
    \n
    " + ], + "in-list-item": [ + "- [progress=40]\n text\n [/progress]\n- next", + "
      \n
    • \n
      \n
      \ntext
      \n
      \n
      \n
      \n
    • \n
    • next
    • \n
    " + ], + "in-table-cell": [ + "| head |\n|---|\n| [progress=40]text[/progress] |", + "
    \n\n\n\n\n\n\n\n\n\n\n\n
    head
    text
    \n
    " + ], + "in-heading": [ + "## [progress=40]text[/progress]", + "

    text

    " + ], + "around-b": [ + "[progress=40][b]text[/b][/progress]", + "
    \n
    text
    \n
    \n
    \n
    " + ], + "in-b": [ + "[b]before [progress=40]text[/progress] after[/b]", + "before
    text
    after
    " + ], + "in-core-quote": [ + "[quote]\n[progress=40]text[/progress]\n[/quote]", + "" + ], + "misnested-with-i": [ + "[progress=40][i]text[/progress] tail[/i]", + "
    \n
    text
    \n
    \n
    \n
    \ntail" + ], + "nested-in-itself": [ + "[progress=40]outer [progress=40]inner[/progress] outer[/progress]", + "
    \n
    outer
    inner
    outer
    \n
    \n
    \n
    " + ], + "repeated": [ + "[progress=40]one[/progress][progress=40]two[/progress] [progress=40]three[/progress]", + "
    \n
    one
    \n
    \n
    \n
    \n
    \n
    two
    \n
    \n
    \n
    \n
    \n
    three
    \n
    \n
    \n
    " + ], + "tail-and-next-line": [ + "[progress=40]text[/progress] tail\nnext line", + "
    \n
    text
    \n
    \n
    \n
    \ntail
    next line" + ], + "blank-lines-around": [ + "before\n\n\n[progress=40]text[/progress]\n\n\nafter", + "before


    \n
    text
    \n
    \n
    \n
    \n


    after" + ], + "unclosed": [ + "[progress=40]text", + "[progress=40]text" + ], + "unmatched-close": [ + "text[/progress]", + "text[/progress]" + ], + "escaped": [ + "\\[progress=40]text[/progress]", + "[progress=40]text[/progress]" + ], + "uppercase": [ + "[PROGRESS=40]text[/PROGRESS]", + "
    \n
    text
    \n
    \n
    \n
    " + ], + "[progress] alone": [ + "[progress]text[/progress]", + "
    \n
    text
    \n
    \n
    \n
    " + ], + "[progress] own-lines": [ + "[progress]\ntext\n[/progress]", + "
    \n
    \ntext
    \n
    \n
    \n
    " + ], + "[progress=150] alone": [ + "[progress=150]text[/progress]", + "
    \n
    text
    \n
    \n
    \n
    " + ], + "[progress=150] own-lines": [ + "[progress=150]\ntext\n[/progress]", + "
    \n
    \ntext
    \n
    \n
    \n
    " + ] + }, + "tag-quote": { + "alone": [ + "[quote]text[/quote]", + "" + ], + "empty": [ + "[quote][/quote]", + "[quote][/quote]" + ], + "mid-line": [ + "before [quote]text[/quote] after", + "before [quote]text[/quote] after" + ], + "own-lines": [ + "[quote]\ntext\n[/quote]", + "" + ], + "own-lines-between-text": [ + "before\n[quote]\ntext\n[/quote]\nafter", + "before
    \nafter" + ], + "starts-mid-line-spans-lines": [ + "before [quote]text\nmore[/quote] after", + "before [quote]text
    \nmore[/quote] after" + ], + "blank-line-inside": [ + "[quote]\ntext\n\nsecond paragraph\n[/quote]", + "" + ], + "markdown-blocks-inside": [ + "[quote]\n## Heading\n\n- one\n- two\n\n> quoted\n[/quote]", + "" + ], + "inline-markdown-inside": [ + "[quote]**bold** _italic_ `code` [link](https://example.com) :smile:[/quote]", + "" + ], + "in-blockquote": [ + "> [quote]\n> text\n> [/quote]", + "
    \n\n
    " + ], + "in-list-item": [ + "- [quote]\n text\n [/quote]\n- next", + "
      \n
    • \n\n
    • \n
    • next
    • \n
    " + ], + "in-table-cell": [ + "| head |\n|---|\n| [quote]text[/quote] |", + "
    \n\n\n\n\n\n\n\n\n\n\n\n
    head
    [quote]text[/quote]
    \n
    " + ], + "in-heading": [ + "## [quote]text[/quote]", + "

    [quote]text[/quote]

    " + ], + "around-b": [ + "[quote][b]text[/b][/quote]", + "" + ], + "in-b": [ + "[b]before [quote]text[/quote] after[/b]", + "before [quote]text[/quote] after" + ], + "in-core-quote": [ + "[quote]\n[quote]text[/quote]\n[/quote]", + "" + ], + "misnested-with-i": [ + "[quote][i]text[/quote] tail[/i]", + "[quote]text[/quote] tail" + ], + "nested-in-itself": [ + "[quote]outer [quote]inner[/quote] outer[/quote]", + "" + ], + "repeated": [ + "[quote]one[/quote][quote]two[/quote] [quote]three[/quote]", + "" + ], + "tail-and-next-line": [ + "[quote]text[/quote] tail\nnext line", + "[quote]text[/quote] tail
    \nnext line" + ], + "blank-lines-around": [ + "before\n\n\n[quote]text[/quote]\n\n\nafter", + "before


    \n

    after" + ], + "unclosed": [ + "[quote]text", + "[quote]text" + ], + "unmatched-close": [ + "text[/quote]", + "text[/quote]" + ], + "escaped": [ + "\\[quote]text[/quote]", + "[quote]text[/quote]" + ], + "uppercase": [ + "[QUOTE]text[/QUOTE]", + "" + ], + "[quote=\"system, post:1, topic:1\"] alone": [ + "[quote=\"system, post:1, topic:1\"]text[/quote]", + "" + ], + "[quote=\"system, post:1, topic:1\"] own-lines": [ + "[quote=\"system, post:1, topic:1\"]\ntext\n[/quote]", + "" + ] + }, + "tag-right": { + "alone": [ + "[right]text[/right]", + "
    text
    " + ], + "empty": [ + "[right][/right]", + "
    " + ], + "mid-line": [ + "before [right]text[/right] after", + "before
    text
    after" + ], + "own-lines": [ + "[right]\ntext\n[/right]", + "
    \n
    \ntext
    \n
    " + ], + "own-lines-between-text": [ + "before\n[right]\ntext\n[/right]\nafter", + "before
    \n
    \ntext
    \n
    \n
    after" + ], + "starts-mid-line-spans-lines": [ + "before [right]text\nmore[/right] after", + "before
    \ntext
    \nmore
    \nafter" + ], + "blank-line-inside": [ + "[right]\ntext\n\nsecond paragraph\n[/right]", + "
    \n
    \ntext

    second paragraph
    \n
    " + ], + "markdown-blocks-inside": [ + "[right]\n## Heading\n\n- one\n- two\n\n> quoted\n[/right]", + "
    \n
    \n

    Heading

    \n
      \n
    • one
    • \n
    • two
    • \n
    \n
    \nquoted
    \n
    \n
    " + ], + "inline-markdown-inside": [ + "[right]**bold** _italic_ `code` [link](https://example.com) :smile:[/right]", + "
    bold italic code link \":smile:\"
    " + ], + "in-blockquote": [ + "> [right]\n> text\n> [/right]", + "
    \n
    \n
    \ntext
    \n
    \n
    " + ], + "in-list-item": [ + "- [right]\n text\n [/right]\n- next", + "
      \n
    • \n
      \n
      \ntext
      \n
      \n
    • \n
    • next
    • \n
    " + ], + "in-table-cell": [ + "| head |\n|---|\n| [right]text[/right] |", + "
    \n\n\n\n\n\n\n\n\n\n\n\n
    head
    text
    \n
    " + ], + "in-heading": [ + "## [right]text[/right]", + "

    text

    " + ], + "around-b": [ + "[right][b]text[/b][/right]", + "
    text
    " + ], + "in-b": [ + "[b]before [right]text[/right] after[/b]", + "before
    text
    after
    " + ], + "in-core-quote": [ + "[quote]\n[right]text[/right]\n[/quote]", + "" + ], + "misnested-with-i": [ + "[right][i]text[/right] tail[/i]", + "
    text
    \ntail" + ], + "nested-in-itself": [ + "[right]outer [right]inner[/right] outer[/right]", + "
    outer
    inner
    outer
    " + ], + "repeated": [ + "[right]one[/right][right]two[/right] [right]three[/right]", + "
    one
    \n
    two
    \n
    three
    " + ], + "tail-and-next-line": [ + "[right]text[/right] tail\nnext line", + "
    text
    \ntail
    next line" + ], + "blank-lines-around": [ + "before\n\n\n[right]text[/right]\n\n\nafter", + "before


    text
    \n


    after" + ], + "unclosed": [ + "[right]text", + "[right]text" + ], + "unmatched-close": [ + "text[/right]", + "text[/right]" + ], + "escaped": [ + "\\[right]text[/right]", + "[right]text[/right]" + ], + "uppercase": [ + "[RIGHT]text[/RIGHT]", + "
    text
    " + ] + }, + "tag-row": { + "alone": [ + "[row][column=6]a[/column][column=6]b[/column][/row]", + "
    a
    b
    " + ], + "empty": [ + "[row][/row]", + "
    " + ], + "mid-line": [ + "before [row][column=6]a[/column][column=6]b[/column][/row] after", + "before
    a
    b
    after" + ], + "own-lines": [ + "[row]\n[column=6]a[/column][column=6]b[/column]\n[/row]", + "
    \n
    \n
    a
    \n
    b
    \n
    \n
    " + ], + "own-lines-between-text": [ + "before\n[row]\n[column=6]a[/column][column=6]b[/column]\n[/row]\nafter", + "before
    \n
    \n
    a
    \n
    b
    \n
    \n
    \n
    after" + ], + "starts-mid-line-spans-lines": [ + "before [row][column=6]a[/column][column=6]b[/column]\nmore[/row] after", + "before
    \n
    a
    \n
    b
    \n
    more
    \nafter" + ], + "blank-line-inside": [ + "[row]\n[column=6]a[/column][column=6]b[/column]\n\nsecond paragraph\n[/row]", + "
    \n
    \n
    a
    \n
    b
    \n

    second paragraph
    \n
    " + ], + "markdown-blocks-inside": [ + "[row]\n## Heading\n\n- one\n- two\n\n> quoted\n[/row]", + "
    \n
    \n

    Heading

    \n
      \n
    • one
    • \n
    • two
    • \n
    \n
    \nquoted
    \n
    \n
    " + ], + "inline-markdown-inside": [ + "[row]**bold** _italic_ `code` [link](https://example.com) :smile:[/row]", + "
    bold italic code link \":smile:\"
    " + ], + "in-blockquote": [ + "> [row]\n> [column=6]a[/column][column=6]b[/column]\n> [/row]", + "
    \n
    \n
    \n
    a
    \n
    b
    \n
    \n
    \n
    " + ], + "in-list-item": [ + "- [row]\n [column=6]a[/column][column=6]b[/column]\n [/row]\n- next", + "
      \n
    • \n
      \n
      \n
      a
      \n
      b
      \n
      \n
      \n
    • \n
    • next
    • \n
    " + ], + "in-table-cell": [ + "| head |\n|---|\n| [row][column=6]a[/column][column=6]b[/column][/row] |", + "
    \n\n\n\n\n\n\n\n\n\n\n\n
    head
    a
    b
    \n
    " + ], + "in-heading": [ + "## [row][column=6]a[/column][column=6]b[/column][/row]", + "

    a
    b

    " + ], + "around-b": [ + "[row][b][column=6]a[/column][column=6]b[/column][/b][/row]", + "
    a
    b
    " + ], + "in-b": [ + "[b]before [row][column=6]a[/column][column=6]b[/column][/row] after[/b]", + "before
    a
    b
    after
    " + ], + "in-core-quote": [ + "[quote]\n[row][column=6]a[/column][column=6]b[/column][/row]\n[/quote]", + "" + ], + "misnested-with-i": [ + "[row][i][column=6]a[/column][column=6]b[/column][/row] tail[/i]", + "
    a
    b
    \ntail" + ], + "nested-in-itself": [ + "[row]outer [row]inner[/row] outer[/row]", + "
    outer
    inner
    outer
    " + ], + "repeated": [ + "[row]one[/row][row]two[/row] [row]three[/row]", + "
    one
    \n
    two
    \n
    three
    " + ], + "tail-and-next-line": [ + "[row][column=6]a[/column][column=6]b[/column][/row] tail\nnext line", + "
    a
    b
    \ntail
    next line" + ], + "blank-lines-around": [ + "before\n\n\n[row][column=6]a[/column][column=6]b[/column][/row]\n\n\nafter", + "before


    a
    b
    \n


    after" + ], + "unclosed": [ + "[row][column=6]a[/column][column=6]b[/column]", + "[row]
    a
    b
    " + ], + "unmatched-close": [ + "[column=6]a[/column][column=6]b[/column][/row]", + "
    a
    \n
    b
    \n[/row]" + ], + "escaped": [ + "\\[row][column=6]a[/column][column=6]b[/column][/row]", + "[row]
    a
    b
    [/row]" + ], + "uppercase": [ + "[ROW][column=6]a[/column][column=6]b[/column][/ROW]", + "
    a
    b
    " + ] + }, + "tag-s": { + "alone": [ + "[s]text[/s]", + "text" + ], + "empty": [ + "[s][/s]", + "" + ], + "mid-line": [ + "before [s]text[/s] after", + "before text after" + ], + "own-lines": [ + "[s]\ntext\n[/s]", + "
    \ntext
    \n
    " + ], + "own-lines-between-text": [ + "before\n[s]\ntext\n[/s]\nafter", + "before
    \n
    \ntext
    \n

    \nafter" + ], + "starts-mid-line-spans-lines": [ + "before [s]text\nmore[/s] after", + "before text
    \nmore
    after" + ], + "blank-line-inside": [ + "[s]\ntext\n\nsecond paragraph\n[/s]", + "
    \ntext
    \n
    \nsecond paragraph
    \n
    " + ], + "markdown-blocks-inside": [ + "[s]\n## Heading\n\n- one\n- two\n\n> quoted\n[/s]", + "
    \n
    \n

    Heading

    \n
      \n
    • one
    • \n
    • two
    • \n
    \n
    \nquoted
    \n
    \n
    " + ], + "inline-markdown-inside": [ + "[s]**bold** _italic_ `code` [link](https://example.com) :smile:[/s]", + "bold italic code link \":smile:\"" + ], + "in-blockquote": [ + "> [s]\n> text\n> [/s]", + "
    \n
    \ntext
    \n
    " + ], + "in-list-item": [ + "- [s]\n text\n [/s]\n- next", + "
      \n

    • \ntext
      \n
    • \n
    • next
    • \n
    " + ], + "in-table-cell": [ + "| head |\n|---|\n| [s]text[/s] |", + "
    \n\n\n\n\n\n\n\n\n\n\n\n
    head
    text
    \n
    " + ], + "in-heading": [ + "## [s]text[/s]", + "

    text

    " + ], + "around-b": [ + "[s][b]text[/b][/s]", + "text" + ], + "in-b": [ + "[b]before [s]text[/s] after[/b]", + "before text after" + ], + "in-core-quote": [ + "[quote]\n[s]text[/s]\n[/quote]", + "" + ], + "misnested-with-i": [ + "[s][i]text[/s] tail[/i]", + "text tail" + ], + "nested-in-itself": [ + "[s]outer [s]inner[/s] outer[/s]", + "outer inner outer" + ], + "repeated": [ + "[s]one[/s][s]two[/s] [s]three[/s]", + "onetwo three" + ], + "tail-and-next-line": [ + "[s]text[/s] tail\nnext line", + "text tail
    \nnext line" + ], + "blank-lines-around": [ + "before\n\n\n[s]text[/s]\n\n\nafter", + "before


    text


    after" + ], + "unclosed": [ + "[s]text", + "[s]text" + ], + "unmatched-close": [ + "text[/s]", + "text[/s]" + ], + "escaped": [ + "\\[s]text[/s]", + "[s]text[/s]" + ], + "uppercase": [ + "[S]text[/S]", + "text" + ] + }, + "tag-script": { + "alone": [ + "[script class=box on=click](print \"hi\")[/script]", + "" + ], + "empty": [ + "[script class=box on=click][/script]", + "" + ], + "mid-line": [ + "before [script class=box on=click](print \"hi\")[/script] after", + "\nbefore after" + ], + "own-lines": [ + "[script class=box on=click]\n(print \"hi\")\n[/script]", + "" + ], + "own-lines-between-text": [ + "before\n[script class=box on=click]\n(print \"hi\")\n[/script]\nafter", + "\nbefore

    after" + ], + "starts-mid-line-spans-lines": [ + "before [script class=box on=click](print \"hi\")\nmore[/script] after", + "\nbefore after" + ], + "blank-line-inside": [ + "[script class=box on=click]\n(print \"hi\")\n\nsecond paragraph\n[/script]", + "" + ], + "markdown-blocks-inside": [ + "[script class=box on=click]\n## Heading\n\n- one\n- two\n\n> quoted\n[/script]", + "" + ], + "inline-markdown-inside": [ + "[script class=box on=click]**bold** _italic_ `code` [link](https://example.com) :smile:[/script]", + "" + ], + "in-blockquote": [ + "> [script class=box on=click]\n> (print \"hi\")\n> [/script]", + "\n
    " + ], + "in-list-item": [ + "- [script class=box on=click]\n (print \"hi\")\n [/script]\n- next", + "\n
      \n
    • \n
    • next
    • \n
    " + ], + "in-table-cell": [ + "| head |\n|---|\n| [script class=box on=click](print \"hi\")[/script] |", + "\n
    \n\n\n\n\n\n\n\n\n\n\n\n
    head
    \n
    " + ], + "in-heading": [ + "## [script class=box on=click](print \"hi\")[/script]", + "\n

    " + ], + "around-b": [ + "[script class=box on=click][b](print \"hi\")[/b][/script]", + "" + ], + "in-b": [ + "[b]before [script class=box on=click](print \"hi\")[/script] after[/b]", + "\nbefore after" + ], + "in-core-quote": [ + "[quote]\n[script class=box on=click](print \"hi\")[/script]\n[/quote]", + "\n" + ], + "misnested-with-i": [ + "[script class=box on=click][i](print \"hi\")[/script] tail[/i]", + "\ntail[/i]" + ], + "nested-in-itself": [ + "[script class=box on=click]outer [script class=box on=click]inner[/script] outer[/script]", + "" + ], + "repeated": [ + "[script class=box on=click]one[/script][script class=box on=click]two[/script] [script class=box on=click]three[/script]", + "" + ], + "tail-and-next-line": [ + "[script class=box on=click](print \"hi\")[/script] tail\nnext line", + "\ntail
    next line" + ], + "blank-lines-around": [ + "before\n\n\n[script class=box on=click](print \"hi\")[/script]\n\n\nafter", + "\nbefore





    after" + ], + "unclosed": [ + "[script class=box on=click](print \"hi\")", + "script class=box on=click" + ], + "unmatched-close": [ + "(print \"hi\")[/script]", + "(print "hi")[/script]" + ], + "escaped": [ + "\\[script class=box on=click](print \"hi\")[/script]", + "[script class=box on=click](print "hi")[/script]" + ], + "uppercase": [ + "[SCRIPT class=box on=click](print \"hi\")[/SCRIPT]", + "" + ], + "[script] alone": [ + "[script](print \"hi\")[/script]", + "" + ], + "[script] own-lines": [ + "[script]\n(print \"hi\")\n[/script]", + "" + ], + "[script alone": [ + "[script(print \"hi\")[/script]", + "[script(print "hi")[/script]" + ], + "[script own-lines": [ + "[script\n(print \"hi\")\n[/script]", + "[script
    \n(print "hi")
    \n[/script]" + ], + "on=bogus] alone": [ + "on=bogus](print \"hi\")[/script]", + "on=bogus](print "hi")[/script]" + ], + "on=bogus] own-lines": [ + "on=bogus]\n(print \"hi\")\n[/script]", + "on=bogus]
    \n(print "hi")
    \n[/script]" + ] + }, + "tag-scroll": { + "alone": [ + "[scroll=200]text[/scroll]", + "
    text
    " + ], + "empty": [ + "[scroll=200][/scroll]", + "
    " + ], + "mid-line": [ + "before [scroll=200]text[/scroll] after", + "before
    text
    after" + ], + "own-lines": [ + "[scroll=200]\ntext\n[/scroll]", + "
    \n
    \ntext
    \n
    " + ], + "own-lines-between-text": [ + "before\n[scroll=200]\ntext\n[/scroll]\nafter", + "before
    \n
    \ntext
    \n
    \n
    after" + ], + "starts-mid-line-spans-lines": [ + "before [scroll=200]text\nmore[/scroll] after", + "before
    \ntext
    \nmore
    \nafter" + ], + "blank-line-inside": [ + "[scroll=200]\ntext\n\nsecond paragraph\n[/scroll]", + "
    \n
    \ntext

    second paragraph
    \n
    " + ], + "markdown-blocks-inside": [ + "[scroll=200]\n## Heading\n\n- one\n- two\n\n> quoted\n[/scroll]", + "
    \n
    \n

    Heading

    \n
      \n
    • one
    • \n
    • two
    • \n
    \n
    \nquoted
    \n
    \n
    " + ], + "inline-markdown-inside": [ + "[scroll=200]**bold** _italic_ `code` [link](https://example.com) :smile:[/scroll]", + "
    bold italic code link \":smile:\"
    " + ], + "in-blockquote": [ + "> [scroll=200]\n> text\n> [/scroll]", + "
    \n
    \n
    \ntext
    \n
    \n
    " + ], + "in-list-item": [ + "- [scroll=200]\n text\n [/scroll]\n- next", + "
      \n
    • \n
      \n
      \ntext
      \n
      \n
    • \n
    • next
    • \n
    " + ], + "in-table-cell": [ + "| head |\n|---|\n| [scroll=200]text[/scroll] |", + "
    \n\n\n\n\n\n\n\n\n\n\n\n
    head
    text
    \n
    " + ], + "in-heading": [ + "## [scroll=200]text[/scroll]", + "

    text

    " + ], + "around-b": [ + "[scroll=200][b]text[/b][/scroll]", + "
    text
    " + ], + "in-b": [ + "[b]before [scroll=200]text[/scroll] after[/b]", + "before
    text
    after
    " + ], + "in-core-quote": [ + "[quote]\n[scroll=200]text[/scroll]\n[/quote]", + "" + ], + "misnested-with-i": [ + "[scroll=200][i]text[/scroll] tail[/i]", + "
    text
    \ntail" + ], + "nested-in-itself": [ + "[scroll=200]outer [scroll=200]inner[/scroll] outer[/scroll]", + "
    outer
    inner
    outer
    " + ], + "repeated": [ + "[scroll=200]one[/scroll][scroll=200]two[/scroll] [scroll=200]three[/scroll]", + "
    one
    \n
    two
    \n
    three
    " + ], + "tail-and-next-line": [ + "[scroll=200]text[/scroll] tail\nnext line", + "
    text
    \ntail
    next line" + ], + "blank-lines-around": [ + "before\n\n\n[scroll=200]text[/scroll]\n\n\nafter", + "before


    text
    \n


    after" + ], + "unclosed": [ + "[scroll=200]text", + "[scroll=200]text" + ], + "unmatched-close": [ + "text[/scroll]", + "text[/scroll]" + ], + "escaped": [ + "\\[scroll=200]text[/scroll]", + "[scroll=200]text[/scroll]" + ], + "uppercase": [ + "[SCROLL=200]text[/SCROLL]", + "
    text
    " + ], + "[scroll] alone": [ + "[scroll]text[/scroll]", + "
    text
    " + ], + "[scroll] own-lines": [ + "[scroll]\ntext\n[/scroll]", + "
    \n
    \ntext
    \n
    " + ], + "[scroll=0] alone": [ + "[scroll=0]text[/scroll]", + "
    text
    " + ], + "[scroll=0] own-lines": [ + "[scroll=0]\ntext\n[/scroll]", + "
    \n
    \ntext
    \n
    " + ], + "[scroll=9999] alone": [ + "[scroll=9999]text[/scroll]", + "
    text
    " + ], + "[scroll=9999] own-lines": [ + "[scroll=9999]\ntext\n[/scroll]", + "
    \n
    \ntext
    \n
    " + ], + "[scroll=abc] alone": [ + "[scroll=abc]text[/scroll]", + "
    text
    " + ], + "[scroll=abc] own-lines": [ + "[scroll=abc]\ntext\n[/scroll]", + "
    \n
    \ntext
    \n
    " + ] + }, + "tag-sh": { + "alone": [ + "[sh]text[/sh]", + "

    text

    " + ], + "empty": [ + "[sh][/sh]", + "

    " + ], + "mid-line": [ + "before [sh]text[/sh] after", + "before

    text

    after" + ], + "own-lines": [ + "[sh]\ntext\n[/sh]", + "

    \n
    \ntext
    \n

    " + ], + "own-lines-between-text": [ + "before\n[sh]\ntext\n[/sh]\nafter", + "before

    \n
    \ntext
    \n

    \n
    after" + ], + "starts-mid-line-spans-lines": [ + "before [sh]text\nmore[/sh] after", + "before

    \ntext
    \nmore

    \nafter" + ], + "blank-line-inside": [ + "[sh]\ntext\n\nsecond paragraph\n[/sh]", + "

    \n
    \ntext

    second paragraph
    \n

    " + ], + "markdown-blocks-inside": [ + "[sh]\n## Heading\n\n- one\n- two\n\n> quoted\n[/sh]", + "

    \n
    \n

    Heading

    \n
      \n
    • one
    • \n
    • two
    • \n
    \n
    \nquoted
    \n
    \n" + ], + "inline-markdown-inside": [ + "[sh]**bold** _italic_ `code` [link](https://example.com) :smile:[/sh]", + "

    bold italic code link \":smile:\"

    " + ], + "in-blockquote": [ + "> [sh]\n> text\n> [/sh]", + "
    \n

    \n
    \ntext
    \n

    \n
    " + ], + "in-list-item": [ + "- [sh]\n text\n [/sh]\n- next", + "
      \n
    • \n

      \n
      \ntext
      \n

      \n
    • \n
    • next
    • \n
    " + ], + "in-table-cell": [ + "| head |\n|---|\n| [sh]text[/sh] |", + "
    \n\n\n\n\n\n\n\n\n\n\n\n
    head

    text

    \n
    " + ], + "in-heading": [ + "## [sh]text[/sh]", + "

    text

    " + ], + "around-b": [ + "[sh][b]text[/b][/sh]", + "

    text

    " + ], + "in-b": [ + "[b]before [sh]text[/sh] after[/b]", + "before

    text

    after
    " + ], + "in-core-quote": [ + "[quote]\n[sh]text[/sh]\n[/quote]", + "" + ], + "misnested-with-i": [ + "[sh][i]text[/sh] tail[/i]", + "

    text

    \ntail" + ], + "nested-in-itself": [ + "[sh]outer [sh]inner[/sh] outer[/sh]", + "

    outer

    inner

    outer" + ], + "repeated": [ + "[sh]one[/sh][sh]two[/sh] [sh]three[/sh]", + "

    one

    \n

    two

    \n

    three

    " + ], + "tail-and-next-line": [ + "[sh]text[/sh] tail\nnext line", + "

    text

    \ntail
    next line" + ], + "blank-lines-around": [ + "before\n\n\n[sh]text[/sh]\n\n\nafter", + "before


    text

    \n


    after" + ], + "unclosed": [ + "[sh]text", + "[sh]text" + ], + "unmatched-close": [ + "text[/sh]", + "text[/sh]" + ], + "escaped": [ + "\\[sh]text[/sh]", + "[sh]text[/sh]" + ], + "uppercase": [ + "[SH]text[/SH]", + "

    text

    " + ] + }, + "tag-side": { + "alone": [ + "[side=right]text[/side]", + "
    text
    " + ], + "empty": [ + "[side=right][/side]", + "
    " + ], + "mid-line": [ + "before [side=right]text[/side] after", + "before
    text
    after" + ], + "own-lines": [ + "[side=right]\ntext\n[/side]", + "
    \n
    \ntext
    \n
    " + ], + "own-lines-between-text": [ + "before\n[side=right]\ntext\n[/side]\nafter", + "before
    \n
    \ntext
    \n
    \nafter" + ], + "starts-mid-line-spans-lines": [ + "before [side=right]text\nmore[/side] after", + "before
    \ntext
    \nmore
    \nafter" + ], + "blank-line-inside": [ + "[side=right]\ntext\n\nsecond paragraph\n[/side]", + "
    \n
    \ntext

    second paragraph
    \n
    " + ], + "markdown-blocks-inside": [ + "[side=right]\n## Heading\n\n- one\n- two\n\n> quoted\n[/side]", + "
    \n
    \n

    Heading

    \n
      \n
    • one
    • \n
    • two
    • \n
    \n
    \nquoted
    \n
    \n
    " + ], + "inline-markdown-inside": [ + "[side=right]**bold** _italic_ `code` [link](https://example.com) :smile:[/side]", + "
    bold italic code link \":smile:\"
    " + ], + "in-blockquote": [ + "> [side=right]\n> text\n> [/side]", + "
    \n
    \n
    \ntext
    \n
    \n
    " + ], + "in-list-item": [ + "- [side=right]\n text\n [/side]\n- next", + "
      \n
    • \n
      \n
      \ntext
      \n
      \n
    • \n
    • next
    • \n
    " + ], + "in-table-cell": [ + "| head |\n|---|\n| [side=right]text[/side] |", + "
    \n\n\n\n\n\n\n\n\n\n\n\n
    head
    text
    \n
    " + ], + "in-heading": [ + "## [side=right]text[/side]", + "

    text

    " + ], + "around-b": [ + "[side=right][b]text[/b][/side]", + "
    text
    " + ], + "in-b": [ + "[b]before [side=right]text[/side] after[/b]", + "before
    text
    after
    " + ], + "in-core-quote": [ + "[quote]\n[side=right]text[/side]\n[/quote]", + "" + ], + "misnested-with-i": [ + "[side=right][i]text[/side] tail[/i]", + "
    text
    \ntail" + ], + "nested-in-itself": [ + "[side=right]outer [side=right]inner[/side] outer[/side]", + "
    outer
    inner
    outer
    " + ], + "repeated": [ + "[side=right]one[/side][side=right]two[/side] [side=right]three[/side]", + "
    one
    \n
    two
    \n
    three
    " + ], + "tail-and-next-line": [ + "[side=right]text[/side] tail\nnext line", + "
    text
    \ntail
    next line" + ], + "blank-lines-around": [ + "before\n\n\n[side=right]text[/side]\n\n\nafter", + "before


    text
    \n

    after" + ], + "unclosed": [ + "[side=right]text", + "[side=right]text" + ], + "unmatched-close": [ + "text[/side]", + "text[/side]" + ], + "escaped": [ + "\\[side=right]text[/side]", + "[side=right]text[/side]" + ], + "uppercase": [ + "[SIDE=right]text[/SIDE]", + "
    text
    " + ], + "[side] alone": [ + "[side]text[/side]", + "
    text
    " + ], + "[side] own-lines": [ + "[side]\ntext\n[/side]", + "
    \n
    \ntext
    \n
    " + ], + "[side=left] alone": [ + "[side=left]text[/side]", + "
    text
    " + ], + "[side=left] own-lines": [ + "[side=left]\ntext\n[/side]", + "
    \n
    \ntext
    \n
    " + ] + }, + "tag-size": { + "alone": [ + "[size=5]text[/size]", + "text" + ], + "empty": [ + "[size=5][/size]", + "" + ], + "mid-line": [ + "before [size=5]text[/size] after", + "before text after" + ], + "own-lines": [ + "[size=5]\ntext\n[/size]", + "
    \ntext
    \n
    " + ], + "own-lines-between-text": [ + "before\n[size=5]\ntext\n[/size]\nafter", + "before
    \n
    \ntext
    \n

    \nafter" + ], + "starts-mid-line-spans-lines": [ + "before [size=5]text\nmore[/size] after", + "before text
    \nmore
    after" + ], + "blank-line-inside": [ + "[size=5]\ntext\n\nsecond paragraph\n[/size]", + "
    \ntext
    \n
    \nsecond paragraph
    \n
    " + ], + "markdown-blocks-inside": [ + "[size=5]\n## Heading\n\n- one\n- two\n\n> quoted\n[/size]", + "
    \n
    \n

    Heading

    \n
      \n
    • one
    • \n
    • two
    • \n
    \n
    \nquoted
    \n
    \n
    " + ], + "inline-markdown-inside": [ + "[size=5]**bold** _italic_ `code` [link](https://example.com) :smile:[/size]", + "bold italic code link \":smile:\"" + ], + "in-blockquote": [ + "> [size=5]\n> text\n> [/size]", + "
    \n
    \ntext
    \n
    " + ], + "in-list-item": [ + "- [size=5]\n text\n [/size]\n- next", + "
      \n

    • \ntext
      \n
    • \n
    • next
    • \n
    " + ], + "in-table-cell": [ + "| head |\n|---|\n| [size=5]text[/size] |", + "
    \n\n\n\n\n\n\n\n\n\n\n\n
    head
    text
    \n
    " + ], + "in-heading": [ + "## [size=5]text[/size]", + "

    text

    " + ], + "around-b": [ + "[size=5][b]text[/b][/size]", + "text" + ], + "in-b": [ + "[b]before [size=5]text[/size] after[/b]", + "before text after" + ], + "in-core-quote": [ + "[quote]\n[size=5]text[/size]\n[/quote]", + "" + ], + "misnested-with-i": [ + "[size=5][i]text[/size] tail[/i]", + "text tail" + ], + "nested-in-itself": [ + "[size=5]outer [size=5]inner[/size] outer[/size]", + "outer inner outer" + ], + "repeated": [ + "[size=5]one[/size][size=5]two[/size] [size=5]three[/size]", + "onetwo three" + ], + "tail-and-next-line": [ + "[size=5]text[/size] tail\nnext line", + "text tail
    \nnext line" + ], + "blank-lines-around": [ + "before\n\n\n[size=5]text[/size]\n\n\nafter", + "before


    text


    after" + ], + "unclosed": [ + "[size=5]text", + "[size=5]text" + ], + "unmatched-close": [ + "text[/size]", + "text[/size]" + ], + "escaped": [ + "\\[size=5]text[/size]", + "[size=5]text[/size]" + ], + "uppercase": [ + "[SIZE=5]text[/SIZE]", + "text" + ], + "[size=1] alone": [ + "[size=1]text[/size]", + "text" + ], + "[size=1] own-lines": [ + "[size=1]\ntext\n[/size]", + "
    \ntext
    \n
    " + ], + "[size=7] alone": [ + "[size=7]text[/size]", + "text" + ], + "[size=7] own-lines": [ + "[size=7]\ntext\n[/size]", + "
    \ntext
    \n
    " + ], + "[size=0] alone": [ + "[size=0]text[/size]", + "text" + ], + "[size=0] own-lines": [ + "[size=0]\ntext\n[/size]", + "
    \ntext
    \n
    " + ], + "[size=12px] alone": [ + "[size=12px]text[/size]", + "text" + ], + "[size=12px] own-lines": [ + "[size=12px]\ntext\n[/size]", + "
    \ntext
    \n
    " + ], + "[size=40px] alone": [ + "[size=40px]text[/size]", + "text" + ], + "[size=40px] own-lines": [ + "[size=40px]\ntext\n[/size]", + "
    \ntext
    \n
    " + ], + "[size=1.5rem] alone": [ + "[size=1.5rem]text[/size]", + "text" + ], + "[size=1.5rem] own-lines": [ + "[size=1.5rem]\ntext\n[/size]", + "
    \ntext
    \n
    " + ], + "[size=12pt] alone": [ + "[size=12pt]text[/size]", + "text" + ], + "[size=12pt] own-lines": [ + "[size=12pt]\ntext\n[/size]", + "
    \ntext
    " + ] + }, + "tag-spoiler": { + "alone": [ + "[spoiler=Title]text[/spoiler]", + "
    \n\nSpoiler: Title\n
    text
    \n
    " + ], + "empty": [ + "[spoiler=Title][/spoiler]", + "
    \n\nSpoiler: Title\n
    \n
    " + ], + "mid-line": [ + "before [spoiler=Title]text[/spoiler] after", + "before
    Spoiler: Title
    text
    after" + ], + "own-lines": [ + "[spoiler=Title]\ntext\n[/spoiler]", + "
    \n\nSpoiler: Title\n
    \ntext
    \n
    " + ], + "own-lines-between-text": [ + "before\n[spoiler=Title]\ntext\n[/spoiler]\nafter", + "before
    \n\nSpoiler: Title\n
    \ntext
    \n
    \nafter" + ], + "starts-mid-line-spans-lines": [ + "before [spoiler=Title]text\nmore[/spoiler] after", + "before
    \n\nSpoiler: Title\n
    \ntext
    \nmore
    \n
    \nafter" + ], + "blank-line-inside": [ + "[spoiler=Title]\ntext\n\nsecond paragraph\n[/spoiler]", + "
    \n\nSpoiler: Title\n
    \ntext

    second paragraph
    \n
    " + ], + "markdown-blocks-inside": [ + "[spoiler=Title]\n## Heading\n\n- one\n- two\n\n> quoted\n[/spoiler]", + "
    \n\nSpoiler: Title\n
    \n

    Heading

    \n
      \n
    • one
    • \n
    • two
    • \n
    \n
    \nquoted
    \n
    \n
    " + ], + "inline-markdown-inside": [ + "[spoiler=Title]**bold** _italic_ `code` [link](https://example.com) :smile:[/spoiler]", + "
    \n\nSpoiler: Title\n
    bold italic code link \":smile:\"
    \n
    " + ], + "in-blockquote": [ + "> [spoiler=Title]\n> text\n> [/spoiler]", + "
    \n
    \n\nSpoiler: Title\n
    \ntext
    \n
    \n
    " + ], + "in-list-item": [ + "- [spoiler=Title]\n text\n [/spoiler]\n- next", + "
      \n
    • \n
      \n\nSpoiler: Title\n
      \ntext
      \n
      \n
    • \n
    • next
    • \n
    " + ], + "in-table-cell": [ + "| head |\n|---|\n| [spoiler=Title]text[/spoiler] |", + "
    \n\n\n\n\n\n\n\n\n\n\n\n
    head
    Spoiler: Title
    text
    \n
    " + ], + "in-heading": [ + "## [spoiler=Title]text[/spoiler]", + "

    Spoiler: Title
    text

    " + ], + "around-b": [ + "[spoiler=Title][b]text[/b][/spoiler]", + "
    \n\nSpoiler: Title\n
    text
    \n
    " + ], + "in-b": [ + "[b]before [spoiler=Title]text[/spoiler] after[/b]", + "before
    Spoiler: Title
    text
    after
    " + ], + "in-core-quote": [ + "[quote]\n[spoiler=Title]text[/spoiler]\n[/quote]", + "" + ], + "misnested-with-i": [ + "[spoiler=Title][i]text[/spoiler] tail[/i]", + "
    \n\nSpoiler: Title\n
    text
    \n
    \ntail" + ], + "nested-in-itself": [ + "[spoiler=Title]outer [spoiler=Title]inner[/spoiler] outer[/spoiler]", + "
    \n\nSpoiler: Title\n
    outer
    Spoiler: Title
    inner
    outer
    \n
    " + ], + "repeated": [ + "[spoiler=Title]one[/spoiler][spoiler=Title]two[/spoiler] [spoiler=Title]three[/spoiler]", + "
    \n\nSpoiler: Title\n
    one
    \n
    \n
    \n\nSpoiler: Title\n
    two
    \n
    \n
    \n\nSpoiler: Title\n
    three
    \n
    " + ], + "tail-and-next-line": [ + "[spoiler=Title]text[/spoiler] tail\nnext line", + "
    \n\nSpoiler: Title\n
    text
    \n
    \ntail
    next line" + ], + "blank-lines-around": [ + "before\n\n\n[spoiler=Title]text[/spoiler]\n\n\nafter", + "before


    \n\nSpoiler: Title\n
    text
    \n
    \n

    after" + ], + "unclosed": [ + "[spoiler=Title]text", + "[spoiler=Title]text" + ], + "unmatched-close": [ + "text[/spoiler]", + "text[/spoiler]" + ], + "escaped": [ + "\\[spoiler=Title]text[/spoiler]", + "[spoiler=Title]text[/spoiler]" + ], + "uppercase": [ + "[SPOILER=Title]text[/SPOILER]", + "
    \n\nSpoiler: Title\n
    text
    \n
    " + ], + "[spoiler] alone": [ + "[spoiler]text[/spoiler]", + "
    \n\nSpoiler\n
    text
    \n
    " + ], + "[spoiler] own-lines": [ + "[spoiler]\ntext\n[/spoiler]", + "
    \n\nSpoiler\n
    \ntext
    \n
    " + ], + "[spoiler=\"Quoted title\"] alone": [ + "[spoiler=\"Quoted title\"]text[/spoiler]", + "
    \n\nSpoiler: Quoted title\n
    text
    \n
    " + ], + "[spoiler=\"Quoted title\"] own-lines": [ + "[spoiler=\"Quoted title\"]\ntext\n[/spoiler]", + "
    \n\nSpoiler: Quoted title\n
    \ntext
    \n
    " + ] + }, + "tag-sub": { + "alone": [ + "[sub]text[/sub]", + "text" + ], + "empty": [ + "[sub][/sub]", + "" + ], + "mid-line": [ + "before [sub]text[/sub] after", + "before text after" + ], + "own-lines": [ + "[sub]\ntext\n[/sub]", + "
    \ntext
    \n
    " + ], + "own-lines-between-text": [ + "before\n[sub]\ntext\n[/sub]\nafter", + "before
    \n
    \ntext
    \n

    \nafter" + ], + "starts-mid-line-spans-lines": [ + "before [sub]text\nmore[/sub] after", + "before text
    \nmore
    after" + ], + "blank-line-inside": [ + "[sub]\ntext\n\nsecond paragraph\n[/sub]", + "
    \ntext
    \n
    \nsecond paragraph
    \n
    " + ], + "markdown-blocks-inside": [ + "[sub]\n## Heading\n\n- one\n- two\n\n> quoted\n[/sub]", + "
    \n## Heading
    \n
    \n- one
    \n- two
    \n
    \n> quoted
    \n
    " + ], + "inline-markdown-inside": [ + "[sub]**bold** _italic_ `code` [link](https://example.com) :smile:[/sub]", + "bold italic code link \":smile:\"" + ], + "in-blockquote": [ + "> [sub]\n> text\n> [/sub]", + "
    \n
    \ntext
    \n
    " + ], + "in-list-item": [ + "- [sub]\n text\n [/sub]\n- next", + "
      \n

    • \ntext
      \n
    • \n
    • next
    • \n
    " + ], + "in-table-cell": [ + "| head |\n|---|\n| [sub]text[/sub] |", + "
    \n\n\n\n\n\n\n\n\n\n\n\n
    head
    text
    \n
    " + ], + "in-heading": [ + "## [sub]text[/sub]", + "

    text

    " + ], + "around-b": [ + "[sub][b]text[/b][/sub]", + "text" + ], + "in-b": [ + "[b]before [sub]text[/sub] after[/b]", + "before text after" + ], + "in-core-quote": [ + "[quote]\n[sub]text[/sub]\n[/quote]", + "" + ], + "misnested-with-i": [ + "[sub][i]text[/sub] tail[/i]", + "text tail" + ], + "nested-in-itself": [ + "[sub]outer [sub]inner[/sub] outer[/sub]", + "outer inner outer" + ], + "repeated": [ + "[sub]one[/sub][sub]two[/sub] [sub]three[/sub]", + "onetwo three" + ], + "tail-and-next-line": [ + "[sub]text[/sub] tail\nnext line", + "text tail
    \nnext line" + ], + "blank-lines-around": [ + "before\n\n\n[sub]text[/sub]\n\n\nafter", + "before


    text


    after" + ], + "unclosed": [ + "[sub]text", + "[sub]text" + ], + "unmatched-close": [ + "text[/sub]", + "text[/sub]" + ], + "escaped": [ + "\\[sub]text[/sub]", + "[sub]text[/sub]" + ], + "uppercase": [ + "[SUB]text[/SUB]", + "text" + ] + }, + "tag-sup": { + "alone": [ + "[sup]text[/sup]", + "text" + ], + "empty": [ + "[sup][/sup]", + "" + ], + "mid-line": [ + "before [sup]text[/sup] after", + "before text after" + ], + "own-lines": [ + "[sup]\ntext\n[/sup]", + "
    \ntext
    \n
    " + ], + "own-lines-between-text": [ + "before\n[sup]\ntext\n[/sup]\nafter", + "before
    \n
    \ntext
    \n

    \nafter" + ], + "starts-mid-line-spans-lines": [ + "before [sup]text\nmore[/sup] after", + "before text
    \nmore
    after" + ], + "blank-line-inside": [ + "[sup]\ntext\n\nsecond paragraph\n[/sup]", + "
    \ntext
    \n
    \nsecond paragraph
    \n
    " + ], + "markdown-blocks-inside": [ + "[sup]\n## Heading\n\n- one\n- two\n\n> quoted\n[/sup]", + "
    \n## Heading
    \n
    \n- one
    \n- two
    \n
    \n> quoted
    \n
    " + ], + "inline-markdown-inside": [ + "[sup]**bold** _italic_ `code` [link](https://example.com) :smile:[/sup]", + "bold italic code link \":smile:\"" + ], + "in-blockquote": [ + "> [sup]\n> text\n> [/sup]", + "
    \n
    \ntext
    \n
    " + ], + "in-list-item": [ + "- [sup]\n text\n [/sup]\n- next", + "
      \n

    • \ntext
      \n
    • \n
    • next
    • \n
    " + ], + "in-table-cell": [ + "| head |\n|---|\n| [sup]text[/sup] |", + "
    \n\n\n\n\n\n\n\n\n\n\n\n
    head
    text
    \n
    " + ], + "in-heading": [ + "## [sup]text[/sup]", + "

    text

    " + ], + "around-b": [ + "[sup][b]text[/b][/sup]", + "text" + ], + "in-b": [ + "[b]before [sup]text[/sup] after[/b]", + "before text after" + ], + "in-core-quote": [ + "[quote]\n[sup]text[/sup]\n[/quote]", + "" + ], + "misnested-with-i": [ + "[sup][i]text[/sup] tail[/i]", + "text tail" + ], + "nested-in-itself": [ + "[sup]outer [sup]inner[/sup] outer[/sup]", + "outer inner outer" + ], + "repeated": [ + "[sup]one[/sup][sup]two[/sup] [sup]three[/sup]", + "onetwo three" + ], + "tail-and-next-line": [ + "[sup]text[/sup] tail\nnext line", + "text tail
    \nnext line" + ], + "blank-lines-around": [ + "before\n\n\n[sup]text[/sup]\n\n\nafter", + "before


    text


    after" + ], + "unclosed": [ + "[sup]text", + "[sup]text" + ], + "unmatched-close": [ + "text[/sup]", + "text[/sup]" + ], + "escaped": [ + "\\[sup]text[/sup]", + "[sup]text[/sup]" + ], + "uppercase": [ + "[SUP]text[/SUP]", + "text" + ] + }, + "tag-tabs": { + "alone": [ + "[tabs][tab=One]one[/tab][tab=Two]two[/tab][/tabs]", + "
    \n\n\n
    one
    \n\n\n
    two
    \n
    " + ], + "empty": [ + "[tabs][/tabs]", + "[tabs][/tabs]" + ], + "mid-line": [ + "before [tabs][tab=One]one[/tab][tab=Two]two[/tab][/tabs] after", + "before
    one
    two
    after" + ], + "own-lines": [ + "[tabs]\n[tab=One]one[/tab][tab=Two]two[/tab]\n[/tabs]", + "
    \n\n\n
    one
    \n\n\n
    two
    \n
    " + ], + "own-lines-between-text": [ + "before\n[tabs]\n[tab=One]one[/tab][tab=Two]two[/tab]\n[/tabs]\nafter", + "before
    \n\n\n
    one
    \n\n\n
    two
    \n
    \n
    after" + ], + "starts-mid-line-spans-lines": [ + "before [tabs][tab=One]one[/tab][tab=Two]two[/tab]\nmore[/tabs] after", + "before
    \n\n\n
    one
    \n\n\n
    two
    \n
    \nafter" + ], + "blank-line-inside": [ + "[tabs]\n[tab=One]one[/tab][tab=Two]two[/tab]\n\nsecond paragraph\n[/tabs]", + "
    \n\n\n
    one
    \n\n\n
    two
    \n
    " + ], + "markdown-blocks-inside": [ + "[tabs]\n## Heading\n\n- one\n- two\n\n> quoted\n[/tabs]", + "[tabs]

    Heading

    \n
      \n
    • one
    • \n
    • two
    • \n
    \n
    \nquoted
    \n[/tabs]
    " + ], + "inline-markdown-inside": [ + "[tabs]**bold** _italic_ `code` [link](https://example.com) :smile:[/tabs]", + "[tabs]bold italic code link \":smile:\"[/tabs]" + ], + "in-blockquote": [ + "> [tabs]\n> [tab=One]one[/tab][tab=Two]two[/tab]\n> [/tabs]", + "
    \n
    \n\n\n
    one
    \n\n\n
    two
    \n
    \n
    " + ], + "in-list-item": [ + "- [tabs]\n [tab=One]one[/tab][tab=Two]two[/tab]\n [/tabs]\n- next", + "
      \n
    • \n
      \n\n\n
      one
      \n\n\n
      two
      \n
      \n
    • \n
    • next
    • \n
    " + ], + "in-table-cell": [ + "| head |\n|---|\n| [tabs][tab=One]one[/tab][tab=Two]two[/tab][/tabs] |", + "
    \n\n\n\n\n\n\n\n\n\n\n\n
    head
    one
    two
    \n
    " + ], + "in-heading": [ + "## [tabs][tab=One]one[/tab][tab=Two]two[/tab][/tabs]", + "

    one
    two

    " + ], + "around-b": [ + "[tabs][b][tab=One]one[/tab][tab=Two]two[/tab][/b][/tabs]", + "[tabs][tab=One]one[/tab][tab=Two]two[/tab][/tabs]" + ], + "in-b": [ + "[b]before [tabs][tab=One]one[/tab][tab=Two]two[/tab][/tabs] after[/b]", + "before
    one
    two
    after
    " + ], + "in-core-quote": [ + "[quote]\n[tabs][tab=One]one[/tab][tab=Two]two[/tab][/tabs]\n[/quote]", + "" + ], + "misnested-with-i": [ + "[tabs][i][tab=One]one[/tab][tab=Two]two[/tab][/tabs] tail[/i]", + "[tabs][tab=One]one[/tab][tab=Two]two[/tab][/tabs] tail" + ], + "nested-in-itself": [ + "[tabs]outer [tabs]inner[/tabs] outer[/tabs]", + "[tabs]outer [tabs]inner[/tabs] outer[/tabs]" + ], + "repeated": [ + "[tabs]one[/tabs][tabs]two[/tabs] [tabs]three[/tabs]", + "[tabs]one[/tabs][tabs]two[/tabs] [tabs]three[/tabs]" + ], + "tail-and-next-line": [ + "[tabs][tab=One]one[/tab][tab=Two]two[/tab][/tabs] tail\nnext line", + "
    \n\n\n
    one
    \n\n\n
    two
    \n
    \ntail
    next line" + ], + "blank-lines-around": [ + "before\n\n\n[tabs][tab=One]one[/tab][tab=Two]two[/tab][/tabs]\n\n\nafter", + "before


    \n\n\n
    one
    \n\n\n
    two
    \n
    \n


    after" + ], + "unclosed": [ + "[tabs][tab=One]one[/tab][tab=Two]two[/tab]", + "[tabs][tab=One]one[/tab][tab=Two]two[/tab]" + ], + "unmatched-close": [ + "[tab=One]one[/tab][tab=Two]two[/tab][/tabs]", + "[tab=One]one[/tab][tab=Two]two[/tab][/tabs]" + ], + "escaped": [ + "\\[tabs][tab=One]one[/tab][tab=Two]two[/tab][/tabs]", + "[tabs][tab=One]one[/tab][tab=Two]two[/tab][/tabs]" + ], + "uppercase": [ + "[TABS][tab=One]one[/tab][tab=Two]two[/tab][/TABS]", + "
    \n\n\n
    one
    \n\n\n
    two
    \n
    " + ] + }, + "tag-textmessage": { + "alone": [ + "[textmessage=Bob][message=them]hi[/message][message=me]yo[/message][/textmessage]", + "
    \n
    \nBob
    \n
    \n
    hi
    yo
    \n
    \n
    " + ], + "empty": [ + "[textmessage=Bob][/textmessage]", + "
    \n
    \nBob
    \n
    \n
    \n
    \n
    " + ], + "mid-line": [ + "before [textmessage=Bob][message=them]hi[/message][message=me]yo[/message][/textmessage] after", + "before
    Bob
    hi
    yo
    after" + ], + "own-lines": [ + "[textmessage=Bob]\n[message=them]hi[/message][message=me]yo[/message]\n[/textmessage]", + "
    \n
    \nBob
    \n
    \n
    \n
    \n
    \n
    hi
    \n
    \n
    \n
    yo
    \n
    \n
    \n
    \n
    \n
    " + ], + "own-lines-between-text": [ + "before\n[textmessage=Bob]\n[message=them]hi[/message][message=me]yo[/message]\n[/textmessage]\nafter", + "before
    \n
    \nBob
    \n
    \n
    \n
    \n
    \n
    hi
    \n
    \n
    \n
    yo
    \n
    \n
    \n
    \n
    \n
    \n
    after" + ], + "starts-mid-line-spans-lines": [ + "before [textmessage=Bob][message=them]hi[/message][message=me]yo[/message]\nmore[/textmessage] after", + "before
    \n
    \nBob
    \n
    \n
    \n
    \n
    hi
    \n
    \n
    \n
    yo
    \n
    \n
    more
    \n
    \n
    \nafter" + ], + "blank-line-inside": [ + "[textmessage=Bob]\n[message=them]hi[/message][message=me]yo[/message]\n\nsecond paragraph\n[/textmessage]", + "
    \n
    \nBob
    \n
    \n
    \n
    \n
    \n
    hi
    \n
    \n
    \n
    yo
    \n
    \n

    second paragraph
    \n
    \n
    \n
    " + ], + "markdown-blocks-inside": [ + "[textmessage=Bob]\n## Heading\n\n- one\n- two\n\n> quoted\n[/textmessage]", + "
    \n
    \nBob
    \n
    \n
    \n
    \n

    Heading

    \n
      \n
    • one
    • \n
    • two
    • \n
    \n
    \nquoted
    \n
    \n
    \n
    \n
    " + ], + "inline-markdown-inside": [ + "[textmessage=Bob]**bold** _italic_ `code` [link](https://example.com) :smile:[/textmessage]", + "
    \n
    \nBob
    \n
    \n
    bold italic code link \":smile:\"
    \n
    \n
    " + ], + "in-blockquote": [ + "> [textmessage=Bob]\n> [message=them]hi[/message][message=me]yo[/message]\n> [/textmessage]", + "
    \n
    \n
    \nBob
    \n
    \n
    \n
    \n
    \n
    hi
    \n
    \n
    \n
    yo
    \n
    \n
    \n
    \n
    \n
    \n
    " + ], + "in-list-item": [ + "- [textmessage=Bob]\n [message=them]hi[/message][message=me]yo[/message]\n [/textmessage]\n- next", + "
      \n
    • \n
      \n
      \nBob
      \n
      \n
      \n
      \n
      \n
      hi
      \n
      \n
      \n
      yo
      \n
      \n
      \n
      \n
      \n
      \n
    • \n
    • next
    • \n
    " + ], + "in-table-cell": [ + "| head |\n|---|\n| [textmessage=Bob][message=them]hi[/message][message=me]yo[/message][/textmessage] |", + "
    \n\n\n\n\n\n\n\n\n\n\n\n
    head
    Bob
    hi
    yo
    \n
    " + ], + "in-heading": [ + "## [textmessage=Bob][message=them]hi[/message][message=me]yo[/message][/textmessage]", + "

    Bob
    hi
    yo

    " + ], + "around-b": [ + "[textmessage=Bob][b][message=them]hi[/message][message=me]yo[/message][/b][/textmessage]", + "
    \n
    \nBob
    \n
    \n
    hi
    yo
    \n
    \n
    " + ], + "in-b": [ + "[b]before [textmessage=Bob][message=them]hi[/message][message=me]yo[/message][/textmessage] after[/b]", + "before
    Bob
    hi
    yo
    after
    " + ], + "in-core-quote": [ + "[quote]\n[textmessage=Bob][message=them]hi[/message][message=me]yo[/message][/textmessage]\n[/quote]", + "" + ], + "misnested-with-i": [ + "[textmessage=Bob][i][message=them]hi[/message][message=me]yo[/message][/textmessage] tail[/i]", + "
    \n
    \nBob
    \n
    \n
    hi
    yo
    \n
    \n
    \ntail" + ], + "nested-in-itself": [ + "[textmessage=Bob]outer [textmessage=Bob]inner[/textmessage] outer[/textmessage]", + "
    \n
    \nBob
    \n
    \n
    outer
    Bob
    inner
    outer
    \n
    \n
    " + ], + "repeated": [ + "[textmessage=Bob]one[/textmessage][textmessage=Bob]two[/textmessage] [textmessage=Bob]three[/textmessage]", + "
    \n
    \nBob
    \n
    \n
    one
    \n
    \n
    \n
    \n
    \nBob
    \n
    \n
    two
    \n
    \n
    \n
    \n
    \nBob
    \n
    \n
    three
    \n
    \n
    " + ], + "tail-and-next-line": [ + "[textmessage=Bob][message=them]hi[/message][message=me]yo[/message][/textmessage] tail\nnext line", + "
    \n
    \nBob
    \n
    \n
    hi
    yo
    \n
    \n
    \ntail
    next line" + ], + "blank-lines-around": [ + "before\n\n\n[textmessage=Bob][message=them]hi[/message][message=me]yo[/message][/textmessage]\n\n\nafter", + "before


    \n
    \nBob
    \n
    \n
    hi
    yo
    \n
    \n
    \n


    after" + ], + "unclosed": [ + "[textmessage=Bob][message=them]hi[/message][message=me]yo[/message]", + "[textmessage=Bob]
    hi
    yo
    " + ], + "unmatched-close": [ + "[message=them]hi[/message][message=me]yo[/message][/textmessage]", + "
    \n
    hi
    \n
    \n
    \n
    yo
    \n
    \n[/textmessage]" + ], + "escaped": [ + "\\[textmessage=Bob][message=them]hi[/message][message=me]yo[/message][/textmessage]", + "[textmessage=Bob]
    hi
    yo
    [/textmessage]" + ], + "uppercase": [ + "[TEXTMESSAGE=Bob][message=them]hi[/message][message=me]yo[/message][/TEXTMESSAGE]", + "
    \n
    \nBob
    \n
    \n
    hi
    yo
    \n
    \n
    " + ], + "[textmessage] alone": [ + "[textmessage][message=them]hi[/message][message=me]yo[/message][/textmessage]", + "
    \n
    \nRecipient
    \n
    \n
    hi
    yo
    \n
    \n
    " + ], + "[textmessage] own-lines": [ + "[textmessage]\n[message=them]hi[/message][message=me]yo[/message]\n[/textmessage]", + "
    \n
    \nRecipient
    \n
    \n
    \n
    \n
    \n
    hi
    \n
    \n
    \n
    yo
    \n
    \n
    \n
    \n
    \n
    " + ] + }, + "tag-thinprogress": { + "alone": [ + "[thinprogress=40]text[/thinprogress]", + "
    \n
    text
    \n
    \n
    \n
    " + ], + "empty": [ + "[thinprogress=40][/thinprogress]", + "
    \n
    \n
    \n
    \n
    " + ], + "mid-line": [ + "before [thinprogress=40]text[/thinprogress] after", + "before
    text
    after" + ], + "own-lines": [ + "[thinprogress=40]\ntext\n[/thinprogress]", + "
    \n
    \ntext
    \n
    \n
    \n
    " + ], + "own-lines-between-text": [ + "before\n[thinprogress=40]\ntext\n[/thinprogress]\nafter", + "before
    \n
    \ntext
    \n
    \n
    \n
    \n
    after" + ], + "starts-mid-line-spans-lines": [ + "before [thinprogress=40]text\nmore[/thinprogress] after", + "before
    \n
    \ntext
    \nmore
    \n
    \n
    \n
    \nafter" + ], + "blank-line-inside": [ + "[thinprogress=40]\ntext\n\nsecond paragraph\n[/thinprogress]", + "
    \n
    \ntext

    second paragraph
    \n
    \n
    \n
    " + ], + "markdown-blocks-inside": [ + "[thinprogress=40]\n## Heading\n\n- one\n- two\n\n> quoted\n[/thinprogress]", + "
    \n
    \n

    Heading

    \n
      \n
    • one
    • \n
    • two
    • \n
    \n
    \nquoted
    \n
    \n
    \n
    \n
    " + ], + "inline-markdown-inside": [ + "[thinprogress=40]**bold** _italic_ `code` [link](https://example.com) :smile:[/thinprogress]", + "
    \n
    bold italic code link \":smile:\"
    \n
    \n
    \n
    " + ], + "in-blockquote": [ + "> [thinprogress=40]\n> text\n> [/thinprogress]", + "
    \n
    \n
    \ntext
    \n
    \n
    \n
    \n
    " + ], + "in-list-item": [ + "- [thinprogress=40]\n text\n [/thinprogress]\n- next", + "
      \n
    • \n
      \n
      \ntext
      \n
      \n
      \n
      \n
    • \n
    • next
    • \n
    " + ], + "in-table-cell": [ + "| head |\n|---|\n| [thinprogress=40]text[/thinprogress] |", + "
    \n\n\n\n\n\n\n\n\n\n\n\n
    head
    text
    \n
    " + ], + "in-heading": [ + "## [thinprogress=40]text[/thinprogress]", + "

    text

    " + ], + "around-b": [ + "[thinprogress=40][b]text[/b][/thinprogress]", + "
    \n
    text
    \n
    \n
    \n
    " + ], + "in-b": [ + "[b]before [thinprogress=40]text[/thinprogress] after[/b]", + "before
    text
    after
    " + ], + "in-core-quote": [ + "[quote]\n[thinprogress=40]text[/thinprogress]\n[/quote]", + "" + ], + "misnested-with-i": [ + "[thinprogress=40][i]text[/thinprogress] tail[/i]", + "
    \n
    text
    \n
    \n
    \n
    \ntail" + ], + "nested-in-itself": [ + "[thinprogress=40]outer [thinprogress=40]inner[/thinprogress] outer[/thinprogress]", + "
    \n
    outer
    inner
    outer
    \n
    \n
    \n
    " + ], + "repeated": [ + "[thinprogress=40]one[/thinprogress][thinprogress=40]two[/thinprogress] [thinprogress=40]three[/thinprogress]", + "
    \n
    one
    \n
    \n
    \n
    \n
    \n
    two
    \n
    \n
    \n
    \n
    \n
    three
    \n
    \n
    \n
    " + ], + "tail-and-next-line": [ + "[thinprogress=40]text[/thinprogress] tail\nnext line", + "
    \n
    text
    \n
    \n
    \n
    \ntail
    next line" + ], + "blank-lines-around": [ + "before\n\n\n[thinprogress=40]text[/thinprogress]\n\n\nafter", + "before


    \n
    text
    \n
    \n
    \n
    \n


    after" + ], + "unclosed": [ + "[thinprogress=40]text", + "[thinprogress=40]text" + ], + "unmatched-close": [ + "text[/thinprogress]", + "text[/thinprogress]" + ], + "escaped": [ + "\\[thinprogress=40]text[/thinprogress]", + "[thinprogress=40]text[/thinprogress]" + ], + "uppercase": [ + "[THINPROGRESS=40]text[/THINPROGRESS]", + "
    \n
    text
    \n
    \n
    \n
    " + ], + "[thinprogress] alone": [ + "[thinprogress]text[/thinprogress]", + "
    \n
    text
    \n
    \n
    \n
    " + ], + "[thinprogress] own-lines": [ + "[thinprogress]\ntext\n[/thinprogress]", + "
    \n
    \ntext
    \n
    \n
    \n
    " + ] + }, + "tag-u": { + "alone": [ + "[u]text[/u]", + "text" + ], + "empty": [ + "[u][/u]", + "" + ], + "mid-line": [ + "before [u]text[/u] after", + "before text after" + ], + "own-lines": [ + "[u]\ntext\n[/u]", + "
    \ntext
    \n
    " + ], + "own-lines-between-text": [ + "before\n[u]\ntext\n[/u]\nafter", + "before
    \n
    \ntext
    \n

    \nafter" + ], + "starts-mid-line-spans-lines": [ + "before [u]text\nmore[/u] after", + "before text
    \nmore
    after" + ], + "blank-line-inside": [ + "[u]\ntext\n\nsecond paragraph\n[/u]", + "
    \ntext
    \n
    \nsecond paragraph
    \n
    " + ], + "markdown-blocks-inside": [ + "[u]\n## Heading\n\n- one\n- two\n\n> quoted\n[/u]", + "
    \n
    \n

    Heading

    \n
      \n
    • one
    • \n
    • two
    • \n
    \n
    \nquoted
    \n
    \n
    " + ], + "inline-markdown-inside": [ + "[u]**bold** _italic_ `code` [link](https://example.com) :smile:[/u]", + "bold italic code link \":smile:\"" + ], + "in-blockquote": [ + "> [u]\n> text\n> [/u]", + "
    \n
    \ntext
    \n
    " + ], + "in-list-item": [ + "- [u]\n text\n [/u]\n- next", + "
      \n

    • \ntext
      \n
    • \n
    • next
    • \n
    " + ], + "in-table-cell": [ + "| head |\n|---|\n| [u]text[/u] |", + "
    \n\n\n\n\n\n\n\n\n\n\n\n
    head
    text
    \n
    " + ], + "in-heading": [ + "## [u]text[/u]", + "

    text

    " + ], + "around-b": [ + "[u][b]text[/b][/u]", + "text" + ], + "in-b": [ + "[b]before [u]text[/u] after[/b]", + "before text after" + ], + "in-core-quote": [ + "[quote]\n[u]text[/u]\n[/quote]", + "" + ], + "misnested-with-i": [ + "[u][i]text[/u] tail[/i]", + "text tail" + ], + "nested-in-itself": [ + "[u]outer [u]inner[/u] outer[/u]", + "outer inner outer" + ], + "repeated": [ + "[u]one[/u][u]two[/u] [u]three[/u]", + "onetwo three" + ], + "tail-and-next-line": [ + "[u]text[/u] tail\nnext line", + "text tail
    \nnext line" + ], + "blank-lines-around": [ + "before\n\n\n[u]text[/u]\n\n\nafter", + "before


    text


    after" + ], + "unclosed": [ + "[u]text", + "[u]text" + ], + "unmatched-close": [ + "text[/u]", + "text[/u]" + ], + "escaped": [ + "\\[u]text[/u]", + "[u]text[/u]" + ], + "uppercase": [ + "[U]text[/U]", + "text" + ] + }, + "tag-url": { + "alone": [ + "[url=https://example.com]text[/url]", + "text" + ], + "empty": [ + "[url=https://example.com][/url]", + "" + ], + "mid-line": [ + "before [url=https://example.com]text[/url] after", + "before text after" + ], + "own-lines": [ + "[url=https://example.com]\ntext\n[/url]", + "
    \ntext
    \n
    " + ], + "own-lines-between-text": [ + "before\n[url=https://example.com]\ntext\n[/url]\nafter", + "before
    \n
    \ntext
    \n

    \nafter" + ], + "starts-mid-line-spans-lines": [ + "before [url=https://example.com]text\nmore[/url] after", + "before text
    \nmore
    after" + ], + "blank-line-inside": [ + "[url=https://example.com]\ntext\n\nsecond paragraph\n[/url]", + "[url=https://example.com]
    \ntext

    second paragraph
    \n[/url]" + ], + "markdown-blocks-inside": [ + "[url=https://example.com]\n## Heading\n\n- one\n- two\n\n> quoted\n[/url]", + "[url=https://example.com]

    Heading

    \n
      \n
    • one
    • \n
    • two
    • \n
    \n
    \nquoted
    \n[/url]
    " + ], + "inline-markdown-inside": [ + "[url=https://example.com]**bold** _italic_ `code` [link](https://example.com) :smile:[/url]", + "bold italic code link \":smile:\"" + ], + "in-blockquote": [ + "> [url=https://example.com]\n> text\n> [/url]", + "
    \n
    \ntext
    \n
    " + ], + "in-list-item": [ + "- [url=https://example.com]\n text\n [/url]\n- next", + "" + ], + "in-table-cell": [ + "| head |\n|---|\n| [url=https://example.com]text[/url] |", + "
    \n\n\n\n\n\n\n\n\n\n\n\n
    head
    text
    \n
    " + ], + "in-heading": [ + "## [url=https://example.com]text[/url]", + "

    text

    " + ], + "around-b": [ + "[url=https://example.com][b]text[/b][/url]", + "text" + ], + "in-b": [ + "[b]before [url=https://example.com]text[/url] after[/b]", + "before text after" + ], + "in-core-quote": [ + "[quote]\n[url=https://example.com]text[/url]\n[/quote]", + "" + ], + "misnested-with-i": [ + "[url=https://example.com][i]text[/url] tail[/i]", + "text tail" + ], + "nested-in-itself": [ + "[url=https://example.com]outer [url=https://example.com]inner[/url] outer[/url]", + "outer [url=https://example.com]inner outer[/url]" + ], + "repeated": [ + "[url=https://example.com]one[/url][url=https://example.com]two[/url] [url=https://example.com]three[/url]", + "onetwo three" + ], + "tail-and-next-line": [ + "[url=https://example.com]text[/url] tail\nnext line", + "text tail
    \nnext line" + ], + "blank-lines-around": [ + "before\n\n\n[url=https://example.com]text[/url]\n\n\nafter", + "before


    text


    after" + ], + "unclosed": [ + "[url=https://example.com]text", + "[url=https://example.com]text" + ], + "unmatched-close": [ + "text[/url]", + "text[/url]" + ], + "escaped": [ + "\\[url=https://example.com]text[/url]", + "[url=https://example.com]text[/url]" + ], + "uppercase": [ + "[URL=https://example.com]text[/URL]", + "text" + ], + "[url] alone": [ + "[url]text[/url]", + "text" + ], + "[url] own-lines": [ + "[url]\ntext\n[/url]", + "
    \ntext
    \n
    " + ] + }, + "tag-wrap": { + "alone": [ + "[wrap=box]text[/wrap]", + "
    \ntext
    " + ], + "empty": [ + "[wrap=box][/wrap]", + "" + ], + "mid-line": [ + "before [wrap=box]text[/wrap] after", + "before text after" + ], + "own-lines": [ + "[wrap=box]\ntext\n[/wrap]", + "
    \ntext
    " + ], + "own-lines-between-text": [ + "before\n[wrap=box]\ntext\n[/wrap]\nafter", + "before
    \ntext
    \nafter" + ], + "starts-mid-line-spans-lines": [ + "before [wrap=box]text\nmore[/wrap] after", + "before text\nmore after" + ], + "blank-line-inside": [ + "[wrap=box]\ntext\n\nsecond paragraph\n[/wrap]", + "
    \ntext

    second paragraph
    " + ], + "markdown-blocks-inside": [ + "[wrap=box]\n## Heading\n\n- one\n- two\n\n> quoted\n[/wrap]", + "
    \n

    Heading

    \n
      \n
    • one
    • \n
    • two
    • \n
    \n
    \nquoted
    \n
    " + ], + "inline-markdown-inside": [ + "[wrap=box]**bold** _italic_ `code` [link](https://example.com) :smile:[/wrap]", + "
    \nbold italic code link \":smile:\"
    " + ], + "in-blockquote": [ + "> [wrap=box]\n> text\n> [/wrap]", + "
    \n
    \ntext
    \n
    " + ], + "in-list-item": [ + "- [wrap=box]\n text\n [/wrap]\n- next", + "
      \n
    • \n
      \ntext
      \n
    • \n
    • next
    • \n
    " + ], + "in-table-cell": [ + "| head |\n|---|\n| [wrap=box]text[/wrap] |", + "
    \n\n\n\n\n\n\n\n\n\n\n\n
    head
    text
    \n
    " + ], + "in-heading": [ + "## [wrap=box]text[/wrap]", + "

    text

    " + ], + "around-b": [ + "[wrap=box][b]text[/b][/wrap]", + "
    \ntext
    " + ], + "in-b": [ + "[b]before [wrap=box]text[/wrap] after[/b]", + "before text after" + ], + "in-core-quote": [ + "[quote]\n[wrap=box]text[/wrap]\n[/quote]", + "" + ], + "misnested-with-i": [ + "[wrap=box][i]text[/wrap] tail[/i]", + "[i]text[/i] tail" + ], + "nested-in-itself": [ + "[wrap=box]outer [wrap=box]inner[/wrap] outer[/wrap]", + "
    \nouter inner outer
    " + ], + "repeated": [ + "[wrap=box]one[/wrap][wrap=box]two[/wrap] [wrap=box]three[/wrap]", + "
    \none[/wrap]two [wrap=box]three
    " + ], + "tail-and-next-line": [ + "[wrap=box]text[/wrap] tail\nnext line", + "text tail
    \nnext line" + ], + "blank-lines-around": [ + "before\n\n\n[wrap=box]text[/wrap]\n\n\nafter", + "before
    \ntext
    \nafter" + ], + "unclosed": [ + "[wrap=box]text", + "[wrap=box]text" + ], + "unmatched-close": [ + "text[/wrap]", + "text[/wrap]" + ], + "escaped": [ + "\\[wrap=box]text[/wrap]", + "[wrap=box]text[/wrap]" + ], + "uppercase": [ + "[WRAP=box]text[/WRAP]", + "
    \ntext
    " + ] + }, + "tags": { + "boxes": [ + "[block=warning]w[/block]\n[print=line]p[/print]\n[note]n[/note]\n[fieldset=Legend]f[/fieldset]\n[progress=40]p[/progress]\n[check=x]c[/check]\n[side=right]s[/side]\n[newspaper]n[/newspaper]", + "
    w
    \n
    p
    \n
    \n
    \n
    n
    \n
    \n
    \n
    \n\nLegend\n
    f
    \n
    \n
    \n
    p
    \n
    \n
    \n
    \n
    c
    \n
    s
    \n
    n
    " + ], + "fonts": [ + "[font=Georgia]a[/font] [font=Lato style=bold italic]b[/font] [font family=Roboto wdth=80 style=300]c[/font]", + "a b c" + ], + "headings": [ + "[h]a[/h]\n[sh]b[/sh]\n[h3]c[/h3]\n[h7]d[/h7]", + "

    a

    \n

    b

    \n

    c

    \n
    [h7]d[/h7]" + ], + "inline": [ + "x[sub]s[/sub][sup]t[/sup] [inlinespoiler] hidden [/inlinespoiler] [a=top]anchor[/a] [goto=top]go[/goto] [highlight]h[/highlight] [pindent]p[/pindent]", + "xst hidden anchor go h p" + ], + "textmessage": [ + "[textmessage=Bob]\n[message=them]hi[/message]\n[message=me]yo[/message]\n[/textmessage]\n[message=me]bare[/message]", + "
    \n
    \nBob
    \n
    \n
    \n
    \n
    \n
    hi
    \n
    \n
    \n
    yo
    \n
    \n
    \n
    \n
    \n
    \n
    \n
    bare
    \n
    " + ], + "wrappers": [ + "[left]l[/left]\n[right]r[/right]\n[justify]j[/justify]\n[border=1px solid red]b[/border]\n[bg=red]g[/bg]\n[centerblock=40]c[/centerblock]\n[imagefloat=left]i[/imagefloat]", + "
    l
    \n
    r
    \n
    j
    \n
    b
    \n
    g
    \n
    c
    \n
    i
    " + ] + } +};