diff --git a/.gitignore b/.gitignore index 4b27429..15c1cee 100644 --- a/.gitignore +++ b/.gitignore @@ -5,3 +5,4 @@ nbproject pkg/* Gemfile.lock *.gemfile.lock +.idea diff --git a/lib/crummy/action_controller.rb b/lib/crummy/action_controller.rb index 3ceb594..a720a21 100644 --- a/lib/crummy/action_controller.rb +++ b/lib/crummy/action_controller.rb @@ -33,9 +33,9 @@ def add_crumb(name, *args) _record = instance.instance_variable_get("@#{name}") unless name.kind_of?(String) if _record and _record.respond_to? :to_param - instance.add_crumb(_record.to_s, url || instance.url_for(_record)) + instance.add_crumb(_record.to_s, url || instance.url_for(_record), options) else - instance.add_crumb(name, url) + instance.add_crumb(name, url, options) end # FIXME: url = instance.url_for(name) if name.respond_to?("to_param") && url.nil? @@ -56,8 +56,8 @@ module InstanceMethods # add_crumb("Home", "/") # add_crumb("Business") { |instance| instance.business_path } # - def add_crumb(name, url=nil) - crumbs.push [name, url] + def add_crumb(name, url=nil, options={}) + crumbs.push [name, url, options] end def clear_crumbs diff --git a/lib/crummy/action_view.rb b/lib/crummy/action_view.rb index 0435d5e..3dbc410 100644 --- a/lib/crummy/action_view.rb +++ b/lib/crummy/action_view.rb @@ -6,8 +6,8 @@ def crumbs end # Add a crumb to the +crumbs+ array - def add_crumb(name, url=nil) - crumbs.push [name, url] + def add_crumb(name, url=nil, options={}) + crumbs.push [name, url, options] end # Render the list of crumbs using renderer diff --git a/lib/crummy/standard_renderer.rb b/lib/crummy/standard_renderer.rb index b9781f7..1c2dec9 100644 --- a/lib/crummy/standard_renderer.rb +++ b/lib/crummy/standard_renderer.rb @@ -70,21 +70,26 @@ def crumb_to_html(crumb, links, first_class, last_class, is_first, is_last, with html_classes = [] html_classes << first_class if is_first html_classes << last_class if is_last - name, url = crumb + name, url, options = crumb + options = {} unless options.is_a?(Hash) can_link = url && links && (!is_last || last_crumb_linked) - html_content = can_link ? link_to((truncate.present? ? name.truncate(truncate) : name), url) : content_tag(:span, (truncate.present? ? name.truncate(truncate) : name)) + html_content = can_link ? link_to((truncate.present? ? name.truncate(truncate) : name), url, options[:link_html_options]) : content_tag(:span, (truncate.present? ? name.truncate(truncate) : name)) + link_html_options = options[:link_html_options] || {} + link_html_options[:class] = html_classes if with_microdata item_title = content_tag(:span, (truncate.present? ? name.truncate(truncate) : name), :itemprop => "title") html_options = {:itemscope => true, :itemtype => data_definition_url("Breadcrumb")} - html_content = can_link ? link_to(item_title, url, :class => html_classes, :itemprop => "url") : item_title + link_html_options[:itemprop] = "url" + html_content = can_link ? link_to(item_title, url, link_html_options) : item_title content_tag(:div, html_content, html_options) else - can_link ? link_to((truncate.present? ? name.truncate(truncate) : name), url, :class => html_classes) : (truncate.present? ? name.truncate(truncate) : name) + can_link ? link_to((truncate.present? ? name.truncate(truncate) : name), url, link_html_options) : (truncate.present? ? name.truncate(truncate) : name) end end def crumb_to_html_list(crumb, links, li_class, first_class, last_class, is_first, is_last, with_microdata, last_crumb_linked, truncate) - name, url = crumb + name, url, options = crumb + options = {} unless options.is_a?(Hash) can_link = url && links && (!is_last || last_crumb_linked) html_classes = [] html_classes << first_class if is_first @@ -95,9 +100,11 @@ def crumb_to_html_list(crumb, links, li_class, first_class, last_class, is_first html_options[:itemscope] = true html_options[:itemtype] = data_definition_url("Breadcrumb") item_title = content_tag(:span, (truncate.present? ? name.truncate(truncate) : name), :itemprop => "title") - html_content = can_link ? link_to(item_title, url, :itemprop => "url") : item_title + link_html_options = options[:link_html_options] || {} + link_html_options[:itemprop] = "url" + html_content = can_link ? link_to(item_title, url, link_html_options) : item_title else - html_content = can_link ? link_to((truncate.present? ? name.truncate(truncate) : name), url) : content_tag(:span, (truncate.present? ? name.truncate(truncate) : name)) + html_content = can_link ? link_to((truncate.present? ? name.truncate(truncate) : name), url, options[:link_html_options]) : content_tag(:span, (truncate.present? ? name.truncate(truncate) : name)) end content_tag(:li, html_content, html_options) end diff --git a/test/standard_renderer_test.rb b/test/standard_renderer_test.rb index c407c89..02b71e9 100644 --- a/test/standard_renderer_test.rb +++ b/test/standard_renderer_test.rb @@ -42,7 +42,7 @@ def test_classes def test_classes_last_crumb_not_linked renderer = StandardRenderer.new assert_equal('name', - renderer.render_crumbs([['name', 'url']], :first_class => 'first', :last_class => 'last', :format => :html, :last_crumb_linked => false)) + renderer.render_crumbs([['name', 'url']], :first_class => 'first', :last_class => 'last', :format => :html, :last_crumb_linked => false)) assert_equal('', renderer.render_crumbs([['name', 'url']], :first_class => 'first', :last_class => 'last', :format => :html_list, :last_crumb_linked => false)) assert_equal('name', @@ -65,6 +65,44 @@ def test_classes_last_crumb_not_linked renderer.render_crumbs([['name', 'url']], :format => :html_list, :ul_id => "crumbid", :ul_class => "crumbclass", :li_class => "liclass", :last_crumb_linked => false)) end + def test_link_html_options + renderer = StandardRenderer.new + Crummy.configure do |config| + config.microdata = false + end + + assert_equal('name', + renderer.render_crumbs([['name', 'url', {:link_html_options => {:title => 'link title'}}]], :first_class => 'first', :last_class => 'last', :format => :html)) + + assert_equal('name', + renderer.render_crumbs([['name', 'url', {:link_html_options => {:title => 'link title'}}]], :first_class => 'first', :last_class => 'last', :format => :html, :last_crumb_linked => false)) + + assert_equal('', + renderer.render_crumbs([['name', 'url', {:link_html_options => {:title => 'link title'}}]], :first_class => 'first', :last_class => 'last', :format => :html_list)) + + assert_equal('', + renderer.render_crumbs([['name', 'url', {:link_html_options => {:title => 'link title'}}]], :first_class => 'first', :last_class => 'last', :format => :html_list, :last_crumb_linked => false)) + end + + def test_link_html_options_with_microdata + renderer = StandardRenderer.new + Crummy.configure do |config| + config.microdata = true + end + + assert_equal('
', + renderer.render_crumbs([['name', 'url', {:link_html_options => {:title => 'link title'}}]], :first_class => 'first', :last_class => 'last', :format => :html)) + + assert_equal('
name
', + renderer.render_crumbs([['name', 'url', {:link_html_options => {:title => 'link title'}}]], :first_class => 'first', :last_class => 'last', :format => :html, :last_crumb_linked => false)) + + assert_equal('', + renderer.render_crumbs([['name', 'url', {:link_html_options => {:title => 'link title'}}]], :first_class => 'first', :last_class => 'last', :format => :html_list)) + + assert_equal('', + renderer.render_crumbs([['name', 'url', {:link_html_options => {:title => 'link title'}}]], :first_class => 'first', :last_class => 'last', :format => :html_list, :last_crumb_linked => false)) + end + def test_configuration renderer = StandardRenderer.new # check defaults @@ -99,5 +137,7 @@ def test_configured_renderer_with_microdata renderer.render_crumbs([['name', 'url']], :first_class => 'first', :last_class => 'last', :format => :html)) # last crumb not linked assert_equal('
name
', - renderer.render_crumbs([['name', 'url']], :first_class => 'first', :last_class => 'last', :format => :html, :last_crumb_linked => false)) end + renderer.render_crumbs([['name', 'url']], :first_class => 'first', :last_class => 'last', :format => :html, :last_crumb_linked => false)) + end + end