diff --git a/app/assets/javascripts/discourse/dialects/bbcode_dialect.js b/app/assets/javascripts/discourse/dialects/bbcode_dialect.js index a29b9c99e..9cdb9de55 100644 --- a/app/assets/javascripts/discourse/dialects/bbcode_dialect.js +++ b/app/assets/javascripts/discourse/dialects/bbcode_dialect.js @@ -78,23 +78,16 @@ Discourse.Dialect.inlineBetween({ emitter: function(contents) { return ['a', {href: contents, 'data-bbcode': true}, contents]; } }); - Discourse.Dialect.inlineBetween({ start: '[spoiler]', stop: '[/spoiler]', rawContents: true, emitter: function(contents) { - return ["__spoiler", this.processInline(contents)]; - } -}); - -Discourse.Dialect.replaceElement('__spoiler', function(node, processInside) { - // Surround images with a `<div class='spoiler'>`, any other tags - // end up in a `span` - if (node.nodeType === 1 && node.nodeName === "IMG") { - return ['div', {class: 'spoiler'}, processInside(node)]; - } else { - return ['span', {class: 'spoiler'}, processInside(node)]; + if (/<img/i.test(contents)) { + return ['div', { 'class': 'spoiler' }, contents]; + } else { + return ['span', { 'class': 'spoiler' }, contents]; + } } }); diff --git a/app/assets/javascripts/discourse/dialects/dialect.js b/app/assets/javascripts/discourse/dialects/dialect.js index 5be09d559..cf12fc64d 100644 --- a/app/assets/javascripts/discourse/dialects/dialect.js +++ b/app/assets/javascripts/discourse/dialects/dialect.js @@ -22,50 +22,6 @@ function initializeDialects() { initialized = true; } -/** - Converts an HTML node Element into JsonML. - - @method nodeToJsonML - @param {Element} node to convert - @returns {Array} jsonML result -**/ -function nodeToJsonML(node) { - if (node.nodeType === 3) { - return node.nodeValue; - } - - var result = [node.nodeName.toLowerCase()], - attributes = {}; - - if (node.attributes && node.attributes.length > 0) { - for (var i=0; i<node.attributes.length; i++) { - var attr = node.attributes[i]; - attributes[attr.name] = attr.value; - } - result.push(attributes); - } - var innerResult = eachNodeList(node.childNodes, nodeToJsonML); - return result.concat(innerResult); -} - -/** - Iterate through a NodeList and apply a function, returning - a concatenated array of results. - - @method eachNodeList - @param {NodeList} nodeList to iterate through - @param {Function} f to call -**/ -function eachNodeList(nodeList, f) { - if (!nodeList || nodeList.length === 0) { return []; } - - var result = []; - for (var i=0; i<nodeList.length; i++) { - result.push(f(nodeList[i], nodeToJsonML)); - } - return result; -} - /** Process the text nodes in the JsonML tree, calling any emitters that have been added. @@ -497,32 +453,6 @@ Discourse.Dialect = { node[node.length-1] = emitter(node[node.length-1]); } }); - }, - - - /** - Replaces an element by name in the final jsonML tree by parsing the HTML - and using a `replacer` callback. - - @method replaceElement - @param {String} nodeName to match - @param {Function} replacer function to call on each node - **/ - replaceElement: function(nodeName, replacer) { - Discourse.Dialect.on('parseNode', function(event) { - var node = event.node; - if (node[0] === nodeName) { - var doc = document.implementation.createHTMLDocument(""); - if (doc) { - doc.documentElement.innerHTML = node[1]; - if (doc.body) { - var jsonML = eachNodeList(doc.body.childNodes, replacer), - parentNode = event.path[event.path.length-1]; - parentNode.splice.apply(parentNode, [parentNode.indexOf(node), 1].concat(jsonML)); - } - } - } - }); } }; diff --git a/test/javascripts/lib/bbcode_test.js b/test/javascripts/lib/bbcode_test.js index cde805e89..d1b059180 100644 --- a/test/javascripts/lib/bbcode_test.js +++ b/test/javascripts/lib/bbcode_test.js @@ -1,8 +1,8 @@ module("Discourse.BBCode"); var format = function(input, expected, text) { - var cooked = Discourse.Markdown.cook(input, {lookupAvatar: false}).replace(/'/g, "\""); - equal(cooked, "<p>" + expected.replace(/'/g, "\"") + "</p>", text); + var cooked = Discourse.Markdown.cook(input, {lookupAvatar: false}); + equal(cooked, "<p>" + expected + "</p>", text); }; test('basic bbcode', function() { @@ -30,15 +30,8 @@ test('code', function() { }); test('spoiler', function() { - format("[spoiler][/spoiler]", "", "it can spoil nothing"); format("[spoiler]it's a sled[/spoiler]", "<span class=\"spoiler\">it's a sled</span>", "supports spoiler tags on text"); - 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"); - format("foo bar[spoiler]aaa <img src='#'> bbb[/spoiler]", - "foo bar<span class='spoiler'>aaa </span><div class='spoiler'><img src='#'/></div><span class='spoiler'> bbb</span>", - "It wraps images and text differently in the same block"); - format("[spoiler]<a href='#'>hello</a>[/spoiler]", - "<span class='spoiler'><a href='#'>hello</a></span>", - "It surrounds other HTML"); + 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"); }); test('lists', function() {