simple-navigation 3.6.0 → 3.7.0
This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
- 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
|