/*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
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\n\n2
", "handles quotes properly"); cookedOptions("1[quote=\"bob, post:1\"]my quote[/quote]2", { topicId: 2, lookupAvatar: function(name) { } }, "1
\n\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
");
});
test("URLs in BBCode tags", function() {
cooked("[img]http://eviltrout.com/eviltrout.png[/img][img]http://samsaffron.com/samsaffron.png[/img]",
"",
"images are properly parsed");
cooked("[url]http://discourse.org[/url]",
"",
"links are properly parsed");
cooked("[url=http://discourse.org]discourse[/url]",
"",
"named links are properly parsed");
});