From 6b9b2d3d6ad0dfc026fbf66d250220eab2c8c8fe Mon Sep 17 00:00:00 2001 From: Robin Ward Date: Mon, 20 Jan 2014 15:09:05 -0500 Subject: [PATCH] New API for replacing elements in the final JsonML. Also changes spoiler tag handling to be more robust with repsect to HTML content. --- .../discourse/dialects/bbcode_dialect.js | 17 +++-- .../javascripts/discourse/dialects/dialect.js | 70 +++++++++++++++++++ test/javascripts/lib/bbcode_test.js | 13 +++- 3 files changed, 92 insertions(+), 8 deletions(-) diff --git a/app/assets/javascripts/discourse/dialects/bbcode_dialect.js b/app/assets/javascripts/discourse/dialects/bbcode_dialect.js index 9cdb9de55b..a29b9c99ea 100644 --- a/app/assets/javascripts/discourse/dialects/bbcode_dialect.js +++ b/app/assets/javascripts/discourse/dialects/bbcode_dialect.js @@ -78,16 +78,23 @@ 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) { - if (/`, 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)]; } }); diff --git a/app/assets/javascripts/discourse/dialects/dialect.js b/app/assets/javascripts/discourse/dialects/dialect.js index cf12fc64d1..5be09d5591 100644 --- a/app/assets/javascripts/discourse/dialects/dialect.js +++ b/app/assets/javascripts/discourse/dialects/dialect.js @@ -22,6 +22,50 @@ 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" + expected + "

", text); + var cooked = Discourse.Markdown.cook(input, {lookupAvatar: false}).replace(/'/g, "\""); + equal(cooked, "

" + expected.replace(/'/g, "\"") + "

", text); }; test('basic bbcode', function() { @@ -30,8 +30,15 @@ test('code', function() { }); test('spoiler', function() { + format("[spoiler][/spoiler]", "", "it can spoil nothing"); format("[spoiler]it's a sled[/spoiler]", "it's a sled", "supports spoiler tags on text"); - format("[spoiler][/spoiler]", "
", "supports spoiler tags on images"); + format("[spoiler][/spoiler]", "
", "supports spoiler tags on images"); + format("foo bar[spoiler]aaa bbb[/spoiler]", + "foo baraaa
bbb", + "It wraps images and text differently in the same block"); + format("[spoiler]hello[/spoiler]", + "hello", + "It surrounds other HTML"); }); test('lists', function() {