simple-navigation 3.14.0 → 4.0.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.
- 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
|
[](https://codeclimate.com/github/codeplant/simple-navigation)
|
6
6
|
[](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)
|