diff --git a/src/Pretzel.Logic/Liquid/CgiEscapeFilter.cs b/src/Pretzel.Logic/Liquid/CgiEscapeFilter.cs new file mode 100644 index 000000000..4abe0faef --- /dev/null +++ b/src/Pretzel.Logic/Liquid/CgiEscapeFilter.cs @@ -0,0 +1,12 @@ +using System; + +namespace Pretzel.Logic.Liquid +{ + public class CgiEscapeFilter + { + public static string cgi_escape(string input) + { + return Uri.EscapeDataString(input); + } + } +} \ No newline at end of file diff --git a/src/Pretzel.Logic/Liquid/CommentBlock.cs b/src/Pretzel.Logic/Liquid/CommentBlock.cs new file mode 100644 index 000000000..c6466d25b --- /dev/null +++ b/src/Pretzel.Logic/Liquid/CommentBlock.cs @@ -0,0 +1,13 @@ +using System.IO; +using DotLiquid; + +namespace Pretzel.Logic.Liquid +{ + public class CommentBlock : Block + { + public override void Render(Context context, TextWriter result) + { + // Do nothing (i.e. swallow the comment...) + } + } +} diff --git a/src/Pretzel.Logic/Liquid/DateToLongStringFilter.cs b/src/Pretzel.Logic/Liquid/DateToLongStringFilter.cs new file mode 100644 index 000000000..81d1578c2 --- /dev/null +++ b/src/Pretzel.Logic/Liquid/DateToLongStringFilter.cs @@ -0,0 +1,26 @@ +using System; +using System.Xml; + +namespace Pretzel.Logic.Liquid +{ + public class DateToLongStringFilter + { + public static string date_to_long_string(DateTime input) + { + //return input.ToString("dd MMMM yyyy"); + return XmlConvert.ToString(input, "dd MMMM yyyy"); + } + + public static string date_to_long_string(string input) + { + DateTime inputDate; + + if (DateTime.TryParse(input, out inputDate)) + { + return date_to_long_string(inputDate); + } + + return ""; + } + } +} diff --git a/src/Pretzel.Logic/Liquid/DateToRfc822FormatFilter.cs b/src/Pretzel.Logic/Liquid/DateToRfc822FormatFilter.cs new file mode 100644 index 000000000..6987c2736 --- /dev/null +++ b/src/Pretzel.Logic/Liquid/DateToRfc822FormatFilter.cs @@ -0,0 +1,37 @@ +using System; + +namespace Pretzel.Logic.Liquid +{ + public class DateToRfc822FormatFilter + { + public static string date_to_rfc822(DateTime input) + { + var rfc822 = input.ToString("r"); + var tz = TimeZone.CurrentTimeZone; + var offset = tz.GetUtcOffset(input).ToString(); + + // if local time is behind utc time, offset should start with "-". + // otherwise, add a plus sign to the beginning of the string. + if (!offset.StartsWith("-")) + offset = "+" + offset; // Add a (+) if it's a UTC+ timezone + offset = offset.Substring(0, 6); // only want the first 6 chars. + offset = offset.Replace(":", ""); // remove colons. + // offset now looks something like "-0700". + rfc822 = rfc822.Replace("GMT", offset); + + return rfc822; + } + + public static string date_to_rfc822(string input) + { + DateTime inputDate; + + if (DateTime.TryParse(input, out inputDate)) + { + return date_to_rfc822(inputDate); + } + + return ""; + } + } +} diff --git a/src/Pretzel.Logic/Liquid/DateToStringFilter.cs b/src/Pretzel.Logic/Liquid/DateToStringFilter.cs new file mode 100644 index 000000000..21d89d335 --- /dev/null +++ b/src/Pretzel.Logic/Liquid/DateToStringFilter.cs @@ -0,0 +1,24 @@ +using System; + +namespace Pretzel.Logic.Liquid +{ + public class DateToStringFilter + { + public static string date_to_string(DateTime input) + { + return input.ToString("dd MMM yyyy"); + } + + public static string date_to_string(string input) + { + DateTime inputDate; + + if (DateTime.TryParse(input, out inputDate)) + { + return date_to_string(inputDate); + } + + return ""; + } + } +} diff --git a/src/Pretzel.Logic/Liquid/NumberOfWordsFilter.cs b/src/Pretzel.Logic/Liquid/NumberOfWordsFilter.cs new file mode 100644 index 000000000..9c710f5fd --- /dev/null +++ b/src/Pretzel.Logic/Liquid/NumberOfWordsFilter.cs @@ -0,0 +1,18 @@ +using System.Text.RegularExpressions; + +namespace Pretzel.Logic.Liquid +{ + public class NumberOfWordsFilter + { + public static string number_of_words(string input) + { + return CountWords(input).ToString(); + } + + private static int CountWords(string input) + { + var collection = Regex.Matches(input, @"[\S]+"); + return collection.Count; + } + } +} \ No newline at end of file diff --git a/src/Pretzel.Logic/Liquid/PostUrlBlock.cs b/src/Pretzel.Logic/Liquid/PostUrlBlock.cs new file mode 100644 index 000000000..e40643966 --- /dev/null +++ b/src/Pretzel.Logic/Liquid/PostUrlBlock.cs @@ -0,0 +1,28 @@ +using System; +using System.Collections.Generic; +using System.IO; +using DotLiquid; + +namespace Pretzel.Logic.Liquid +{ + public class PostUrlBlock : Block + { + private string postFileName; + + public override void Initialize(string tagName, string markup, List tokens) + { + base.Initialize(tagName, markup, tokens); + postFileName = markup; + } + + public override void Render(Context context, TextWriter result) + { + var permalink = postFileName.Replace(".md", ""); + permalink = permalink.Replace(".mdown", ""); + permalink = permalink.Replace("-", "/"); + permalink += ".html"; + + result.Write(permalink); + } + } +} diff --git a/src/Pretzel.Logic/Liquid/UriEscapeFilter.cs b/src/Pretzel.Logic/Liquid/UriEscapeFilter.cs new file mode 100644 index 000000000..bbc4643b5 --- /dev/null +++ b/src/Pretzel.Logic/Liquid/UriEscapeFilter.cs @@ -0,0 +1,12 @@ +using System; + +namespace Pretzel.Logic.Liquid +{ + public class UriEscapeFilter + { + public static string uri_escape(string input) + { + return Uri.EscapeUriString(input); + } + } +} \ No newline at end of file diff --git a/src/Pretzel.Logic/Pretzel.Logic.csproj b/src/Pretzel.Logic/Pretzel.Logic.csproj index 5505e00c2..32243d250 100644 --- a/src/Pretzel.Logic/Pretzel.Logic.csproj +++ b/src/Pretzel.Logic/Pretzel.Logic.csproj @@ -106,8 +106,16 @@ + + + + + + + + diff --git a/src/Pretzel.Logic/Templating/Jekyll/LiquidEngine.cs b/src/Pretzel.Logic/Templating/Jekyll/LiquidEngine.cs index 7a96a4e29..68a2a4795 100644 --- a/src/Pretzel.Logic/Templating/Jekyll/LiquidEngine.cs +++ b/src/Pretzel.Logic/Templating/Jekyll/LiquidEngine.cs @@ -71,7 +71,13 @@ public override void Initialize() { Template.RegisterFilter(typeof(XmlEscapeFilter)); Template.RegisterFilter(typeof(DateToXmlSchemaFilter)); + Template.RegisterFilter(typeof(DateToLongStringFilter)); + Template.RegisterFilter(typeof(DateToRfc822FormatFilter)); + Template.RegisterFilter(typeof(CgiEscapeFilter)); + Template.RegisterFilter(typeof(UriEscapeFilter)); + Template.RegisterFilter(typeof(NumberOfWordsFilter)); Template.RegisterTag("highlight"); + Template.RegisterTag("post_url"); } } } diff --git a/src/Pretzel.Tests/Pretzel.Tests.csproj b/src/Pretzel.Tests/Pretzel.Tests.csproj index e756314c6..1e65f5bb0 100644 --- a/src/Pretzel.Tests/Pretzel.Tests.csproj +++ b/src/Pretzel.Tests/Pretzel.Tests.csproj @@ -59,6 +59,7 @@ False ..\packages\System.IO.Abstractions.TestingHelpers.1.4.0.44\lib\net35\System.IO.Abstractions.TestingHelpers.dll + @@ -93,6 +94,7 @@ + diff --git a/src/Pretzel.Tests/Templating/Jekyll/LiquidFilterTests.cs b/src/Pretzel.Tests/Templating/Jekyll/LiquidFilterTests.cs new file mode 100644 index 000000000..4a10ba486 --- /dev/null +++ b/src/Pretzel.Tests/Templating/Jekyll/LiquidFilterTests.cs @@ -0,0 +1,58 @@ +using System; +using System.Web; +using Pretzel.Logic.Liquid; +using Xunit; + +namespace Pretzel.Tests.Templating.Jekyll +{ + public class LiquidFilterTests + { + [Fact] + public void DateToXmlSchema_ForExpectedDate_ReturnsCorrectString() + { + Assert.Equal("2014-01-01T00:00:00-05:00", DateToXmlSchemaFilter.date_to_xmlschema(new DateTime(2014, 01, 01))); + } + + [Fact] + public void DateToRfc822_ForExpectedDate_ReturnsCorrectString() + { + Assert.Equal("Wed, 01 Jan 2014 00:00:00 -0500", DateToRfc822FormatFilter.date_to_rfc822(new DateTime(2014, 01, 01))); + } + + [Fact] + public void DateToString_ForExpectedDate_ReturnsCorrectString() + { + Assert.Equal("07 Nov 2008", DateToStringFilter.date_to_string(new DateTime(2008, 11, 07))); + } + + [Fact] + public void DateToString_WithNoDate_ReturnsNothing() + { + Assert.Equal("", DateToStringFilter.date_to_string("")); + } + + [Fact] + public void DateToLongString_ForExpectedDate_ReturnsCorrectString() + { + Assert.Equal("07 November 2008", DateToLongStringFilter.date_to_long_string(new DateTime(2008, 11, 07))); + } + + [Fact] + public void CgiEscape_ForGivenString_ReturnsEscapedString() + { + Assert.Equal("foo%2Cbar%3Bbaz%3F", CgiEscapeFilter.cgi_escape(@"foo,bar;baz?")); + } + + [Fact] + public void UriEscape_ForGivenString_ReturnsEscapedString() + { + Assert.Equal("foo,%20bar%20%5Cbaz?", UriEscapeFilter.uri_escape(@"foo, bar \baz?")); + } + + [Fact] + public void NumberOfWords_ForGiveString_ReturnsCorrectCount() + { + Assert.Equal(4.ToString(), NumberOfWordsFilter.number_of_words("This is a test")); + } + } +}