deep merge hashes so as to not lose data
This commit is contained in:
parent
8477cb5946
commit
dd8054411c
|
@ -8,9 +8,10 @@ lib/jekyll.rb
|
|||
lib/jekyll/albino.rb
|
||||
lib/jekyll/converters/csv.rb
|
||||
lib/jekyll/converters/mephisto.rb
|
||||
lib/jekyll/converters/wordpress.rb
|
||||
lib/jekyll/converters/mt.rb
|
||||
lib/jekyll/converters/wordpress.rb
|
||||
lib/jekyll/convertible.rb
|
||||
lib/jekyll/core_ext.rb
|
||||
lib/jekyll/filters.rb
|
||||
lib/jekyll/layout.rb
|
||||
lib/jekyll/page.rb
|
||||
|
|
|
@ -31,6 +31,7 @@ rescue LoadError
|
|||
end
|
||||
|
||||
# internal requires
|
||||
require 'jekyll/core_ext'
|
||||
require 'jekyll/site'
|
||||
require 'jekyll/convertible'
|
||||
require 'jekyll/layout'
|
||||
|
|
|
@ -50,7 +50,7 @@ module Jekyll
|
|||
# recursively render layouts
|
||||
layout = layouts[self.data["layout"]]
|
||||
while layout
|
||||
payload = payload.merge({"content" => self.output, "page" => payload['page']})
|
||||
payload = payload.deep_merge({"content" => self.output, "page" => layout.data})
|
||||
self.output = Liquid::Template.parse(layout.content).render(payload, [Jekyll::Filters])
|
||||
|
||||
layout = layouts[layout.data["layout"]]
|
||||
|
|
|
@ -0,0 +1,22 @@
|
|||
class Hash
|
||||
# Merges self with another hash, recursively.
|
||||
#
|
||||
# This code was lovingly stolen from some random gem:
|
||||
# http://gemjack.com/gems/tartan-0.1.1/classes/Hash.html
|
||||
#
|
||||
# Thanks to whoever made it.
|
||||
def deep_merge(hash)
|
||||
target = dup
|
||||
|
||||
hash.keys.each do |key|
|
||||
if hash[key].is_a? Hash and self[key].is_a? Hash
|
||||
target[key] = target[key].deep_merge(hash[key])
|
||||
next
|
||||
end
|
||||
|
||||
target[key] = hash[key]
|
||||
end
|
||||
|
||||
target
|
||||
end
|
||||
end
|
|
@ -28,21 +28,6 @@ module Jekyll
|
|||
def process(name)
|
||||
self.ext = File.extname(name)
|
||||
end
|
||||
|
||||
# Add any necessary layouts to this post
|
||||
# +layouts+ is a Hash of {"name" => "layout"}
|
||||
# +site_payload+ is the site payload hash
|
||||
#
|
||||
# Returns nothing
|
||||
def add_layout(layouts, site_payload)
|
||||
payload = {"page" => self.data}.merge(site_payload)
|
||||
self.content = Liquid::Template.parse(self.content).render(payload, [Jekyll::Filters])
|
||||
|
||||
layout = layouts[self.data["layout"]] || self.content
|
||||
payload = {"content" => self.content, "page" => self.data}
|
||||
|
||||
self.content = Liquid::Template.parse(layout).render(payload, [Jekyll::Filters])
|
||||
end
|
||||
end
|
||||
|
||||
end
|
|
@ -38,7 +38,7 @@ module Jekyll
|
|||
#
|
||||
# Returns nothing
|
||||
def render(layouts, site_payload)
|
||||
payload = {"page" => self.data}.merge(site_payload)
|
||||
payload = {"page" => self.data}.deep_merge(site_payload)
|
||||
do_layout(payload, layouts)
|
||||
end
|
||||
|
||||
|
|
|
@ -132,7 +132,7 @@ module Jekyll
|
|||
"site" => { "related_posts" => related_posts(site_payload["site"]["posts"]) },
|
||||
"page" => self.to_liquid
|
||||
}
|
||||
payload = payload.merge(site_payload)
|
||||
payload = payload.deep_merge(site_payload)
|
||||
|
||||
do_layout(payload, layouts)
|
||||
end
|
||||
|
@ -159,7 +159,11 @@ module Jekyll
|
|||
"date" => self.date,
|
||||
"id" => self.id,
|
||||
"topics" => self.topics,
|
||||
"content" => self.content }.merge(self.data)
|
||||
"content" => self.content }.deep_merge(self.data)
|
||||
end
|
||||
|
||||
def inspect
|
||||
"<Post: #{self.id}>"
|
||||
end
|
||||
end
|
||||
|
||||
|
|
Loading…
Reference in New Issue