{ "regular_tests": [ { "name": "codeblock_hilite", "input": "Hamlet said:\n~~~~.python \ndef speak(self):\n x = 1\n~~~~", "expected_output": "
Hamlet said:
\ndef speak(self):\n x = 1\n
test_input
", "bugdown_matches_marked": true }, { "name": "codeblock_multiline", "input": "Hamlet once said\n~~~~\ndef func():\n x = 1\n\n y = 2\n\n z = 3\n~~~~\nAnd all was good.", "expected_output": "Hamlet once said
\ndef func():\n x = 1\n\n y = 2\n\n z = 3\n
And all was good.
", "bugdown_matches_marked": true }, { "name": "codeblock_trailing_whitespace", "input": "Hamlet once said\n~~~~\ndef func():\n x = 1\n\n y = 2\t\t\n\n z = 3 \n~~~~\nAnd all was good.", "expected_output": "Hamlet once said
\ndef func():\n x = 1\n\n y = 2\n\n z = 3\n
And all was good.
", "bugdown_matches_marked": true }, { "name": "codeblock_backticks", "input": "\n```\nfenced code\n```\n\n```inline code```\n", "expected_output": "fenced code\n
inline code
Hamlet said:
\ndef speak(self):\n x = 1\n# Comment to make this code block longer to test Trac #1162\n
Then he mentioned y = 4 + x**2
and
def foobar(self):\n return self.baz()\n
Hamlet said:
\n\n", "bugdown_matches_marked": true }, { "name": "fenced_nested_quote", "input": "Hamlet said:\n~~~ quote\nPolonius said:\n> This above all: to thine ownself be true,\nAnd it must follow, as the night the day,\nThou canst not then be false to any man.\n\nWhat good advice!\n~~~", "expected_output": "To be or not to be.
\nThat is the question
\n
Hamlet said:
\n\n", "bugdown_matches_marked": true }, { "name": "complexly_nested_quote", "input": "I heard about this second hand...\n~~~ quote\n\nHe said:\n~~~ quote\nThe customer is complaining.\n\nThey looked at this code:\n``` \ndef hello(): print 'hello\n```\nThey would prefer:\n~~~\ndef hello()\n puts 'hello'\nend\n~~~\n\nPlease advise.\n~~~\n\nShe said:\n~~~ quote\nJust send them this:\n```\necho \"hello\n\"\n```\n~~~", "expected_output": "Polonius said:
\n\n\nThis above all: to thine ownself be true,
\n
\nAnd it must follow, as the night the day,
\nThou canst not then be false to any man.What good advice!
\n
I heard about this second hand...
\n\n\nHe said:
\n\n\nThe customer is complaining.
\nThey looked at this code:
\n\n\n\ndef hello(): print 'hello\nThey would prefer:
\ndef hello()
\n
\n puts 'hello'
\nend
Please advise.
\nShe said:\n~~~ quote\nJust send them this:\n```\necho "hello\n"\n```\n
xxxxxx xxxxx xxxxxxxx xxxx. x xxxx xxxxxxxxxx:
\n\"xxxx xxxx\\xxxxx\\xxxxxx\"
xxx xxxx xxxxx:xx.xxxxxxx(x'^xxxx$', xx.xxxxxxxxx)
xxxxxxx'x xxxx xxxxxxxxxx 'xxxx'
, xxxxx xxxxxxxxx xxxxx ^ xxx $ xxxxxx xxxxx xxxxxxxxxxxx xxx xxxx xx x xxxx xx xxxx xx xxx xxxxx xxxxxx?
one
two
x = 1\n
Some text with a list:
\nSome text with a hanging list:
\nPlain list
\nAlpha
\nBeta
\nThen hang it off:
\nPlain list
\nAnd Again:
\nOnce more for feeling:
\nint x = 3\n* 4;\n
~~~~~~~~xxxxxxxxx: xxxxxxxxxxxx xxxxx x xxxxxxxx~~~~~~
", "bugdown_matches_marked": true }, { "name": "strikthrough_basic", "input": "I like ~~software~~ hardware", "expected_output": "I like software hardware
I like software love hardware
I like software love hardware
_foo_
", "bugdown_matches_marked": true }, { "name": "emphasis_text", "input": "*foo*", "expected_output": "foo
", "bugdown_matches_marked": true }, { "name": "emphasis_code", "input": "const char *x = (char *)y", "expected_output": "const char *x = (char *)y
", "bugdown_matches_marked": true }, { "name": "emphasis_with_space", "input": "A *foo bar* is a *baz quux*", "expected_output": "A foo bar is a baz quux
", "bugdown_matches_marked": true }, { "name": "underscore_strong_disabled", "input": "__foo__", "expected_output": "__foo__
", "bugdown_matches_marked": true }, { "name": "star_strong", "input": "**foo**", "expected_output": "foo
", "bugdown_matches_marked": true }, { "name": "linkify_interference", "input": "link: xx, x xxxxx xx xxxx xx\n\n[xxxxx #xx](http://xxxxxxxxx:xxxx/xxx/xxxxxx%xxxxxx/xx/):**xxxxxxx**\n\nxxxxxxx xxxxx xxxx xxxxx:\n`xxxxxx`: xxxxxxx\n`xxxxxx`: xxxxx\n`xxxxxx`: xxxxx xxxxx", "expected_output": "link: xx, x xxxxx xx xxxx xx
\nxxxxx #xx:xxxxxxx
\nxxxxxxx xxxxx xxxx xxxxx:
\nxxxxxx
: xxxxxxx
\nxxxxxx
: xxxxx
\nxxxxxx
: xxxxx xxxxx
Google logo today: https://www.google.com/images/srpr/logo4w.png
\nKinda boring
Google logo today: https://www.google.com/images/srpr/logo4w.png
\nKinda boringGoogle logo today: https://www.google.com/images/srpr/logo4w.png
\nKinda boring
Google logo today: http://www.google.com/images/srpr/logo4w.png
\n ", "bugdown_matches_marked": false }, { "name": "nl2br", "input": "test\nbar", "expected_output": "test
\nbar
test
", "bugdown_matches_marked": true }, { "name": "tables", "input": "This is a table:\n\nFirst Header | Second Header\n------------- | -------------\nContent Cell | Content Cell\nContent Cell | Content Cell\n", "expected_output": "This is a table:
\nFirst Header | \nSecond Header | \n
---|---|
Content Cell | \nContent Cell | \n
Content Cell | \nContent Cell | \n
You can check out **any time you'd like
\nBut you can never leave**
test again
\n:) foo:)bar x::y::z :wasted waste: :fakeemojithisshouldnotrender:
hello
", "bugdown_matches_marked": true }, { "name": "emojis_newline", "input": ":cat:\n:dog:", "expected_output": "
\n
:not_an_emoji:
", "bugdown_matches_marked": true }, { "name": "unicode_emoji", "input": "\ud83d\udca9", "expected_output":"<\/p>", "bugdown_matches_marked": true }, { "name": "two_unicode_emoji", "input": "\ud83d\udca9\ud83d\udca9", "expected_output":"
<\/p>", "bugdown_matches_marked": true }, { "name": "two_unicode_emoji_separated_by_text", "input": "\ud83d\udca9 word \ud83d\udca9", "expected_output":"
word <\/p>", "bugdown_matches_marked": true }, { "name": "miscellaneous_and_dingbats_emoji", "input": "\u2693\u2797", "expected_output":"
<\/p>", "bugdown_matches_marked": true }, { "name": "unicode_emoji_without_space", "input": "Extra\ud83d\udc7dTerrestrial", "expected_output":"
ExtraTerrestrial<\/p>", "bugdown_matches_marked": true }, { "name": "unicode_emojis_new_line", "input": "\ud83d\udc7d\n\ud83d\udc7d", "expected_output":"
\n<\/p>",
"bugdown_matches_marked": true
},
{
"name": "emoji_alongside_punctuation",
"input": ":smile:, :smile:; :smile:",
"expected_output": "
, ;
", "bugdown_matches_marked": true }, { "name": "safe_html", "input": "<h1>stay normal</h1> thanks
", "bugdown_matches_marked": true }, { "name": "safe_html_with_simple_script_tag", "input": "", "expected_output": "<script>alert(1)</script>
", "bugdown_matches_marked": false }, { "name": "safe_html_nested_script_tag", "input": "</script>", "expected_output": "<<script>script>evil()<</script>/script>
", "bugdown_matches_marked": true }, { "name": "safe_html_nested_script_tag_with_parse_error", "input": "<<<x>script>evil()<</x>/script>
", "bugdown_matches_marked": true }, { "name": "safe_html_messed_up_complexly_nested_script_tags", "input": "<scr<script></script>ipt type=\"text/javascript\">alert(\"foo\");</<script></script>script<del></del>>
", "bugdown_matches_marked": false }, { "name": "safe_html_unclosed_tag", "input": "$$\n\n~~~math\n\n~~~", "expected_output": "<scripttype=′text/javascript′>alert(′xss′);</script>
\n<scripttype=′text/javascript′>alert(′xss′);</script>
", "bugdown_matches_marked": false }, { "name": "tex_error_safe_script_tag", "input": "$$\\$$\n\n~~~math\n\\\n~~~", "expected_output": "$$\\<script type='text/javascript'>alert('xss');</script>$$
\n\\<script type='text/javascript'>alert('xss');</script>
", "bugdown_matches_marked": false } ], "linkify_tests": [ [ "http://www.google.com", "%s
", "http://www.google.com" ], [ "https://www.google.com", "%s
", "https://www.google.com" ], [ "http://www.theregister.co.uk/foo/bar", "%s
", "http://www.theregister.co.uk/foo/bar" ], [ " some text https://www.google.com/", "some text %s
", "https://www.google.com/" ], [ "with short example.com url", "with short %s url
", "example.com" ], [ "t.co", "%s
", "t.co" ], [ "readme.md", "readme.md
", "readme.md" ], [ "go to views.org please", "go to %s please
", "views.org" ], [ "http://foo.com/blah_blah/", "%s
", "http://foo.com/blah_blah/" ], [ "python class views.py is", "python class views.py is
", "" ], [ "with www www.zulip.com/foo ok?", "with www %s ok?
", "www.zulip.com/foo" ], [ "allow questions like foo.com?", "allow questions like %s?
", "foo.com" ], [ "\"is.gd/foo/ \"", "\"%s \"
", "is.gd/foo/" ], [ "end of sentence https://t.co.", "end of sentence %s.
", "https://t.co" ], [ "(Something like http://foo.com/blah_blah)", "(Something like %s)
", "http://foo.com/blah_blah" ], [ "\"is.gd/foo/\"", "\"%s\"
", "is.gd/foo/" ], [ "end with a quote www.google.com\"", "end with a quote %s\"
", "www.google.com" ], [ "end with an exclamation www.google.com!", "end with an exclamation %s!
", "www.google.com" ], [ "http://www.guardian.co.uk/foo/bar", "%s
", "http://www.guardian.co.uk/foo/bar" ], [ "from http://supervisord.org/running.html:", "from %s:
", "http://supervisord.org/running.html" ], [ "http://raven.io", "%s
", "http://raven.io" ], [ "at https://zulip.com/api. Check it!", "at %s. Check it!
", "https://zulip.com/api" ], [ "goo.gl/abc", "%s
", "goo.gl/abc" ], [ "I spent a year at ucl.ac.uk", "I spent a year at %s
", "ucl.ac.uk" ], [ "http://a.cc/i/FMXO", "%s
", "http://a.cc/i/FMXO" ], [ "http://fmota.eu/blog/test.html", "%s
", "http://fmota.eu/blog/test.html" ], [ "http://j.mp/14Hwm3X", "%s
", "http://j.mp/14Hwm3X" ], [ "http://localhost:9991/?show_debug=1", "%s
", "http://localhost:9991/?show_debug=1" ], [ "anyone before? (http://a.cc/i/FMXO)", "anyone before? (%s)
", "http://a.cc/i/FMXO" ], [ "(http://en.wikipedia.org/wiki/Each-way_(bet))", "(%s)
", "http://en.wikipedia.org/wiki/Each-way_(bet)" ], [ "(http://en.wikipedia.org/wiki/Each-way_(bet)_(more_parens))", "(%s)
", "http://en.wikipedia.org/wiki/Each-way_(bet)_(more_parens)" ], [ "http://en.wikipedia.org/wiki/Qt_(framework)", "%s
", "http://en.wikipedia.org/wiki/Qt_(framework)" ], [ "http://fr.wikipedia.org/wiki/Fichier:SMirC-facepalm.svg", "%s
", "http://fr.wikipedia.org/wiki/Fichier:SMirC-facepalm.svg" ], [ "https://en.wikipedia.org/wiki/File:Methamphetamine_from_ephedrine_with_HI_en.mov", "%s
", "https://en.wikipedia.org/wiki/File:Methamphetamine_from_ephedrine_with_HI_en.mov" ], [ "https://jira.atlassian.com/browse/JRA-31953?page=com.atlassian.jira.plugin.system.issuetabpanels:comment-tabpanel", "%s
", "https://jira.atlassian.com/browse/JRA-31953?page=com.atlassian.jira.plugin.system.issuetabpanels:comment-tabpanel" ], [ "http://web.archive.org/web/20120630032016/http://web.mit.edu/mitcard/idpolicies.html", "%s
", "http://web.archive.org/web/20120630032016/http://web.mit.edu/mitcard/idpolicies.html" ], [ "http://www.postgresql.org/message-id/14040.1364490185@sss.pgh.pa.us", "%s
", "http://www.postgresql.org/message-id/14040.1364490185@sss.pgh.pa.us" ], [ "javascript:alert(\"hi\");.com", "javascript:alert(\"hi\");.com
", "" ], [ "javascript:foo.com", "javascript:%s
", "foo.com" ], [ "javascript://foo.com", "javascript://foo.com
", "" ], [ "foobarscript://foo.com", "foobarscript://foo.com
", "" ], [ "about:blank.com", "about:%s
", "blank.com" ], [ "[foo](javascript:foo.com)", "[foo](javascript:%s)
", "foo.com" ], [ "[foo](javascript://foo.com)", "[foo](javascript://foo.com)
", "" ], [ "aim:addbuddy?screenname=foo", "aim:addbuddy?screenname=foo
", "" ], [ "itms://itunes.com/apps/appname", "itms://itunes.com/apps/appname
", "" ], [ "[foo](itms://itunes.com/apps/appname)", "[foo](itms://itunes.com/apps/appname)
", "" ], [ "1 [](foo://) 3 [](foo://) 5", "1 [](foo://) 3 [](foo://) 5
", "" ], [ "javascript:\"foo&bar\"", "javascript:<i>\"foo&bar\"</i>
", "" ], [ "[foo](javascript:\"foo&bar\")", "[foo](javascript:<i>\"foo&bar\"</i>)
", "" ], [ "a@b.com", "%s
", "a@b.com" ], [ "", "<%s>
", "a@b.com" ], [ "a@b.com/foo", "a@b.com/foo
", "" ], [ "http://leo@foo.com/my/file", "%s
", "http://leo@foo.com/my/file" ], [ "http://example.com/something?with,commas,in,url, but not at end", "%s, but not at end
", "http://example.com/something?with,commas,in,url" ], [ "http://www.yelp.com/biz/taim-mobile-falafel-and-smoothie-truck-new-york#query", "%s
", "http://www.yelp.com/biz/taim-mobile-falafel-and-smoothie-truck-new-york#query" ], [ " some text https://www.google.com/baz_(match)?with=foo&bar=baz with extras", "some text %s with extras
", "https://www.google.com/baz_(match)?with=foo&bar=baz" ], [ "hash it http://foo.com/blah_(wikipedia)_blah#cite-1", "hash it %s
", "http://foo.com/blah_(wikipedia)_blah#cite-1" ], [ "http://technet.microsoft.com/en-us/library/Cc751099.rk20_25_big(l=en-us).mov", "%s
", "http://technet.microsoft.com/en-us/library/Cc751099.rk20_25_big(l=en-us).mov" ], [ "https://metacpan.org/module/Image::Resize::OpenCV", "%s
", "https://metacpan.org/module/Image::Resize::OpenCV" ], [ "foo.com/a::trollface::b", "%s
", "foo.com/a::trollface::b" ], [ "a.commandstuff()", "a.commandstuff()
", "" ], [ "love...it", "love...it
", "" ], [ "sorry,http://example.com/", "sorry,%s
", "http://example.com/" ], [ "two nested parens https://zulip.com/(we_like_(to_nest_)_nest)_nest", "two nested parens %s
", "https://zulip.com/(we_like_(to_nest_)_nest)_nest" ], [ "three nested parens https://zulip.com/(we_like_(to_(and_)nest_)_nest)_nest", "three nested parens %s
", "https://zulip.com/(we_like_(to_(and_)nest_)_nest)_nest" ], [ "four nested parens https://zulip.com/(we_like_(to_n(e)st_)_n(es)t)_nest", "four nested parens %s
", "https://zulip.com/(we_like_(to_n(e)st_)_n(es)t)_nest" ], [ "six nested parens https://zulip.com/(we_like_((t(d(o(___)o)o))o_nest_)_nest)_nest", "six nested parens %s
", "https://zulip.com/(we_like_((t(d(o(___)o)o))o_nest_)_nest)_nest" ], [ "eight is too many https://zulip.com/(we_like_((t(d(o(_(1(2)1)__)o)o))o_nest_)_nest)_nest", "eight is too many https://zulip.com/(we_like_((t(d(o(_(1(2)1)__)o)o))o_nest_)_nest)_nest
", "" ], [ "nested with autodetection zulip.us/(we_like_(to_n(e)st_)_n(es)t)_nest", "nested with autodetection %s
", "zulip.us/(we_like_(to_n(e)st_)_n(es)t)_nest" ], [ "quora http://generate.quora.net/render?width=700&from=-4hours&until=now&height=400&bgcolor=black&lineMode=connected&title=arb%20hint%20status&target=alias(ans.hintland.hand.arb.enhint_rate%2C%22enhint%20rate%22)&target=alias(ans.hintland.hand.arb.unhint_rate%2C%22unhint%20rate%22)&target=alias(ans.hintland.hand.arb.size%2C%22hint%20size%22)&target=alias(scale(ans.vagabond.dingarb_cube_count%2C10000)%2C%22cube%20count%20x%2010K%22)&target=alias(scale(hnumbers.time.ding.gegevens.query.count%2C10)%2C%22ding%20gegevens%20query%20count%20x%2010%22)&fgcolor=white&uniq=0.44046106841415167", "quora %s
", "http://generate.quora.net/render?width=700&from=-4hours&until=now&height=400&bgcolor=black&lineMode=connected&title=arb%20hint%20status&target=alias(ans.hintland.hand.arb.enhint_rate%2C%22enhint%20rate%22)&target=alias(ans.hintland.hand.arb.unhint_rate%2C%22unhint%20rate%22)&target=alias(ans.hintland.hand.arb.size%2C%22hint%20size%22)&target=alias(scale(ans.vagabond.dingarb_cube_count%2C10000)%2C%22cube%20count%20x%2010K%22)&target=alias(scale(hnumbers.time.ding.gegevens.query.count%2C10)%2C%22ding%20gegevens%20query%20count%20x%2010%22)&fgcolor=white&uniq=0.44046106841415167" ] ] }