simplify and correct rendering pipeline
This commit is contained in:
parent
2074f92ed6
commit
c46ea4096d
|
@ -39,10 +39,8 @@ module Jekyll
|
||||||
# +site_payload+ is the site payload hash
|
# +site_payload+ is the site payload hash
|
||||||
#
|
#
|
||||||
# Returns nothing
|
# Returns nothing
|
||||||
def do_layout(payload, layouts, site_payload)
|
def do_layout(payload, layouts)
|
||||||
# construct payload
|
# render and transform content (this becomes the final content of the object)
|
||||||
payload = payload.merge(site_payload)
|
|
||||||
# render content
|
|
||||||
self.content = Liquid::Template.parse(self.content).render(payload, [Jekyll::Filters])
|
self.content = Liquid::Template.parse(self.content).render(payload, [Jekyll::Filters])
|
||||||
self.transform
|
self.transform
|
||||||
|
|
||||||
|
|
|
@ -37,9 +37,9 @@ module Jekyll
|
||||||
# +site_payload+ is the site payload hash
|
# +site_payload+ is the site payload hash
|
||||||
#
|
#
|
||||||
# Returns nothing
|
# Returns nothing
|
||||||
def add_layout(layouts, site_payload)
|
def render(layouts, site_payload)
|
||||||
payload = {"page" => self.data}
|
payload = {"page" => self.data}.merge(site_payload)
|
||||||
do_layout(payload, layouts, site_payload)
|
do_layout(payload, layouts)
|
||||||
end
|
end
|
||||||
|
|
||||||
# Write the generated page file to the destination directory.
|
# Write the generated page file to the destination directory.
|
||||||
|
|
|
@ -123,11 +123,16 @@ module Jekyll
|
||||||
# +site_payload+ is the site payload hash
|
# +site_payload+ is the site payload hash
|
||||||
#
|
#
|
||||||
# Returns nothing
|
# Returns nothing
|
||||||
def add_layout(layouts, site_payload)
|
def render(layouts, site_payload)
|
||||||
# construct post payload
|
# construct payload
|
||||||
related = related_posts(site_payload["site"]["posts"])
|
payload =
|
||||||
payload = {"page" => self.to_liquid.merge(self.data)}
|
{
|
||||||
do_layout(payload, layouts, site_payload.merge({"site" => {"related_posts" => related}}))
|
"site" => { "related_posts" => related_posts(site_payload["site"]["posts"]) },
|
||||||
|
"page" => self.to_liquid
|
||||||
|
}
|
||||||
|
payload = payload.merge(site_payload)
|
||||||
|
|
||||||
|
do_layout(payload, layouts)
|
||||||
end
|
end
|
||||||
|
|
||||||
# Write the generated post file to the destination directory.
|
# Write the generated post file to the destination directory.
|
||||||
|
@ -147,11 +152,11 @@ module Jekyll
|
||||||
#
|
#
|
||||||
# Returns <Hash>
|
# Returns <Hash>
|
||||||
def to_liquid
|
def to_liquid
|
||||||
self.data.merge({ "title" => self.data["title"] || "",
|
{ "title" => self.data["title"] || "",
|
||||||
"url" => self.url,
|
"url" => self.url,
|
||||||
"date" => self.date,
|
"date" => self.date,
|
||||||
"id" => self.id,
|
"id" => self.id,
|
||||||
"content" => self.content })
|
"content" => self.content }.merge(self.data)
|
||||||
end
|
end
|
||||||
end
|
end
|
||||||
|
|
||||||
|
|
|
@ -53,15 +53,19 @@ module Jekyll
|
||||||
entries = Dir.entries(base)
|
entries = Dir.entries(base)
|
||||||
entries = entries.reject { |e| File.directory?(File.join(base, e)) }
|
entries = entries.reject { |e| File.directory?(File.join(base, e)) }
|
||||||
|
|
||||||
|
# first pass processes, but does not yet render post content
|
||||||
entries.each do |f|
|
entries.each do |f|
|
||||||
if Post.valid?(f)
|
if Post.valid?(f)
|
||||||
post = Post.new(base, f)
|
post = Post.new(base, f)
|
||||||
post.content = Liquid::Template.parse(post.content).render(site_payload, [Jekyll::Filters])
|
|
||||||
post.transform
|
|
||||||
self.posts << post
|
self.posts << post
|
||||||
end
|
end
|
||||||
end
|
end
|
||||||
|
|
||||||
|
# second pass renders each post now that full site payload is available
|
||||||
|
self.posts.each do |post|
|
||||||
|
post.render(self.layouts, site_payload)
|
||||||
|
end
|
||||||
|
|
||||||
self.posts.sort!
|
self.posts.sort!
|
||||||
rescue Errno::ENOENT => e
|
rescue Errno::ENOENT => e
|
||||||
# ignore missing layout dir
|
# ignore missing layout dir
|
||||||
|
@ -72,7 +76,6 @@ module Jekyll
|
||||||
# Returns nothing
|
# Returns nothing
|
||||||
def write_posts
|
def write_posts
|
||||||
self.posts.each do |post|
|
self.posts.each do |post|
|
||||||
post.add_layout(self.layouts, site_payload)
|
|
||||||
post.write(self.dest)
|
post.write(self.dest)
|
||||||
end
|
end
|
||||||
end
|
end
|
||||||
|
@ -87,14 +90,14 @@ module Jekyll
|
||||||
def transform_pages(dir = '')
|
def transform_pages(dir = '')
|
||||||
base = File.join(self.source, dir)
|
base = File.join(self.source, dir)
|
||||||
entries = Dir.entries(base)
|
entries = Dir.entries(base)
|
||||||
entries = entries.reject { |e|
|
entries = entries.reject do |e|
|
||||||
(e != '_posts') and ['.', '_'].include?(e[0..0])
|
(e != '_posts') and ['.', '_'].include?(e[0..0])
|
||||||
}
|
end
|
||||||
|
|
||||||
# we need to make sure to process _posts *first* otherwise they
|
# we need to make sure to process _posts *first* otherwise they
|
||||||
# might not be available yet to other templates as {{ site.posts }}
|
# might not be available yet to other templates as {{ site.posts }}
|
||||||
if entries.include? '_posts'
|
if entries.include?('_posts')
|
||||||
entries.delete '_posts'
|
entries.delete('_posts')
|
||||||
read_posts(File.join(base, '_posts'))
|
read_posts(File.join(base, '_posts'))
|
||||||
end
|
end
|
||||||
|
|
||||||
|
@ -105,13 +108,13 @@ module Jekyll
|
||||||
else
|
else
|
||||||
first3 = File.open(File.join(self.source, dir, f)) { |fd| fd.read(3) }
|
first3 = File.open(File.join(self.source, dir, f)) { |fd| fd.read(3) }
|
||||||
|
|
||||||
# if the file appears to have a YAML header then process it as a page
|
|
||||||
if first3 == "---"
|
if first3 == "---"
|
||||||
|
# file appears to have a YAML header so process it as a page
|
||||||
page = Page.new(self.source, dir, f)
|
page = Page.new(self.source, dir, f)
|
||||||
page.add_layout(self.layouts, site_payload)
|
page.render(self.layouts, site_payload)
|
||||||
page.write(self.dest)
|
page.write(self.dest)
|
||||||
# otherwise copy the file without transforming it
|
|
||||||
else
|
else
|
||||||
|
# otherwise copy the file without transforming it
|
||||||
FileUtils.mkdir_p(File.join(self.dest, dir))
|
FileUtils.mkdir_p(File.join(self.dest, dir))
|
||||||
FileUtils.cp(File.join(self.source, dir, f), File.join(self.dest, dir, f))
|
FileUtils.cp(File.join(self.source, dir, f), File.join(self.dest, dir, f))
|
||||||
end
|
end
|
||||||
|
|
|
@ -59,10 +59,10 @@ class TestPost < Test::Unit::TestCase
|
||||||
assert_equal "<h1>{{ page.title }}</h1>\n<p>Best <strong>post</strong> ever</p>", p.content
|
assert_equal "<h1>{{ page.title }}</h1>\n<p>Best <strong>post</strong> ever</p>", p.content
|
||||||
end
|
end
|
||||||
|
|
||||||
def test_add_layout
|
def test_render
|
||||||
p = Post.new(File.join(File.dirname(__FILE__), *%w[source _posts]), "2008-10-18-foo-bar.textile")
|
p = Post.new(File.join(File.dirname(__FILE__), *%w[source _posts]), "2008-10-18-foo-bar.textile")
|
||||||
layouts = {"default" => Layout.new(File.join(File.dirname(__FILE__), *%w[source _layouts]), "simple.html")}
|
layouts = {"default" => Layout.new(File.join(File.dirname(__FILE__), *%w[source _layouts]), "simple.html")}
|
||||||
p.add_layout(layouts, {"site" => {"posts" => []}})
|
p.render(layouts, {"site" => {"posts" => []}})
|
||||||
|
|
||||||
assert_equal "<<< <h1>Foo Bar</h1>\n<p>Best <strong>post</strong> ever</p> >>>", p.output
|
assert_equal "<<< <h1>Foo Bar</h1>\n<p>Best <strong>post</strong> ever</p> >>>", p.output
|
||||||
end
|
end
|
||||||
|
@ -72,14 +72,14 @@ class TestPost < Test::Unit::TestCase
|
||||||
|
|
||||||
p = Post.new(File.join(File.dirname(__FILE__), *%w[source _posts]), "2008-10-18-foo-bar.textile")
|
p = Post.new(File.join(File.dirname(__FILE__), *%w[source _posts]), "2008-10-18-foo-bar.textile")
|
||||||
layouts = {"default" => Layout.new(File.join(File.dirname(__FILE__), *%w[source _layouts]), "simple.html")}
|
layouts = {"default" => Layout.new(File.join(File.dirname(__FILE__), *%w[source _layouts]), "simple.html")}
|
||||||
p.add_layout(layouts, {"site" => {"posts" => []}})
|
p.render(layouts, {"site" => {"posts" => []}})
|
||||||
p.write(dest_dir)
|
p.write(dest_dir)
|
||||||
end
|
end
|
||||||
|
|
||||||
def test_data
|
def test_data
|
||||||
p = Post.new(File.join(File.dirname(__FILE__), *%w[source _posts]), "2008-11-21-complex.textile")
|
p = Post.new(File.join(File.dirname(__FILE__), *%w[source _posts]), "2008-11-21-complex.textile")
|
||||||
layouts = {"default" => Layout.new(File.join(File.dirname(__FILE__), *%w[source _layouts]), "simple.html")}
|
layouts = {"default" => Layout.new(File.join(File.dirname(__FILE__), *%w[source _layouts]), "simple.html")}
|
||||||
p.add_layout(layouts, {"site" => {"posts" => []}})
|
p.render(layouts, {"site" => {"posts" => []}})
|
||||||
|
|
||||||
assert_equal "<<< <p>url: /test/source/2008/11/21/complex.html<br />\ndate: #{Time.parse("2008-11-21")}<br />\nid: /test/source/2008/11/21/complex</p> >>>", p.output
|
assert_equal "<<< <p>url: /test/source/2008/11/21/complex.html<br />\ndate: #{Time.parse("2008-11-21")}<br />\nid: /test/source/2008/11/21/complex</p> >>>", p.output
|
||||||
end
|
end
|
||||||
|
@ -88,7 +88,7 @@ class TestPost < Test::Unit::TestCase
|
||||||
Jekyll.source = File.join(File.dirname(__FILE__), *%w[source])
|
Jekyll.source = File.join(File.dirname(__FILE__), *%w[source])
|
||||||
p = Post.new(File.join(File.dirname(__FILE__), *%w[source _posts]), "2008-12-13-include.markdown")
|
p = Post.new(File.join(File.dirname(__FILE__), *%w[source _posts]), "2008-12-13-include.markdown")
|
||||||
layouts = {"default" => Layout.new(File.join(File.dirname(__FILE__), *%w[source _layouts]), "simple.html")}
|
layouts = {"default" => Layout.new(File.join(File.dirname(__FILE__), *%w[source _layouts]), "simple.html")}
|
||||||
p.add_layout(layouts, {"site" => {"posts" => []}})
|
p.render(layouts, {"site" => {"posts" => []}})
|
||||||
|
|
||||||
assert_equal "<<< <hr />\n<p>Tom Preston-Werner github.com/mojombo</p>\n\n<p>This <em>is</em> cool</p> >>>", p.output
|
assert_equal "<<< <hr />\n<p>Tom Preston-Werner github.com/mojombo</p>\n\n<p>This <em>is</em> cool</p> >>>", p.output
|
||||||
end
|
end
|
||||||
|
|
Loading…
Reference in New Issue