From 0946efa7c3c52158cea8534d3426b3ff98be2090 Mon Sep 17 00:00:00 2001 From: Ashwin Maroli Date: Thu, 2 May 2019 22:52:29 +0530 Subject: [PATCH 1/3] Allow excerpts to be generated for Page objects --- lib/jekyll.rb | 1 + lib/jekyll/page.rb | 9 +++++++++ lib/jekyll/page_excerpt.rb | 26 ++++++++++++++++++++++++++ 3 files changed, 36 insertions(+) create mode 100644 lib/jekyll/page_excerpt.rb diff --git a/lib/jekyll.rb b/lib/jekyll.rb index 2b0e63826bd..08ddf7def7b 100644 --- a/lib/jekyll.rb +++ b/lib/jekyll.rb @@ -50,6 +50,7 @@ module Jekyll autoload :EntryFilter, "jekyll/entry_filter" autoload :Errors, "jekyll/errors" autoload :Excerpt, "jekyll/excerpt" + autoload :PageExcerpt, "jekyll/page_excerpt" autoload :External, "jekyll/external" autoload :FrontmatterDefaults, "jekyll/frontmatter_defaults" autoload :Hooks, "jekyll/hooks" diff --git a/lib/jekyll/page.rb b/lib/jekyll/page.rb index e6d691c25dc..dacb29a948b 100644 --- a/lib/jekyll/page.rb +++ b/lib/jekyll/page.rb @@ -15,6 +15,7 @@ class Page ATTRIBUTES_FOR_LIQUID = %w( content dir + excerpt name path url @@ -182,5 +183,13 @@ def trigger_hooks(hook_name, *args) def write? true end + + def excerpt_separator + @excerpt_separator ||= (data["excerpt_separator"] || site.config["excerpt_separator"]).to_s + end + + def excerpt + data["excerpt"] ||= Jekyll::PageExcerpt.new(self) unless excerpt_separator.empty? + end end end diff --git a/lib/jekyll/page_excerpt.rb b/lib/jekyll/page_excerpt.rb new file mode 100644 index 00000000000..c1bae50ffcf --- /dev/null +++ b/lib/jekyll/page_excerpt.rb @@ -0,0 +1,26 @@ +# frozen_string_literal: true + +module Jekyll + class PageExcerpt < Excerpt + attr_reader :output, :doc + alias_method :id, :relative_path + + # The Liquid representation of this instance is simply the rendered output string. + alias_method :to_liquid, :output + + def initialize(doc) + super + self.output = Renderer.new(site, self, site.site_payload).run + end + + def render_with_liquid? + return false if data["render_with_liquid"] == false + + Jekyll::Utils.has_liquid_construct?(content) + end + + def inspect + "#<#{self.class} id=#{id.inspect}>" + end + end +end From 9541eba2d51029661678429adb43317e5926ce03 Mon Sep 17 00:00:00 2001 From: Ashwin Maroli Date: Wed, 20 May 2020 17:42:07 +0530 Subject: [PATCH 2/3] Initialize PageExcerpt objects only for Page objs --- lib/jekyll/page.rb | 2 ++ test/test_page.rb | 26 ++++++++++++++++++++++++++ test/test_page_without_a_file.rb | 2 +- 3 files changed, 29 insertions(+), 1 deletion(-) diff --git a/lib/jekyll/page.rb b/lib/jekyll/page.rb index 1f083e39463..bd51291deb4 100644 --- a/lib/jekyll/page.rb +++ b/lib/jekyll/page.rb @@ -221,6 +221,8 @@ def excerpt_separator end def excerpt + return data["excerpt"] unless self.class == Jekyll::Page + data["excerpt"] ||= Jekyll::PageExcerpt.new(self).to_liquid unless excerpt_separator.empty? end end diff --git a/test/test_page.rb b/test/test_page.rb index 05d92339f6e..1296213eead 100644 --- a/test/test_page.rb +++ b/test/test_page.rb @@ -403,6 +403,32 @@ def do_render(page) assert_exist dest_dir("contacts", "bar", "index.html") end end + + context "read-in by default" do + should "expose an excerpt to Liquid templates" do + page = setup_page("/contacts", "bar.html") + assert_equal "Contact Information\n", page.to_liquid["excerpt"] + end + end + + context "generated via plugin" do + setup do + PageSubclass = Class.new(Jekyll::Page) + @page = PageSubclass.new(@site, source_dir, "/contacts", "bar.html") + @page.data.clear + end + + should "not expose an excerpt to Liquid templates by default" do + assert_equal "Contact Information\n", @page.content + assert_nil @page.to_liquid["excerpt"] + end + + should "expose an excerpt to Liquid templates if hardcoded" do + @page.data["excerpt"] = "Test excerpt." + assert_equal "Contact Information\n", @page.content + assert_equal "Test excerpt.", @page.to_liquid["excerpt"] + end + end end end end diff --git a/test/test_page_without_a_file.rb b/test/test_page_without_a_file.rb index e34f07a6ab8..3a9ea6469c2 100644 --- a/test/test_page_without_a_file.rb +++ b/test/test_page_without_a_file.rb @@ -53,7 +53,7 @@ def render_and_write attrs = { "content" => nil, "dir" => "/", - "excerpt" => "", + "excerpt" => nil, "foo" => "bar", "layout" => "default", "name" => "properties.html", From ff017820f8937405fe5644e85318f5c1248742e0 Mon Sep 17 00:00:00 2001 From: Ashwin Maroli Date: Wed, 20 May 2020 17:55:41 +0530 Subject: [PATCH 3/3] Rename instance-variable in test --- test/test_page.rb | 14 +++++++------- 1 file changed, 7 insertions(+), 7 deletions(-) diff --git a/test/test_page.rb b/test/test_page.rb index 1296213eead..805e5a5a29f 100644 --- a/test/test_page.rb +++ b/test/test_page.rb @@ -414,19 +414,19 @@ def do_render(page) context "generated via plugin" do setup do PageSubclass = Class.new(Jekyll::Page) - @page = PageSubclass.new(@site, source_dir, "/contacts", "bar.html") - @page.data.clear + @test_page = PageSubclass.new(@site, source_dir, "/contacts", "bar.html") + @test_page.data.clear end should "not expose an excerpt to Liquid templates by default" do - assert_equal "Contact Information\n", @page.content - assert_nil @page.to_liquid["excerpt"] + assert_equal "Contact Information\n", @test_page.content + assert_nil @test_page.to_liquid["excerpt"] end should "expose an excerpt to Liquid templates if hardcoded" do - @page.data["excerpt"] = "Test excerpt." - assert_equal "Contact Information\n", @page.content - assert_equal "Test excerpt.", @page.to_liquid["excerpt"] + @test_page.data["excerpt"] = "Test excerpt." + assert_equal "Contact Information\n", @test_page.content + assert_equal "Test excerpt.", @test_page.to_liquid["excerpt"] end end end