wrap_it 0.2.0 → 1.0.0
Sign up to get free protection for your applications and to get access to all the features.
- checksums.yaml +4 -4
- data/.ruby-version +1 -0
- data/.yardopts +3 -0
- data/README.md +67 -66
- data/lib/wrap_it.rb +16 -16
- data/lib/wrap_it/arguments.rb +368 -0
- data/lib/wrap_it/base.rb +56 -47
- data/lib/wrap_it/callbacks.rb +24 -5
- data/lib/wrap_it/capture_array.rb +140 -0
- data/lib/wrap_it/container.rb +69 -25
- data/lib/wrap_it/derived_attributes.rb +22 -6
- data/lib/wrap_it/enums.rb +44 -34
- data/lib/wrap_it/frameworks.rb +7 -3
- data/lib/wrap_it/helpers.rb +66 -1
- data/lib/wrap_it/html.rb +149 -0
- data/lib/wrap_it/html_class.rb +164 -183
- data/lib/wrap_it/html_data.rb +28 -15
- data/lib/wrap_it/link.rb +40 -17
- data/lib/wrap_it/sections.rb +90 -2
- data/lib/wrap_it/switches.rb +33 -29
- data/lib/wrap_it/text_container.rb +83 -10
- data/lib/wrap_it/version.rb +2 -1
- data/spec/frameworks/log/development.log +2108 -0
- data/spec/integration/base_spec.rb +2 -2
- data/spec/integration/container_spec.rb +3 -3
- data/spec/integration/examples_spec.rb +16 -15
- data/spec/integration/text_container_spec.rb +3 -3
- data/spec/lib/arguments_array_spec.rb +37 -27
- data/spec/lib/arguments_spec.rb +153 -0
- data/spec/lib/base_spec.rb +2 -25
- data/spec/lib/callbacks_spec.rb +1 -1
- data/spec/lib/container_spec.rb +1 -1
- data/spec/lib/derived_attributes_spec.rb +1 -1
- data/spec/lib/enums_spec.rb +2 -3
- data/spec/lib/html_class_spec.rb +269 -80
- data/spec/lib/html_data_spec.rb +18 -12
- data/spec/lib/html_spec.rb +124 -0
- data/spec/lib/link_spec.rb +2 -2
- data/spec/lib/sections_spec.rb +1 -1
- data/spec/lib/switches_spec.rb +3 -3
- data/spec/lib/text_container_spec.rb +2 -2
- data/spec/support/example_groups/{wrap_it_example_group.rb → wrapped_example_group.rb} +5 -5
- data/wrap_it.gemspec +2 -0
- metadata +15 -8
- data/lib/wrap_it/arguments_array.rb +0 -128
- data/lib/wrap_it/module_helpers.rb +0 -23
data/lib/wrap_it/base.rb
CHANGED
@@ -19,59 +19,79 @@ module WrapIt
|
|
19
19
|
# @author Alexey Ovchinnikov <alexiss@cybernetlab.ru>
|
20
20
|
#
|
21
21
|
class Base
|
22
|
+
# Documentation includes
|
23
|
+
#
|
24
|
+
# @!parse extend Arguments::ClassMethods
|
25
|
+
# @!parse extend Enums::ClassMethods
|
26
|
+
# @!parse extend HTML::ClassMethods
|
27
|
+
# @!parse extend Sections::ClassMethods
|
28
|
+
# @!parse extend Switches::ClassMethods
|
29
|
+
|
30
|
+
#
|
31
|
+
# include appropriate functionality from modules
|
22
32
|
include DerivedAttributes
|
23
33
|
include Callbacks
|
24
34
|
|
25
35
|
callback :initialize, :capture, :render
|
26
36
|
|
37
|
+
include Arguments
|
27
38
|
include Sections
|
28
|
-
include
|
29
|
-
include HTMLData
|
39
|
+
include HTML
|
30
40
|
include Switches
|
31
41
|
include Enums
|
32
42
|
include Renderer
|
33
43
|
|
34
44
|
@omit_content = false
|
35
45
|
|
36
|
-
attr_reader :
|
37
|
-
|
38
|
-
|
46
|
+
attr_reader :helper_name
|
47
|
+
option :helper_name
|
48
|
+
option :tag
|
39
49
|
section :content, :render_arguments, :render_block
|
40
50
|
place :content, :after, :begin
|
41
51
|
place :render_block, :after, :begin
|
42
52
|
place :render_arguments, :after, :begin
|
43
53
|
|
44
54
|
def initialize(template, *args, &block)
|
45
|
-
@template, @
|
46
|
-
self.options = @arguments.extract_options!
|
47
|
-
|
48
|
-
@helper_name = @options.delete(:helper_name)
|
49
|
-
@helper_name.is_a?(String) && @helper_name = @helper_name.to_sym
|
50
|
-
|
51
|
-
@arguments.extend ArgumentsArray
|
55
|
+
@template, @block = template, block
|
52
56
|
add_default_classes
|
53
|
-
|
54
57
|
run_callbacks :initialize do
|
55
|
-
|
56
|
-
|
57
|
-
|
58
|
+
capture_arguments!(args, &block)
|
59
|
+
# TODO: uncomment following after html_attr implementation finished
|
60
|
+
#html_attr.merge!(args.extract_options!)
|
61
|
+
self.html_attr = args.extract_options!
|
62
|
+
# TODO: find convenient way to save unprocessed arguments
|
63
|
+
@arguments = args
|
58
64
|
end
|
59
65
|
end
|
60
66
|
|
67
|
+
def tag
|
68
|
+
@tag ||= (self.class.get_derived(:@default_tag) || 'div').to_s
|
69
|
+
end
|
70
|
+
|
71
|
+
def tag=(value)
|
72
|
+
value.is_a?(Symbol) && value = value.to_s
|
73
|
+
value.is_a?(String) && @tag = value
|
74
|
+
end
|
75
|
+
|
76
|
+
def helper_name=(value)
|
77
|
+
value.is_a?(String) && value = value.to_sym
|
78
|
+
value.is_a?(Symbol) && @helper_name = value
|
79
|
+
end
|
80
|
+
|
61
81
|
def omit_content?
|
62
|
-
self.class.get_derived(:@omit_content)
|
82
|
+
self.class.get_derived(:@omit_content) == true
|
63
83
|
end
|
64
84
|
|
65
85
|
#
|
66
86
|
# Renders element to template
|
67
87
|
#
|
68
|
-
# @
|
69
|
-
#
|
70
|
-
#
|
71
|
-
#
|
72
|
-
#
|
73
|
-
#
|
74
|
-
#
|
88
|
+
# @overload render([content, ...])
|
89
|
+
# @param content [String] additional content that will be appended
|
90
|
+
# to element content
|
91
|
+
# @yield [element] Runs block after capturing element content and before
|
92
|
+
# rendering it. Returned value appended to content.
|
93
|
+
# @yieldparam element [Base] rendering element.
|
94
|
+
# @yieldreturn [String, nil] content to append to HTML
|
75
95
|
#
|
76
96
|
# @return [String] rendered HTML for element
|
77
97
|
def render(*args, &render_block)
|
@@ -110,17 +130,17 @@ module WrapIt
|
|
110
130
|
#
|
111
131
|
# If block present, it will be called when wrapper will rendered.
|
112
132
|
#
|
113
|
-
# @
|
114
|
-
#
|
133
|
+
# @overload wrap(wrapper)
|
134
|
+
# @param wrapper [Base] wrapper instance.
|
115
135
|
#
|
116
|
-
# @
|
117
|
-
#
|
118
|
-
#
|
119
|
-
#
|
136
|
+
# @overload wrap(wrapper_class, [arg, ...], options = {})
|
137
|
+
# @param wrapper_class [Class] WrapIt::Base subclass for wrapper.
|
138
|
+
# @param arg [String, Symbol] wrapper creation arguments.
|
139
|
+
# @param options [Hash] wrapper creation options.
|
120
140
|
#
|
121
|
-
# @
|
122
|
-
#
|
123
|
-
#
|
141
|
+
# @overload wrap([arg, ...], options = {})
|
142
|
+
# @param arg [String, Symbol] wrapper creation arguments.
|
143
|
+
# @param options [Hash] wrapper creation options.
|
124
144
|
#
|
125
145
|
# @return [void]
|
126
146
|
def wrap(*args, &block)
|
@@ -139,7 +159,6 @@ module WrapIt
|
|
139
159
|
protected
|
140
160
|
|
141
161
|
#
|
142
|
-
# @dsl
|
143
162
|
# Defines or gets default tag name for element. This tag can be changed
|
144
163
|
# soon. Without parameters returns current default_tag value.
|
145
164
|
# @param name [<Symbol, String>] Tag name. Converted to `String`.
|
@@ -158,17 +177,6 @@ module WrapIt
|
|
158
177
|
@omit_content = true
|
159
178
|
end
|
160
179
|
|
161
|
-
def options=(hash)
|
162
|
-
hash.is_a?(Hash) || return
|
163
|
-
hash.symbolize_keys!
|
164
|
-
|
165
|
-
# sanitize class
|
166
|
-
hash[:class] ||= []
|
167
|
-
hash[:class] = [hash[:class]] unless hash[:class].is_a?(Array)
|
168
|
-
hash[:class] = hash[:class].map { |c| c.to_s }.uniq
|
169
|
-
@options = hash
|
170
|
-
end
|
171
|
-
|
172
180
|
def capture_sections
|
173
181
|
run_callbacks :capture do
|
174
182
|
unless @block.nil?
|
@@ -199,12 +207,13 @@ module WrapIt
|
|
199
207
|
|
200
208
|
def do_render
|
201
209
|
# cleanup options from empty values
|
202
|
-
|
210
|
+
html_attr.select! do |k, v|
|
203
211
|
!v.nil? && (!v.respond_to?(:empty?) || !v.empty?)
|
204
212
|
end
|
205
213
|
@rendered = render_sections
|
206
214
|
run_callbacks :render do
|
207
|
-
|
215
|
+
options = html_attr.merge(class: html_class.to_html, data: html_data)
|
216
|
+
@rendered = content_tag(tag, @rendered, options)
|
208
217
|
end
|
209
218
|
end
|
210
219
|
|
data/lib/wrap_it/callbacks.rb
CHANGED
@@ -5,38 +5,57 @@ module WrapIt
|
|
5
5
|
# @author Alexey Ovchinnikov <alexiss@cybernetlab.ru>
|
6
6
|
#
|
7
7
|
module Callbacks
|
8
|
+
# Documentation includes
|
9
|
+
# @!parse extend Callbacks::ClassMethods
|
10
|
+
|
11
|
+
# module implementation
|
12
|
+
|
8
13
|
extend DerivedAttributes
|
9
14
|
|
15
|
+
#
|
10
16
|
def self.included(base)
|
11
17
|
base.extend ClassMethods
|
12
18
|
end
|
13
19
|
|
20
|
+
#
|
21
|
+
# Runs specified callbacks with block
|
22
|
+
#
|
23
|
+
# Runs first `before` callbacks in inheritance order, then yields block if
|
24
|
+
# it given and then `after` callbacks in reverse order.
|
25
|
+
#
|
26
|
+
# @param name [Symbol] callback name, that should be defined by
|
27
|
+
# {ClassMethods#callback callback} method.
|
28
|
+
#
|
29
|
+
# @return [void]
|
14
30
|
def run_callbacks(name)
|
15
31
|
self.class.collect_derived("@before_#{name}").each do |cb|
|
16
32
|
if cb.is_a?(Symbol)
|
17
|
-
# break if send(cb) == false # if respond_to?(cb)
|
18
33
|
send(cb) # if respond_to?(cb)
|
19
34
|
else
|
20
|
-
# break if instance_eval(&cb) == false
|
21
35
|
instance_eval(&cb)
|
22
36
|
end
|
23
37
|
end
|
24
38
|
yield if block_given?
|
25
39
|
self.class.collect_derived("@after_#{name}").reverse.each do |cb|
|
26
40
|
if cb.is_a?(Symbol)
|
27
|
-
# break if send(cb) == false # if respond_to?(cb)
|
28
41
|
send(cb) # if respond_to?(cb)
|
29
42
|
else
|
30
|
-
# break if instance_eval(&cb) == false
|
31
43
|
instance_eval(&cb)
|
32
44
|
end
|
33
45
|
end
|
34
46
|
end
|
35
47
|
|
36
48
|
#
|
37
|
-
#
|
49
|
+
# {Callbacks} class methods
|
38
50
|
#
|
39
51
|
module ClassMethods
|
52
|
+
#
|
53
|
+
# Defines callback
|
54
|
+
#
|
55
|
+
# @overload callback([name, ...])
|
56
|
+
# @param name [Symbol, String] callback name
|
57
|
+
#
|
58
|
+
# @return [void]
|
40
59
|
def callback(*args)
|
41
60
|
args.each do |name|
|
42
61
|
instance_eval(&Callbacks.define_callback(:before, name))
|
@@ -0,0 +1,140 @@
|
|
1
|
+
module WrapIt
|
2
|
+
#
|
3
|
+
# Adds #capture! and #capture_first! methods to array. Theese methods are
|
4
|
+
# extracts items from array by some conditions and returns its as separate
|
5
|
+
# array for #capture! and as first item for #capture_first!.
|
6
|
+
#
|
7
|
+
# @author Alexey Ovchinnikov <alexiss@cybernetlab.ru>
|
8
|
+
#
|
9
|
+
module CaptureArray
|
10
|
+
REQUIRED_METHODS = %i(reject! find_index delete_at)
|
11
|
+
|
12
|
+
#
|
13
|
+
def self.included(base)
|
14
|
+
methods = base.methods
|
15
|
+
# avoid including in classes thats doen't have methods, used in
|
16
|
+
# inplementation
|
17
|
+
REQUIRED_METHODS.all? { |m| methods.include?(m) } || fail(
|
18
|
+
TypeError,
|
19
|
+
"#{self.class.name} can't be included into #{base.class.name}"
|
20
|
+
)
|
21
|
+
end
|
22
|
+
|
23
|
+
#
|
24
|
+
# Extracts elements from array by conditions, passed in arguments and
|
25
|
+
# returns theese elements as new array.
|
26
|
+
#
|
27
|
+
# Condition can be Regexp, Class, Array, lambdas and any other value.
|
28
|
+
# if condition contains labdas, all off them will be called before
|
29
|
+
# tests and results of theese calls will be used as conditions.
|
30
|
+
#
|
31
|
+
# If condition is `Regexp`, all elements of array are tested for matching
|
32
|
+
# to this regexp, previously converted to String by their `to_s` method. If
|
33
|
+
# condition is an `Array`, all elements tested if it included in these
|
34
|
+
# array. If the condition is a class, then elements are tested via `is_a?`
|
35
|
+
# method for this class. `true` and `false` conditions do exactly what it
|
36
|
+
# mean - `true` will satisfy condition, `false` will not. For any other
|
37
|
+
# value, elements are tested with equality operator `==`.
|
38
|
+
#
|
39
|
+
# You can provide a block. In this case, all arguments are ignored, and
|
40
|
+
# block yielded for each element of array. If block returns `true`,
|
41
|
+
# element extracted from array.
|
42
|
+
#
|
43
|
+
# All conditions, passed as arguments are `or`-ed so `String, Symbol` means
|
44
|
+
# select Symbol or String elements.
|
45
|
+
#
|
46
|
+
# You can also specify `and` option, so all tests will be and'ed with its
|
47
|
+
# conditions.
|
48
|
+
#
|
49
|
+
# @overload capture!([condition, ...], opts = {})
|
50
|
+
# @param condition [Object] one of `or`-ed conditions for comparing
|
51
|
+
# @param opts [Hash] options for extracting
|
52
|
+
# @option opts [Object, Array] :and one or array of `and`-ed conditions
|
53
|
+
#
|
54
|
+
# @overload capture!(&block)
|
55
|
+
# @yield [element] Gives each element of array to block. You should return
|
56
|
+
# `true` to capture this element or `false` to keep it in array.
|
57
|
+
# @yieldparam [Object] element element of array to inspect
|
58
|
+
# @yieldreturn [Boolean] whether exclude this element or not
|
59
|
+
#
|
60
|
+
# @return [Array] array of captured elements
|
61
|
+
#
|
62
|
+
# @example capture by class
|
63
|
+
# arr = [1, 2, 3, 'and', 'string']
|
64
|
+
# arr.extend WrapIt::CaptureArray
|
65
|
+
# arr.capture(String) #=> ['and', 'string']
|
66
|
+
# arr #=> [1, 2, 3]
|
67
|
+
#
|
68
|
+
# @example capture by value
|
69
|
+
# arr = [1, 2, 3, 'and', 'string']
|
70
|
+
# arr.extend WrapIt::CaptureArray
|
71
|
+
# arr.capture(1, 2) #=> [1, 2]
|
72
|
+
# arr #=> [3, 'and', 'string']
|
73
|
+
#
|
74
|
+
# @example capture by Regexp
|
75
|
+
# arr = [1, 2, 3, 'and', 'string', :str]
|
76
|
+
# arr.extend WrapIt::CaptureArray
|
77
|
+
# arr.capture(/^str/) #=> ['string', :str]
|
78
|
+
# arr #=> [1, 2, 3, 'and']
|
79
|
+
#
|
80
|
+
# @example capture by Array
|
81
|
+
# arr = [1, 2, 3, 'and', 'string']
|
82
|
+
# arr.extend WrapIt::CaptureArray
|
83
|
+
# arr.capture([1, 10, 'and']) #=> [1, 'and']
|
84
|
+
# arr #=> [2, 3, 'string']
|
85
|
+
#
|
86
|
+
# @example capture by block
|
87
|
+
# arr = [1, 2, 3, 'and', 'string']
|
88
|
+
# arr.extend WrapIt::CaptureArray
|
89
|
+
# arr.capture {|x| x < 3} #=> [1, 2]
|
90
|
+
# arr #=> [3, 'and', 'string']
|
91
|
+
#
|
92
|
+
# @example capture with `and` condition
|
93
|
+
# arr = [1, 2, 3, 'and', 'string', :str]
|
94
|
+
# arr.extend WrapIt::CaptureArray
|
95
|
+
# arr.capture(String, and: [/^str/]) #=> ['string']
|
96
|
+
# arr #=> [1, 2, 3, 'and', :str]
|
97
|
+
def capture!(*args, &block)
|
98
|
+
captureed = []
|
99
|
+
reject! do |arg|
|
100
|
+
do_compare(arg, *args, &block) && (captureed << arg) && true
|
101
|
+
end
|
102
|
+
captureed
|
103
|
+
end
|
104
|
+
|
105
|
+
#
|
106
|
+
# Extracts first element from array that is satisfy conditions, passed in
|
107
|
+
# arguments and returns these element.
|
108
|
+
#
|
109
|
+
# @see #capture!
|
110
|
+
def capture_first!(*args, &block)
|
111
|
+
index = find_index { |arg| do_compare(arg, *args, &block) }
|
112
|
+
index.nil? ? nil : delete_at(index)
|
113
|
+
end
|
114
|
+
|
115
|
+
private
|
116
|
+
|
117
|
+
def do_compare(target, *compare_args, &block)
|
118
|
+
if block_given?
|
119
|
+
yield target
|
120
|
+
else
|
121
|
+
options = compare_args.extract_options!
|
122
|
+
compare_args.map! { |x| x.is_a?(Proc) && x.lambda? ? x.call : x }
|
123
|
+
result = compare_args.any? do |dest|
|
124
|
+
case
|
125
|
+
when dest == true || dest == false then dest
|
126
|
+
when dest.is_a?(Array) then dest.include?(target)
|
127
|
+
when dest.is_a?(Regexp) then dest.match(target.to_s)
|
128
|
+
when dest.is_a?(Class) then target.is_a?(dest)
|
129
|
+
when dest.is_a?(Proc) then dest.call(dest) == true
|
130
|
+
else dest == target
|
131
|
+
end
|
132
|
+
end
|
133
|
+
if options[:and].is_a?(Array)
|
134
|
+
result &&= do_compare(target, *options[:and])
|
135
|
+
end
|
136
|
+
result
|
137
|
+
end
|
138
|
+
end
|
139
|
+
end
|
140
|
+
end
|
data/lib/wrap_it/container.rb
CHANGED
@@ -4,7 +4,8 @@ module WrapIt
|
|
4
4
|
#
|
5
5
|
# @author Alexey Ovchinnikov <alexiss@cybernetlab.ru>
|
6
6
|
#
|
7
|
-
#
|
7
|
+
# @todo single_child realization
|
8
|
+
# @todo refactor code for more clearness
|
8
9
|
class Container < Base
|
9
10
|
switch :deffered_render do |_|
|
10
11
|
# avoid changing deffered_render after any child added
|
@@ -15,27 +16,64 @@ module WrapIt
|
|
15
16
|
end
|
16
17
|
end
|
17
18
|
|
19
|
+
# list of children elements
|
18
20
|
attr_reader :children
|
21
|
+
|
22
|
+
# children can be extracted from normal template flow and rendered in
|
23
|
+
# separate section.
|
19
24
|
attr_writer :extract_children
|
25
|
+
|
20
26
|
section :children
|
21
27
|
|
22
28
|
def extract_children?
|
23
29
|
@extract_children == true
|
24
30
|
end
|
25
31
|
|
26
|
-
|
32
|
+
before_initialize do
|
27
33
|
@children = []
|
28
|
-
self.class.extract_from_options.each do |option, name|
|
29
|
-
args = options.delete(option)
|
30
|
-
next if args.nil?
|
31
|
-
args = [args] unless args.is_a?(Array)
|
32
|
-
self.deffered_render = true
|
33
|
-
send(name, *args)
|
34
|
-
end
|
35
34
|
end
|
36
35
|
|
37
36
|
#
|
38
|
-
# Defines
|
37
|
+
# Defines helper for child elements creation.
|
38
|
+
#
|
39
|
+
# @example simple usage
|
40
|
+
# class Item < WrapIt::Base
|
41
|
+
# include TextContainer
|
42
|
+
# end
|
43
|
+
#
|
44
|
+
# class List < WrapIt::Container
|
45
|
+
# default_tag 'ul'
|
46
|
+
# child :item, tag: 'li'
|
47
|
+
# end
|
48
|
+
#
|
49
|
+
# list = List.new(template)
|
50
|
+
# list.item 'list item 1'
|
51
|
+
# list.item 'list item 2'
|
52
|
+
# list.render # => '<ul><li>list item 1'</li><li>list item 2</li></ul>'
|
53
|
+
#
|
54
|
+
# @example with option
|
55
|
+
# class Button < WrapIt::Container
|
56
|
+
# include TextContainer
|
57
|
+
# html_class 'btn'
|
58
|
+
# child :icon, tag: 'i', option: true
|
59
|
+
# end
|
60
|
+
#
|
61
|
+
# btn = Button.new(template, 'Home', icon: { class: 'i-home' })
|
62
|
+
# btn.render # => '<div class="btn">Home<i class="i-home"></i></div>'
|
63
|
+
#
|
64
|
+
# @overload child(name, class_name = nil, [args, ...], opts = {}, &block)
|
65
|
+
# @param name [Symbol, String] helper method name
|
66
|
+
# @param class_name [String, Base] class for child elements. If ommited
|
67
|
+
# WrapIt::Base will be used
|
68
|
+
# @param args [Object] any arguments that will be passed to child
|
69
|
+
# element constructor
|
70
|
+
# @param opts [Hash] options
|
71
|
+
# @option opts [true, Symbol] :option if specified, child can be created
|
72
|
+
# via option with same name (if :option is true) or with specified
|
73
|
+
# name
|
74
|
+
# @option opts [Symbol] :section section to that this children will be
|
75
|
+
# rendered. By default children rendered to `children`. Refer to
|
76
|
+
# {Sections} module for details.
|
39
77
|
#
|
40
78
|
# @return [String]
|
41
79
|
def self.child(name, *args, &block)
|
@@ -48,8 +86,11 @@ module WrapIt
|
|
48
86
|
'WrapIt::Base'
|
49
87
|
end
|
50
88
|
child_class = child_class.name if child_class.is_a?(Class)
|
51
|
-
|
52
|
-
|
89
|
+
|
90
|
+
opts = args.extract_options!
|
91
|
+
extract = opts.delete(:option)
|
92
|
+
args << opts
|
93
|
+
|
53
94
|
define_method name do |*helper_args, &helper_block|
|
54
95
|
# We should clone arguments becouse if we have loop in template,
|
55
96
|
# `extract_options!` below works only for first iterration
|
@@ -60,20 +101,21 @@ module WrapIt
|
|
60
101
|
helper_args += default_args + [options]
|
61
102
|
add_children(name, child_class, block, *helper_args, &helper_block)
|
62
103
|
end
|
63
|
-
end
|
64
104
|
|
65
|
-
|
66
|
-
|
67
|
-
|
68
|
-
|
69
|
-
|
70
|
-
|
71
|
-
|
72
|
-
|
73
|
-
|
74
|
-
|
75
|
-
|
76
|
-
|
105
|
+
unless extract.nil?
|
106
|
+
extract.is_a?(Array) || extract = [extract]
|
107
|
+
extract.each do |opt_name|
|
108
|
+
opt_name = name if opt_name == true
|
109
|
+
option(opt_name) do |_, arguments|
|
110
|
+
self.deffered_render = true
|
111
|
+
arguments.is_a?(Array) || arguments = [arguments]
|
112
|
+
o = arguments.extract_options!
|
113
|
+
o.merge!(extracted: true)
|
114
|
+
arguments << o
|
115
|
+
send name, *arguments
|
116
|
+
end
|
117
|
+
end
|
118
|
+
end
|
77
119
|
end
|
78
120
|
|
79
121
|
after_capture do
|
@@ -106,6 +148,7 @@ module WrapIt
|
|
106
148
|
def add_children(name, helper_class, class_block, *args, &helper_block)
|
107
149
|
options = args.extract_options!
|
108
150
|
section = options.delete(:section) || :children
|
151
|
+
extracted = options.delete(:extracted) == true
|
109
152
|
args << options
|
110
153
|
item = Object
|
111
154
|
.const_get(helper_class)
|
@@ -120,6 +163,7 @@ module WrapIt
|
|
120
163
|
class_block.nil? || instance_exec(item, &class_block)
|
121
164
|
|
122
165
|
deffered_render? && @children << item
|
166
|
+
return if extracted
|
123
167
|
if !deffered_render? && (omit_content? || extract_children?)
|
124
168
|
self[section] << capture { item.render }
|
125
169
|
end
|