78 lines
2.1 KiB
Ruby
78 lines
2.1 KiB
Ruby
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
|
|
sorted_children_keys = @children.keys.sort do |a, b|
|
|
a_subtree = @children[a]
|
|
b_subtree = @children[b]
|
|
if a_subtree.is_a? SitemapResource
|
|
if b_subtree.is_a? SitemapResource
|
|
a.downcase <=> b.downcase
|
|
else
|
|
1
|
|
end
|
|
elsif b_subtree.is_a? SitemapResource
|
|
if a_subtree.is_a? SitemapResource
|
|
b.downcase <=> a.downcase
|
|
else
|
|
-1
|
|
end
|
|
else
|
|
a.downcase <=> b.downcase
|
|
end
|
|
end
|
|
|
|
sorted_children_keys.reduce('') do |content, path_part|
|
|
subtree = @children[path_part]
|
|
content << "<details class='#{subtree.css_classes.join(' ')}'>"
|
|
content << '<summary>'
|
|
content << "<i class='icon-folder-open'></i>" unless subtree.is_a? SitemapResource
|
|
content << "#{path_part}</summary>"
|
|
content << subtree.render
|
|
content << '</details>'
|
|
end
|
|
end
|
|
|
|
def css_classes
|
|
['tree'].concat(ignored? ? ['ignored'] : [])
|
|
end
|
|
|
|
def ignored?
|
|
@children.values.all?(&:ignored?)
|
|
end
|
|
|
|
protected
|
|
|
|
def add_path(path_parts, resource)
|
|
first_part = path_parts.first
|
|
|
|
if path_parts.size == 1
|
|
sitemap_class = SitemapResource
|
|
# Allow special sitemap resources to use custom metadata view classes
|
|
sitemap_class = resource.meta_pages_class if resource.respond_to? :meta_pages_class
|
|
|
|
@children[first_part] = sitemap_class.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
|