Skip to content

Commit

Permalink
add possibility to add options to breadcrumb link
Browse files Browse the repository at this point in the history
  • Loading branch information
Ralf Ibelshaeuser committed May 7, 2013
1 parent 392d9fd commit 1e2d37f
Show file tree
Hide file tree
Showing 5 changed files with 63 additions and 15 deletions.
1 change: 1 addition & 0 deletions .gitignore
Expand Up @@ -5,3 +5,4 @@ nbproject
pkg/*
Gemfile.lock
*.gemfile.lock
.idea
8 changes: 4 additions & 4 deletions lib/crummy/action_controller.rb
Expand Up @@ -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?
Expand All @@ -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
Expand Down
4 changes: 2 additions & 2 deletions lib/crummy/action_view.rb
Expand Up @@ -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
Expand Down
21 changes: 14 additions & 7 deletions lib/crummy/standard_renderer.rb
Expand Up @@ -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
Expand All @@ -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
Expand Down
44 changes: 42 additions & 2 deletions test/standard_renderer_test.rb
Expand Up @@ -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('<ul class="" id=""><li class="first last"><span>name</span></li></ul>',
renderer.render_crumbs([['name', 'url']], :first_class => 'first', :last_class => 'last', :format => :html_list, :last_crumb_linked => false))
assert_equal('<crumb href="url">name</crumb>',
Expand All @@ -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('<a href="url" class="first last" title="link title">name</a>',
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('<ul class="" id=""><li class="first last"><a href="url" title="link title">name</a></li></ul>',
renderer.render_crumbs([['name', 'url', {:link_html_options => {:title => 'link title'}}]], :first_class => 'first', :last_class => 'last', :format => :html_list))

assert_equal('<ul class="" id=""><li class="first last"><span>name</span></li></ul>',
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('<div itemscope="itemscope" itemtype="http://data-vocabulary.org/Breadcrumb"><a href="url" class="first last" itemprop="url" title="link title"><span itemprop="title">name</span></a></div>',
renderer.render_crumbs([['name', 'url', {:link_html_options => {:title => 'link title'}}]], :first_class => 'first', :last_class => 'last', :format => :html))

assert_equal('<div itemscope="itemscope" itemtype="http://data-vocabulary.org/Breadcrumb"><span itemprop="title">name</span></div>',
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('<ul class="" id=""><li class="first last" itemscope="itemscope" itemtype="http://data-vocabulary.org/Breadcrumb"><a href="url" itemprop="url" title="link title"><span itemprop="title">name</span></a></li></ul>',
renderer.render_crumbs([['name', 'url', {:link_html_options => {:title => 'link title'}}]], :first_class => 'first', :last_class => 'last', :format => :html_list))

assert_equal('<ul class="" id=""><li class="first last" itemscope="itemscope" itemtype="http://data-vocabulary.org/Breadcrumb"><span itemprop="title">name</span></li></ul>',
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
Expand Down Expand Up @@ -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('<div itemscope="itemscope" itemtype="http://data-vocabulary.org/Breadcrumb"><span itemprop="title">name</span></div>',
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

0 comments on commit 1e2d37f

Please sign in to comment.