diff --git a/app/Umbraco/Archetype.Tests/Serialization/Base/RegressionTestBase.cs b/app/Umbraco/Archetype.Tests/Serialization/Base/RegressionTestBase.cs index 6ff02c5..db9b84b 100644 --- a/app/Umbraco/Archetype.Tests/Serialization/Base/RegressionTestBase.cs +++ b/app/Umbraco/Archetype.Tests/Serialization/Base/RegressionTestBase.cs @@ -1,21 +1,13 @@ -using System; -using System.Collections; -using System.Collections.Generic; +using System.Collections; using System.Linq; using System.Reflection; -using Archetype.PropertyEditors; using Archetype.Serialization; using Moq; using Newtonsoft.Json; -using Newtonsoft.Json.Linq; using NUnit.Framework; using Umbraco.Core; -using Umbraco.Core.Models; -using Umbraco.Core.Models.Editors; using Umbraco.Core.Persistence; -using Umbraco.Core.PropertyEditors; using Umbraco.Core.Services; -using Umbraco.Web.PropertyEditors; namespace Archetype.Tests.Serialization.Base { diff --git a/app/Umbraco/Archetype.Tests/Serialization/Delinter/ArchetypeJsonDelinterTest.cs b/app/Umbraco/Archetype.Tests/Serialization/Delinter/ArchetypeJsonDelinterTest.cs index aa06ce0..dcb02a4 100644 --- a/app/Umbraco/Archetype.Tests/Serialization/Delinter/ArchetypeJsonDelinterTest.cs +++ b/app/Umbraco/Archetype.Tests/Serialization/Delinter/ArchetypeJsonDelinterTest.cs @@ -56,7 +56,11 @@ namespace Archetype.Tests.Serialization.Delinter { const string _JSON_WITH_RESERVED_CHARS = @"{ ""alias"": ""captions"", - ""value"": ""{\""fieldsets\"":[{\""properties\"":[{\""alias\"":\""textstring\"",\""value\"":\""test1 \r\n test1\r\n\""}],\""alias\"":\""textstringArray\""},{\""properties\"":[{\""alias\"":\""textstring\"",\""value\"":\""test2\r\ntest2\""}],\""alias\"":\""textstringArray\""},{\""properties\"":[{\""alias\"":\""textstring\"",\""value\"":\""test3b \\r\\r\\rtest3\""}],\""alias\"":\""textstringArray\""}]}"" + ""value"": ""{ \""fieldsets\"": [ +{ + \""properties\"": + [ +{ \""alias\"": \""textstring\"" , \""value\"":\""test1 \r\n test1\r\n\""}], \""alias\"":\""textstringArray\"" },{\""properties\"": [ { \""alias\"":\""textstring\"",\""value\"":\""test2\r\ntest2\""}],\""alias\"":\""textstringArray\""},{\""properties\"":[{\""alias\"":\""textstring\"",\""value\"":\""test3b \""quote\"" \\r\\r\\rtest3\""}],\""alias\"":\""textstringArray\"" } ] }"" }"; var referenceModel = new Captions() @@ -66,10 +70,13 @@ namespace Archetype.Tests.Serialization.Delinter "}, new TextString() {Text = @"test2 test2"}, - new TextString() {Text = @"test3b \r\r\rtest3"} + new TextString() {Text = @"test3b ""quote"" \r\r\rtest3"} }; - var actualModel = ConvertArchetypeJsonToModel(_JSON_WITH_RESERVED_CHARS.DelintArchetypeJson()); + var delintedJson = _JSON_WITH_RESERVED_CHARS.DelintArchetypeJson(); + var actualModel = ConvertArchetypeJsonToModel(delintedJson); + + var t = JToken.Parse(delintedJson).ToString(Formatting.None); Assert.IsInstanceOf(actualModel); Assert.IsNotNull(actualModel); diff --git a/app/Umbraco/Umbraco.Archetype/Serialization/ArchetypeJsonDelinter.cs b/app/Umbraco/Umbraco.Archetype/Serialization/ArchetypeJsonDelinter.cs index b1b2b63..894a442 100644 --- a/app/Umbraco/Umbraco.Archetype/Serialization/ArchetypeJsonDelinter.cs +++ b/app/Umbraco/Umbraco.Archetype/Serialization/ArchetypeJsonDelinter.cs @@ -1,13 +1,14 @@ using System; +using System.Linq; using System.Collections.Generic; using System.Text.RegularExpressions; namespace Archetype.Serialization { public enum DelinterStep - { - RemoveWhiteSpace = 0, - RemoveNewLine, + { + RemoveNewLine = 0, + RemoveWhiteSpace, UnescapeLabels, UnescapeAlias, UnescapeValues, @@ -25,9 +26,9 @@ namespace Archetype.Serialization public class ArchetypeJsonDelinter { - public IDictionary Pipeline { get; set; } - public IDictionary Tokens { get; set; } - public IDictionary> Actions { get; set; } + public IDictionary Pipeline { get; private set; } + public IDictionary Tokens { get; private set; } + public IDictionary> Actions { get; private set; } public ArchetypeJsonDelinter() { @@ -52,7 +53,7 @@ namespace Archetype.Serialization Tokens = new Dictionary { {DelinterStep.RemoveNewLine, new Regex(@"(?<=\,){0,1}(\\+r\\+n)(?=\\*?""(alias|value|properties|fieldsets)\\*?"":\{*?(\\*|""|\[))|(\r|\n)+|(\\+r\\+n)(?=\s*?(\{|\}|\]))|(\\+r\\n+)(?=\s+\\*?""(alias|value|properties|fieldsets))")}, - {DelinterStep.RemoveWhiteSpace, new Regex(@"(\s*?)\\+""(fieldsets|properties|alias|value)\\+"":(\s+)|""(\s*?)\},(\s+)\{|\[(\s+)\{|[\]\}](\s+)[\]\}]")}, + {DelinterStep.RemoveWhiteSpace, new Regex(@"(""\S+?"":)(\s+?)("")|([\{\[\}\],]|(? String.Empty) }, {DelinterAction.RemoveWhiteSpace, (input, pattern) => - RecursiveReplace(input, pattern, match => match.Groups[2].Success ? match.Groups[0].Value : String.Empty) + RecursiveReplace(input.Trim(), pattern, match => + String.Join(String.Empty, + match.Groups + .OfType() + .Select((g, i) => String.IsNullOrWhiteSpace(g.Value) ? String.Empty : g.Value) + .Skip(1) + .ToArray())) }, {DelinterAction.UnescapeLabels, (input, pattern) => RecursiveReplace(input, pattern, match => String.Format(@"""{0}"":", match.Groups[1].Value)) @@ -85,7 +92,7 @@ namespace Archetype.Serialization {DelinterStep.UnescapeAlias, DelinterAction.UnescapeValues}, {DelinterStep.UnescapeValues, DelinterAction.UnescapeValues}, {DelinterStep.FixNestedFieldsets, DelinterAction.FixNestedFieldsets}, - //{DelinterStep.RemoveWhiteSpace, DelinterAction.RemoveWhiteSpace}, + {DelinterStep.RemoveWhiteSpace, DelinterAction.RemoveWhiteSpace}, }; } @@ -94,7 +101,7 @@ namespace Archetype.Serialization var buffer = input; while (pattern.IsMatch(buffer)) { - buffer = pattern.Replace(input, match => matchFunc(match)); + buffer = pattern.Replace(buffer, match => matchFunc(match)); } return buffer; }