{ "regular_tests": [ { "name": "codeblock_hilite", "input": "Hamlet said:\n~~~~.python \ndef speak(self):\n x = 1\n~~~~", "expected_output": "

Hamlet said:

\n
def speak(self):\n    x = 1\n
", "bugdown_matches_marked": false }, { "name": "basic_paragraph", "input": "test_input", "expected_output": "

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

\n
def func():\n    x = 1\n\n    y = 2\n\n    z = 3\n
\n\n\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
\n\n\n

inline code

", "bugdown_matches_marked": true }, { "name": "hanging_multi_codeblock", "input": "Hamlet said:\n~~~~\ndef speak(self):\n x = 1\n# Comment to make this code block longer to test Trac #1162\n~~~~\n\nThen he mentioned ````y = 4 + x**2```` and\n~~~~\ndef foobar(self):\n return self.baz()", "expected_output": "

Hamlet said:

\n
def speak(self):\n    x = 1\n# Comment to make this code block longer to test Trac #1162\n
\n\n\n

Then he mentioned y = 4 + x**2 and

\n
def foobar(self):\n    return self.baz()\n
", "bugdown_matches_marked": true }, { "name": "fenced_quote", "input": "Hamlet said:\n~~~ quote\nTo be or **not** to be.\n\nThat is the question\n~~~", "expected_output": "

Hamlet said:

\n
\n

To be or not to be.

\n

That is the question

\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": "

Hamlet said:

\n
\n

Polonius said:

\n
\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
\n

What good advice!

\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": "

I heard about this second hand...

\n
\n

He said:

\n
\n

The customer is complaining.

\n

They looked at this code:

\n
def hello(): print 'hello\n
\n\n\n

They would prefer:

\n
\n

def hello()
\n puts 'hello'
\nend

\n
\n

Please advise.

\n
She said:\n~~~ quote\nJust send them this:\n```\necho "hello\n"\n```\n
", "bugdown_matches_marked": false }, { "name": "dangerous_block", "input": "xxxxxx xxxxx xxxxxxxx xxxx. x xxxx xxxxxxxxxx:\n\n```\"xxxx xxxx\\xxxxx\\xxxxxx\"```\n\nxxx xxxx xxxxx:```xx.xxxxxxx(x'^xxxx$', xx.xxxxxxxxx)```\n\nxxxxxxx'x xxxx xxxxxxxxxx ```'xxxx'```, xxxxx xxxxxxxxx xxxxx ^ xxx $ xxxxxx xxxxx xxxxxxxxxxxx xxx xxxx xx x xxxx xx xxxx xx xxx xxxxx xxxxxx?", "expected_output": "

xxxxxx xxxxx xxxxxxxx xxxx. x xxxx xxxxxxxxxx:

\n

\"xxxx xxxx\\xxxxx\\xxxxxx\"

\n

xxx xxxx xxxxx:xx.xxxxxxx(x'^xxxx$', xx.xxxxxxxxx)

\n

xxxxxxx'x xxxx xxxxxxxxxx 'xxxx', xxxxx xxxxxxxxx xxxxx ^ xxx $ xxxxxx xxxxx xxxxxxxxxxxx xxx xxxx xx x xxxx xx xxxx xx xxx xxxxx xxxxxx?

", "bugdown_matches_marked": false }, { "name": "dangerous_block", "input": "``` one ```\n\n``` two ```\n\n~~~~\nx = 1", "expected_output": "

one

\n

two

\n
x = 1\n
", "bugdown_matches_marked": true }, { "name": "ulist_standard", "input": "Some text with a list:\n\n* One item\n* Two items\n* Three items", "expected_output": "

Some text with a list:

\n", "bugdown_matches_marked": true }, { "name": "ulist_hanging", "input": "Some text with a hanging list:\n* One item\n* Two items\n* Three items", "expected_output": "

Some text with a hanging list:

\n", "bugdown_matches_marked": true }, { "name": "ulist_hanging_mixed", "input": "Plain list\n\n* Alpha\n\n* Beta\n\nThen hang it off:\n* Ypsilon\n* Zeta", "expected_output": "

Plain list

\n\n

Then hang it off:

\n", "bugdown_matches_marked": false }, { "name": "ulist_hanging_multi", "input": "Plain list\n* Alpha\n* Beta\n\nAnd Again:\n* A\n* B\n* C\n\nOnce more for feeling:\n* Q\n* E\n* D", "expected_output": "

Plain list

\n\n

And Again:

\n\n

Once more for feeling:

\n", "bugdown_matches_marked": true }, { "name": "ulist_codeblock", "input": "~~~\nint x = 3\n* 4;\n~~~", "expected_output": "
int x = 3\n* 4;\n
", "bugdown_matches_marked": true }, { "name": "malformed_fence", "input": "~~~~~~~~xxxxxxxxx: xxxxxxxxxxxx xxxxx x xxxxxxxx~~~~~~", "expected_output": "

~~~~~~~~xxxxxxxxx: xxxxxxxxxxxx xxxxx x xxxxxxxx~~~~~~

", "bugdown_matches_marked": true }, { "name": "underscore_disabled", "input": "_foo_", "expected_output": "

_foo_

", "bugdown_matches_marked": true }, { "name": "star_disabled", "input": "*foo*", "expected_output": "

*foo*

", "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

\n

xxxxx #xx:xxxxxxx

\n

xxxxxxx xxxxx xxxx xxxxx:
\nxxxxxx: xxxxxxx
\nxxxxxx: xxxxx
\nxxxxxx: xxxxx xxxxx

", "bugdown_matches_marked": true }, { "name": "inline_image", "input": "Google logo today: https://www.google.com/images/srpr/logo4w.png\nKinda boring", "expected_output": "

Google logo today: https://www.google.com/images/srpr/logo4w.png
\nKinda boring

\n
", "bugdown_matches_marked": false }, { "name": "two_inline_images", "input": "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", "expected_output": "

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

\n
", "bugdown_matches_marked": false }, { "name": "camo", "input": "Google logo today: http://www.google.com/images/srpr/logo4w.png", "expected_output": "

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

", "bugdown_matches_marked": true }, { "name": "nl2br_trailing_space", "input": "test ", "expected_output": "

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:

\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n
First HeaderSecond Header
Content CellContent Cell
Content CellContent Cell
", "bugdown_matches_marked": true }, { "name": "multiline_strong", "input": "You can check out **any time you'd like\nBut you can never leave**", "expected_output": "

You can check out **any time you'd like
\nBut you can never leave**

", "bugdown_matches_marked": false }, { "name": "many_emoji", "input": "test :smile: again :poop:\n:) foo:)bar x::y::z :wasted waste: :fakeemojithisshouldnotrender:", "expected_output": "

test \":smile:\" again \":poop:\"
\n:) foo:)bar x::y::z :wasted waste: :fakeemojithisshouldnotrender:

", "bugdown_matches_marked": true }, { "name": "random_emoji_1", "input": ":hankey:", "expected_output": "

\":hankey:\"

", "bugdown_matches_marked": true }, { "name": "random_emoji_2", "input": ":poop:", "expected_output": "

\":poop:\"

", "bugdown_matches_marked": true }, { "name": "not_emoji", "input": ":not_an_emoji:", "expected_output": "

:not_an_emoji:

", "bugdown_matches_marked": true }, { "name": "unicode_emoji", "input": "\ud83d\udca9", "expected_output":"

\"\ud83d\udca9\"<\/p>", "bugdown_matches_marked": true }, { "name": "two_unicode_emoji", "input": "\ud83d\udca9\ud83d\udca9", "expected_output":"

\"\ud83d\udca9\"\"\ud83d\udca9\"<\/p>", "bugdown_matches_marked": true }, { "name": "two_unicode_emoji_separated_by_text", "input": "\ud83d\udca9 word \ud83d\udca9", "expected_output":"

\"\ud83d\udca9\" word \"\ud83d\udca9\"<\/p>", "bugdown_matches_marked": true }, { "name": "emoji_alongside_punctuation", "input": ":smile:, :smile:; :smile:", "expected_output": "

\":smile:\", \":smile:\"; \":smile:\"

", "bugdown_matches_marked": true }, { "name": "safe_html", "input": "

stay normal

thanks", "expected_output": "

<h1>stay normal</h1> thanks

", "bugdown_matches_marked": true }, { "name": "safe_html_in_code", "input": "~~~\n

stay normal

", "expected_output": "
<h1>stay normal</h1>\n
", "bugdown_matches_marked": true }, { "name": "ulist_with_inline_code", "input": "gonna take a break for a bit--all yours if you want to play around too. what I did:\n\n* install cmake\n* git clone zulip desktop\n* run `cmake-gui ..` in `c:\\zulip\\zulip-desktop\\msvcbuild`\n* hit configure/generate until it generated the msvc project (had to make a fix to some cmake files)\n* opened vs2013 \n* tried to build\n", "expected_output": "

gonna take a break for a bit--all yours if you want to play around too. what I did:

\n", "bugdown_matches_marked": true }, { "name": "modal_link", "input": "!modal_link(#settings, Settings page)", "expected_output": "

Settings page

", "bugdown_matches_marked": false }, { "name": "modal_link_escaped", "input": "`!modal_link(#settings, Settings page)`", "expected_output": "

!modal_link(#settings, Settings page)

", "bugdown_matches_marked": true }, { "name": "avatar", "input": "!avatar(username@example.com)", "expected_output": "

\"username@example.com\"

", "bugdown_matches_marked": true }, { "name": "gravatar", "input": "!gravatar(username@example.com)", "expected_output": "

\"username@example.com\"

", "bugdown_matches_marked": true }, { "name": "avatar_escaped", "input": "`!avatar(username@example.com)`", "expected_output": "

!avatar(username@example.com)

", "bugdown_matches_marked": true }, { "name": "gravatar_escaped", "input": "`!gravatar(username@example.com)`", "expected_output": "

!gravatar(username@example.com)

", "bugdown_matches_marked": true }, { "name": "stream_subscribe_button", "input": "!_stream_subscribe_button(streamname)", "expected_output": "

", "bugdown_matches_marked": false }, { "name": "stream_subscribe_button_escaped", "input": "`!_stream_subscribe_button(streamname)`", "expected_output": "

!_stream_subscribe_button(streamname)

", "bugdown_matches_marked": true } ], "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" ], [ "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" ] ] }