From 354d7edaea44028be40d46aa4c6a181b8bf95488 Mon Sep 17 00:00:00 2001 From: Jan Szumiec Date: Tue, 6 Dec 2011 19:52:17 +0100 Subject: [PATCH] render_crumbs now accepts two additional options: options[:first_class], options[:last_class] which are html classes applied to first and last elements respectively. --- lib/crummy/standard_renderer.rb | 28 +++++++++++++++++++--------- test/standard_renderer_test.rb | 29 +++++++++++++++++++++++++++++ 2 files changed, 48 insertions(+), 9 deletions(-) create mode 100644 test/standard_renderer_test.rb diff --git a/lib/crummy/standard_renderer.rb b/lib/crummy/standard_renderer.rb index 9b44233..6294c45 100644 --- a/lib/crummy/standard_renderer.rb +++ b/lib/crummy/standard_renderer.rb @@ -34,10 +34,13 @@ def render_crumbs(crumbs, options = {}) options[:separator] = "crumb" if options[:format] == :xml end options[:links] = true if options[:links] == nil + options[:first_class] ||= '' + options[:last_class] ||= '' + case options[:format] when :html crumb_string = crumbs.collect do |crumb| - crumb_to_html crumb, options[:links] + crumb_to_html(crumb, options[:links], options[:first_class], options[:last_class], (crumb == crumbs.first), (crumb == crumbs.last)) end * options[:separator] crumb_string when :html_list @@ -49,13 +52,13 @@ def render_crumbs(crumbs, options = {}) options[:ul_class] = "" if options[:ul_class] == nil options[:ul_id] = "" if options[:ul_id] == nil crumb_string = crumbs.collect do |crumb| - crumb_to_html_list crumb, options[:links], options[:li_class], options[:active_li_class] + crumb_to_html_list(crumb, options[:links], options[:li_class], options[:active_li_class], options[:first_class], options[:last_class], (crumb == crumbs.first), (crumb == crumbs.last)) end * options[:separator] crumb_string = "" crumb_string when :xml crumbs.collect do |crumb| - crumb_to_xml crumb, options[:links], options[:separator] + crumb_to_xml(crumb, options[:links], options[:separator], (crumb == crumbs.first), (crumb == crumbs.last)) end * '' else raise ArgumentError, "Unknown breadcrumb output format" @@ -64,17 +67,24 @@ def render_crumbs(crumbs, options = {}) private - def crumb_to_html(crumb, links) + def crumb_to_html(crumb, links, first_class, last_class, is_first, is_last) + html_classes = [] + html_classes << first_class if is_first + html_classes << last_class if is_last name, url = crumb - url && links ? link_to(name, url) : name + url && links ? link_to(name, url, :class => html_classes) : name end - def crumb_to_html_list(crumb, links, li_class, active_li_class) + def crumb_to_html_list(crumb, links, li_class, active_li_class, first_class, last_class, is_first, is_last) name, url = crumb - url && links ? "
  • #{name}
  • " : "
  • #{name}
  • " + html_classes = [] + html_classes << first_class if is_first + html_classes << last_class if is_last + html_classes << active_li_class unless url && links + url && links ? "
  • #{name}
  • " : "
  • #{name}
  • " end - - def crumb_to_xml(crumb, links, separator) + + def crumb_to_xml(crumb, links, separator, is_first, is_last) name, url = crumb url && links ? "<#{separator} href=\"#{url}\">#{name}" : "<#{separator}>#{name}" end diff --git a/test/standard_renderer_test.rb b/test/standard_renderer_test.rb new file mode 100644 index 0000000..b7378a0 --- /dev/null +++ b/test/standard_renderer_test.rb @@ -0,0 +1,29 @@ +require 'rubygems' +require 'bundler' +Bundler.require(:test) +require 'test/unit' + +require 'action_controller' +require 'active_support/core_ext/string/output_safety' +require 'crummy/standard_renderer' + +class StandardRendererTest < Test::Unit::TestCase + include Crummy + + def test_classes + renderer = StandardRenderer.new + assert_equal('name', + renderer.render_crumbs([['name', 'url']], :first_class => 'first', :last_class => 'last', :format => :html)) + assert_equal('', + renderer.render_crumbs([['name', 'url']], :first_class => 'first', :last_class => 'last', :format => :html_list)) + assert_equal('name', + renderer.render_crumbs([['name', 'url']], :first_class => 'first', :last_class => 'last', :format => :xml)) + + assert_equal('name1 » name2', + renderer.render_crumbs([['name1', 'url1'], ['name2', 'url2']], :first_class => 'first', :last_class => 'last', :format => :html)) + assert_equal('', + renderer.render_crumbs([['name1', 'url1'], ['name2', 'url2']], :first_class => 'first', :last_class => 'last', :format => :html_list)) + assert_equal('name1name2', + renderer.render_crumbs([['name1', 'url1'], ['name2', 'url2']], :first_class => 'first', :last_class => 'last', :format => :xml)) + end +end