diff --git a/lib/jekyll.rb b/lib/jekyll.rb index 7989dd2e756..a1e59fb9a76 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/drops/page_drop.rb b/lib/jekyll/drops/page_drop.rb index 13eff684343..ee5f5e4d7a9 100644 --- a/lib/jekyll/drops/page_drop.rb +++ b/lib/jekyll/drops/page_drop.rb @@ -7,7 +7,7 @@ class PageDrop < Drop mutable false - def_delegators :@obj, :content, :dir, :name, :path, :url + def_delegators :@obj, :content, :dir, :name, :path, :url, :excerpt private def_delegator :@obj, :data, :fallback_data def title diff --git a/lib/jekyll/page.rb b/lib/jekyll/page.rb index 2e346fc5f25..bd51291deb4 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 @@ -214,5 +215,15 @@ 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 + return data["excerpt"] unless self.class == Jekyll::Page + + data["excerpt"] ||= Jekyll::PageExcerpt.new(self).to_liquid 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 diff --git a/test/test_page.rb b/test/test_page.rb index 023560c90e6..805e5a5a29f 100644 --- a/test/test_page.rb +++ b/test/test_page.rb @@ -125,7 +125,7 @@ def do_render(page) attrs = { :content => "All the properties.\n", :dir => "/properties/", - :excerpt => nil, + :excerpt => "All the properties.\n", :foo => "bar", :layout => "default", :name => "properties.html", @@ -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) + @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", @test_page.content + assert_nil @test_page.to_liquid["excerpt"] + end + + should "expose an excerpt to Liquid templates if hardcoded" do + @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 end end diff --git a/test/test_page_without_a_file.rb b/test/test_page_without_a_file.rb index 6deca7b537c..3a9ea6469c2 100644 --- a/test/test_page_without_a_file.rb +++ b/test/test_page_without_a_file.rb @@ -49,9 +49,9 @@ def render_and_write assert_equal "All the properties.\n", regular_page["content"] assert_equal "properties.html", regular_page["name"] - basic_attrs = %w(dir name path url) + basic_attrs = %w(dir name path url excerpt) attrs = { - "content" => "All the properties.\n", + "content" => nil, "dir" => "/", "excerpt" => nil, "foo" => "bar",