From 79dc68512fd7e77575ba1c35a31920bae5229c51 Mon Sep 17 00:00:00 2001 From: Jens Maier Date: Thu, 24 Jul 2014 17:34:13 +0200 Subject: [PATCH] FIX: dialects accept nested inline markup --- .../javascripts/discourse/dialects/dialect.js | 17 +++++++++-------- test/javascripts/lib/bbcode_test.js | 1 + 2 files changed, 10 insertions(+), 8 deletions(-) diff --git a/app/assets/javascripts/discourse/dialects/dialect.js b/app/assets/javascripts/discourse/dialects/dialect.js index 495d0fa6720..67f7cb8cc94 100644 --- a/app/assets/javascripts/discourse/dialects/dialect.js +++ b/app/assets/javascripts/discourse/dialects/dialect.js @@ -288,7 +288,7 @@ Discourse.Dialect = { this.registerInline(start, function(text, match, prev) { if (invalidBoundary(args, prev)) { return; } - var endPos = self.findEndPos(text, stop, args, startLength); + var endPos = self.findEndPos(text, start, stop, args, startLength); if (endPos === -1) { return; } var between = text.slice(startLength, endPos); @@ -304,13 +304,14 @@ Discourse.Dialect = { }); }, - findEndPos: function(text, stop, args, start) { - var endPos = text.indexOf(stop, start); - if (endPos === -1) { return -1; } - var after = text.charAt(endPos + stop.length); - if (after && after.indexOf(stop) === 0) { - return this.findEndPos(text, stop, args, endPos + stop.length + 1); - } + findEndPos: function(text, start, stop, args, offset) { + var endPos, nextStart; + do { + endPos = text.indexOf(stop, offset); + if (endPos === -1) { return -1; } + nextStart = text.indexOf(start, offset); + offset = endPos + stop.length; + } while (nextStart !== -1 && nextStart < endPos); return endPos; }, diff --git a/test/javascripts/lib/bbcode_test.js b/test/javascripts/lib/bbcode_test.js index 7d630a16b87..c269cff4537 100644 --- a/test/javascripts/lib/bbcode_test.js +++ b/test/javascripts/lib/bbcode_test.js @@ -22,6 +22,7 @@ test('basic bbcode', function() { "evil trout", "allows embedding of tags"); format("[EMAIL]eviltrout@mailinator.com[/EMAIL]", "eviltrout@mailinator.com", "supports upper case bbcode"); + format("[b]strong [b]stronger[/b][/b]", "strong stronger", "accepts nested bbcode tags"); }); test('invalid bbcode', function() {