diff --git a/src/Orchard.Tests/DisplayManagement/Descriptors/LocationParserTests.cs b/src/Orchard.Tests/DisplayManagement/Descriptors/LocationParserTests.cs new file mode 100644 index 000000000..9a042b9d1 --- /dev/null +++ b/src/Orchard.Tests/DisplayManagement/Descriptors/LocationParserTests.cs @@ -0,0 +1,60 @@ +using NUnit.Framework; +using Orchard.DisplayManagement.Descriptors; + +namespace Orchard.Tests.DisplayManagement.Descriptors { + [TestFixture] + public class LocationParserTests : ContainerTestBase { + + [Test] + public void ZoneShouldBeParsed() { + Assert.That(new PlacementInfo { Location = "Content" }.GetZone(), Is.EqualTo("Content")); + Assert.That(new PlacementInfo { Location = "Content:5" }.GetZone(), Is.EqualTo("Content")); + Assert.That(new PlacementInfo { Location = "Content:5#Tab1" }.GetZone(), Is.EqualTo("Content")); + Assert.That(new PlacementInfo { Location = "Content:5@Group1" }.GetZone(), Is.EqualTo("Content")); + Assert.That(new PlacementInfo { Location = "Content:5@Group1#Tab1" }.GetZone(), Is.EqualTo("Content")); + } + + [Test] + public void PositionShouldBeParsed() { + Assert.That(new PlacementInfo { Location = "Content" }.GetPosition(), Is.EqualTo("")); + Assert.That(new PlacementInfo { Location = "Content:5" }.GetPosition(), Is.EqualTo("5")); + Assert.That(new PlacementInfo { Location = "Content:5#Tab1" }.GetPosition(), Is.EqualTo("5")); + Assert.That(new PlacementInfo { Location = "Content:5.1#Tab1" }.GetPosition(), Is.EqualTo("5.1")); + Assert.That(new PlacementInfo { Location = "Content:5@Group1" }.GetPosition(), Is.EqualTo("5")); + Assert.That(new PlacementInfo { Location = "Content:5@Group1#Tab1" }.GetPosition(), Is.EqualTo("5")); + } + + + [Test] + public void LayoutZoneShouldBeParsed() { + Assert.That(new PlacementInfo { Location = "/Content" }.IsLayoutZone(), Is.EqualTo(true)); + Assert.That(new PlacementInfo { Location = "/Content:5" }.IsLayoutZone(), Is.EqualTo(true)); + Assert.That(new PlacementInfo { Location = "Content:5#Tab1" }.IsLayoutZone(), Is.EqualTo(false)); + Assert.That(new PlacementInfo { Location = "Content:5.1#Tab1" }.IsLayoutZone(), Is.EqualTo(false)); + Assert.That(new PlacementInfo { Location = "Content:5@Group1" }.IsLayoutZone(), Is.EqualTo(false)); + Assert.That(new PlacementInfo { Location = "Content:5@Group1#Tab1" }.IsLayoutZone(), Is.EqualTo(false)); + } + + [Test] + public void TabShouldBeParsed() { + Assert.That(new PlacementInfo { Location = "Content" }.GetTab(), Is.EqualTo("")); + Assert.That(new PlacementInfo { Location = "Content:5" }.GetTab(), Is.EqualTo("")); + Assert.That(new PlacementInfo { Location = "Content:5#Tab1" }.GetTab(), Is.EqualTo("Tab1")); + Assert.That(new PlacementInfo { Location = "Content:5.1#Tab1" }.GetTab(), Is.EqualTo("Tab1")); + Assert.That(new PlacementInfo { Location = "Content:5@Group1" }.GetTab(), Is.EqualTo("")); + Assert.That(new PlacementInfo { Location = "Content:5@Group1#Tab1" }.GetTab(), Is.EqualTo("Tab1")); + Assert.That(new PlacementInfo { Location = "Content:5#Tab1@Group1" }.GetTab(), Is.EqualTo("Tab1")); + } + + [Test] + public void GroupShouldBeParsed() { + Assert.That(new PlacementInfo { Location = "Content" }.GetGroup(), Is.EqualTo("")); + Assert.That(new PlacementInfo { Location = "Content:5" }.GetGroup(), Is.EqualTo("")); + Assert.That(new PlacementInfo { Location = "Content:5#Tab1" }.GetGroup(), Is.EqualTo("")); + Assert.That(new PlacementInfo { Location = "Content:5.1#Tab1" }.GetGroup(), Is.EqualTo("")); + Assert.That(new PlacementInfo { Location = "Content:5@Group1" }.GetGroup(), Is.EqualTo("Group1")); + Assert.That(new PlacementInfo { Location = "Content:5@Group1#Tab1" }.GetGroup(), Is.EqualTo("Group1")); + Assert.That(new PlacementInfo { Location = "Content:5#Tab1@Group1" }.GetGroup(), Is.EqualTo("Group1")); + } + } +} diff --git a/src/Orchard.Tests/Orchard.Framework.Tests.csproj b/src/Orchard.Tests/Orchard.Framework.Tests.csproj index d634cecbd..536583771 100644 --- a/src/Orchard.Tests/Orchard.Framework.Tests.csproj +++ b/src/Orchard.Tests/Orchard.Framework.Tests.csproj @@ -218,6 +218,7 @@ + diff --git a/src/Orchard/ContentManagement/Drivers/ContentShapeResult.cs b/src/Orchard/ContentManagement/Drivers/ContentShapeResult.cs index a84f18d94..e4865014b 100644 --- a/src/Orchard/ContentManagement/Drivers/ContentShapeResult.cs +++ b/src/Orchard/ContentManagement/Drivers/ContentShapeResult.cs @@ -26,9 +26,6 @@ namespace Orchard.ContentManagement.Drivers { } private void ApplyImplementation(BuildShapeContext context, string displayType) { - if (!string.Equals(context.GroupId ?? "", _groupId ?? "", StringComparison.OrdinalIgnoreCase)) - return; - var placement = context.FindPlacement(_shapeType, _differentiator, _defaultLocation); if (string.IsNullOrEmpty(placement.Location) || placement.Location == "-") return; @@ -65,6 +62,15 @@ namespace Orchard.ContentManagement.Drivers { newShapeMetadata.Wrappers.Clear(); } + // parse group placement + var group = placement.GetGroup(); + if (!String.IsNullOrEmpty(group)) { + _groupId = group; + } + + if (!string.Equals(context.GroupId ?? "", _groupId ?? "", StringComparison.OrdinalIgnoreCase)) + return; + foreach (var alternate in placement.Alternates) { newShapeMetadata.Alternates.Add(alternate); } @@ -73,23 +79,19 @@ namespace Orchard.ContentManagement.Drivers { newShapeMetadata.Wrappers.Add(wrapper); } - // copy the current location for further processing - var localPlacement = placement.Location; - // the zone name is in reference of Layout, e.g. /AsideSecond - if (placement.Location.StartsWith("/")) { - localPlacement = placement.Location.Substring(1); + if (placement.IsLayoutZone()) { parentShape = context.Layout; } - var delimiterIndex = localPlacement.IndexOf(':'); - if (delimiterIndex < 0) { - parentShape.Zones[localPlacement].Add(newShape); + var position = placement.GetPosition(); + var zone = placement.GetZone(); + + if (String.IsNullOrEmpty(position)) { + parentShape.Zones[zone].Add(newShape); } else { - var zoneName = localPlacement.Substring(0, delimiterIndex); - var position = localPlacement.Substring(delimiterIndex + 1); - parentShape.Zones[zoneName].Add(newShape, position); + parentShape.Zones[zone].Add(newShape, position); } } diff --git a/src/Orchard/DisplayManagement/Descriptors/PlacementInfo.cs b/src/Orchard/DisplayManagement/Descriptors/PlacementInfo.cs index 97ef08bb2..d15c72c42 100644 --- a/src/Orchard/DisplayManagement/Descriptors/PlacementInfo.cs +++ b/src/Orchard/DisplayManagement/Descriptors/PlacementInfo.cs @@ -1,8 +1,11 @@ -using System.Collections.Generic; +using System; +using System.Collections.Generic; using System.Linq; namespace Orchard.DisplayManagement.Descriptors { public class PlacementInfo { + private static readonly char[] Delimiters = {':', '#', '@'}; + public PlacementInfo() { Alternates = Enumerable.Empty(); Wrappers = Enumerable.Empty(); @@ -10,9 +13,63 @@ namespace Orchard.DisplayManagement.Descriptors { public string Location { get; set; } public string Source { get; set; } - public string ShapeType { get; set; } public IEnumerable Alternates { get; set; } public IEnumerable Wrappers { get; set; } + + public string GetZone() { + var firstDelimiter = Location.IndexOfAny(Delimiters); + if (firstDelimiter == -1) { + return Location.TrimStart('/'); + } + + return Location.Substring(0, firstDelimiter).TrimStart('/'); + } + + public string GetPosition() { + var contentDelimiter = Location.IndexOf(':'); + if (contentDelimiter == -1) { + return ""; + } + + var secondDelimiter = Location.IndexOfAny(Delimiters, contentDelimiter + 1); + if (secondDelimiter == -1) { + return Location.Substring(contentDelimiter + 1); + } + + return Location.Substring(contentDelimiter + 1, secondDelimiter - contentDelimiter - 1); + } + + public bool IsLayoutZone() { + return GetZone().StartsWith("/"); + } + + public string GetTab() { + var tabDelimiter = Location.IndexOf('#'); + if (tabDelimiter == -1) { + return ""; + } + + var nextDelimiter = Location.IndexOfAny(Delimiters, tabDelimiter + 1); + if (nextDelimiter == -1) { + return Location.Substring(tabDelimiter + 1); + } + + return Location.Substring(tabDelimiter + 1, nextDelimiter - tabDelimiter - 1); + } + + public string GetGroup() { + var groupDelimiter = Location.IndexOf('@'); + if (groupDelimiter == -1) { + return ""; + } + + var nextDelimiter = Location.IndexOfAny(Delimiters, groupDelimiter + 1); + if (nextDelimiter == -1) { + return Location.Substring(groupDelimiter + 1); + } + + return Location.Substring(groupDelimiter + 1, nextDelimiter - groupDelimiter - 1); + } } }