simple-navigation 3.14.0 → 4.0.0
Sign up to get free protection for your applications and to get access to all the features.
- checksums.yaml +4 -4
- data/.gitignore +3 -0
- data/.rspec +1 -0
- data/.travis.yml +10 -2
- data/CHANGELOG.md +400 -0
- data/Guardfile +4 -2
- data/README.md +1 -1
- data/gemfiles/.bundle/config +2 -0
- data/gemfiles/rails-3-2-stable.gemfile +10 -0
- data/gemfiles/rails-4-1-stable.gemfile +6 -0
- data/gemfiles/rails-4-2-stable.gemfile +7 -0
- data/generators/navigation_config/navigation_config_generator.rb +0 -1
- data/generators/navigation_config/templates/config/navigation.rb +18 -15
- data/lib/simple_navigation.rb +25 -42
- data/lib/simple_navigation/adapters/rails.rb +1 -24
- data/lib/simple_navigation/adapters/sinatra.rb +2 -11
- data/lib/simple_navigation/config_file.rb +36 -0
- data/lib/simple_navigation/config_file_finder.rb +42 -0
- data/lib/simple_navigation/{core/configuration.rb → configuration.rb} +7 -1
- data/lib/simple_navigation/{rendering/helpers.rb → helpers.rb} +0 -4
- data/lib/simple_navigation/{core/item.rb → item.rb} +76 -85
- data/lib/simple_navigation/{core/item_adapter.rb → item_adapter.rb} +3 -17
- data/lib/simple_navigation/{core/item_container.rb → item_container.rb} +23 -14
- data/lib/simple_navigation/{core/items_provider.rb → items_provider.rb} +0 -0
- data/lib/simple_navigation/railtie.rb +7 -0
- data/lib/simple_navigation/renderer.rb +12 -0
- data/lib/simple_navigation/{rendering/renderer → renderer}/base.rb +1 -1
- data/lib/simple_navigation/{rendering/renderer → renderer}/breadcrumbs.rb +0 -0
- data/lib/simple_navigation/{rendering/renderer → renderer}/json.rb +2 -0
- data/lib/simple_navigation/{rendering/renderer → renderer}/links.rb +0 -0
- data/lib/simple_navigation/{rendering/renderer → renderer}/list.rb +0 -0
- data/lib/simple_navigation/{rendering/renderer → renderer}/text.rb +0 -0
- data/lib/simple_navigation/version.rb +1 -1
- data/simple-navigation.gemspec +5 -4
- data/spec/fake_app/config/navigation.rb +6 -0
- data/spec/fake_app/rails_app.rb +35 -0
- data/spec/initializers/coveralls.rb +3 -0
- data/spec/initializers/have_css_matcher.rb +8 -3
- data/spec/initializers/memfs.rb +7 -0
- data/spec/initializers/rails.rb +4 -0
- data/spec/initializers/rspec.rb +7 -0
- data/spec/integration/rendering_navigation_spec.rb +12 -0
- data/spec/{lib/simple_navigation → simple_navigation}/adapters/padrino_spec.rb +0 -2
- data/spec/{lib/simple_navigation → simple_navigation}/adapters/rails_spec.rb +36 -93
- data/spec/{lib/simple_navigation → simple_navigation}/adapters/sinatra_spec.rb +4 -6
- data/spec/simple_navigation/config_file_finder_spec.rb +50 -0
- data/spec/simple_navigation/config_file_spec.rb +25 -0
- data/spec/{lib/simple_navigation/core → simple_navigation}/configuration_spec.rb +29 -19
- data/spec/{lib/simple_navigation/rendering → simple_navigation}/helpers_spec.rb +10 -13
- data/spec/{lib/simple_navigation/core → simple_navigation}/item_adapter_spec.rb +14 -11
- data/spec/{lib/simple_navigation/core → simple_navigation}/item_container_spec.rb +130 -42
- data/spec/simple_navigation/item_spec.rb +467 -0
- data/spec/{lib/simple_navigation/core → simple_navigation}/items_provider_spec.rb +1 -3
- data/spec/{lib/simple_navigation/rendering → simple_navigation}/renderer/base_spec.rb +34 -36
- data/spec/{lib/simple_navigation/rendering → simple_navigation}/renderer/breadcrumbs_spec.rb +4 -7
- data/spec/{lib/simple_navigation/rendering → simple_navigation}/renderer/json_spec.rb +5 -11
- data/spec/{lib/simple_navigation/rendering → simple_navigation}/renderer/links_spec.rb +5 -8
- data/spec/{lib/simple_navigation/rendering → simple_navigation}/renderer/list_spec.rb +4 -7
- data/spec/{lib/simple_navigation/rendering → simple_navigation}/renderer/text_spec.rb +4 -7
- data/spec/simple_navigation_spec.rb +190 -0
- data/spec/spec_helper.rb +29 -35
- metadata +103 -68
- data/CHANGELOG +0 -292
- data/lib/simple_navigation/core.rb +0 -5
- data/lib/simple_navigation/rails_controller_methods.rb +0 -164
- data/lib/simple_navigation/rendering.rb +0 -12
- data/rails/init.rb +0 -1
- data/spec/lib/simple_navigation/core/item_spec.rb +0 -703
- data/spec/lib/simple_navigation/rails_controller_methods_spec.rb +0 -270
- data/spec/lib/simple_navigation_spec.rb +0 -300
data/README.md
CHANGED
@@ -5,7 +5,7 @@
|
|
5
5
|
[![Code Climate](https://codeclimate.com/github/codeplant/simple-navigation.png)](https://codeclimate.com/github/codeplant/simple-navigation)
|
6
6
|
[![Coverage Status](https://coveralls.io/repos/codeplant/simple-navigation/badge.png)](https://coveralls.io/r/codeplant/simple-navigation)
|
7
7
|
|
8
|
-
Simple Navigation is a ruby library for creating navigations (with multiple levels) for your Rails 2, Rails 3, Rails 4, Sinatra or Padrino applications. It runs with all ruby versions (including ruby 2.
|
8
|
+
Simple Navigation is a ruby library for creating navigations (with multiple levels) for your Rails 2, Rails 3, Rails 4, Sinatra or Padrino applications. It runs with all ruby versions (including ruby 2.x).
|
9
9
|
|
10
10
|
## Documentation
|
11
11
|
|
@@ -4,35 +4,38 @@ SimpleNavigation::Configuration.run do |navigation|
|
|
4
4
|
# Specify a custom renderer if needed.
|
5
5
|
# The default renderer is SimpleNavigation::Renderer::List which renders HTML lists.
|
6
6
|
# The renderer can also be specified as option in the render_navigation call.
|
7
|
-
#
|
7
|
+
#navigation.renderer = Your::Custom::Renderer
|
8
8
|
|
9
|
-
# Specify the class that will be applied to active navigation items.
|
10
|
-
#
|
9
|
+
# Specify the class that will be applied to active navigation items. Defaults to 'selected'
|
10
|
+
#navigation.selected_class = 'selected'
|
11
11
|
|
12
12
|
# Specify the class that will be applied to the current leaf of
|
13
13
|
# active navigation items. Defaults to 'simple-navigation-active-leaf'
|
14
|
-
#
|
14
|
+
#navigation.active_leaf_class = 'simple-navigation-active-leaf'
|
15
15
|
|
16
|
-
#
|
17
|
-
#
|
18
|
-
# navigation.autogenerate_item_ids = false
|
16
|
+
# Specify if item keys are added to navigation items as id. Defaults to true
|
17
|
+
#navigation.autogenerate_item_ids = true
|
19
18
|
|
20
19
|
# You can override the default logic that is used to autogenerate the item ids.
|
21
20
|
# To do this, define a Proc which takes the key of the current item as argument.
|
22
21
|
# The example below would add a prefix to each key.
|
23
|
-
#
|
22
|
+
#navigation.id_generator = Proc.new {|key| "my-prefix-#{key}"}
|
24
23
|
|
25
24
|
# If you need to add custom html around item names, you can define a proc that
|
26
25
|
# will be called with the name you pass in to the navigation.
|
27
26
|
# The example below shows how to wrap items spans.
|
28
|
-
#
|
27
|
+
#navigation.name_generator = Proc.new {|name, item| "<span>#{name}</span>"}
|
29
28
|
|
30
|
-
#
|
31
|
-
#
|
32
|
-
|
29
|
+
# Specify if the auto highlight feature is turned on (globally, for the whole navigation). Defaults to true
|
30
|
+
#navigation.auto_highlight = true
|
31
|
+
|
32
|
+
# Specifies whether auto highlight should ignore query params and/or anchors when
|
33
|
+
# comparing the navigation items with the current URL. Defaults to true
|
34
|
+
#navigation.ignore_query_params_on_auto_highlight = true
|
35
|
+
#navigation.ignore_anchors_on_auto_highlight = true
|
33
36
|
|
34
37
|
# If this option is set to true, all item names will be considered as safe (passed through html_safe). Defaults to false.
|
35
|
-
#
|
38
|
+
#navigation.consider_item_names_as_safe = false
|
36
39
|
|
37
40
|
# Define the primary navigation
|
38
41
|
navigation.items do |primary|
|
@@ -69,9 +72,9 @@ SimpleNavigation::Configuration.run do |navigation|
|
|
69
72
|
|
70
73
|
# you can also specify html attributes to attach to this particular level
|
71
74
|
# works for all levels of the menu
|
72
|
-
#
|
75
|
+
#primary.dom_attributes = {id: 'menu-id', class: 'menu-class'}
|
73
76
|
|
74
77
|
# You can turn off auto highlighting for a specific level
|
75
|
-
#
|
78
|
+
#primary.auto_highlight = false
|
76
79
|
end
|
77
80
|
end
|
data/lib/simple_navigation.rb
CHANGED
@@ -4,9 +4,15 @@ require 'active_support/core_ext/hash'
|
|
4
4
|
require 'active_support/core_ext/module/attribute_accessors'
|
5
5
|
|
6
6
|
require 'simple_navigation/version'
|
7
|
-
require 'simple_navigation/
|
8
|
-
require 'simple_navigation/
|
7
|
+
require 'simple_navigation/configuration'
|
8
|
+
require 'simple_navigation/item_adapter'
|
9
|
+
require 'simple_navigation/item'
|
10
|
+
require 'simple_navigation/item_container'
|
11
|
+
require 'simple_navigation/items_provider'
|
12
|
+
require 'simple_navigation/renderer'
|
9
13
|
require 'simple_navigation/adapters'
|
14
|
+
require 'simple_navigation/config_file_finder'
|
15
|
+
require 'simple_navigation/railtie' if defined?(::Rails)
|
10
16
|
|
11
17
|
require 'forwardable'
|
12
18
|
|
@@ -55,7 +61,7 @@ module SimpleNavigation
|
|
55
61
|
def set_env(root, environment)
|
56
62
|
self.root = root
|
57
63
|
self.environment = environment
|
58
|
-
config_file_paths <<
|
64
|
+
config_file_paths << default_config_file_path
|
59
65
|
end
|
60
66
|
|
61
67
|
# Returns the current framework in which the plugin is running.
|
@@ -89,30 +95,6 @@ module SimpleNavigation
|
|
89
95
|
File.join(root, 'config')
|
90
96
|
end
|
91
97
|
|
92
|
-
# Returns true if the config_file for specified context does exist.
|
93
|
-
def config_file?(navigation_context = :default)
|
94
|
-
!!config_file(navigation_context)
|
95
|
-
end
|
96
|
-
|
97
|
-
# Returns the path to the config file for the given navigation context or
|
98
|
-
# nil if no matching config file can be found.
|
99
|
-
# If multiple config_paths are set, it returns the first matching path.
|
100
|
-
def config_file(navigation_context = :default)
|
101
|
-
config_file_paths
|
102
|
-
.map { |path| File.join(path, config_file_name(navigation_context)) }
|
103
|
-
.find { |full_path| File.exist?(full_path) }
|
104
|
-
end
|
105
|
-
|
106
|
-
# Returns the name of the config file for the given navigation_context
|
107
|
-
def config_file_name(navigation_context = :default)
|
108
|
-
prefix = if navigation_context == :default
|
109
|
-
''
|
110
|
-
else
|
111
|
-
"#{navigation_context.to_s.underscore}_"
|
112
|
-
end
|
113
|
-
"#{prefix}navigation.rb"
|
114
|
-
end
|
115
|
-
|
116
98
|
# Resets the list of config_file_paths to the specified path
|
117
99
|
def config_file_path=(path)
|
118
100
|
self.config_file_paths = [path]
|
@@ -121,20 +103,10 @@ module SimpleNavigation
|
|
121
103
|
# Reads the config_file for the specified navigation_context and stores it
|
122
104
|
# for later evaluation.
|
123
105
|
def load_config(navigation_context = :default)
|
124
|
-
unless config_file?(navigation_context)
|
125
|
-
fail "Config file '#{config_file_name(navigation_context)}' not " \
|
126
|
-
"found in path(s) #{config_file_paths.join(', ')}!"
|
127
|
-
end
|
128
|
-
|
129
|
-
# FIXME: what about update_config and update_config! methods ?
|
130
106
|
if environment == 'production'
|
131
|
-
|
132
|
-
IO.read(config_file(navigation_context))
|
133
|
-
end
|
107
|
+
update_config(navigation_context)
|
134
108
|
else
|
135
|
-
|
136
|
-
IO.read(config_file(navigation_context))
|
137
|
-
end
|
109
|
+
update_config!(navigation_context)
|
138
110
|
end
|
139
111
|
end
|
140
112
|
|
@@ -186,9 +158,20 @@ module SimpleNavigation
|
|
186
158
|
|
187
159
|
private
|
188
160
|
|
189
|
-
def
|
190
|
-
|
191
|
-
|
161
|
+
def config_file(navigation_context)
|
162
|
+
ConfigFileFinder.new(config_file_paths).find(navigation_context)
|
163
|
+
end
|
164
|
+
|
165
|
+
def read_config(navigation_context)
|
166
|
+
File.read config_file(navigation_context)
|
167
|
+
end
|
168
|
+
|
169
|
+
def update_config(navigation_context)
|
170
|
+
config_files[navigation_context] ||= read_config(navigation_context)
|
171
|
+
end
|
172
|
+
|
173
|
+
def update_config!(navigation_context)
|
174
|
+
config_files[navigation_context] = read_config(navigation_context)
|
192
175
|
end
|
193
176
|
end
|
194
177
|
end
|
@@ -4,7 +4,7 @@ module SimpleNavigation
|
|
4
4
|
attr_reader :controller, :template
|
5
5
|
|
6
6
|
def self.register
|
7
|
-
SimpleNavigation.set_env(
|
7
|
+
SimpleNavigation.set_env(::Rails.root, ::Rails.env)
|
8
8
|
ActionController::Base.send(:include, SimpleNavigation::Helpers)
|
9
9
|
SimpleNavigation::Helpers.instance_methods.each do |m|
|
10
10
|
ActionController::Base.send(:helper_method, m.to_sym)
|
@@ -51,18 +51,6 @@ module SimpleNavigation
|
|
51
51
|
|
52
52
|
protected
|
53
53
|
|
54
|
-
def self.rails_root
|
55
|
-
gte_rails3? ? ::Rails.root : ::RAILS_ROOT
|
56
|
-
end
|
57
|
-
|
58
|
-
def self.rails_env
|
59
|
-
gte_rails3? ? ::Rails.env : ::RAILS_ENV
|
60
|
-
end
|
61
|
-
|
62
|
-
def self.gte_rails3?
|
63
|
-
::Rails::VERSION::MAJOR >= 3
|
64
|
-
end
|
65
|
-
|
66
54
|
def template_from(controller)
|
67
55
|
if controller.respond_to?(:view_context)
|
68
56
|
controller.view_context
|
@@ -97,14 +85,3 @@ module SimpleNavigation
|
|
97
85
|
end
|
98
86
|
end
|
99
87
|
end
|
100
|
-
|
101
|
-
# Initializer for Rails3
|
102
|
-
if defined?(Rails) && SimpleNavigation::Adapters::Rails.gte_rails3?
|
103
|
-
module SimpleNavigation
|
104
|
-
class Railtie < Rails::Railtie
|
105
|
-
initializer 'simple_navigation.register' do |app|
|
106
|
-
SimpleNavigation.register
|
107
|
-
end
|
108
|
-
end
|
109
|
-
end
|
110
|
-
end
|
@@ -3,9 +3,8 @@ require 'cgi'
|
|
3
3
|
module SimpleNavigation
|
4
4
|
module Adapters
|
5
5
|
class Sinatra < Base
|
6
|
-
def self.register
|
7
|
-
SimpleNavigation.set_env(
|
8
|
-
::Sinatra::Application.send(:helpers, SimpleNavigation::Helpers)
|
6
|
+
def self.register(app)
|
7
|
+
SimpleNavigation.set_env(app.root, app.environment)
|
9
8
|
end
|
10
9
|
|
11
10
|
def initialize(context)
|
@@ -50,14 +49,6 @@ module SimpleNavigation
|
|
50
49
|
|
51
50
|
protected
|
52
51
|
|
53
|
-
def self.sinatra_root
|
54
|
-
::Sinatra::Application.root
|
55
|
-
end
|
56
|
-
|
57
|
-
def self.sinatra_environment
|
58
|
-
::Sinatra::Application.environment
|
59
|
-
end
|
60
|
-
|
61
52
|
def to_attributes(options)
|
62
53
|
options.map { |k, v| v.nil? ? '' : " #{k}='#{v}'" }.join
|
63
54
|
end
|
@@ -0,0 +1,36 @@
|
|
1
|
+
require 'active_support/core_ext/string'
|
2
|
+
|
3
|
+
module SimpleNavigation
|
4
|
+
# Internal: Encapsulates the config file naming knowledge.
|
5
|
+
class ConfigFile
|
6
|
+
# Internal: Initializes a ConfigFile.
|
7
|
+
#
|
8
|
+
# context - The navigation context for this ConfigFile.
|
9
|
+
def initialize(context)
|
10
|
+
@prefix = prefix_for_context(context)
|
11
|
+
end
|
12
|
+
|
13
|
+
# Internal: Returns the name of the configuration file on disk.
|
14
|
+
#
|
15
|
+
# Based on the the initialization context the outcome may differ.
|
16
|
+
#
|
17
|
+
# Examples
|
18
|
+
#
|
19
|
+
# ConfigFile.new.name # => "navigation.rb"
|
20
|
+
# ConfigFile.new(:default).name # => "navigation.rb"
|
21
|
+
# ConfigFile.new(:other).name # => "other_navigation.rb"
|
22
|
+
#
|
23
|
+
# Returns a String representing the name of the configuration file on disk.
|
24
|
+
def name
|
25
|
+
@name ||= "#{prefix}navigation.rb"
|
26
|
+
end
|
27
|
+
|
28
|
+
private
|
29
|
+
|
30
|
+
attr_reader :prefix
|
31
|
+
|
32
|
+
def prefix_for_context(context)
|
33
|
+
context == :default ? '' : "#{context.to_s.underscore}_"
|
34
|
+
end
|
35
|
+
end
|
36
|
+
end
|
@@ -0,0 +1,42 @@
|
|
1
|
+
require 'simple_navigation/config_file'
|
2
|
+
|
3
|
+
module SimpleNavigation
|
4
|
+
# Internal: Encapsulates the configuration file finding logic.
|
5
|
+
class ConfigFileFinder
|
6
|
+
# Internal: Initializes a ConfigFileFinder.
|
7
|
+
#
|
8
|
+
# paths - an enumerable list of paths in which to look for configuration
|
9
|
+
# files.
|
10
|
+
def initialize(paths)
|
11
|
+
@paths = paths
|
12
|
+
end
|
13
|
+
|
14
|
+
# Internal: Searches a configuration file for the given context in the
|
15
|
+
# initialization paths.
|
16
|
+
#
|
17
|
+
# context - The navigation context for which to look the configuration file.
|
18
|
+
#
|
19
|
+
# Returns a String representing the full path of the configuation file.
|
20
|
+
# Raises StandardError if no file is found.
|
21
|
+
def find(context)
|
22
|
+
config_file_name = config_file_name_for_context(context)
|
23
|
+
|
24
|
+
find_config_file(config_file_name) ||
|
25
|
+
fail("Config file '#{config_file_name}' not found in " \
|
26
|
+
"path(s) #{paths.join(', ')}!")
|
27
|
+
end
|
28
|
+
|
29
|
+
private
|
30
|
+
|
31
|
+
attr_reader :paths
|
32
|
+
|
33
|
+
def config_file_name_for_context(context)
|
34
|
+
ConfigFile.new(context).name
|
35
|
+
end
|
36
|
+
|
37
|
+
def find_config_file(config_file_name)
|
38
|
+
paths.map { |path| File.join(path, config_file_name) }
|
39
|
+
.find { |full_path| File.exist?(full_path) }
|
40
|
+
end
|
41
|
+
end
|
42
|
+
end
|
@@ -7,7 +7,10 @@ module SimpleNavigation
|
|
7
7
|
|
8
8
|
attr_accessor :autogenerate_item_ids,
|
9
9
|
:auto_highlight,
|
10
|
-
:consider_item_names_as_safe
|
10
|
+
:consider_item_names_as_safe,
|
11
|
+
:highlight_on_subpath,
|
12
|
+
:ignore_query_params_on_auto_highlight,
|
13
|
+
:ignore_anchors_on_auto_highlight
|
11
14
|
|
12
15
|
attr_reader :primary_navigation
|
13
16
|
|
@@ -33,6 +36,9 @@ module SimpleNavigation
|
|
33
36
|
@autogenerate_item_ids = true
|
34
37
|
@auto_highlight = true
|
35
38
|
@consider_item_names_as_safe = false
|
39
|
+
@highlight_on_subpath = false
|
40
|
+
@ignore_anchors_on_auto_highlight = true
|
41
|
+
@ignore_query_params_on_auto_highlight = true
|
36
42
|
end
|
37
43
|
|
38
44
|
def active_leaf_class
|
@@ -34,10 +34,6 @@ module SimpleNavigation
|
|
34
34
|
SimpleNavigation.config.items(options[:items], &block)
|
35
35
|
end
|
36
36
|
|
37
|
-
if SimpleNavigation.respond_to?(:handle_explicit_navigation)
|
38
|
-
SimpleNavigation.handle_explicit_navigation
|
39
|
-
end
|
40
|
-
|
41
37
|
unless SimpleNavigation.primary_navigation
|
42
38
|
fail 'no primary navigation defined, either use a navigation config ' \
|
43
39
|
'file or pass items directly to render_navigation'
|
@@ -2,27 +2,23 @@ module SimpleNavigation
|
|
2
2
|
# Represents an item in your navigation.
|
3
3
|
# Gets generated by the item method in the config-file.
|
4
4
|
class Item
|
5
|
-
attr_reader :
|
6
|
-
:
|
7
|
-
:method,
|
5
|
+
attr_reader :key,
|
6
|
+
:name,
|
8
7
|
:sub_navigation,
|
9
8
|
:url
|
10
9
|
|
11
|
-
attr_writer :html_options
|
12
|
-
|
13
10
|
# see ItemContainer#item
|
14
11
|
#
|
15
12
|
# The subnavigation (if any) is either provided by a block or
|
16
13
|
# passed in directly as <tt>items</tt>
|
17
|
-
def initialize(container, key, name,
|
18
|
-
|
19
|
-
|
20
|
-
|
21
|
-
|
22
|
-
|
23
|
-
@container = setup_container(container, options)
|
14
|
+
def initialize(container, key, name, url = nil, opts = {}, &sub_nav_block)
|
15
|
+
self.container = container
|
16
|
+
self.key = key
|
17
|
+
self.name = name.respond_to?(:call) ? name.call : name
|
18
|
+
self.url = url.respond_to?(:call) ? url.call : url
|
19
|
+
self.options = opts
|
24
20
|
|
25
|
-
setup_sub_navigation(items, &sub_nav_block)
|
21
|
+
setup_sub_navigation(options[:items], &sub_nav_block)
|
26
22
|
end
|
27
23
|
|
28
24
|
# Returns the item's name.
|
@@ -32,8 +28,8 @@ module SimpleNavigation
|
|
32
28
|
#
|
33
29
|
def name(options = {})
|
34
30
|
options = { apply_generator: true }.merge(options)
|
35
|
-
if
|
36
|
-
|
31
|
+
if options[:apply_generator]
|
32
|
+
config.name_generator.call(@name, self)
|
37
33
|
else
|
38
34
|
@name
|
39
35
|
end
|
@@ -42,35 +38,32 @@ module SimpleNavigation
|
|
42
38
|
# Returns true if this navigation item should be rendered as 'selected'.
|
43
39
|
# An item is selected if
|
44
40
|
#
|
45
|
-
# * it has been explicitly selected in a controller or
|
46
41
|
# * it has a subnavigation and one of its subnavigation items is selected or
|
47
42
|
# * its url matches the url of the current request (auto highlighting)
|
48
43
|
#
|
49
44
|
def selected?
|
50
|
-
@selected ||=
|
51
|
-
selected_by_subnav? ||
|
52
|
-
selected_by_condition?
|
45
|
+
@selected ||= selected_by_subnav? || selected_by_condition?
|
53
46
|
end
|
54
47
|
|
55
48
|
# Returns the html-options hash for the item, i.e. the options specified
|
56
49
|
# for this item in the config-file.
|
57
50
|
# It also adds the 'selected' class to the list of classes if necessary.
|
58
51
|
def html_options
|
59
|
-
|
60
|
-
|
52
|
+
html_opts = options.fetch(:html) { Hash.new }
|
53
|
+
html_opts[:id] ||= autogenerated_item_id
|
61
54
|
|
62
|
-
classes = [
|
55
|
+
classes = [html_opts[:class], selected_class, active_leaf_class]
|
63
56
|
classes = classes.flatten.compact.join(' ')
|
64
|
-
|
57
|
+
html_opts[:class] = classes if classes && !classes.empty?
|
65
58
|
|
66
|
-
|
59
|
+
html_opts
|
67
60
|
end
|
68
61
|
|
69
62
|
# Returns the configured active_leaf_class if the item is the selected leaf,
|
70
63
|
# nil otherwise
|
71
64
|
def active_leaf_class
|
72
65
|
if !selected_by_subnav? && selected_by_condition?
|
73
|
-
|
66
|
+
config.active_leaf_class
|
74
67
|
end
|
75
68
|
end
|
76
69
|
|
@@ -78,10 +71,26 @@ module SimpleNavigation
|
|
78
71
|
# nil otherwise
|
79
72
|
def selected_class
|
80
73
|
if selected?
|
81
|
-
container.selected_class ||
|
74
|
+
container.selected_class || config.selected_class
|
82
75
|
end
|
83
76
|
end
|
84
77
|
|
78
|
+
# Returns the :highlights_on option as set at initialization
|
79
|
+
def highlights_on
|
80
|
+
@highlights_on ||= options[:highlights_on]
|
81
|
+
end
|
82
|
+
|
83
|
+
# Returns the :method option as set at initialization
|
84
|
+
def method
|
85
|
+
@method ||= options[:method]
|
86
|
+
end
|
87
|
+
|
88
|
+
# Returns the html attributes for the link as set with the :link_html option
|
89
|
+
# at initialization
|
90
|
+
def link_html_options
|
91
|
+
@link_html_options ||= options[:link_html]
|
92
|
+
end
|
93
|
+
|
85
94
|
protected
|
86
95
|
|
87
96
|
# Returns true if item has a subnavigation and
|
@@ -90,10 +99,6 @@ module SimpleNavigation
|
|
90
99
|
sub_navigation && sub_navigation.selected?
|
91
100
|
end
|
92
101
|
|
93
|
-
def selected_by_config?
|
94
|
-
false
|
95
|
-
end
|
96
|
-
|
97
102
|
# Returns true if the item's url matches the request's current url.
|
98
103
|
def selected_by_condition?
|
99
104
|
highlights_on ? selected_by_highlights_on? : selected_by_autohighlight?
|
@@ -104,86 +109,72 @@ module SimpleNavigation
|
|
104
109
|
url == '/' && SimpleNavigation.request_path == '/'
|
105
110
|
end
|
106
111
|
|
107
|
-
# Returns true if the item's id should be added to the rendered output.
|
108
|
-
def autogenerate_item_ids?
|
109
|
-
SimpleNavigation.config.autogenerate_item_ids
|
110
|
-
end
|
111
|
-
|
112
112
|
# Returns the item's id which is added to the rendered output.
|
113
113
|
def autogenerated_item_id
|
114
|
-
|
114
|
+
config.id_generator.call(key) if config.autogenerate_item_ids
|
115
115
|
end
|
116
116
|
|
117
117
|
# Return true if auto_highlight is on for this item.
|
118
118
|
def auto_highlight?
|
119
|
-
|
120
|
-
end
|
121
|
-
|
122
|
-
def url_without_anchor
|
123
|
-
url && url.split('#').first
|
119
|
+
config.auto_highlight && container.auto_highlight
|
124
120
|
end
|
125
121
|
|
126
122
|
private
|
127
123
|
|
128
|
-
|
124
|
+
attr_accessor :container,
|
125
|
+
:options
|
129
126
|
|
130
|
-
attr_writer :
|
127
|
+
attr_writer :key,
|
128
|
+
:name,
|
131
129
|
:sub_navigation,
|
132
130
|
:url
|
133
131
|
|
132
|
+
def config
|
133
|
+
SimpleNavigation.config
|
134
|
+
end
|
135
|
+
|
136
|
+
def request_uri
|
137
|
+
SimpleNavigation.request_uri
|
138
|
+
end
|
139
|
+
|
140
|
+
def remove_anchors(url_with_anchors)
|
141
|
+
url_with_anchors && url_with_anchors.split('#').first
|
142
|
+
end
|
143
|
+
|
144
|
+
def remove_query_params(url_with_params)
|
145
|
+
url_with_params && url_with_params.split('?').first
|
146
|
+
end
|
147
|
+
|
148
|
+
def url_for_autohighlight
|
149
|
+
relevant_url = remove_anchors(self.url) if config.ignore_anchors_on_auto_highlight
|
150
|
+
relevant_url = remove_query_params(relevant_url) if config.ignore_query_params_on_auto_highlight
|
151
|
+
relevant_url
|
152
|
+
end
|
153
|
+
|
134
154
|
def selected_by_autohighlight?
|
135
|
-
auto_highlight?
|
136
|
-
|
137
|
-
|
138
|
-
|
155
|
+
return false unless auto_highlight?
|
156
|
+
root_path_match? ||
|
157
|
+
SimpleNavigation.current_page?(url_for_autohighlight) ||
|
158
|
+
autohighlight_by_subpath?
|
139
159
|
end
|
140
160
|
|
141
|
-
def
|
142
|
-
|
161
|
+
def autohighlight_by_subpath?
|
162
|
+
config.highlight_on_subpath && selected_by_subpath?
|
163
|
+
end
|
143
164
|
|
165
|
+
def selected_by_highlights_on?
|
144
166
|
case highlights_on
|
145
|
-
when Regexp then
|
167
|
+
when Regexp then !!(request_uri =~ highlights_on)
|
146
168
|
when Proc then highlights_on.call
|
147
|
-
when :subpath
|
148
|
-
escaped_url = Regexp.escape(url_without_anchor)
|
149
|
-
!!(SimpleNavigation.request_uri =~ /^#{escaped_url}(\/|$|\?)/i)
|
169
|
+
when :subpath then selected_by_subpath?
|
150
170
|
else
|
151
171
|
fail ArgumentError, ':highlights_on must be a Regexp, Proc or :subpath'
|
152
172
|
end
|
153
173
|
end
|
154
174
|
|
155
|
-
def
|
156
|
-
|
157
|
-
|
158
|
-
end
|
159
|
-
|
160
|
-
if options[:container_id]
|
161
|
-
container.dom_id = options.delete(:container_id)
|
162
|
-
end
|
163
|
-
|
164
|
-
container.dom_attributes = if options[:container_attributes]
|
165
|
-
options.delete(:container_attributes)
|
166
|
-
else
|
167
|
-
{}
|
168
|
-
end
|
169
|
-
|
170
|
-
if options[:selected_class]
|
171
|
-
container.selected_class = options.delete(:selected_class)
|
172
|
-
end
|
173
|
-
|
174
|
-
container
|
175
|
-
end
|
176
|
-
|
177
|
-
def setup_url_and_options(url_or_options, options_or_nil)
|
178
|
-
case url_or_options
|
179
|
-
when Hash then options = url_or_options # there is no url
|
180
|
-
when Proc then self.url = url_or_options.call
|
181
|
-
else self.url = url_or_options
|
182
|
-
end
|
183
|
-
|
184
|
-
options ||= options_or_nil
|
185
|
-
self.highlights_on = options.delete(:highlights_on)
|
186
|
-
self.html_options = options
|
175
|
+
def selected_by_subpath?
|
176
|
+
escaped_url = Regexp.escape(url_for_autohighlight)
|
177
|
+
!!(request_uri =~ /^#{escaped_url}(\/|$||\?)/i)
|
187
178
|
end
|
188
179
|
|
189
180
|
def setup_sub_navigation(items = nil, &sub_nav_block)
|