Switch to using view classes isntead of partials

This commit is contained in:
Ben Hollis 2012-10-13 14:28:08 -07:00 committed by Thomas Reynolds
parent b8eb932a73
commit 142abe027e
6 changed files with 71 additions and 30 deletions

View file

@ -1,6 +1,7 @@
require 'rack/builder' require 'rack/builder'
require 'rack/static' require 'rack/static'
require 'tilt' require 'tilt'
require 'middleman-core/meta_pages/sitemap_tree'
module Middleman module Middleman
module MetaPages module MetaPages
@ -42,18 +43,13 @@ module Middleman
def sitemap(env) def sitemap(env)
resources = @middleman.sitemap.resources(true) resources = @middleman.sitemap.resources(true)
resource_tree = {} sitemap_tree = SitemapTree.new
resources.each do |resource| resources.each do |resource|
branch = resource_tree sitemap_tree.add_resource resource
path_parts = resource.path.split('/')
path_parts[0...-1].each do |path_part|
branch[path_part] ||= {}
branch = branch[path_part]
end
branch[path_parts.last] = resource
end end
template('sitemap.html.erb', :resource_tree => resource_tree) template('sitemap.html.erb', :sitemap_tree => sitemap_tree)
end end
private private
@ -61,7 +57,7 @@ module Middleman
# Render a template with the given name and locals # Render a template with the given name and locals
def template(template_name, locals={}) def template(template_name, locals={})
template_path = File.join(File.dirname(__FILE__), 'meta_pages', 'templates', template_name) template_path = File.join(File.dirname(__FILE__), 'meta_pages', 'templates', template_name)
content = Tilt.new(template_path).render(RenderHelper.new, locals) content = Tilt.new(template_path).render(nil, locals)
response(content) response(content)
end end
@ -69,13 +65,6 @@ module Middleman
def response(content) def response(content)
[ 200, {"Content-Type" => "text/html"}, Array(content) ] [ 200, {"Content-Type" => "text/html"}, Array(content) ]
end end
class RenderHelper
def partial(partial_name, locals={})
partial_path = File.join(File.dirname(__FILE__), 'meta_pages', 'templates', 'partials', partial_name)
content = Tilt.new(partial_path).render(RenderHelper.new, locals)
end
end
end end
end end
end end

View file

@ -0,0 +1 @@
alert("foo");

View file

@ -0,0 +1,14 @@
module Middleman
module MetaPages
# View class for a sitemap resource
class SitemapResource
def initialize(resource)
@resource = resource
end
def render
"<p>#{@resource.destination_path}</p>"
end
end
end
end

View file

@ -0,0 +1,48 @@
require 'middleman-core/meta_pages/sitemap_resource'
module Middleman
module MetaPages
# View class for a sitemap tree
class SitemapTree
def initialize
@children = {}
end
def add_resource(resource)
add_path(resource.path.split('/'), resource)
end
def render
content = ""
@children.keys.sort_by(&:downcase).each do |path_part|
content << "<details>"
content << "<summary>"
content << path_part
content << "</summary>"
subtree = @children[path_part]
content << subtree.render
content << "</details>"
end
content
end
protected
def add_path(path_parts, resource)
first_part = path_parts.first
if path_parts.size == 1
@children[first_part] = SitemapResource.new(resource)
else
@children[first_part] ||= SitemapTree.new
@children[first_part].add_path(path_parts[1..-1], resource)
end
end
def to_s
"Sitemap Tree"
end
end
end
end

View file

@ -1,12 +0,0 @@
<ul>
<% tree.each do |path_part, subtree| %>
<li>
<%= path_part %>
<% if subtree.respond_to? :path %>
Path!
<% else %>
<%= partial 'sitemap_tree.html.erb', :tree => subtree %>
<% end %>
</li>
<% end %>
</ul>

View file

@ -4,13 +4,14 @@
<meta charset="utf-8"> <meta charset="utf-8">
<title>Middleman Sitemap</title> <title>Middleman Sitemap</title>
<script src="../assets/sitemap.js"></script>
</head> </head>
<body> <body>
<h1>Middleman Sitemap</h1> <h1>Middleman Sitemap</h1>
<a href="../">More meta pages</a> <a href="../">More meta pages</a>
<%= partial 'sitemap_tree.html.erb', :tree => resource_tree %> <%= sitemap_tree.render %>
</body> </body>
</html> </html>