simple-navigation 3.6.0 → 3.7.0
Sign up to get free protection for your applications and to get access to all the features.
- data/CHANGELOG +6 -0
- data/VERSION +1 -1
- data/lib/simple_navigation.rb +3 -0
- data/lib/simple_navigation/adapters.rb +2 -1
- data/lib/simple_navigation/adapters/nanoc.rb +45 -0
- data/lib/simple_navigation/core/item.rb +1 -1
- data/lib/simple_navigation/rendering/renderer/base.rb +37 -1
- data/lib/simple_navigation/rendering/renderer/breadcrumbs.rb +12 -5
- data/lib/simple_navigation/rendering/renderer/links.rb +3 -8
- data/lib/simple_navigation/rendering/renderer/list.rb +0 -26
- data/spec/lib/simple_navigation/rendering/renderer/breadcrumbs_spec.rb +27 -0
- data/spec/spec_helper.rb +3 -3
- metadata +5 -4
data/CHANGELOG
CHANGED
@@ -1,3 +1,9 @@
|
|
1
|
+
*3.7.0
|
2
|
+
|
3
|
+
* Added new adapater for working with the Nanoc static site generation framework.
|
4
|
+
* Fix issue #22 - last link in a breadcrumb trail may now be rendered as static text insted by supplying :static_leaf => true as an option
|
5
|
+
* Allow breadcrumbs to be provided with link id and classes by supplying :allow_classes_and_ids => true as an option
|
6
|
+
|
1
7
|
*3.6.0
|
2
8
|
|
3
9
|
* Added linkless items functionality - the `url` parameter is now optional, items which aren't links will be rendered within a 'span' element rather than an 'a' element. `options` remain optional (defaults to an empty Hash). `options` may be provided without providing a `url` (detected by checking if the '`url`' parameter is a Hash or otherwise).
|
data/VERSION
CHANGED
@@ -1 +1 @@
|
|
1
|
-
3.
|
1
|
+
3.7.0
|
data/lib/simple_navigation.rb
CHANGED
@@ -46,6 +46,7 @@ module SimpleNavigation
|
|
46
46
|
return :rails if defined?(Rails)
|
47
47
|
return :padrino if defined?(Padrino)
|
48
48
|
return :sinatra if defined?(Sinatra)
|
49
|
+
return :nanoc if defined?(Nanoc3)
|
49
50
|
raise 'simple_navigation currently only works for Rails, Sinatra and Padrino apps'
|
50
51
|
end
|
51
52
|
|
@@ -58,6 +59,8 @@ module SimpleNavigation
|
|
58
59
|
SimpleNavigation::Adapters::Sinatra
|
59
60
|
when :padrino
|
60
61
|
SimpleNavigation::Adapters::Padrino
|
62
|
+
when :nanoc
|
63
|
+
SimpleNavigation::Adapters::Nanoc
|
61
64
|
end
|
62
65
|
end
|
63
66
|
|
@@ -0,0 +1,45 @@
|
|
1
|
+
module SimpleNavigation
|
2
|
+
module Adapters
|
3
|
+
class Nanoc < Base
|
4
|
+
class << self
|
5
|
+
def register(root)
|
6
|
+
SimpleNavigation.set_env(root, 'development')
|
7
|
+
Nanoc3::Context.send(:include, SimpleNavigation::Helpers)
|
8
|
+
end
|
9
|
+
end
|
10
|
+
|
11
|
+
def initialize(ctx)
|
12
|
+
@context = ctx
|
13
|
+
end
|
14
|
+
|
15
|
+
# Returns the context in which the config files will be evaluated
|
16
|
+
def context_for_eval
|
17
|
+
context
|
18
|
+
end
|
19
|
+
|
20
|
+
# Returns true if the current request's url matches the specified url.
|
21
|
+
# Used to determine if an item should be autohighlighted.
|
22
|
+
def current_page?(url)
|
23
|
+
path = context.item.path
|
24
|
+
path && path.chop == url
|
25
|
+
end
|
26
|
+
|
27
|
+
# Returns a link with the specified name, url and options.
|
28
|
+
# Used for rendering.
|
29
|
+
def link_to(name, url, options={})
|
30
|
+
"<a href='#{url}' #{to_attributes(options)}>#{name}</a>"
|
31
|
+
end
|
32
|
+
|
33
|
+
# Returns a tag of the specified type, content and options.
|
34
|
+
# Used for rendering.
|
35
|
+
def content_tag(type, content, options={})
|
36
|
+
"<#{type} #{to_attributes(options)}>#{content}</#{type}>"
|
37
|
+
end
|
38
|
+
|
39
|
+
private
|
40
|
+
def to_attributes(options)
|
41
|
+
options.map {|k, v| v.nil? ? nil : "#{k}='#{v}'"}.compact.join(' ')
|
42
|
+
end
|
43
|
+
end
|
44
|
+
end
|
45
|
+
end
|
@@ -59,7 +59,7 @@ module SimpleNavigation
|
|
59
59
|
# Returns the configured active_leaf_class if the item is the selected leaf,
|
60
60
|
# nil otherwise
|
61
61
|
def active_leaf_class
|
62
|
-
selected_by_condition? ? SimpleNavigation.config.active_leaf_class : nil
|
62
|
+
!selected_by_subnav? && selected_by_condition? ? SimpleNavigation.config.active_leaf_class : nil
|
63
63
|
end
|
64
64
|
|
65
65
|
# Returns the configured selected_class if the item is selected,
|
@@ -65,7 +65,43 @@ module SimpleNavigation
|
|
65
65
|
def expand_sub_navigation?(item)
|
66
66
|
expand_all? || item.selected?
|
67
67
|
end
|
68
|
-
|
68
|
+
|
69
|
+
# to allow overriding when there is specific logic determining
|
70
|
+
# when a link should not be rendered (eg. breadcrumbs renderer
|
71
|
+
# does not render the final breadcrumb as a link when instructed
|
72
|
+
# not to do so.)
|
73
|
+
def suppress_link?(item)
|
74
|
+
item.url.nil?
|
75
|
+
end
|
76
|
+
|
77
|
+
# determine and return link or static content depending on
|
78
|
+
# item/renderer conditions.
|
79
|
+
def tag_for(item)
|
80
|
+
if suppress_link?(item)
|
81
|
+
content_tag('span', item.name, link_options_for(item).except(:method))
|
82
|
+
else
|
83
|
+
link_to(item.name, item.url, options_for(item))
|
84
|
+
end
|
85
|
+
end
|
86
|
+
|
87
|
+
# to allow overriding when link options should be special-cased
|
88
|
+
# (eg. links renderer uses item options for the a-tag rather
|
89
|
+
# than an li-tag).
|
90
|
+
def options_for(item)
|
91
|
+
link_options_for(item)
|
92
|
+
end
|
93
|
+
|
94
|
+
# Extracts the options relevant for the generated link
|
95
|
+
#
|
96
|
+
def link_options_for(item)
|
97
|
+
special_options = {:method => item.method, :class => item.selected_class}.reject {|k, v| v.nil? }
|
98
|
+
link_options = item.html_options[:link]
|
99
|
+
return special_options unless link_options
|
100
|
+
opts = special_options.merge(link_options)
|
101
|
+
opts[:class] = [link_options[:class], item.selected_class].flatten.compact.join(' ')
|
102
|
+
opts.delete(:class) if opts[:class].nil? || opts[:class] == ''
|
103
|
+
opts
|
104
|
+
end
|
69
105
|
end
|
70
106
|
end
|
71
107
|
end
|
@@ -32,14 +32,21 @@ module SimpleNavigation
|
|
32
32
|
@join_with ||= options[:join_with] || " "
|
33
33
|
end
|
34
34
|
|
35
|
-
def
|
36
|
-
|
37
|
-
|
35
|
+
def suppress_link?(item)
|
36
|
+
super || (options[:static_leaf] && item.active_leaf_class)
|
37
|
+
end
|
38
|
+
|
39
|
+
# Extracts the options relevant for the generated link
|
40
|
+
#
|
41
|
+
def link_options_for(item)
|
42
|
+
if options[:allow_classes_and_ids]
|
43
|
+
opts = super
|
44
|
+
opts[:id] = "breadcrumb_#{opts[:id]}" if opts[:id]
|
45
|
+
opts
|
38
46
|
else
|
39
|
-
|
47
|
+
{:method => item.method}.merge(item.html_options.except(:class,:id))
|
40
48
|
end
|
41
49
|
end
|
42
50
|
end
|
43
|
-
|
44
51
|
end
|
45
52
|
end
|
@@ -11,7 +11,6 @@ module SimpleNavigation
|
|
11
11
|
# The ItemContainer's dom_class and dom_id are applied to the surrounding <div> element.
|
12
12
|
#
|
13
13
|
class Links < SimpleNavigation::Renderer::Base
|
14
|
-
|
15
14
|
def render(item_container)
|
16
15
|
div_content = item_container.items.inject([]) do |list, item|
|
17
16
|
list << tag_for(item)
|
@@ -19,14 +18,10 @@ module SimpleNavigation
|
|
19
18
|
content_tag(:div, div_content, {:id => item_container.dom_id, :class => item_container.dom_class})
|
20
19
|
end
|
21
20
|
|
22
|
-
|
23
|
-
|
24
|
-
|
25
|
-
else
|
26
|
-
link_to(item.name, item.url, {:method => item.method}.merge(item.html_options))
|
27
|
-
end
|
21
|
+
protected
|
22
|
+
def options_for(item)
|
23
|
+
{:method => item.method}.merge(item.html_options)
|
28
24
|
end
|
29
25
|
end
|
30
|
-
|
31
26
|
end
|
32
27
|
end
|
@@ -9,7 +9,6 @@ module SimpleNavigation
|
|
9
9
|
# By default, the renderer sets the item's key as dom_id for the rendered <li> element unless the config option <tt>autogenerate_item_ids</tt> is set to false.
|
10
10
|
# The id can also be explicitely specified by setting the id in the html-options of the 'item' method in the config/navigation.rb file.
|
11
11
|
class List < SimpleNavigation::Renderer::Base
|
12
|
-
|
13
12
|
def render(item_container)
|
14
13
|
list_content = item_container.items.inject([]) do |list, item|
|
15
14
|
li_options = item.html_options.reject {|k, v| k == :link}
|
@@ -25,31 +24,6 @@ module SimpleNavigation
|
|
25
24
|
content_tag(:ul, list_content, {:id => item_container.dom_id, :class => item_container.dom_class})
|
26
25
|
end
|
27
26
|
end
|
28
|
-
|
29
|
-
protected
|
30
|
-
|
31
|
-
def tag_for(item)
|
32
|
-
if item.url.nil?
|
33
|
-
content_tag('span', item.name, link_options_for(item).except(:method))
|
34
|
-
else
|
35
|
-
link_to(item.name, item.url, link_options_for(item))
|
36
|
-
end
|
37
|
-
end
|
38
|
-
|
39
|
-
# Extracts the options relevant for the generated link
|
40
|
-
#
|
41
|
-
def link_options_for(item)
|
42
|
-
special_options = {:method => item.method, :class => item.selected_class}.reject {|k, v| v.nil? }
|
43
|
-
link_options = item.html_options[:link]
|
44
|
-
return special_options unless link_options
|
45
|
-
opts = special_options.merge(link_options)
|
46
|
-
opts[:class] = [link_options[:class], item.selected_class].flatten.compact.join(' ')
|
47
|
-
opts.delete(:class) if opts[:class].nil? || opts[:class] == ''
|
48
|
-
opts
|
49
|
-
end
|
50
|
-
|
51
|
-
|
52
27
|
end
|
53
|
-
|
54
28
|
end
|
55
29
|
end
|
@@ -45,6 +45,33 @@ describe SimpleNavigation::Renderer::Breadcrumbs do
|
|
45
45
|
tag["class"].should be_nil
|
46
46
|
end
|
47
47
|
end
|
48
|
+
|
49
|
+
context 'with allow_classes_and_ids option' do
|
50
|
+
before(:each) do
|
51
|
+
@selection = HTML::Selector.new('div a').select(render(:users, :level => :all, :allow_classes_and_ids => true))
|
52
|
+
end
|
53
|
+
it "should render class and id" do
|
54
|
+
@selection.each do |tag|
|
55
|
+
raise unless tag.name == "a"
|
56
|
+
tag["id"].should_not be_nil
|
57
|
+
tag["class"].should_not be_nil
|
58
|
+
end
|
59
|
+
end
|
60
|
+
end
|
61
|
+
|
62
|
+
context 'with static_leaf option' do
|
63
|
+
before(:each) do
|
64
|
+
@selection = HTML::Selector.new('div *').select(render(:subnav1, :level => :all, :static_leaf => true))
|
65
|
+
end
|
66
|
+
it "should render link for non-leaes" do
|
67
|
+
@selection[0..-2].each do |tag|
|
68
|
+
tag.name.should == 'a'
|
69
|
+
end
|
70
|
+
end
|
71
|
+
it "should not render link for leaf" do
|
72
|
+
@selection.last.name.should == 'span'
|
73
|
+
end
|
74
|
+
end
|
48
75
|
end
|
49
76
|
|
50
77
|
|
data/spec/spec_helper.rb
CHANGED
@@ -41,7 +41,7 @@ end
|
|
41
41
|
|
42
42
|
def primary_items
|
43
43
|
[
|
44
|
-
[:users, 'users', 'first_url', {:id => 'my_id'}],
|
44
|
+
[:users, 'users', 'first_url', {:id => 'my_id', :link => {:id => 'my_link_id'}}],
|
45
45
|
[:invoices, 'invoices', 'second_url'],
|
46
46
|
[:accounts, 'accounts', 'third_url', {:style => 'float:right', :link => {:style => 'float:left'}}],
|
47
47
|
[:miscellany, 'miscellany']
|
@@ -77,10 +77,10 @@ def select_item(key)
|
|
77
77
|
if(key == :subnav1)
|
78
78
|
select_item(:invoices)
|
79
79
|
primary_item(:invoices) do |item|
|
80
|
-
item.instance_variable_get(:@sub_navigation).items.find { |i| i.key == key}.stub!(:selected? => true)
|
80
|
+
item.instance_variable_get(:@sub_navigation).items.find { |i| i.key == key}.stub!(:selected? => true, :selected_by_condition? => true)
|
81
81
|
end
|
82
82
|
else
|
83
|
-
primary_item(key) {|item| item.stub!(:selected? => true
|
83
|
+
primary_item(key) {|item| item.stub!(:selected? => true) unless item.frozen?}
|
84
84
|
end
|
85
85
|
end
|
86
86
|
|
metadata
CHANGED
@@ -1,13 +1,13 @@
|
|
1
1
|
--- !ruby/object:Gem::Specification
|
2
2
|
name: simple-navigation
|
3
3
|
version: !ruby/object:Gem::Version
|
4
|
-
hash:
|
4
|
+
hash: 27
|
5
5
|
prerelease: false
|
6
6
|
segments:
|
7
7
|
- 3
|
8
|
-
-
|
8
|
+
- 7
|
9
9
|
- 0
|
10
|
-
version: 3.
|
10
|
+
version: 3.7.0
|
11
11
|
platform: ruby
|
12
12
|
authors:
|
13
13
|
- Andi Schacke
|
@@ -16,7 +16,7 @@ autorequire:
|
|
16
16
|
bindir: bin
|
17
17
|
cert_chain: []
|
18
18
|
|
19
|
-
date:
|
19
|
+
date: 2012-02-20 00:00:00 +00:00
|
20
20
|
default_executable:
|
21
21
|
dependencies:
|
22
22
|
- !ruby/object:Gem::Dependency
|
@@ -101,6 +101,7 @@ files:
|
|
101
101
|
- lib/simple_navigation.rb
|
102
102
|
- lib/simple_navigation/adapters.rb
|
103
103
|
- lib/simple_navigation/adapters/base.rb
|
104
|
+
- lib/simple_navigation/adapters/nanoc.rb
|
104
105
|
- lib/simple_navigation/adapters/padrino.rb
|
105
106
|
- lib/simple_navigation/adapters/rails.rb
|
106
107
|
- lib/simple_navigation/adapters/sinatra.rb
|