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);
+ }
}
}