From bdea6c5386252f87073b32993d6e2ad14b281531 Mon Sep 17 00:00:00 2001 From: Nathan Heskew Date: Sun, 17 Oct 2010 02:03:00 -0700 Subject: [PATCH] Adding a "content-items" class name to the blog post list --HG-- branch : dev --- .../Extensions/StringExtensionsTests.cs | 17 +++++++++- src/Orchard.Web/Core/Shapes/CoreShapes.cs | 31 ++++++++++--------- .../Views/Parts/Blogs.BlogPost.List.cshtml | 1 + .../Utility/Extensions/StringExtensions.cs | 5 +-- 4 files changed, 37 insertions(+), 17 deletions(-) diff --git a/src/Orchard.Tests/Utility/Extensions/StringExtensionsTests.cs b/src/Orchard.Tests/Utility/Extensions/StringExtensionsTests.cs index 2d5d3de90..0f90bef4e 100644 --- a/src/Orchard.Tests/Utility/Extensions/StringExtensionsTests.cs +++ b/src/Orchard.Tests/Utility/Extensions/StringExtensionsTests.cs @@ -5,10 +5,15 @@ using Orchard.Utility.Extensions; namespace Orchard.Tests.Utility.Extensions { [TestFixture] public class StringExtensionsTests { + [Test] + public void HtmlClassify_ValidReallySimpleClassNameReturnsSame() { + const string toClassify = "someclass"; + Assert.That(toClassify.HtmlClassify(), Is.StringMatching(toClassify)); + } [Test] public void HtmlClassify_ValidSimpleClassNameReturnsSame() { const string toClassify = "some-class"; - Assert.That(toClassify.HtmlClassify(), Is.StringMatching("some-class")); + Assert.That(toClassify.HtmlClassify(), Is.StringMatching(toClassify)); } [Test] public void HtmlClassify_SimpleStringReturnsSimpleClassName() { @@ -26,6 +31,16 @@ namespace Orchard.Tests.Utility.Extensions { Assert.That(toClassify.HtmlClassify(), Is.StringMatching("")); } [Test] + public void HtmlClassify_LowerCamelCasedStringReturnsLowerHyphenatedClassName() { + const string toClassify = "camelCased"; + Assert.That(toClassify.HtmlClassify(), Is.StringMatching("camel-cased")); + } + [Test] + public void HtmlClassify_PascalCasedStringReturnsLowerHyphenatedClassName() { + const string toClassify = "PascalCased"; + Assert.That(toClassify.HtmlClassify(), Is.StringMatching("pascal-cased")); + } + [Test] public void OrDefault_ReturnsDefaultForNull() { const string s = null; var def = new LocalizedString("test"); diff --git a/src/Orchard.Web/Core/Shapes/CoreShapes.cs b/src/Orchard.Web/Core/Shapes/CoreShapes.cs index cb6c55152..bb49c0a00 100644 --- a/src/Orchard.Web/Core/Shapes/CoreShapes.cs +++ b/src/Orchard.Web/Core/Shapes/CoreShapes.cs @@ -12,6 +12,7 @@ using Orchard.Settings; using Orchard.UI; using Orchard.UI.Resources; using Orchard.UI.Zones; +using Orchard.Utility.Extensions; // ReSharper disable InconsistentNaming @@ -237,27 +238,29 @@ namespace Orchard.Core.Shapes { IEnumerable ItemClasses, IDictionary ItemAttributes) { + if (Items == null) + return; + var listTagName = string.IsNullOrEmpty(Tag) ? "ul" : Tag; const string itemTagName = "li"; var listTag = GetTagBuilder(listTagName, Id, Classes, Attributes); Output.Write(listTag.ToString(TagRenderMode.StartTag)); - if (Items != null) { - var count = Items.Count(); - var index = 0; - foreach (var item in Items) { - var itemTag = GetTagBuilder(itemTagName, null, ItemClasses, ItemAttributes); - if (index == 0) - itemTag.AddCssClass("first"); - if (index == count - 1) - itemTag.AddCssClass("last"); - Output.Write(itemTag.ToString(TagRenderMode.StartTag)); - Output.Write(Display(item)); - Output.Write(itemTag.ToString(TagRenderMode.EndTag)); - ++index; - } + var count = Items.Count(); + var index = 0; + foreach (var item in Items) { + var itemTag = GetTagBuilder(itemTagName, null, ItemClasses, ItemAttributes); + if (index == 0) + itemTag.AddCssClass("first"); + if (index == count - 1) + itemTag.AddCssClass("last"); + Output.Write(itemTag.ToString(TagRenderMode.StartTag)); + Output.Write(Display(item)); + Output.Write(itemTag.ToString(TagRenderMode.EndTag)); + ++index; } + Output.Write(listTag.ToString(TagRenderMode.EndTag)); } diff --git a/src/Orchard.Web/Modules/Orchard.Blogs/Views/Parts/Blogs.BlogPost.List.cshtml b/src/Orchard.Web/Modules/Orchard.Blogs/Views/Parts/Blogs.BlogPost.List.cshtml index c5ad057ad..ad6b06f2d 100644 --- a/src/Orchard.Web/Modules/Orchard.Blogs/Views/Parts/Blogs.BlogPost.List.cshtml +++ b/src/Orchard.Web/Modules/Orchard.Blogs/Views/Parts/Blogs.BlogPost.List.cshtml @@ -1,5 +1,6 @@ @{ IEnumerable blogPosts = Model.ContentItems; + Model.ContentItems.Classes.Add("content-items"); } @Display(Model.ContentItems) @if (blogPosts == null || blogPosts.Count() < 1) { diff --git a/src/Orchard/Utility/Extensions/StringExtensions.cs b/src/Orchard/Utility/Extensions/StringExtensions.cs index 8aac63eb4..062c61f75 100644 --- a/src/Orchard/Utility/Extensions/StringExtensions.cs +++ b/src/Orchard/Utility/Extensions/StringExtensions.cs @@ -4,7 +4,7 @@ using Orchard.Localization; namespace Orchard.Utility.Extensions { public static class StringExtensions { - private static readonly Regex humps = new Regex("[A-Z][^A-Z]*"); + private static readonly Regex humps = new Regex("(?:^[a-zA-Z][^A-Z]*|[A-Z][^A-Z]*)"); public static string CamelFriendly(this string camel) { if (camel == null) return null; @@ -29,7 +29,8 @@ namespace Orchard.Utility.Extensions { } public static string HtmlClassify(this string text) { - return Regex.Replace(text, @"[^a-zA-Z]+", m => m.Index == 0 ? "" : "-").ToLowerInvariant(); + var friendlier = text.CamelFriendly(); + return Regex.Replace(friendlier, @"[^a-zA-Z]+", m => m.Index == 0 ? "" : "-").ToLowerInvariant(); } public static bool IsNullOrEmptyTrimmed(this string text) {