2013-06-17 23:38:30 +08:00
module ( "Discourse.BBCode" ) ;
2013-06-18 23:35:51 +08:00
var format = function ( input , expected , text ) {
2014-01-22 01:04:26 +08:00
var cooked = Discourse . Markdown . cook ( input , { lookupAvatar : false } ) ;
equal ( cooked , "<p>" + expected + "</p>" , text ) ;
2013-06-22 02:06:20 +08:00
} ;
2013-06-17 23:38:30 +08:00
2013-06-18 23:35:51 +08:00
test ( 'basic bbcode' , function ( ) {
2013-08-09 06:14:12 +08:00
format ( "[b]strong[/b]" , "<span class=\"bbcode-b\">strong</span>" , "bolds text" ) ;
format ( "[i]emphasis[/i]" , "<span class=\"bbcode-i\">emphasis</span>" , "italics text" ) ;
format ( "[u]underlined[/u]" , "<span class=\"bbcode-u\">underlined</span>" , "underlines text" ) ;
format ( "[s]strikethrough[/s]" , "<span class=\"bbcode-s\">strikethrough</span>" , "strikes-through text" ) ;
format ( "[img]http://eviltrout.com/eviltrout.png[/img]" , "<img src=\"http://eviltrout.com/eviltrout.png\"/>" , "links images" ) ;
2013-06-17 23:38:30 +08:00
format ( "[url]http://bettercallsaul.com[/url]" , "<a href=\"http://bettercallsaul.com\">http://bettercallsaul.com</a>" , "supports [url] without a title" ) ;
format ( "[email]eviltrout@mailinator.com[/email]" , "<a href=\"mailto:eviltrout@mailinator.com\">eviltrout@mailinator.com</a>" , "supports [email] without a title" ) ;
2013-08-28 00:52:00 +08:00
format ( "[b]evil [i]trout[/i][/b]" ,
"<span class=\"bbcode-b\">evil <span class=\"bbcode-i\">trout</span></span>" ,
"allows embedding of tags" ) ;
2014-03-04 00:59:57 +08:00
format ( "[EMAIL]eviltrout@mailinator.com[/EMAIL]" , "<a href=\"mailto:eviltrout@mailinator.com\">eviltrout@mailinator.com</a>" , "supports upper case bbcode" ) ;
2013-06-18 23:35:51 +08:00
} ) ;
2013-06-17 23:38:30 +08:00
2013-09-12 03:52:37 +08:00
test ( 'invalid bbcode' , function ( ) {
var cooked = Discourse . Markdown . cook ( "[code]I am not closed\n\nThis text exists." , { lookupAvatar : false } ) ;
equal ( cooked , "<p>[code]I am not closed</p>\n\n<p>This text exists.</p>" , "does not raise an error with an open bbcode tag." ) ;
} ) ;
2013-10-22 00:12:58 +08:00
test ( 'code' , function ( ) {
format ( "[code]\nx++\n[/code]" , "<pre>\nx++</pre>" , "makes code into pre" ) ;
format ( "[code]\nx++\ny++\nz++\n[/code]" , "<pre>\nx++\ny++\nz++</pre>" , "makes code into pre" ) ;
format ( "[code]abc\n#def\n[/code]" , '<pre>abc\n#def</pre>' , 'it handles headings in a [code] block' ) ;
} ) ;
2014-01-13 02:38:46 +08:00
test ( 'spoiler' , function ( ) {
2014-01-15 07:53:06 +08:00
format ( "[spoiler]it's a sled[/spoiler]" , "<span class=\"spoiler\">it's a sled</span>" , "supports spoiler tags on text" ) ;
2014-01-22 01:04:26 +08:00
format ( "[spoiler]<img src='http://eviltrout.com/eviltrout.png' width='50' height='50'>[/spoiler]" , "<div class=\"spoiler\"><img src='http://eviltrout.com/eviltrout.png' width='50' height='50'></div>" , "supports spoiler tags on images" ) ;
2014-01-13 02:38:46 +08:00
} ) ;
2013-06-18 23:35:51 +08:00
test ( 'lists' , function ( ) {
2013-06-17 23:38:30 +08:00
format ( "[ul][li]option one[/li][/ul]" , "<ul><li>option one</li></ul>" , "creates an ul" ) ;
format ( "[ol][li]option one[/li][/ol]" , "<ol><li>option one</li></ol>" , "creates an ol" ) ;
2013-06-18 23:35:51 +08:00
} ) ;
2013-06-17 23:38:30 +08:00
2013-06-18 23:35:51 +08:00
test ( 'tags with arguments' , function ( ) {
2013-06-17 23:38:30 +08:00
format ( "[url=http://bettercallsaul.com]better call![/url]" , "<a href=\"http://bettercallsaul.com\">better call!</a>" , "supports [url] with a title" ) ;
format ( "[email=eviltrout@mailinator.com]evil trout[/email]" , "<a href=\"mailto:eviltrout@mailinator.com\">evil trout</a>" , "supports [email] with a title" ) ;
2013-08-09 06:14:12 +08:00
format ( "[u][i]abc[/i][/u]" , "<span class=\"bbcode-u\"><span class=\"bbcode-i\">abc</span></span>" , "can nest tags" ) ;
format ( "[b]first[/b] [b]second[/b]" , "<span class=\"bbcode-b\">first</span> <span class=\"bbcode-b\">second</span>" , "can bold two things on the same line" ) ;
2013-10-22 23:08:13 +08:00
} ) ;
test ( "size tags" , function ( ) {
format ( "[size=35]BIG [b]whoop[/b][/size]" ,
"<span class=\"bbcode-size-35\">BIG <span class=\"bbcode-b\">whoop</span></span>" ,
"supports [size=]" ) ;
format ( "[size=asdf]regular[/size]" ,
"<span class=\"bbcode-size-1\">regular</span>" ,
"it only supports numbers in bbcode" ) ;
2013-06-19 01:44:20 +08:00
} ) ;
test ( "quotes" , function ( ) {
var post = Discourse . Post . create ( {
cooked : "<p><b>lorem</b> ipsum</p>" ,
username : "eviltrout" ,
post _number : 1 ,
topic _id : 2
} ) ;
var formatQuote = function ( val , expected , text ) {
2013-08-09 06:14:12 +08:00
equal ( Discourse . Quote . build ( post , val ) , expected , text ) ;
2013-06-22 02:06:20 +08:00
} ;
2013-06-19 01:44:20 +08:00
formatQuote ( undefined , "" , "empty string for undefined content" ) ;
formatQuote ( null , "" , "empty string for null content" ) ;
formatQuote ( "" , "" , "empty string for empty string content" ) ;
formatQuote ( "lorem" , "[quote=\"eviltrout, post:1, topic:2\"]\nlorem\n[/quote]\n\n" , "correctly formats quotes" ) ;
formatQuote ( " lorem \t " ,
"[quote=\"eviltrout, post:1, topic:2\"]\nlorem\n[/quote]\n\n" ,
"trims white spaces before & after the quoted contents" ) ;
formatQuote ( "lorem ipsum" ,
"[quote=\"eviltrout, post:1, topic:2, full:true\"]\nlorem ipsum\n[/quote]\n\n" ,
"marks quotes as full when the quote is the full message" ) ;
formatQuote ( "**lorem** ipsum" ,
"[quote=\"eviltrout, post:1, topic:2, full:true\"]\n**lorem** ipsum\n[/quote]\n\n" ,
"keeps BBCode formatting" ) ;
2013-08-30 02:15:05 +08:00
formatQuote ( "this is <not> a bug" ,
"[quote=\"eviltrout, post:1, topic:2\"]\nthis is <not> a bug\n[/quote]\n\n" ,
"it escapes the contents of the quote" ) ;
2013-10-21 23:11:54 +08:00
format ( "[quote]test[/quote]" ,
"<aside class=\"quote\"><blockquote><p>test</p></blockquote></aside>" ,
"it supports quotes without params" ) ;
2013-11-08 05:06:50 +08:00
format ( "[quote]\n*test*\n[/quote]" ,
"<aside class=\"quote\"><blockquote><p><em>test</em></p></blockquote></aside>" ,
"it doesn't insert a new line for italics" ) ;
2014-04-21 21:20:39 +08:00
format ( "[quote,script='a'><script>alert('test');//':a][/quote]" ,
"<aside class=\"quote\" data-script='a'><script>alert('test');//'=\"a\"><blockquote></blockquote></aside>" ,
"It will not create a script tag within an attribute" ) ;
2013-06-19 01:44:20 +08:00
} ) ;
test ( "quote formatting" , function ( ) {
2013-08-09 06:14:12 +08:00
format ( "[quote=\"EvilTrout, post:123, topic:456, full:true\"][sam][/quote]" ,
"<aside class=\"quote\" data-post=\"123\" data-topic=\"456\" data-full=\"true\"><div class=\"title\">" +
2013-09-28 03:08:30 +08:00
"<div class=\"quote-controls\"></div>EvilTrout said:</div><blockquote><p>[sam]</p></blockquote></aside>" ,
2013-08-09 06:14:12 +08:00
"it allows quotes with [] inside" ) ;
2013-06-19 01:44:20 +08:00
format ( "[quote=\"eviltrout, post:1, topic:1\"]abc[/quote]" ,
2013-08-09 06:14:12 +08:00
"<aside class=\"quote\" data-post=\"1\" data-topic=\"1\"><div class=\"title\"><div class=\"quote-controls\"></div>eviltrout said:" +
2013-09-28 03:08:30 +08:00
"</div><blockquote><p>abc</p></blockquote></aside>" ,
2013-06-19 01:44:20 +08:00
"renders quotes properly" ) ;
2013-08-09 06:14:12 +08:00
format ( "[quote=\"eviltrout, post:1, topic:1\"]abc[/quote]\nhello" ,
"<aside class=\"quote\" data-post=\"1\" data-topic=\"1\"><div class=\"title\"><div class=\"quote-controls\"></div>eviltrout said:" +
2013-09-28 03:08:30 +08:00
"</div><blockquote><p>abc</p></blockquote></aside></p>\n\n<p>hello" ,
2013-08-09 06:14:12 +08:00
"handles new lines properly" ) ;
2013-06-19 01:44:20 +08:00
} ) ;
2013-10-16 22:26:35 +08:00
test ( "quotes with trailing formatting" , function ( ) {
var cooked = Discourse . Markdown . cook ( "[quote=\"EvilTrout, post:123, topic:456, full:true\"]\nhello\n[/quote]\n*Test*" , { lookupAvatar : false } ) ;
equal ( cooked ,
"<p><aside class=\"quote\" data-post=\"123\" data-topic=\"456\" data-full=\"true\"><div class=\"title\">" +
"<div class=\"quote-controls\"></div>EvilTrout said:</div><blockquote><p>hello</p></blockquote></aside></p>\n\n<p><em>Test</em></p>" ,
"it allows trailing formatting" ) ;
} ) ;
2013-06-19 01:44:20 +08:00