module Navigasmic
class HtmlNavigationBuilder
@@classnames = {
:with_group => 'with-group',
:disabled => 'disabled',
:highlighted => 'highlighted'
}
@@wrapper_tag = :ul
@@group_tag = :ul
@@item_tag = :li
@@label_tag = :span
attr_accessor :template, :name, :items
def initialize(template, name, options = {}, &proc)
@template, @name, @items = template, name.to_s, []
render(options.delete(:html), &proc)
end
def render(options, &proc)
buffer = template.capture(self, &proc)
template.concat(template.content_tag(@@wrapper_tag, buffer, options))
end
def group(label = nil, options = {}, &proc)
raise ArgumentError, "Missing block" unless block_given?
options[:html] ||= {}
options[:html][:class] = template.add_html_class(options[:html][:class], @@classnames[:with_group])
options[:html][:id] ||= label.to_s.gsub(/\s/, '_').underscore unless label.blank? || options[:html].has_key?(:id)
buffer = template.capture(self, &proc)
group = template.content_tag(@@group_tag, buffer)
label = label_for_group(label) unless label.blank?
visible = options[:hidden_unless].nil? ? true : options[:hidden_unless].is_a?(Proc) ? template.instance_eval(&options[:hidden_unless]) : options[:hidden_unless]
visible ? template.content_tag(@@item_tag, (label.to_s + group).html_safe, options.delete(:html)) : ''
end
def item(label, options = {}, &proc)
buffer = block_given? ? template.capture(self, &proc) : ''
item = NavigationItem.new(label, options, template)
options[:html] ||= {}
options[:html][:id] = label.to_s.gsub(/\s/, '_').underscore unless options[:html].has_key?(:id)
options[:html][:class] = template.add_html_class(options[:html][:class], @@classnames[:disabled]) if item.disabled?
options[:html][:class] = template.add_html_class(options[:html][:class], @@classnames[:highlighted]) if item.highlighted?(template.request.path, template.params, template)
label = label_for_item(label)
link = item.link.is_a?(Proc) ? template.instance_eval(&item.link) : item.link
label = template.link_to(label, link, options.delete(:link_html)) unless !item.link? || item.disabled?
item.hidden? ? '' : template.content_tag(@@item_tag, label + buffer, options.delete(:html))
end
def label_for_group(label)
template.content_tag(@@label_tag, label.to_s)
end
def label_for_item(label)
template.content_tag(@@label_tag, label.to_s)
end
end
end