diff --git a/Manifest.txt b/Manifest.txt index f43cc645..eb613ef2 100644 --- a/Manifest.txt +++ b/Manifest.txt @@ -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 diff --git a/lib/jekyll.rb b/lib/jekyll.rb index 9e6b610e..3676b576 100644 --- a/lib/jekyll.rb +++ b/lib/jekyll.rb @@ -31,6 +31,7 @@ rescue LoadError end # internal requires +require 'jekyll/core_ext' require 'jekyll/site' require 'jekyll/convertible' require 'jekyll/layout' diff --git a/lib/jekyll/convertible.rb b/lib/jekyll/convertible.rb index 99774684..d8677657 100644 --- a/lib/jekyll/convertible.rb +++ b/lib/jekyll/convertible.rb @@ -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"]] diff --git a/lib/jekyll/core_ext.rb b/lib/jekyll/core_ext.rb new file mode 100644 index 00000000..de584711 --- /dev/null +++ b/lib/jekyll/core_ext.rb @@ -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 \ No newline at end of file diff --git a/lib/jekyll/layout.rb b/lib/jekyll/layout.rb index 50397c40..391cf69c 100644 --- a/lib/jekyll/layout.rb +++ b/lib/jekyll/layout.rb @@ -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 \ No newline at end of file diff --git a/lib/jekyll/page.rb b/lib/jekyll/page.rb index d3488c42..140258fc 100644 --- a/lib/jekyll/page.rb +++ b/lib/jekyll/page.rb @@ -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 diff --git a/lib/jekyll/post.rb b/lib/jekyll/post.rb index 53bcbb22..2cebc0ff 100644 --- a/lib/jekyll/post.rb +++ b/lib/jekyll/post.rb @@ -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 + "" end end