antw-kin 0.3.2 → 0.3.3
Sign up to get free protection for your applications and to get access to all the features.
- data/CHANGELOG +11 -0
- data/VERSION.yml +1 -1
- data/lib/kin.rb +4 -1
- data/lib/kin/masthead.rb +113 -60
- data/lib/kin/nav.rb +29 -4
- data/lib/kin/nav/builder.rb +4 -2
- data/lib/kin/nav/formatters.rb +187 -92
- data/lib/kin/nav/helper_mixin.rb +1 -1
- data/lib/kin/sprites.rb +100 -0
- data/lib/kin/sprites/image_generator.rb +75 -0
- data/lib/kin/sprites/rake_runner.rb +179 -0
- data/lib/kin/sprites/sass_generator.rb +81 -0
- data/lib/kin/tasks/sprites.rb +34 -0
- data/spec/fixture/app/views/nav_specs/has_right_formatter.html.haml +9 -0
- data/spec/fixture/app/views/nav_specs/subnav_formatter.html.haml +7 -0
- data/spec/fixture/config/sprites.different.yml +11 -0
- data/spec/fixture/config/sprites.yml +9 -0
- data/spec/fixture/public/images/sprites/src/one.png +0 -0
- data/spec/fixture/public/images/sprites/src/three.png +0 -0
- data/spec/fixture/public/images/sprites/src/two.png +0 -0
- data/spec/masthead_spec.rb +1 -77
- data/spec/nav_spec.rb +32 -0
- data/spec/spec_helper.rb +31 -0
- data/spec/sprites_spec.rb +349 -0
- metadata +16 -4
- data/lib/kin/merbtasks.rb +0 -0
- data/spec/fixture/app/views/masthead_specs/no_border.html.haml +0 -2
data/CHANGELOG
CHANGED
@@ -1,3 +1,14 @@
|
|
1
|
+
== 0.3.3 2009-08-28
|
2
|
+
|
3
|
+
* Added Subnav and HasRight menu formatters.
|
4
|
+
* A custom formatter can now be supplied when setting up a menu.
|
5
|
+
|
6
|
+
== 0.3.2 2009-08-27
|
7
|
+
|
8
|
+
* The _modal.sass partial, containing shared styles for modal dialogs, has
|
9
|
+
been added to assets/css.
|
10
|
+
* Added a block syntax for defining nav items.
|
11
|
+
|
1
12
|
== 0.3.1 2009-08-26
|
2
13
|
|
3
14
|
* When setting on which controller and actions a nav item can be active, you
|
data/VERSION.yml
CHANGED
data/lib/kin.rb
CHANGED
@@ -14,10 +14,13 @@ if defined?(Merb::Plugins)
|
|
14
14
|
require File.join(kin, 'nav')
|
15
15
|
|
16
16
|
Merb::Plugins.add_rakefiles(File.join(kin, 'tasks', 'sync_assets'))
|
17
|
+
Merb::Plugins.add_rakefiles(File.join(kin, 'tasks', 'sprites'))
|
17
18
|
|
18
19
|
# Default nav formatter. Can be overridden in an after_app_loads block, or
|
19
20
|
# on a case-by-case basis in +display_navigation+.
|
20
|
-
Merb::Plugins.config[:kin] = {
|
21
|
+
Merb::Plugins.config[:kin] = {
|
22
|
+
:nav_formatter => Kin::Nav::Formatters::Basic
|
23
|
+
}
|
21
24
|
|
22
25
|
Merb::BootLoader.after_app_loads do
|
23
26
|
# Add default time formats.
|
data/lib/kin/masthead.rb
CHANGED
@@ -22,20 +22,38 @@ module Kin
|
|
22
22
|
class Builder
|
23
23
|
include Merb::Helpers::Tag
|
24
24
|
|
25
|
-
|
25
|
+
CSS_CLASSES = {
|
26
26
|
:title => ''.freeze,
|
27
27
|
:subtitle => 'subtitle'.freeze,
|
28
28
|
:right_title => 'main'.freeze,
|
29
29
|
:right_subtitle => 'subtitle'.freeze
|
30
30
|
}.freeze
|
31
31
|
|
32
|
-
|
33
|
-
|
34
|
-
|
32
|
+
##
|
33
|
+
# Creates a new masthead builder.
|
34
|
+
#
|
35
|
+
# @api semipublic
|
36
|
+
#
|
35
37
|
def initialize
|
36
|
-
@title
|
37
|
-
@
|
38
|
-
|
38
|
+
@title = @right_title = @subtitle = @right_subtitle = nil
|
39
|
+
@options = Hash.new { |hash, key| hash[key] = {} }
|
40
|
+
end
|
41
|
+
|
42
|
+
##
|
43
|
+
# Builds a masthead.
|
44
|
+
#
|
45
|
+
# Yields the builder instance providing a DSL for setting up the
|
46
|
+
# masthead as desired.
|
47
|
+
#
|
48
|
+
# @return [Kin::Nav::Builder]
|
49
|
+
#
|
50
|
+
# @yield [Kin::Nav::Builder]
|
51
|
+
#
|
52
|
+
# @api semipublic
|
53
|
+
#
|
54
|
+
def build
|
55
|
+
yield self
|
56
|
+
self
|
39
57
|
end
|
40
58
|
|
41
59
|
##
|
@@ -46,6 +64,8 @@ module Kin
|
|
46
64
|
# @param [Hash] options A hash containing extraoptions.
|
47
65
|
# @return [String] The masthead title.
|
48
66
|
#
|
67
|
+
# @api public
|
68
|
+
#
|
49
69
|
def title(value = nil, options = nil)
|
50
70
|
end
|
51
71
|
|
@@ -57,6 +77,8 @@ module Kin
|
|
57
77
|
# @param [Hash] options A hash containing extraoptions.
|
58
78
|
# @return [String] The masthead right title.
|
59
79
|
#
|
80
|
+
# @api public
|
81
|
+
#
|
60
82
|
def right_title(value = nil, options = nil)
|
61
83
|
end
|
62
84
|
|
@@ -68,6 +90,8 @@ module Kin
|
|
68
90
|
# @param [Hash] options A hash containing extraoptions.
|
69
91
|
# @return [String] The masthead subtitle.
|
70
92
|
#
|
93
|
+
# @api public
|
94
|
+
#
|
71
95
|
def subtitle(value = nil, options = nil)
|
72
96
|
end
|
73
97
|
|
@@ -79,6 +103,8 @@ module Kin
|
|
79
103
|
# @param [Hash] options A hash containing extraoptions.
|
80
104
|
# @return [String] The masthead right subtitle.
|
81
105
|
#
|
106
|
+
# @api public
|
107
|
+
#
|
82
108
|
def right_subtitle(value = nil, options = nil)
|
83
109
|
end
|
84
110
|
|
@@ -101,89 +127,114 @@ module Kin
|
|
101
127
|
end
|
102
128
|
|
103
129
|
##
|
104
|
-
# Returns the
|
105
|
-
#
|
130
|
+
# Returns the HTML representation of the masthead.
|
131
|
+
#
|
132
|
+
# @return [String]
|
133
|
+
# The masthead with all the various titles.
|
134
|
+
#
|
135
|
+
# @api public
|
106
136
|
#
|
107
137
|
def to_html
|
108
|
-
formatted_title = formatted(:title, :h1)
|
109
|
-
formatted_subtitle = formatted(:subtitle) if @subtitle
|
110
|
-
|
111
|
-
extras = if has_extras?
|
112
|
-
'<div class="extra">%s %s</div>' % [
|
113
|
-
formatted(:right_title) || '<span class="main"> </span>',
|
114
|
-
@right_subtitle ? formatted(:right_subtitle) : ''
|
115
|
-
]
|
116
|
-
end
|
117
|
-
|
118
138
|
<<-HTML
|
119
|
-
<div id="masthead"
|
139
|
+
<div id="masthead">
|
120
140
|
<div class="details">
|
121
|
-
#{
|
122
|
-
#{
|
141
|
+
#{ formatted(:title, :h1) }
|
142
|
+
#{ formatted(:subtitle) }
|
123
143
|
</div>
|
124
144
|
|
125
|
-
#{
|
145
|
+
#{ extras_as_html }
|
126
146
|
</div>
|
127
147
|
HTML
|
128
148
|
end
|
129
149
|
|
130
|
-
|
131
|
-
# Builds a masthead.
|
132
|
-
#
|
133
|
-
def build
|
134
|
-
yield self
|
135
|
-
self
|
136
|
-
end
|
137
|
-
|
138
|
-
#######
|
139
|
-
private
|
140
|
-
#######
|
150
|
+
private # ==============================================================
|
141
151
|
|
142
152
|
##
|
143
|
-
# Returns
|
153
|
+
# Returns <div.extra> containing the right-hand stuff.
|
144
154
|
#
|
145
|
-
#
|
146
|
-
#
|
147
|
-
# rendered by #to_html
|
155
|
+
# @return [String, nil]
|
156
|
+
# Returns nil if no <div.extra> is needed.
|
148
157
|
#
|
149
|
-
# @
|
158
|
+
# @api private
|
150
159
|
#
|
151
|
-
def
|
152
|
-
|
160
|
+
def extras_as_html
|
161
|
+
unless @right_title.nil? && @right_subtitle.nil?
|
162
|
+
<<-HTML
|
163
|
+
<div class="extra">
|
164
|
+
#{ formatted(:right_title) }
|
165
|
+
#{ formatted(:right_subtitle) }
|
166
|
+
</div>
|
167
|
+
HTML
|
168
|
+
end
|
153
169
|
end
|
154
170
|
|
155
171
|
##
|
156
|
-
# Returns
|
157
|
-
#
|
172
|
+
# Returns the HTML element containing the value for the field specified
|
173
|
+
# by +field+.
|
174
|
+
#
|
175
|
+
# @param [Symbol] field
|
176
|
+
# The name of the field whose value you wish to retrieve.
|
177
|
+
# @param [Symbol] wrap_in
|
178
|
+
# The HTML element which should wrap the field value.
|
179
|
+
#
|
180
|
+
# @return [String, nil]
|
181
|
+
# nil will be returned if no the field should not be displayed.
|
182
|
+
#
|
183
|
+
# @api semipublic
|
158
184
|
#
|
159
185
|
def formatted(field, wrap_in = :span)
|
160
|
-
|
161
|
-
|
162
|
-
else
|
163
|
-
value = instance_variable_get(:"@#{field}").to_s
|
164
|
-
end
|
186
|
+
value = value_for(field)
|
187
|
+
options = @options[field]
|
165
188
|
|
166
|
-
|
167
|
-
|
189
|
+
if value.blank?
|
190
|
+
# If the field is blank, we want to return _unless_ the field is the
|
191
|
+
# right subtitle, and a right title is set (in which case a title
|
192
|
+
# element is needed to push the subtitle down).
|
193
|
+
if field != :right_title || value_for(:right_subtitle).blank?
|
194
|
+
return nil
|
195
|
+
else
|
196
|
+
value = ' '
|
197
|
+
options[:no_escape] = true
|
198
|
+
end
|
199
|
+
end
|
168
200
|
|
169
201
|
# Escape required?
|
170
202
|
unless options.delete(:no_escape)
|
171
|
-
value = Merb::Parse.escape_xml(value
|
203
|
+
value = Merb::Parse.escape_xml(value)
|
172
204
|
end
|
173
205
|
|
174
206
|
# Link required?
|
175
|
-
if link
|
176
|
-
value =
|
207
|
+
if options.has_key?(:link)
|
208
|
+
value = %[<a href="#{options.delete(:link)}"] +
|
209
|
+
%[ title="#{value}">#{value}</a>]
|
177
210
|
end
|
178
211
|
|
212
|
+
# Set the CSS class.
|
179
213
|
if options[:class]
|
180
|
-
options[:class]
|
181
|
-
elsif field !=
|
182
|
-
options[:class] =
|
214
|
+
options[:class] = [options[:class], CSS_CLASSES[field]].join(' ')
|
215
|
+
elsif CSS_CLASSES[field] != ''
|
216
|
+
options[:class] = CSS_CLASSES[field]
|
183
217
|
end
|
184
218
|
|
185
219
|
tag(wrap_in, value, options)
|
186
220
|
end
|
221
|
+
|
222
|
+
##
|
223
|
+
# Retrieves a value for the specified +field+.
|
224
|
+
#
|
225
|
+
# @param [Symbol] field
|
226
|
+
# The name of the field whose value you wish to retrieve.
|
227
|
+
#
|
228
|
+
# @return [String, nil]
|
229
|
+
# Returns nil if nothing is set, or a string version of whatever the
|
230
|
+
# field is set to.
|
231
|
+
#
|
232
|
+
# @api private
|
233
|
+
#
|
234
|
+
def value_for(field)
|
235
|
+
value = instance_variable_get(:"@#{field}")
|
236
|
+
value.nil? ? nil : value.to_s
|
237
|
+
end
|
187
238
|
end
|
188
239
|
|
189
240
|
##
|
@@ -199,22 +250,24 @@ module Kin
|
|
199
250
|
# Note that the block is evaluated within the MastheadBuilder instance
|
200
251
|
# itself.
|
201
252
|
#
|
202
|
-
# @example
|
203
|
-
# - masthead
|
253
|
+
# @example In a template
|
254
|
+
# - masthead do
|
204
255
|
# - title @set
|
205
256
|
# - subtitle "This set contains #{@set.contents}"
|
206
257
|
#
|
258
|
+
# @api public
|
259
|
+
#
|
207
260
|
def masthead(options = {}, &blk)
|
208
|
-
masthead_builder.no_border = options.fetch(:no_border, false)
|
209
261
|
masthead_builder.build(&blk)
|
210
262
|
end
|
211
263
|
|
212
264
|
##
|
213
265
|
# Returns the MastheadBuilder instance for the current request.
|
214
266
|
#
|
215
|
-
# @api private
|
216
267
|
# @return [Kin::MastheadBuilder]
|
217
268
|
#
|
269
|
+
# @api public
|
270
|
+
#
|
218
271
|
def masthead_builder
|
219
272
|
@_masthead_builder ||= Kin::Masthead::Builder.new
|
220
273
|
end
|
data/lib/kin/nav.rb
CHANGED
@@ -19,6 +19,8 @@ module Kin
|
|
19
19
|
#
|
20
20
|
# @param [Symbol] name
|
21
21
|
# A name for this menu.
|
22
|
+
# @param [Kin::Nav::Formatters::Basic] formatter
|
23
|
+
# A custom formatter to use when rendering the menu as HTML.
|
22
24
|
# @param [Block] blk
|
23
25
|
# A block for setting up the menu.
|
24
26
|
#
|
@@ -27,8 +29,8 @@ module Kin
|
|
27
29
|
#
|
28
30
|
# @api public
|
29
31
|
#
|
30
|
-
def self.setup(name = :default, &blk)
|
31
|
-
menu = Builder.new(name).build(&blk)
|
32
|
+
def self.setup(name = :default, formatter = nil, &blk)
|
33
|
+
menu = Builder.new(name, formatter).build(&blk)
|
32
34
|
menu.freeze
|
33
35
|
menu.items.freeze
|
34
36
|
menu.items.each { |i| i.freeze }
|
@@ -88,17 +90,31 @@ module Kin
|
|
88
90
|
#
|
89
91
|
# @param [Symbol] name
|
90
92
|
# A name for this nav.
|
93
|
+
# @param [Kin::Nav::Formatters::Basic]
|
94
|
+
# A formatter to be used when rendering the menu.
|
91
95
|
#
|
92
96
|
# @api private
|
93
97
|
#
|
94
|
-
def initialize(name)
|
98
|
+
def initialize(name, formatter = nil)
|
95
99
|
@name = name.to_sym
|
100
|
+
@formatter = formatter
|
96
101
|
@items = []
|
97
102
|
|
98
103
|
# Used to find the active item on a given page.
|
99
104
|
@matchers = Struct.new(:best, :controller, :generic).new([], [], [])
|
100
105
|
end
|
101
106
|
|
107
|
+
##
|
108
|
+
# Returns the default formatter to be used when rendering this menu.
|
109
|
+
#
|
110
|
+
# @return [Kin::Nav::Formatters::Basic]
|
111
|
+
#
|
112
|
+
# @api public
|
113
|
+
#
|
114
|
+
def formatter
|
115
|
+
@formatter || Merb::Plugins.config[:kin][:nav_formatter]
|
116
|
+
end
|
117
|
+
|
102
118
|
##
|
103
119
|
# Adds a controller name / action name pair for matching active items.
|
104
120
|
#
|
@@ -109,7 +125,7 @@ module Kin
|
|
109
125
|
#
|
110
126
|
# @return Kin::Nav::ItemMatcher
|
111
127
|
#
|
112
|
-
# @api
|
128
|
+
# @api semipublic
|
113
129
|
#
|
114
130
|
def add_active_match(name, item)
|
115
131
|
name = name.split('/')
|
@@ -228,6 +244,8 @@ module Kin
|
|
228
244
|
# Returns true if this item expects a resource in order to generate a
|
229
245
|
# URL.
|
230
246
|
#
|
247
|
+
# @api private
|
248
|
+
#
|
231
249
|
def expects_resource?
|
232
250
|
not @resource.nil?
|
233
251
|
end
|
@@ -235,6 +253,8 @@ module Kin
|
|
235
253
|
##
|
236
254
|
# Takes a resource and generates a URL.
|
237
255
|
#
|
256
|
+
# @api private
|
257
|
+
#
|
238
258
|
def resource_url(given)
|
239
259
|
raise MissingResource, "Nav item #{id.inspect} expected a " \
|
240
260
|
"resource to generate a URL, and none was given" unless given
|
@@ -255,6 +275,11 @@ module Kin
|
|
255
275
|
# given controller and action.
|
256
276
|
#
|
257
277
|
class ItemMatcher
|
278
|
+
##
|
279
|
+
# Returns the item which this matcher is associated.
|
280
|
+
#
|
281
|
+
# @api semipublic
|
282
|
+
#
|
258
283
|
attr_reader :item
|
259
284
|
|
260
285
|
##
|
data/lib/kin/nav/builder.rb
CHANGED
@@ -10,11 +10,13 @@ module Kin
|
|
10
10
|
#
|
11
11
|
# @param [Symbol] name
|
12
12
|
# A unique name for the Menu instance.
|
13
|
+
# @param [Kin::Nav::Formatters::Basic] formatter
|
14
|
+
# A custom formatter to use when rendering the menu as HTML.
|
13
15
|
#
|
14
16
|
# @api private
|
15
17
|
#
|
16
|
-
def initialize(name)
|
17
|
-
@nav = Menu.new(name)
|
18
|
+
def initialize(name, formatter = nil)
|
19
|
+
@nav = Menu.new(name, formatter)
|
18
20
|
@item_builders = []
|
19
21
|
end
|
20
22
|
|
data/lib/kin/nav/formatters.rb
CHANGED
@@ -1,116 +1,211 @@
|
|
1
1
|
module Kin
|
2
2
|
module Nav
|
3
|
-
|
4
|
-
##
|
5
|
-
# Receives a nav instance and transforms it into HTML.
|
6
|
-
#
|
7
|
-
# @see Kin::Nav::Helper#display_navigation
|
8
|
-
#
|
9
|
-
class BasicFormatter
|
10
|
-
include Merb::Helpers::Tag
|
11
|
-
|
3
|
+
module Formatters
|
12
4
|
##
|
13
|
-
#
|
14
|
-
#
|
15
|
-
# @param [Kin::Nav::Menu] nav
|
16
|
-
# An instance of a Menu to be rendered as HTML.
|
17
|
-
# @param [#controller_name, #action_name] controller
|
18
|
-
# An object which behaves like a controller.
|
19
|
-
# @param [Hash] options
|
20
|
-
# A hash of options for customising the menu. See
|
21
|
-
# Kin::Nav::Helper#display_navigation.
|
5
|
+
# Receives a nav instance and transforms it into HTML.
|
22
6
|
#
|
23
|
-
# @
|
7
|
+
# @see Kin::Nav::Helper#display_navigation
|
24
8
|
#
|
25
|
-
|
26
|
-
|
27
|
-
|
28
|
-
|
29
|
-
|
30
|
-
|
31
|
-
@
|
32
|
-
|
33
|
-
#
|
34
|
-
|
35
|
-
|
36
|
-
|
37
|
-
|
9
|
+
class Basic
|
10
|
+
include Merb::Helpers::Tag
|
11
|
+
|
12
|
+
##
|
13
|
+
# Creates a new BasicFormatter instance.
|
14
|
+
#
|
15
|
+
# @param [Kin::Nav::Menu] nav
|
16
|
+
# An instance of a Menu to be rendered as HTML.
|
17
|
+
# @param [#controller_name, #action_name] controller
|
18
|
+
# An object which behaves like a controller.
|
19
|
+
# @param [Hash] options
|
20
|
+
# A hash of options for customising the menu. See
|
21
|
+
# Kin::Nav::Helper#display_navigation.
|
22
|
+
#
|
23
|
+
# @api public
|
24
|
+
#
|
25
|
+
def initialize(nav, controller, options)
|
26
|
+
@nav = nav
|
27
|
+
@current = nav.active_item(controller)
|
28
|
+
|
29
|
+
@resource = options[:resource]
|
30
|
+
@inject = options.fetch(:inject, {})
|
31
|
+
@guards = options.fetch(:guard, {})
|
32
|
+
|
33
|
+
# Escape injected content.
|
34
|
+
@inject.each do |item_id, contents|
|
35
|
+
contents = Array(contents)
|
36
|
+
contents.map! { |v| Merb::Parse.escape_xml(v) }
|
37
|
+
@inject[item_id] = contents
|
38
|
+
end
|
38
39
|
end
|
39
|
-
end
|
40
40
|
|
41
|
-
|
42
|
-
|
43
|
-
|
44
|
-
|
45
|
-
|
46
|
-
|
47
|
-
|
48
|
-
|
49
|
-
|
50
|
-
|
51
|
-
|
52
|
-
|
53
|
-
|
54
|
-
|
55
|
-
|
41
|
+
##
|
42
|
+
# Transforms the menu given to +initialize+ into a string containing
|
43
|
+
# HTML.
|
44
|
+
#
|
45
|
+
# @return [String]
|
46
|
+
# HTML containing the rendered menu. A collection of <li> elements
|
47
|
+
# contained in a <ul>.
|
48
|
+
#
|
49
|
+
# @api public
|
50
|
+
#
|
51
|
+
def to_html
|
52
|
+
'<ul>%s</ul>' % @nav.items.map do |item|
|
53
|
+
trasform_item_to_html(item) if item.display?(@guards)
|
54
|
+
end.join("\n")
|
55
|
+
end
|
56
56
|
|
57
|
-
|
57
|
+
private # ==============================================================
|
58
58
|
|
59
|
-
|
60
|
-
|
61
|
-
|
62
|
-
|
63
|
-
|
64
|
-
|
65
|
-
|
66
|
-
|
67
|
-
|
68
|
-
|
69
|
-
|
70
|
-
|
71
|
-
|
72
|
-
|
59
|
+
##
|
60
|
+
# Receives an individual nav item and transforms it into HTML.
|
61
|
+
#
|
62
|
+
# @param [Kin::Nav::Item] item
|
63
|
+
# The nav item to be transformed.
|
64
|
+
#
|
65
|
+
# @return [String]
|
66
|
+
# A string containing an HTML <li> element.
|
67
|
+
#
|
68
|
+
# @api private
|
69
|
+
#
|
70
|
+
def trasform_item_to_html(item)
|
71
|
+
html_list_item(item) do
|
72
|
+
html_link(item) { item.label(@inject[item.id]) }
|
73
|
+
end
|
73
74
|
end
|
74
|
-
|
75
|
+
|
76
|
+
##
|
77
|
+
# Returns a list element, yielding to allow injection of the <a>
|
78
|
+
# element.
|
79
|
+
#
|
80
|
+
# @param [Kin::Nav::Item] item
|
81
|
+
# The item to be transformed to HTML.
|
82
|
+
#
|
83
|
+
# @return [String]
|
84
|
+
#
|
85
|
+
# @api private
|
86
|
+
#
|
87
|
+
def html_list_item(item)
|
88
|
+
opts =
|
89
|
+
case item.id == @current
|
90
|
+
when true then { :id => "nav_#{item.id}", :class => 'active' }
|
91
|
+
when false then { :id => "nav_#{item.id}" }
|
92
|
+
end
|
93
|
+
|
94
|
+
tag(:li, yield, opts)
|
95
|
+
end
|
96
|
+
|
97
|
+
##
|
98
|
+
# Returns an anchor element containing a link for the menu item.
|
99
|
+
#
|
100
|
+
# @param [Kin::Nav::Item] item
|
101
|
+
# The item to be transformed to HTML.
|
102
|
+
#
|
103
|
+
# @return [String]
|
104
|
+
#
|
105
|
+
# @api private
|
106
|
+
#
|
107
|
+
def html_link(item)
|
108
|
+
tag(:a, yield,
|
109
|
+
:href => item.url(@resource),
|
110
|
+
:title => item.title(@inject[item.id])
|
111
|
+
)
|
112
|
+
end
|
113
|
+
end # Basic
|
75
114
|
|
76
115
|
##
|
77
|
-
#
|
78
|
-
#
|
116
|
+
# A formatter used when a navigation menu may has items which should
|
117
|
+
# appear on the right of the UI. Right-floated items are styled slightly
|
118
|
+
# differently.
|
79
119
|
#
|
80
|
-
|
81
|
-
|
82
|
-
#
|
83
|
-
# @return [String]
|
84
|
-
#
|
85
|
-
# @api private
|
86
|
-
#
|
87
|
-
def html_list_item(item)
|
88
|
-
opts =
|
89
|
-
case item.id == @current
|
90
|
-
when true then { :id => "nav_#{item.id}", :class => 'active' }
|
91
|
-
when false then { :id => "nav_#{item.id}" }
|
92
|
-
end
|
120
|
+
class HasRight < Basic
|
121
|
+
class_inheritable_accessor :right_items
|
93
122
|
|
94
|
-
|
95
|
-
|
123
|
+
private
|
124
|
+
|
125
|
+
##
|
126
|
+
# Receives an individual nav item and transforms it into HTML.
|
127
|
+
#
|
128
|
+
# Items specified as being a right_item will be styled differently
|
129
|
+
# to the others.
|
130
|
+
#
|
131
|
+
# @param [Kin::Nav::Item] item
|
132
|
+
# The nav item to be transformed.
|
133
|
+
#
|
134
|
+
# @return [String]
|
135
|
+
# A string containing an HTML <li> element.
|
136
|
+
#
|
137
|
+
# @api private
|
138
|
+
#
|
139
|
+
def trasform_item_to_html(item)
|
140
|
+
return super unless self.class.right_items.include?(item.id)
|
141
|
+
|
142
|
+
html_list_item(item) do
|
143
|
+
link = html_link(item) { item.label(@inject[item.id]) }
|
144
|
+
|
145
|
+
<<-HTML
|
146
|
+
<span class="right_border"> </span>
|
147
|
+
<span class="bg">#{ link }</span>
|
148
|
+
HTML
|
149
|
+
end
|
150
|
+
end # transform_item_to_html
|
151
|
+
end # HasRight
|
96
152
|
|
97
153
|
##
|
98
|
-
#
|
154
|
+
# Creates a HasRight subclass.
|
155
|
+
#
|
156
|
+
# @param [Symbol] *items
|
157
|
+
# Symbols matching the given items which should have the custom style
|
158
|
+
# applied.
|
99
159
|
#
|
100
|
-
# @
|
101
|
-
#
|
160
|
+
# @return [Class]
|
161
|
+
# A subclass of the HasRight formatter.
|
102
162
|
#
|
103
|
-
# @
|
163
|
+
# @example
|
164
|
+
# :formatter => Kin::Nav::Formatters::HasRight(:user, :guest)
|
104
165
|
#
|
105
|
-
# @api
|
166
|
+
# @api public
|
106
167
|
#
|
107
|
-
def
|
108
|
-
|
109
|
-
|
110
|
-
|
111
|
-
)
|
168
|
+
def self.HasRight(*items)
|
169
|
+
klass = Class.new(Kin::Nav::Formatters::HasRight)
|
170
|
+
klass.right_items = Set.new(items)
|
171
|
+
klass
|
112
172
|
end
|
113
|
-
end # Formatter
|
114
173
|
|
174
|
+
##
|
175
|
+
# A formatter used for creating subnavs.
|
176
|
+
#
|
177
|
+
class Subnav < Basic
|
178
|
+
private
|
179
|
+
|
180
|
+
##
|
181
|
+
# Receives an individual nav item and transforms it into HTML.
|
182
|
+
#
|
183
|
+
# Wraps the contents of the link in a span.pill and span.icon to
|
184
|
+
# enable futher styling.
|
185
|
+
#
|
186
|
+
# @param [Kin::Nav::Item] item
|
187
|
+
# The nav item to be transformed.
|
188
|
+
#
|
189
|
+
# @return [String]
|
190
|
+
# A string containing an HTML <li> element.
|
191
|
+
#
|
192
|
+
# @api private
|
193
|
+
#
|
194
|
+
def trasform_item_to_html(item)
|
195
|
+
html_list_item(item) do
|
196
|
+
html_link(item) do
|
197
|
+
<<-HTML
|
198
|
+
<span class="pill">
|
199
|
+
<span class="icon">
|
200
|
+
#{item.label(@inject[item.id])}
|
201
|
+
</span>
|
202
|
+
</span>
|
203
|
+
HTML
|
204
|
+
end
|
205
|
+
end
|
206
|
+
end # transform_item_to_html
|
207
|
+
end # Subnav
|
208
|
+
|
209
|
+
end # Formatters
|
115
210
|
end # Nav
|
116
211
|
end # Kin
|