Skip to content

Commit

Permalink
add menu_level_X indicator to facilitate CSS integration
Browse files Browse the repository at this point in the history
  • Loading branch information
Daniel Haran committed Oct 27, 2008
1 parent bd33e9f commit 12f5d57
Show file tree
Hide file tree
Showing 2 changed files with 30 additions and 18 deletions.
24 changes: 17 additions & 7 deletions lib/semantic_menu.rb
Original file line number Diff line number Diff line change
Expand Up @@ -8,22 +8,32 @@ class MenuItem

attr_accessor :children, :link

def initialize(title, link)
@title, @link, @children = title, link, []
def initialize(title, link, level)
@title, @link, @level, @children = title, link, level, []
end

def add(title, link, &block)
returning(MenuItem.new(title, link)) do |adding|
returning(MenuItem.new(title, link, @level +1)) do |adding|
@children << adding
yield adding if block_given?
end
end

def to_s
opts = active? ? {:class => 'active'} : {}
opts = add_level_class({:class => (active? ? 'active' : '')})
content_tag :li, link_to(@title, @link) + child_output, opts
end

def add_level_class(opts)
level_class = "menu_level_#{@level}"
if opts[:class].blank?
opts[:class] = level_class
else
opts[:class] += ' ' + level_class
end
opts
end

def child_output
children.empty? ? '' : content_tag(:ul, @children.collect(&:to_s).join)
end
Expand All @@ -45,11 +55,11 @@ def controller # make it available to current_page? in UrlHelper
class SemanticMenu < MenuItem

def initialize(controller, opts={},&block)
@@controller = controller

@@controller = controller
@opts = {:class => 'menu'}.merge opts
@opts[:class] = @opts[:class] + ' menu_level_1' unless @opts[:class].split(' ').include?('menu1')
@level = 0
@children = []

yield self if block_given?
end

Expand Down
24 changes: 13 additions & 11 deletions test/semantic_menu_test.rb
Original file line number Diff line number Diff line change
Expand Up @@ -7,32 +7,34 @@

class SemanticMenuTest < ActiveSupport::TestCase
def test_menu_to_s
assert_equal SemanticMenu.new(nil) {}.to_s, '<ul class="menu menu_level_1"></ul>'
assert_equal SemanticMenu.new(nil) {}.to_s, '<ul class="menu"></ul>'
end

def test_menu_item_to_s
MenuItem.any_instance.stubs(:active?).returns(false)
assert_equal MenuItem.new("title", "link").to_s, '<li><a href="link">title</a></li>'
assert_equal '<li class="menu_level_2"><a href="link">title</a></li>',
MenuItem.new("title", "link", 2).to_s

end

def test_menu_item_with_one_child
MenuItem.any_instance.stubs(:active?).returns(false)
assert_equal '<ul class="mymenu menu_level_1"><li><a href="link">title</a></li></ul>', default_menu.to_s
assert_equal '<ul class="mymenu"><li class="menu_level_1"><a href="link">title</a></li></ul>', default_menu.to_s
end

def test_menu_item_with_two_children
MenuItem.any_instance.stubs(:active?).returns(false)
menu = default_menu
menu.add 'title2', 'link2'
assert_equal '<ul class="mymenu menu_level_1">' +
'<li><a href="link">title</a></li>' +
'<li><a href="link2">title2</a></li></ul>', menu.to_s
assert_equal '<ul class="mymenu">' +
'<li class="menu_level_1"><a href="link">title</a></li>' +
'<li class="menu_level_1"><a href="link2">title2</a></li></ul>', menu.to_s
end

def test_menu_item_shows_active_if_on_current_page
item = MenuItem.new("title", "link")
item = MenuItem.new("title", "link", 2)
item.stubs(:active?).returns(true)
assert_equal '<li class="active"><a href="link">title</a></li>', item.to_s
assert_equal '<li class="active menu_level_2"><a href="link">title</a></li>', item.to_s
end

def test_nested_menu
Expand All @@ -43,10 +45,10 @@ def test_nested_menu
end
end
expected = <<NESTED
<ul class="menu menu_level_1">
<li class="active"><a href="link_level1">level1</a>
<ul class="menu">
<li class="active menu_level_1"><a href="link_level1">level1</a>
<ul>
<li class="active"><a href="link_level2">level2</a></li>
<li class="active menu_level_2"><a href="link_level2">level2</a></li>
</ul>
</li>
</ul>
Expand Down

0 comments on commit 12f5d57

Please sign in to comment.