From be1a09f4e93e9d4f3894e692d20d2589ff6571f2 Mon Sep 17 00:00:00 2001 From: Andrey Akinshin Date: Tue, 3 Feb 2015 17:30:35 +0200 Subject: [PATCH 1/5] Add ContentExcerpt feature for pages --- src/Pretzel.Logic/Templating/Context/Page.cs | 1 + .../Templating/Context/SiteContext.cs | 16 ++++++++++++ .../Context/SiteContextGenerator.cs | 13 +++++++++- .../Context/SiteContextGeneratorTests.cs | 26 +++++++++++++++++++ 4 files changed, 55 insertions(+), 1 deletion(-) diff --git a/src/Pretzel.Logic/Templating/Context/Page.cs b/src/Pretzel.Logic/Templating/Context/Page.cs index 52003787c..013b76c77 100644 --- a/src/Pretzel.Logic/Templating/Context/Page.cs +++ b/src/Pretzel.Logic/Templating/Context/Page.cs @@ -20,6 +20,7 @@ public Page() public IEnumerable Categories { get; set; } public IEnumerable Tags { get; set; } public string Content { get; set; } + public string ContentExcerpt { get; set; } public string Filepath { get; set; } public IDictionary Bag { get; set; } public IEnumerable DirectoryPages { get; set; } diff --git a/src/Pretzel.Logic/Templating/Context/SiteContext.cs b/src/Pretzel.Logic/Templating/Context/SiteContext.cs index 77e502470..207ae20a3 100644 --- a/src/Pretzel.Logic/Templating/Context/SiteContext.cs +++ b/src/Pretzel.Logic/Templating/Context/SiteContext.cs @@ -5,8 +5,11 @@ namespace Pretzel.Logic.Templating.Context { public class SiteContext { + private const string ExcerptSeparatorDefault = ""; + private string engine; private string title; + private string excerptSeparator = ExcerptSeparatorDefault; public IDictionary Config { get; set; } public string SourceFolder { get; set; } @@ -32,6 +35,19 @@ public string Title set { title = value; } } + public string ExcerptSeparator + { + get + { + if (Config.Keys.Contains("excerpt_separator")) + { + excerptSeparator = Config["excerpt_separator"].ToString(); + } + return excerptSeparator; + } + set { excerptSeparator = value; } + } + public string Engine { get diff --git a/src/Pretzel.Logic/Templating/Context/SiteContextGenerator.cs b/src/Pretzel.Logic/Templating/Context/SiteContextGenerator.cs index 828b71768..362ce315b 100644 --- a/src/Pretzel.Logic/Templating/Context/SiteContextGenerator.cs +++ b/src/Pretzel.Logic/Templating/Context/SiteContextGenerator.cs @@ -222,6 +222,10 @@ private Page CreatePage(SiteContext context, IDictionary config, return pageCache[file]; var contents = SafeReadContents(file); var header = contents.YamlHeader(); + var content = RenderContent(file, contents, header); + var excerptSeparator = header.ContainsKey("excerpt_separator") + ? header["excerpt_separator"].ToString() + : context.ExcerptSeparator; if (header.ContainsKey("published") && header["published"].ToString().ToLower() == "false") { @@ -232,7 +236,8 @@ private Page CreatePage(SiteContext context, IDictionary config, { Title = header.ContainsKey("title") ? header["title"].ToString() : "this is a post", Date = header.ContainsKey("date") ? DateTime.Parse(header["date"].ToString()) : file.Datestamp(), - Content = RenderContent(file, contents, header), + Content = content, + ContentExcerpt = GetContentExcerpt(content, excerptSeparator), Filepath = isPost ? GetPathWithTimestamp(context.OutputFolder, file) : GetFilePathForPage(context, file), File = file, Bag = header, @@ -336,6 +341,12 @@ private string RenderContent(string file, string contents, IDictionaryTwo"))); + + // act + var siteContext = generator.BuildContext(@"C:\TestSite", false); + + Assert.Equal(1, siteContext.Posts.Count); + Assert.Equal("

One", siteContext.Posts[0].ContentExcerpt); + } + + [Fact] + public void post_with_excerpt_and_custom_separator() + { + fileSystem.AddFile(@"C:\TestSite\_posts\SomeFile.md", new MockFileData(string.Format(@"--- +excerpt_separator: +---OneTwoThree"))); + + // act + var siteContext = generator.BuildContext(@"C:\TestSite", false); + + Assert.Equal(1, siteContext.Posts.Count); + Assert.Equal("

OneTwo", siteContext.Posts[0].ContentExcerpt); + } + [Fact] public void post_with_date_in_title() { From 594205e9ef7b72fce7237ad6076e6c50f2988a0f Mon Sep 17 00:00:00 2001 From: Andrey Akinshin Date: Tue, 3 Feb 2015 20:06:41 +0200 Subject: [PATCH 2/5] Rename: Page.ContentExcerpt -> Page.Excerpt --- src/Pretzel.Logic/Templating/Context/Page.cs | 2 +- src/Pretzel.Logic/Templating/Context/SiteContextGenerator.cs | 2 +- .../Templating/Context/SiteContextGeneratorTests.cs | 4 ++-- 3 files changed, 4 insertions(+), 4 deletions(-) diff --git a/src/Pretzel.Logic/Templating/Context/Page.cs b/src/Pretzel.Logic/Templating/Context/Page.cs index 013b76c77..a63178fe9 100644 --- a/src/Pretzel.Logic/Templating/Context/Page.cs +++ b/src/Pretzel.Logic/Templating/Context/Page.cs @@ -20,7 +20,7 @@ public Page() public IEnumerable Categories { get; set; } public IEnumerable Tags { get; set; } public string Content { get; set; } - public string ContentExcerpt { get; set; } + public string Excerpt { get; set; } public string Filepath { get; set; } public IDictionary Bag { get; set; } public IEnumerable DirectoryPages { get; set; } diff --git a/src/Pretzel.Logic/Templating/Context/SiteContextGenerator.cs b/src/Pretzel.Logic/Templating/Context/SiteContextGenerator.cs index 362ce315b..7b9191020 100644 --- a/src/Pretzel.Logic/Templating/Context/SiteContextGenerator.cs +++ b/src/Pretzel.Logic/Templating/Context/SiteContextGenerator.cs @@ -237,7 +237,7 @@ private Page CreatePage(SiteContext context, IDictionary config, Title = header.ContainsKey("title") ? header["title"].ToString() : "this is a post", Date = header.ContainsKey("date") ? DateTime.Parse(header["date"].ToString()) : file.Datestamp(), Content = content, - ContentExcerpt = GetContentExcerpt(content, excerptSeparator), + Excerpt = GetContentExcerpt(content, excerptSeparator), Filepath = isPost ? GetPathWithTimestamp(context.OutputFolder, file) : GetFilePathForPage(context, file), File = file, Bag = header, diff --git a/src/Pretzel.Tests/Templating/Context/SiteContextGeneratorTests.cs b/src/Pretzel.Tests/Templating/Context/SiteContextGeneratorTests.cs index 8c0ec49af..232101010 100644 --- a/src/Pretzel.Tests/Templating/Context/SiteContextGeneratorTests.cs +++ b/src/Pretzel.Tests/Templating/Context/SiteContextGeneratorTests.cs @@ -866,7 +866,7 @@ public void post_with_excerpt() var siteContext = generator.BuildContext(@"C:\TestSite", false); Assert.Equal(1, siteContext.Posts.Count); - Assert.Equal("

One", siteContext.Posts[0].ContentExcerpt); + Assert.Equal("

One", siteContext.Posts[0].Excerpt); } [Fact] @@ -880,7 +880,7 @@ public void post_with_excerpt_and_custom_separator() var siteContext = generator.BuildContext(@"C:\TestSite", false); Assert.Equal(1, siteContext.Posts.Count); - Assert.Equal("

OneTwo", siteContext.Posts[0].ContentExcerpt); + Assert.Equal("

OneTwo", siteContext.Posts[0].Excerpt); } [Fact] From 876a6e31b9b8f457cb17604fa6588bbdd3017c1f Mon Sep 17 00:00:00 2001 From: Andrey Akinshin Date: Tue, 3 Feb 2015 23:47:18 +0200 Subject: [PATCH 3/5] Fixed in excerpt support --- src/Pretzel.Logic/Templating/Context/PageContext.cs | 5 ++++- src/Pretzel.Logic/Templating/Context/SiteContextGenerator.cs | 1 + 2 files changed, 5 insertions(+), 1 deletion(-) diff --git a/src/Pretzel.Logic/Templating/Context/PageContext.cs b/src/Pretzel.Logic/Templating/Context/PageContext.cs index 0610d9d09..faf840c21 100644 --- a/src/Pretzel.Logic/Templating/Context/PageContext.cs +++ b/src/Pretzel.Logic/Templating/Context/PageContext.cs @@ -1,3 +1,4 @@ +using System; using System.Collections.Generic; using System.IO; @@ -32,6 +33,8 @@ public PageContext(PageContext context) public string Content { get; set; } + public string Excerpt { get; set; } + public SiteContext Site { get; private set; } public Page Page { get; set; } @@ -77,9 +80,9 @@ public static PageContext FromPage(SiteContext siteContext, Page page, string ou context.Title = siteContext.Title; context.Content = page.Content; + context.Excerpt = page.Excerpt; context.Bag = page.Bag; context.Bag["id"] = page.Id; - context.Bag.Add("url", page.Url); return context; } } diff --git a/src/Pretzel.Logic/Templating/Context/SiteContextGenerator.cs b/src/Pretzel.Logic/Templating/Context/SiteContextGenerator.cs index 7b9191020..15f18eece 100644 --- a/src/Pretzel.Logic/Templating/Context/SiteContextGenerator.cs +++ b/src/Pretzel.Logic/Templating/Context/SiteContextGenerator.cs @@ -242,6 +242,7 @@ private Page CreatePage(SiteContext context, IDictionary config, File = file, Bag = header, }; + page.Bag["excerpt"] = page.Excerpt; // resolve categories and tags if (isPost) From ca28fefbe28653202e00995ca54830914f337317 Mon Sep 17 00:00:00 2001 From: Andrey Akinshin Date: Tue, 3 Feb 2015 23:47:37 +0200 Subject: [PATCH 4/5] Add LiquidEngineTests.Given_Page_Has_Excerpt --- .../Templating/Jekyll/LiquidEngineTests.cs | 30 +++++++++++++++++++ 1 file changed, 30 insertions(+) diff --git a/src/Pretzel.Tests/Templating/Jekyll/LiquidEngineTests.cs b/src/Pretzel.Tests/Templating/Jekyll/LiquidEngineTests.cs index 6ae92336f..e42cdaff5 100644 --- a/src/Pretzel.Tests/Templating/Jekyll/LiquidEngineTests.cs +++ b/src/Pretzel.Tests/Templating/Jekyll/LiquidEngineTests.cs @@ -967,6 +967,36 @@ public void The_Output_Should_Have_Been_Transformed() } } + public class Given_Page_Has_Excerpt : BakingEnvironment + { + const string IndexContents = "---\r\n title: index\r\n show: true \r\n---\r\n\r\n{% for post in site.posts %}{{ post.excerpt }}{% endfor %}"; + const string PostContents = "---\r\n layout: nil \r\n---\r\n\r\n

OneTwo

"; + const string ExpectedIndexContents = "

One

"; + + public override LiquidEngine Given() + { + var engine = new LiquidEngine(); + engine.Initialize(); + return engine; + } + + public override void When() + { + FileSystem.AddFile(@"C:\website\index.md", new MockFileData(IndexContents)); + FileSystem.AddFile(@"C:\website\_posts\2015-02-03-post.md", new MockFileData(PostContents)); + var generator = new SiteContextGenerator(FileSystem, Enumerable.Empty()); + var context = generator.BuildContext(@"C:\website\", false); + Subject.FileSystem = FileSystem; + Subject.Process(context); + } + + [Fact] + public void Posts_Should_Have_Excerpt() + { + Assert.Equal(ExpectedIndexContents, FileSystem.File.ReadAllText(@"C:\website\_site\index.html").RemoveWhiteSpace()); + } + } + public class Given_Page_Has_HighlightBlock : BakingEnvironment { const string PageContents = "---\r\n layout: nil \r\n---\r\n\r\n{% highlight %}a word{% endhighlight %}"; From 7fb84b7a755f316a66a7a440a5b69ee66707b07a Mon Sep 17 00:00:00 2001 From: Andrey Akinshin Date: Wed, 4 Feb 2015 20:08:34 +0200 Subject: [PATCH 5/5] Some test fixes for Posts[0].Bag.Count assert (excerpt was added) --- .../Context/SiteContextGeneratorTests.cs | 16 ++++++++-------- 1 file changed, 8 insertions(+), 8 deletions(-) diff --git a/src/Pretzel.Tests/Templating/Context/SiteContextGeneratorTests.cs b/src/Pretzel.Tests/Templating/Context/SiteContextGeneratorTests.cs index 232101010..4da6dcfa2 100644 --- a/src/Pretzel.Tests/Templating/Context/SiteContextGeneratorTests.cs +++ b/src/Pretzel.Tests/Templating/Context/SiteContextGeneratorTests.cs @@ -735,7 +735,7 @@ public void page_default_values() Assert.Equal("

Title

\n", siteContext.Pages[0].Content); Assert.Equal(@"C:\TestSite\_site\SomeFile.md", siteContext.Pages[0].Filepath); Assert.Equal(@"C:\TestSite\SomeFile.md", siteContext.Pages[0].File); - Assert.Equal(2, siteContext.Pages[0].Bag.Count); + Assert.Equal(3, siteContext.Pages[0].Bag.Count); // param, excerpt, date Assert.Equal("value", siteContext.Pages[0].Bag["param"]); } @@ -759,7 +759,7 @@ public void page_metadata_values() Assert.Equal("

Title

\n", siteContext.Pages[0].Content); Assert.Equal(@"C:\TestSite\_site\SomeFile.md", siteContext.Pages[0].Filepath); Assert.Equal(@"C:\TestSite\SomeFile.md", siteContext.Pages[0].File); - Assert.Equal(3, siteContext.Pages[0].Bag.Count); + Assert.Equal(4, siteContext.Pages[0].Bag.Count); // title, date, param, excerpt Assert.Equal("value", siteContext.Pages[0].Bag["param"]); Assert.Equal("my title", siteContext.Pages[0].Bag["title"]); Assert.Equal(currentDate, siteContext.Pages[0].Bag["date"]); @@ -784,7 +784,7 @@ public void page_with_date_in_title() Assert.Equal("

Title

\n", siteContext.Pages[0].Content); Assert.Equal(string.Format(@"C:\TestSite\_site\{0}-SomeFile.md", currentDate.Replace("/", "-")), siteContext.Pages[0].Filepath); Assert.Equal(filePath, siteContext.Pages[0].File); - Assert.Equal(2, siteContext.Pages[0].Bag.Count); + Assert.Equal(3, siteContext.Pages[0].Bag.Count); // param, excerpt, date Assert.Equal("value", siteContext.Pages[0].Bag["param"]); } @@ -807,7 +807,7 @@ public void page_with_false_date_in_title() Assert.Equal("

Title

\n", siteContext.Pages[0].Content); Assert.Equal(string.Format(@"C:\TestSite\_site\{0}SomeFile.md", currentDate.Replace("/", "-")), siteContext.Pages[0].Filepath); Assert.Equal(filePath, siteContext.Pages[0].File); - Assert.Equal(2, siteContext.Pages[0].Bag.Count); + Assert.Equal(3, siteContext.Pages[0].Bag.Count); // param, excerpt, date Assert.Equal("value", siteContext.Pages[0].Bag["param"]); } @@ -827,7 +827,7 @@ public void post_default_values() Assert.Equal("

Title

\n", siteContext.Posts[0].Content); Assert.Equal(@"C:\TestSite\_site\SomeFile.md", siteContext.Posts[0].Filepath); Assert.Equal(@"C:\TestSite\_posts\SomeFile.md", siteContext.Posts[0].File); - Assert.Equal(2, siteContext.Posts[0].Bag.Count); + Assert.Equal(3, siteContext.Posts[0].Bag.Count); // param, excerpt, date Assert.Equal("value", siteContext.Posts[0].Bag["param"]); } @@ -851,7 +851,7 @@ public void post_metadata_values() Assert.Equal("

Title

\n", siteContext.Posts[0].Content); Assert.Equal(@"C:\TestSite\_site\SomeFile.md", siteContext.Posts[0].Filepath); Assert.Equal(@"C:\TestSite\_posts\SomeFile.md", siteContext.Posts[0].File); - Assert.Equal(3, siteContext.Posts[0].Bag.Count); + Assert.Equal(4, siteContext.Posts[0].Bag.Count); // title, date, param, excerpt Assert.Equal("value", siteContext.Posts[0].Bag["param"]); Assert.Equal("my title", siteContext.Posts[0].Bag["title"]); Assert.Equal(currentDate, siteContext.Posts[0].Bag["date"]); @@ -902,7 +902,7 @@ public void post_with_date_in_title() Assert.Equal("

Title

\n", siteContext.Posts[0].Content); Assert.Equal(string.Format(@"C:\TestSite\_site\{0}\SomeFile.md", currentDate.Replace("/", "\\")), siteContext.Posts[0].Filepath); Assert.Equal(filePath, siteContext.Posts[0].File); - Assert.Equal(2, siteContext.Posts[0].Bag.Count); + Assert.Equal(3, siteContext.Posts[0].Bag.Count); // param, excerpt, date Assert.Equal("value", siteContext.Posts[0].Bag["param"]); } @@ -925,7 +925,7 @@ public void post_with_false_date_in_title() Assert.Equal("

Title

\n", siteContext.Posts[0].Content); Assert.Equal(string.Format(@"C:\TestSite\_site\{0}SomeFile.md", currentDate.Replace("/", "\\")), siteContext.Posts[0].Filepath); Assert.Equal(filePath, siteContext.Posts[0].File); - Assert.Equal(2, siteContext.Posts[0].Bag.Count); + Assert.Equal(3, siteContext.Posts[0].Bag.Count); // param, excerpt, date Assert.Equal("value", siteContext.Posts[0].Bag["param"]); }