/*global sanitizeHtml:true */ module("Discourse.Markdown", { setup: function() { Discourse.SiteSettings.traditional_markdown_linebreaks = false; } }); var cooked = function(input, expected, text) { equal(Discourse.Markdown.cook(input, {mentionLookup: false }), expected, text); }; var cookedOptions = function(input, opts, expected, text) { equal(Discourse.Markdown.cook(input, opts), expected, text); }; test("basic cooking", function() { cooked("hello", "

hello

", "surrounds text with paragraphs"); }); test("Line Breaks", function() { var input = "1\n2\n3"; cooked(input, "

1
\n2
\n3

", "automatically handles trivial newlines"); var traditionalOutput = "

1\n2\n3

"; cookedOptions(input, {traditional_markdown_linebreaks: true}, traditionalOutput, "It supports traditional markdown via an option"); Discourse.SiteSettings.traditional_markdown_linebreaks = true; cooked(input, traditionalOutput, "It supports traditional markdown via a Site Setting"); }); test("Links", function() { cooked("Youtube: http://www.youtube.com/watch?v=1MrpeBRkM5A", '

Youtube: http://www.youtube.com/watch?v=1MrpeBRkM5A

', "allows links to contain query params"); cooked("Derpy: http://derp.com?__test=1", '

Derpy: http://derp.com?__test=1

', "escapes double underscores in URLs"); cooked("Atwood: www.codinghorror.com", '

Atwood: www.codinghorror.com

', "autolinks something that begins with www"); cooked("Atwood: http://www.codinghorror.com", '

Atwood: http://www.codinghorror.com

', "autolinks a URL with http://www"); cooked("EvilTrout: http://eviltrout.com", '

EvilTrout: http://eviltrout.com

', "autolinks a URL"); cooked("here is [an example](http://twitter.com)", '

here is an example

', "supports markdown style links"); cooked("Batman: http://en.wikipedia.org/wiki/The_Dark_Knight_(film)", '

Batman: http://en.wikipedia.org/wiki/The_Dark_Knight_(film)

', "autolinks a URL with parentheses (like Wikipedia)"); }); test("Quotes", function() { cookedOptions("1[quote=\"bob, post:1\"]my quote[/quote]2", { topicId: 2, lookupAvatar: function(name) { return "" + name; } }, "

1

\n


\n2

", "handles quotes properly"); cookedOptions("1[quote=\"bob, post:1\"]my quote[/quote]2", { topicId: 2, lookupAvatar: function(name) { } }, "

1

\n


\n2

", "includes no avatar if none is found"); }); test("Mentions", function() { cookedOptions("Hello @sam", { mentionLookup: (function() { return true; }) }, "

Hello @sam

", "translates mentions to links"); cooked("Hello @EvilTrout", "

Hello @EvilTrout

", "adds a mention class"); cooked("robin@email.host", "

robin@email.host

", "won't add mention class to an email address"); cooked("hanzo55@yahoo.com", "

hanzo55@yahoo.com

", "won't be affected by email addresses that have a number before the @ symbol"); cooked("@EvilTrout yo", "

@EvilTrout yo

", "doesn't do @username mentions inside
 or  blocks");
  cooked("`evil` @EvilTrout `trout`",
         "

evil @EvilTrout trout

", "deals correctly with multiple blocks"); }); test("Oneboxing", function() { var matches = function(input, regexp) { return Discourse.Markdown.cook(input, {mentionLookup: false }).match(regexp); }; ok(!matches("- http://www.textfiles.com/bbs/MINDVOX/FORUMS/ethics\n\n- http://drupal.org", /onebox/), "doesn't onebox a link within a list"); ok(matches("http://test.com", /onebox/), "adds a onebox class to a link on its own line"); ok(matches("http://test.com\nhttp://test2.com", /onebox[\s\S]+onebox/m), "supports multiple links"); ok(!matches("http://test.com bob", /onebox/), "doesn't onebox links that have trailing text"); cooked("http://en.wikipedia.org/wiki/Homicide:_Life_on_the_Street", "

http://en.wikipedia.org/wiki/Homicide:_Life_on_the_Street

", "works with links that have underscores in them"); }); test("SanitizeHTML", function() { equal(sanitizeHtml("
"), "
"); equal(sanitizeHtml("

hello

"), "

hello

"); }); // TODO // test("with BBCode", function() { // cooked("[img]http://eviltrout.com/eviltrout.png[/img]", // "

", // "BBCode is parsed first"); // });