From f0573fc68c0f795622951bf922809436a661dca7 Mon Sep 17 00:00:00 2001 From: Shannon Date: Mon, 20 Jan 2014 13:59:25 +1100 Subject: [PATCH] Fixes: U4-4084 Macro's with non alphanumeric chars in their aliases cannot render in the rich text editor --- src/Umbraco.Core/Macros/MacroTagParser.cs | 6 +- src/Umbraco.Tests/Macros/MacroParserTests.cs | 92 +++++++++++++++++-- .../src/common/services/macro.service.js | 2 +- .../common/services/macro-service.spec.js | 14 +++ 4 files changed, 103 insertions(+), 11 deletions(-) diff --git a/src/Umbraco.Core/Macros/MacroTagParser.cs b/src/Umbraco.Core/Macros/MacroTagParser.cs index ba6793580b..2a4916eb78 100644 --- a/src/Umbraco.Core/Macros/MacroTagParser.cs +++ b/src/Umbraco.Core/Macros/MacroTagParser.cs @@ -12,7 +12,7 @@ namespace Umbraco.Core.Macros internal class MacroTagParser { private static readonly Regex MacroRteContent = new Regex(@"()", RegexOptions.Compiled | RegexOptions.IgnoreCase | RegexOptions.Singleline); - private static readonly Regex MacroPersistedFormat = new Regex(@"(<\?UMBRACO_MACRO macroAlias=[""'](\w+?)[""'].+?)(?:/>|>.*?)", RegexOptions.Compiled | RegexOptions.IgnoreCase | RegexOptions.Singleline); + private static readonly Regex MacroPersistedFormat = new Regex(@"(<\?UMBRACO_MACRO macroAlias=[""']([\w\.]+?)[""'].+?)(?:/>|>.*?)", RegexOptions.Compiled | RegexOptions.IgnoreCase | RegexOptions.Singleline); /// /// This formats the persisted string to something useful for the rte so that the macro renders properly since we @@ -39,8 +39,8 @@ namespace Umbraco.Core.Macros //
var alias = match.Groups[2].Value; var sb = new StringBuilder("
hello world

", content); } + [Test] + public void Format_RTE_Data_For_Editor_With_Non_AlphaNumeric_Char_In_Alias() + { + var content = @"

asdfasdf

+

asdfsadf

+ +

asdfasdf

"; + var result = MacroTagParser.FormatRichTextPersistedDataForEditor(content, new Dictionary() { { "test1", "value1" }, { "test2", "value2" } }); + +// Assert.AreEqual(@"

asdfasdf

+//

asdfsadf

+//
+// +//Macro alias: Map
+//

asdfasdf

".Replace(Environment.NewLine, string.Empty), result.Replace(Environment.NewLine, string.Empty)); + Assert.AreEqual(@"

asdfasdf

+

asdfsadf

+
+ +Macro alias: My.Map.isCool
+

asdfasdf

".Replace(Environment.NewLine, string.Empty), result.Replace(Environment.NewLine, string.Empty)); + } + [Test] public void Format_RTE_Data_For_Editor() { @@ -25,9 +48,16 @@ namespace Umbraco.Tests.Macros

asdfasdf

"; var result = MacroTagParser.FormatRichTextPersistedDataForEditor(content, new Dictionary(){{"test1", "value1"},{"test2", "value2"}}); +// Assert.AreEqual(@"

asdfasdf

+//

asdfsadf

+//
+// +//Macro alias: Map
+//

asdfasdf

".Replace(Environment.NewLine, string.Empty), result.Replace(Environment.NewLine, string.Empty)); + Assert.AreEqual(@"

asdfasdf

asdfsadf

-
+
Macro alias: Map

asdfasdf

".Replace(Environment.NewLine, string.Empty), result.Replace(Environment.NewLine, string.Empty)); @@ -42,9 +72,15 @@ namespace Umbraco.Tests.Macros

asdfasdf

"; var result = MacroTagParser.FormatRichTextPersistedDataForEditor(content, new Dictionary() { { "test1", "value1" }, { "test2", "value2" } }); +// Assert.AreEqual(@"

asdfasdf

+//

asdfsadf

+//
+// +//Macro alias: Map
+//

asdfasdf

".Replace(Environment.NewLine, string.Empty), result.Replace(Environment.NewLine, string.Empty)); Assert.AreEqual(@"

asdfasdf

asdfsadf

-
+
Macro alias: Map

asdfasdf

".Replace(Environment.NewLine, string.Empty), result.Replace(Environment.NewLine, string.Empty)); @@ -59,9 +95,15 @@ namespace Umbraco.Tests.Macros

asdfasdf

"; var result = MacroTagParser.FormatRichTextPersistedDataForEditor(content, new Dictionary() { { "test1", "value1" }, { "test2", "value2" } }); +// Assert.AreEqual(@"

asdfasdf

+//

asdfsadf

+//
+// +//Macro alias: Map
+//

asdfasdf

".Replace(Environment.NewLine, string.Empty), result.Replace(Environment.NewLine, string.Empty)); Assert.AreEqual(@"

asdfasdf

asdfsadf

-
+
Macro alias: Map

asdfasdf

".Replace(Environment.NewLine, string.Empty), result.Replace(Environment.NewLine, string.Empty)); @@ -76,9 +118,15 @@ namespace Umbraco.Tests.Macros

asdfasdf

"; var result = MacroTagParser.FormatRichTextPersistedDataForEditor(content, new Dictionary() { { "test1", "value1" }, { "test2", "value2" } }); +// Assert.AreEqual(@"

asdfasdf

+//

asdfsadf

+//
+// +//Macro alias: Map
+//

asdfasdf

".Replace(Environment.NewLine, string.Empty), result.Replace(Environment.NewLine, string.Empty)); Assert.AreEqual(@"

asdfasdf

asdfsadf

-
+
Macro alias: Map

asdfasdf

".Replace(Environment.NewLine, string.Empty), result.Replace(Environment.NewLine, string.Empty)); @@ -93,9 +141,15 @@ namespace Umbraco.Tests.Macros

asdfasdf

"; var result = MacroTagParser.FormatRichTextPersistedDataForEditor(content, new Dictionary() { { "test1", "value1" }, { "test2", "value2" } }); +// Assert.AreEqual(@"

asdfasdf

+//

asdfsadf

+//
+// +//Macro alias: Map
+//

asdfasdf

".Replace(Environment.NewLine, string.Empty), result.Replace(Environment.NewLine, string.Empty)); Assert.AreEqual(@"

asdfasdf

asdfsadf

-
+
Macro alias: Map

asdfasdf

".Replace(Environment.NewLine, string.Empty), result.Replace(Environment.NewLine, string.Empty)); @@ -104,10 +158,26 @@ namespace Umbraco.Tests.Macros [Test] public void Format_RTE_Data_For_Persistence() { +// var content = @" +// +//

asdfasdf

+//
+// +//asdfasdf +//asdfas +//asdfasdfasdf +//

asdfasdf

+//
+//asdfdasf +//
+//asdfsdf +//
+// +//"; var content = @"

asdfasdf

-
+
asdfasdf asdfas @@ -170,7 +240,15 @@ asdfsdf [Test] public void Format_RTE_Data_For_Persistence_Custom_Single_Entry() { - var content = @"
+// var content = @"
+//
+//
+//

null

+//
+//
1089
+//
+//
"; + var content = @"

null

diff --git a/src/Umbraco.Web.UI.Client/src/common/services/macro.service.js b/src/Umbraco.Web.UI.Client/src/common/services/macro.service.js index 0c240a294c..0b1f73e696 100644 --- a/src/Umbraco.Web.UI.Client/src/common/services/macro.service.js +++ b/src/Umbraco.Web.UI.Client/src/common/services/macro.service.js @@ -13,7 +13,7 @@ function macroService() { /** parses the special macro syntax like and returns an object with the macro alias and it's parameters */ parseMacroSyntax: function (syntax) { - var expression = /(<\?UMBRACO_MACRO macroAlias=["'](\w+?)["'].+?)(\/>|>.*?<\/\?UMBRACO_MACRO>)/im; + var expression = /(<\?UMBRACO_MACRO macroAlias=["']([\w\.]+?)["'].+?)(\/>|>.*?<\/\?UMBRACO_MACRO>)/im; var match = expression.exec(syntax); if (!match || match.length < 3) { return null; diff --git a/src/Umbraco.Web.UI.Client/test/unit/common/services/macro-service.spec.js b/src/Umbraco.Web.UI.Client/test/unit/common/services/macro-service.spec.js index 470b7b59f8..381ae22713 100644 --- a/src/Umbraco.Web.UI.Client/test/unit/common/services/macro-service.spec.js +++ b/src/Umbraco.Web.UI.Client/test/unit/common/services/macro-service.spec.js @@ -21,6 +21,20 @@ describe('macro service tests', function () { expect(result.marcoParamsDictionary.test2).toBe("hello"); + }); + + it('can parse syntax for macros with aliases containing dots', function () { + + var result = macroService.parseMacroSyntax(""); + + expect(result).not.toBeNull(); + expect(result.macroAlias).toBe("Map.Test"); + expect(result.marcoParamsDictionary.test1).not.toBeUndefined(); + expect(result.marcoParamsDictionary.test1).toBe("asdf"); + expect(result.marcoParamsDictionary.test2).not.toBeUndefined(); + expect(result.marcoParamsDictionary.test2).toBe("hello"); + + }); it('can parse syntax for macros with body', function () {