From af673529cb8381e0fc35369599bb2a9343094564 Mon Sep 17 00:00:00 2001 From: Tom Preston-Werner Date: Wed, 5 Nov 2008 22:00:30 -0500 Subject: [PATCH] allow nested layouts --- lib/autoblog.rb | 1 + lib/autoblog/convertible.rb | 25 +++++++++++++++++++ lib/autoblog/layout.rb | 48 +++++++++++++++++++++++++++++++++++++ lib/autoblog/page.rb | 13 ++++------ lib/autoblog/post.rb | 11 +++------ lib/autoblog/site.rb | 2 +- 6 files changed, 82 insertions(+), 18 deletions(-) create mode 100644 lib/autoblog/layout.rb diff --git a/lib/autoblog.rb b/lib/autoblog.rb index 1c36a2ae..ce2d7367 100644 --- a/lib/autoblog.rb +++ b/lib/autoblog.rb @@ -16,6 +16,7 @@ require 'redcloth' # internal requires require 'autoblog/site' require 'autoblog/convertible' +require 'autoblog/layout' require 'autoblog/page' require 'autoblog/post' require 'autoblog/filters' diff --git a/lib/autoblog/convertible.rb b/lib/autoblog/convertible.rb index a7c1548e..dfe444fb 100644 --- a/lib/autoblog/convertible.rb +++ b/lib/autoblog/convertible.rb @@ -24,5 +24,30 @@ module AutoBlog self.content = RedCloth.new(self.content).to_html end 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 do_layout(payload, layouts, site_payload) + # construct payload + payload = payload.merge(site_payload) + + # render content + self.content = Liquid::Template.parse(self.content).render(payload, [AutoBlog::Filters]) + + # output keeps track of what will finally be written + self.output = self.content + + # recursively render layouts + layout = layouts[self.data["layout"]] + while layout + payload = payload.merge({"content" => self.output, "page" => self.data}) + self.output = Liquid::Template.parse(layout.content).render(payload, [AutoBlog::Filters]) + + layout = layouts[layout.data["layout"]] + end + end end end \ No newline at end of file diff --git a/lib/autoblog/layout.rb b/lib/autoblog/layout.rb new file mode 100644 index 00000000..ef4eec5f --- /dev/null +++ b/lib/autoblog/layout.rb @@ -0,0 +1,48 @@ +module AutoBlog + + class Layout + include Convertible + + attr_accessor :ext + attr_accessor :data, :content + + # Initialize a new Layout. + # +base+ is the String path to the + # +name+ is the String filename of the post file + # + # Returns + def initialize(base, name) + @base = base + @name = name + + self.data = {} + + self.process(name) + self.read_yaml(base, name) + end + + # Extract information from the layout filename + # +name+ is the String filename of the layout file + # + # Returns nothing + 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, [AutoBlog::Filters]) + + layout = layouts[self.data["layout"]] || self.content + payload = {"content" => self.content, "page" => self.data} + + self.content = Liquid::Template.parse(layout).render(payload, [AutoBlog::Filters]) + end + end + +end \ No newline at end of file diff --git a/lib/autoblog/page.rb b/lib/autoblog/page.rb index 229d5cd2..5865b6c1 100644 --- a/lib/autoblog/page.rb +++ b/lib/autoblog/page.rb @@ -4,7 +4,7 @@ module AutoBlog include Convertible attr_accessor :ext - attr_accessor :data, :content + attr_accessor :data, :content, :output # Initialize a new Page. # +base+ is the String path to the @@ -38,13 +38,8 @@ module AutoBlog # # Returns nothing def add_layout(layouts, site_payload) - payload = {"page" => self.data}.merge(site_payload) - self.content = Liquid::Template.parse(self.content).render(payload, [AutoBlog::Filters]) - - layout = layouts[self.data["layout"]] || self.content - payload = {"content" => self.content, "page" => self.data} - - self.content = Liquid::Template.parse(layout).render(payload, [AutoBlog::Filters]) + payload = {"page" => self.data} + do_layout(payload, layouts, site_payload) end # Write the generated page file to the destination directory. @@ -61,7 +56,7 @@ module AutoBlog path = File.join(dest, @dir, name) File.open(path, 'w') do |f| - f.write(self.content) + f.write(self.output) end end end diff --git a/lib/autoblog/post.rb b/lib/autoblog/post.rb index 92d1b8ba..36c0b3c2 100644 --- a/lib/autoblog/post.rb +++ b/lib/autoblog/post.rb @@ -86,15 +86,10 @@ module AutoBlog # # Returns nothing def add_layout(layouts, site_payload) + # construct post payload related = related_posts(site_payload["site"]["posts"]) - - payload = {"page" => self.data, "related_posts" => related}.merge(site_payload) - self.content = Liquid::Template.parse(self.content).render(payload, [AutoBlog::Filters]) - - layout = layouts[self.data["layout"]] || self.content - payload = {"content" => self.content, "page" => self.data} - - self.output = Liquid::Template.parse(layout).render(payload, [AutoBlog::Filters]) + payload = {"page" => self.data, "related_posts" => related} + do_layout(payload, layouts, site_payload) end # Write the generated post file to the destination directory. diff --git a/lib/autoblog/site.rb b/lib/autoblog/site.rb index b85d37a9..6df05b45 100644 --- a/lib/autoblog/site.rb +++ b/lib/autoblog/site.rb @@ -40,7 +40,7 @@ module AutoBlog entries.each do |f| name = f.split(".")[0..-2].join(".") - self.layouts[name] = File.read(File.join(base, f)) + self.layouts[name] = Layout.new(base, f) end rescue Errno::ENOENT => e # ignore missing layout dir