deep merge hashes so as to not lose data

This commit is contained in:
Tom Preston-Werner 2008-12-24 22:05:46 -08:00
parent 8477cb5946
commit dd8054411c
7 changed files with 33 additions and 20 deletions

View File

@ -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

View File

@ -31,6 +31,7 @@ rescue LoadError
end
# internal requires
require 'jekyll/core_ext'
require 'jekyll/site'
require 'jekyll/convertible'
require 'jekyll/layout'

View File

@ -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"]]

22
lib/jekyll/core_ext.rb Normal file
View File

@ -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

View File

@ -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

View File

@ -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

View File

@ -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