Skip to content

Commit

Permalink
deep merge hashes so as to not lose data
Browse files Browse the repository at this point in the history
  • Loading branch information
mojombo committed Dec 25, 2008
1 parent 8477cb5 commit dd80544
Show file tree
Hide file tree
Showing 7 changed files with 33 additions and 20 deletions.
3 changes: 2 additions & 1 deletion Manifest.txt
Original file line number Diff line number Diff line change
Expand Up @@ -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
Expand Down
1 change: 1 addition & 0 deletions lib/jekyll.rb
Original file line number Diff line number Diff line change
Expand Up @@ -31,6 +31,7 @@
end

# internal requires
require 'jekyll/core_ext'
require 'jekyll/site'
require 'jekyll/convertible'
require 'jekyll/layout'
Expand Down
2 changes: 1 addition & 1 deletion lib/jekyll/convertible.rb
Original file line number Diff line number Diff line change
Expand Up @@ -50,7 +50,7 @@ def do_layout(payload, layouts)
# 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"]]
Expand Down
22 changes: 22 additions & 0 deletions lib/jekyll/core_ext.rb
Original file line number Diff line number Diff line change
@@ -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
15 changes: 0 additions & 15 deletions lib/jekyll/layout.rb
Original file line number Diff line number Diff line change
Expand Up @@ -28,21 +28,6 @@ def initialize(base, name)
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
2 changes: 1 addition & 1 deletion lib/jekyll/page.rb
Original file line number Diff line number Diff line change
Expand Up @@ -38,7 +38,7 @@ def process(name)
#
# 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

Expand Down
8 changes: 6 additions & 2 deletions lib/jekyll/post.rb
Original file line number Diff line number Diff line change
Expand Up @@ -132,7 +132,7 @@ def render(layouts, site_payload)
"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
Expand All @@ -159,7 +159,11 @@ def to_liquid
"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

Expand Down

0 comments on commit dd80544

Please sign in to comment.