From 27dfb7a948d341c1ebcebb151759e81549f41452 Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?R=C3=A9gis=20Hanol?= <regis@hanol.fr> Date: Thu, 16 May 2013 01:59:07 +0200 Subject: [PATCH] FIX: @username mentions when there are multiple code blocks in a post. Meta: [All of my internal users show as coming from 127.0.0.1!](http://meta.discourse.org/t/all-of-my-internal-users-show-as-coming-from-127-0-0-1/6607) This fixes the regular expression used to identify @ inside <code> or <pre> blocks in the `postConversion` hook. --- app/assets/javascripts/discourse/components/markdown.js | 4 ++-- spec/javascripts/components/markdown_spec.js | 8 ++++++++ 2 files changed, 10 insertions(+), 2 deletions(-) diff --git a/app/assets/javascripts/discourse/components/markdown.js b/app/assets/javascripts/discourse/components/markdown.js index 599dce085..7ceee45a0 100644 --- a/app/assets/javascripts/discourse/components/markdown.js +++ b/app/assets/javascripts/discourse/components/markdown.js @@ -143,8 +143,8 @@ Discourse.Markdown = { if (!text) return ""; // don't do @username mentions inside <pre> or <code> blocks - text = text.replace(/<(pre|code)>([\s\S]*?@[\s\S]*?)<\/(pre|code)>/gi, function(wholeMatch, m1, m2, m3) { - return "<" + m1 + ">" + (m2.replace(/@/g, '@')) + "</" + m3 + ">"; + text = text.replace(/<(pre|code)>([\s\S](?!<(pre|code)>))*?@([\s\S](?!<(pre|code)>))*?<\/(pre|code)>/gi, function(m) { + return m.replace(/@/g, '@'); }); // add @username mentions, if valid; must be bounded on left and right by non-word characters diff --git a/spec/javascripts/components/markdown_spec.js b/spec/javascripts/components/markdown_spec.js index 4a0527496..948000573 100644 --- a/spec/javascripts/components/markdown_spec.js +++ b/spec/javascripts/components/markdown_spec.js @@ -92,6 +92,14 @@ describe("Discourse.Markdown", function() { expect(cook("@EvilTrout yo")).toBe("<p><span class='mention'>@EvilTrout</span> yo</p>"); }); + it("doesn't do @username mentions inside <pre> or <code> blocks", function() { + expect(cook("`@EvilTrout yo`")).toBe("<p><code>@EvilTrout yo</code></p>"); + }); + + it("deals correctly with multiple <code> blocks", function() { + expect(cook("`evil` @EvilTrout `trout`")).toBe("<p><code>evil</code> <span class='mention'>@EvilTrout</span> <code>trout</code></p>"); + }); + }); describe("Oneboxing", function() {