fortitude 0.0.4-java → 0.0.5-java
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/.travis.yml +19 -19
- data/CHANGES.md +31 -0
- data/Gemfile +1 -0
- data/README-erector.md +1 -1
- data/lib/fortitude/erector.rb +32 -0
- data/lib/fortitude/method_templates/tag_method_template.rb.smpl +6 -6
- data/lib/fortitude/method_templates/text_method_template.rb.smpl +3 -3
- data/lib/fortitude/rails/railtie.rb +6 -4
- data/lib/fortitude/rails/renderer.rb +7 -4
- data/lib/fortitude/rails/template_handler.rb +18 -3
- data/lib/fortitude/rendering_context.rb +20 -2
- data/lib/fortitude/tags/render_widget_placeholder.rb +19 -0
- data/lib/fortitude/tags/tag.rb +18 -4
- data/lib/fortitude/tags/tag_return_value.rb +1 -1
- data/lib/fortitude/tags/tag_store.rb +4 -0
- data/lib/fortitude/tilt/fortitude_template.rb +6 -128
- data/lib/fortitude/version.rb +1 -1
- data/lib/fortitude/widget.rb +2 -0
- data/lib/fortitude/widget/files.rb +162 -0
- data/lib/fortitude/widget/integration.rb +5 -3
- data/lib/fortitude/widget/modules_and_subclasses.rb +17 -0
- data/lib/fortitude/widget/rendering.rb +12 -5
- data/lib/fortitude/widget/start_and_end_comments.rb +4 -2
- data/lib/fortitude/widget/tags.rb +6 -1
- data/lib/fortitude/widget/widget_class_inheritable_attributes.rb +7 -0
- data/spec/helpers/rails_server.rb +4 -0
- data/spec/rails/basic_rails_system_spec.rb +4 -0
- data/spec/rails/erector_coexistence_system_spec.rb +33 -0
- data/spec/rails/rendering_context_system_spec.rb +19 -3
- data/spec/rails/rendering_system_spec.rb +6 -0
- data/spec/rails/templates/basic_rails_system_spec/app/controllers/basic_rails_system_spec_controller.rb +5 -0
- data/spec/rails/templates/basic_rails_system_spec/app/views/basic_rails_system_spec/double_render_one.rb +5 -0
- data/spec/rails/templates/basic_rails_system_spec/app/views/basic_rails_system_spec/double_render_three.rb +5 -0
- data/spec/rails/templates/basic_rails_system_spec/app/views/basic_rails_system_spec/double_render_two.rb +9 -0
- data/spec/rails/templates/erector_coexistence_system_spec/app/controllers/erector_coexistence_system_spec_controller.rb +19 -0
- data/spec/rails/templates/erector_coexistence_system_spec/app/v/views/erector_coexistence_system_spec/erector_widget_in_app_v_views.rb +7 -0
- data/spec/rails/templates/erector_coexistence_system_spec/app/v/views/erector_coexistence_system_spec/fortitude_widget_in_app_v_views.rb +7 -0
- data/spec/rails/templates/erector_coexistence_system_spec/app/views/erector_coexistence_system_spec/erector_widget_in_app_views.rb +7 -0
- data/spec/rails/templates/erector_coexistence_system_spec/app/views/erector_coexistence_system_spec/fortitude_widget_in_app_views.rb +7 -0
- data/spec/rails/templates/erector_coexistence_system_spec/config/application.rb +25 -0
- data/spec/rails/templates/rendering_context_system_spec/app/controllers/rendering_context_system_spec_controller.rb +2 -2
- data/spec/rails/templates/rendering_context_system_spec/app/views/rendering_context_system_spec/_current_element_nesting_intermediate.html.erb +3 -0
- data/spec/rails/templates/rendering_context_system_spec/app/views/rendering_context_system_spec/current_element_nesting_child.rb +13 -0
- data/spec/rails/templates/rendering_context_system_spec/app/views/rendering_context_system_spec/current_element_nesting_toplevel.rb +9 -0
- data/spec/rails/templates/rendering_context_system_spec/app/views/rendering_context_system_spec/start_end_widget_through_partials.rb +2 -2
- data/spec/system/convenience_methods_system_spec.rb +22 -0
- data/spec/system/inline_system_spec.rb +2 -2
- data/spec/system/record_tag_emission_system_spec.rb +71 -0
- data/spec/system/rendering_context_system_spec.rb +21 -0
- data/spec/system/setting_inheritance_system_spec.rb +52 -0
- data/spec/system/tag_return_value_system_spec.rb +7 -0
- data/spec/system/tilt_system_spec.rb +13 -18
- data/spec/system/widget_class_from_spec.rb +240 -0
- data/spec/system/widget_method_system_spec.rb +52 -0
- metadata +37 -2
checksums.yaml
CHANGED
@@ -1,7 +1,7 @@
|
|
1
1
|
---
|
2
2
|
SHA1:
|
3
|
-
metadata.gz:
|
4
|
-
data.tar.gz:
|
3
|
+
metadata.gz: 996ef14559afdcaf5e6d38539b6cd3833f6a1092
|
4
|
+
data.tar.gz: ef4536daad102644d9b841b07f60ac90e8144e24
|
5
5
|
SHA512:
|
6
|
-
metadata.gz:
|
7
|
-
data.tar.gz:
|
6
|
+
metadata.gz: 2518e9ccc389d05add5ddc23c7ed04528ead578c3d8cb189158035b19eb09e65a0ac259330d80542c58d14c6cd5e38755d674133b248282aff332f6cc3fc5235
|
7
|
+
data.tar.gz: a5892beecdc684d675e9e4f26504d12116467bc3ea04c281d5526c438bc8b87b3c6c3bf6eccbb6b6d06e87be6b11f937c137c51549019a07a6d170f5bf1379ad
|
data/.travis.yml
CHANGED
@@ -3,14 +3,14 @@ rvm:
|
|
3
3
|
- "1.9.3"
|
4
4
|
- "2.0.0"
|
5
5
|
- "2.1.2"
|
6
|
-
- "jruby-1.7.
|
6
|
+
- "jruby-1.7.15"
|
7
7
|
env:
|
8
|
-
- FORTITUDE_SPECS_RAILS_VERSION=4.1.
|
9
|
-
- FORTITUDE_SPECS_RAILS_VERSION=4.0.
|
10
|
-
- FORTITUDE_SPECS_RAILS_VERSION=3.2.
|
8
|
+
- FORTITUDE_SPECS_RAILS_VERSION=4.1.6
|
9
|
+
- FORTITUDE_SPECS_RAILS_VERSION=4.0.10
|
10
|
+
- FORTITUDE_SPECS_RAILS_VERSION=3.2.19
|
11
11
|
- FORTITUDE_SPECS_RAILS_VERSION=3.1.12
|
12
12
|
- FORTITUDE_SPECS_RAILS_VERSION=3.0.20
|
13
|
-
- FORTITUDE_NATIVE_EXTENSIONS=false FORTITUDE_SPECS_RAILS_VERSION=4.1.
|
13
|
+
- FORTITUDE_NATIVE_EXTENSIONS=false FORTITUDE_SPECS_RAILS_VERSION=4.1.6
|
14
14
|
- FORTITUDE_NATIVE_EXTENSIONS=false FORTITUDE_SPECS_RAILS_VERSION=3.0.20
|
15
15
|
before_script:
|
16
16
|
- export JRUBY_OPTS="$JRUBY_OPTS -J-Xmx128m -J-Xms128m -J-Xss2048k"
|
@@ -18,11 +18,11 @@ matrix:
|
|
18
18
|
exclude:
|
19
19
|
# Rails 4.x doesn't support Ruby 1.8.7
|
20
20
|
- rvm: 1.8.7
|
21
|
-
env: FORTITUDE_SPECS_RAILS_VERSION=4.1.
|
21
|
+
env: FORTITUDE_SPECS_RAILS_VERSION=4.1.6
|
22
22
|
- rvm: 1.8.7
|
23
|
-
env: FORTITUDE_NATIVE_EXTENSIONS=false FORTITUDE_SPECS_RAILS_VERSION=4.1.
|
23
|
+
env: FORTITUDE_NATIVE_EXTENSIONS=false FORTITUDE_SPECS_RAILS_VERSION=4.1.6
|
24
24
|
- rvm: 1.8.7
|
25
|
-
env: FORTITUDE_SPECS_RAILS_VERSION=4.0.
|
25
|
+
env: FORTITUDE_SPECS_RAILS_VERSION=4.0.10
|
26
26
|
# 2014-06-19 ageweke -- ARGH. After trying about seventeen different things, no matter what I do,
|
27
27
|
# Travis fails JRuby builds about 20% of the time with "Killed". Their documentation indicates that this
|
28
28
|
# is likely an out-of-memory issue (i.e., entire VM's memory is consumed). However, I'm running JRuby with
|
@@ -34,17 +34,17 @@ matrix:
|
|
34
34
|
# one manually to make sure there aren't other failures, too. This is very frustrating, but I can't seem to
|
35
35
|
# find a way around it. If there's a fix out there somewhere, I'm all ears!
|
36
36
|
allow_failures:
|
37
|
-
- rvm: jruby-1.7.
|
38
|
-
env: FORTITUDE_SPECS_RAILS_VERSION=4.1.
|
39
|
-
- rvm: jruby-1.7.
|
40
|
-
env: FORTITUDE_SPECS_RAILS_VERSION=4.0.
|
41
|
-
- rvm: jruby-1.7.
|
42
|
-
env: FORTITUDE_SPECS_RAILS_VERSION=3.2.
|
43
|
-
- rvm: jruby-1.7.
|
37
|
+
- rvm: jruby-1.7.15
|
38
|
+
env: FORTITUDE_SPECS_RAILS_VERSION=4.1.6
|
39
|
+
- rvm: jruby-1.7.15
|
40
|
+
env: FORTITUDE_SPECS_RAILS_VERSION=4.0.10
|
41
|
+
- rvm: jruby-1.7.15
|
42
|
+
env: FORTITUDE_SPECS_RAILS_VERSION=3.2.19
|
43
|
+
- rvm: jruby-1.7.15
|
44
44
|
env: FORTITUDE_SPECS_RAILS_VERSION=3.1.12
|
45
|
-
- rvm: jruby-1.7.
|
45
|
+
- rvm: jruby-1.7.15
|
46
46
|
env: FORTITUDE_SPECS_RAILS_VERSION=3.0.20
|
47
|
-
- rvm: jruby-1.7.
|
48
|
-
env: FORTITUDE_NATIVE_EXTENSIONS=false FORTITUDE_SPECS_RAILS_VERSION=4.1.
|
49
|
-
- rvm: jruby-1.7.
|
47
|
+
- rvm: jruby-1.7.15
|
48
|
+
env: FORTITUDE_NATIVE_EXTENSIONS=false FORTITUDE_SPECS_RAILS_VERSION=4.1.6
|
49
|
+
- rvm: jruby-1.7.15
|
50
50
|
env: FORTITUDE_NATIVE_EXTENSIONS=false FORTITUDE_SPECS_RAILS_VERSION=3.0.20
|
data/CHANGES.md
CHANGED
@@ -1,5 +1,36 @@
|
|
1
1
|
# Fortitude Releases
|
2
2
|
|
3
|
+
## 0.0.5, 22 September 2014
|
4
|
+
|
5
|
+
* You can now load both Fortitude and Erector at the same time into a project, and it will "just work": Erector
|
6
|
+
widgets will render using Erector, and Fortitude widgets will render using Fortitude. (Fortitude takes over the
|
7
|
+
actual template engine registration for `.rb` files, and uses a trick to keep Erector from displacing it; it then
|
8
|
+
looks at the widget class being rendered, and delegates all Erector rendering directly to Erector.)
|
9
|
+
* When inside a widget, you can now render a sub-widget using `widget MyWidget.new(...)` — _i.e._, passing an
|
10
|
+
actual widget instance — or using `widget MyWidget, { :param1 => value1 }` — _i.e._, passing a widget
|
11
|
+
class and a `Hash` of assignments (which can be omitted if the widget doesn't have any `need`s).
|
12
|
+
* Fixed an issue where, _e.g._, calling `#render_to_string` on a Fortitude widget within a Rails controller, and then
|
13
|
+
also rendering a Fortitude widget as the template for that action, would cause a method to be called on `nil`.
|
14
|
+
* Added `Fortitude::RenderingContext#parent_widget`, which returns the parent widget of the current widget during
|
15
|
+
rendering at runtime. (In other words, this is not the superclass of the current widget, but the widget that caused
|
16
|
+
this widget to get rendered, using either `Fortitude::Widget#widget` or `render :partial => ...`.) This can, of
|
17
|
+
course, be `nil` if there is no current parent widget.
|
18
|
+
* Added `Fortitude::Widget.all_fortitude_superclasses`, which returns an `Array` of all superclasses of a widget up to,
|
19
|
+
but not including, `Fortitude::Widget` itself.
|
20
|
+
* Added `Fortitude::Widget.widget_class_from_file`, which accepts the path to a file and an array of "root" directories
|
21
|
+
to look under (_i.e._, assuming you're using something like Rails' autoloading mechanism), and returns the `Class`
|
22
|
+
object for the widget that's contained in that file. This uses a series of mechansims to try to detect the class
|
23
|
+
that's present in the file: a "magic comment" that can be present in the file, an array of class names to try
|
24
|
+
that you can pass in, the position of the class in the file hierarchy, and scanning the source text itself.
|
25
|
+
* Added a `record_tag_emission` class-level setting that tells a widget to call `#emitting_tag!` on the
|
26
|
+
`Fortitude::RenderingContext` when emitting a tag; you can use this to build various systems that need to know where
|
27
|
+
in the hierarchy of tags we are at the moment.
|
28
|
+
* The object being returned from Fortitude tag methods — which, in general, you should never use — now
|
29
|
+
inherits from `Object`, not `BasicObject`, so that some built-in methods like `#is_a?` can be safely called on it.
|
30
|
+
This is for use in some users' environments doing funny things with the Ruby runtime that end up calling methods
|
31
|
+
like that on the return values of widget `#content` methods, which very often just end up being the tag return
|
32
|
+
value object.
|
33
|
+
|
3
34
|
## 0.0.4, 24 June 2014
|
4
35
|
|
5
36
|
* Added support for building a JRuby-specific gem to the gemspec, so that things work smoothly for JRuby users.
|
data/Gemfile
CHANGED
data/README-erector.md
CHANGED
@@ -18,7 +18,7 @@ garbage as ERb/Erubis);
|
|
18
18
|
* Full, complete native HTML5 support (with selectable X/HTML4.01 Strict/Transitional/Frameset doctypes);
|
19
19
|
* Enforces HTML element-nesting and attribute-name rules, and enforce ID uniqueness across a page (configurable, and off by default);
|
20
20
|
* In development, beautiful HTML comments around each widget, showing what class is being rendered, the values of all variables supplied to that class, and the nesting depth of that widget;
|
21
|
-
* Fully compatible with Ruby 1.8.7-2.1.x, JRuby 1.7.
|
21
|
+
* Fully compatible with Ruby 1.8.7-2.1.x, JRuby 1.7.15, and Rails 3.0.x-4.1.x;
|
22
22
|
* Full Tilt support, and can be used with or without Rails;
|
23
23
|
* Much more thorough Rails support — all known Rails integration points have been resolved, and it should work
|
24
24
|
as smoothly with Rails as does (_e.g._) ERb/Erubis;
|
@@ -0,0 +1,32 @@
|
|
1
|
+
module Fortitude
|
2
|
+
module Erector
|
3
|
+
class << self
|
4
|
+
def is_erector_available?
|
5
|
+
@is_erector_available ||= begin
|
6
|
+
begin
|
7
|
+
gem 'erector'
|
8
|
+
rescue Gem::LoadError => le
|
9
|
+
# ok
|
10
|
+
end
|
11
|
+
|
12
|
+
begin
|
13
|
+
require 'erector'
|
14
|
+
rescue LoadError => le
|
15
|
+
# ok
|
16
|
+
end
|
17
|
+
|
18
|
+
if defined?(::Erector::Widget) then :yes else :no end
|
19
|
+
end
|
20
|
+
|
21
|
+
@is_erector_available == :yes
|
22
|
+
end
|
23
|
+
|
24
|
+
def is_erector_widget_class?(widget_class)
|
25
|
+
return false unless is_erector_available?
|
26
|
+
return true if widget_class == ::Erector::Widget
|
27
|
+
return false if widget_class == ::Object
|
28
|
+
return is_erector_widget_class?(widget_class.superclass)
|
29
|
+
end
|
30
|
+
end
|
31
|
+
end
|
32
|
+
end
|
@@ -1,9 +1,9 @@
|
|
1
1
|
def #{method_name}(content_or_attributes = nil, attributes = nil)
|
2
2
|
o = @_fortitude_output_buffer_holder.output_buffer
|
3
|
-
rc = @_fortitude_rendering_context # :if
|
3
|
+
rc = @_fortitude_rendering_context # :if record_emitting_tag || needs_formatting
|
4
4
|
|
5
|
-
this_tag = #{tag_object_const} # :if
|
6
|
-
rc.
|
5
|
+
this_tag = #{tag_object_const} # :if record_emitting_tag || needs_attribute_rules || needs_id_uniqueness
|
6
|
+
rc.emitting_tag!(self, this_tag, content_or_attributes, attributes) do # :if record_emitting_tag
|
7
7
|
format_output = rc.format_output? # :if needs_formatting
|
8
8
|
if format_output # :if needs_formatting
|
9
9
|
rc.needs_newline! # :if needs_formatting && newline_before
|
@@ -36,7 +36,7 @@ def #{method_name}(content_or_attributes = nil, attributes = nil)
|
|
36
36
|
elsif (! attributes)
|
37
37
|
_fortitude_raise_no_content_allowed_error(#{tag_object_const}) # :if ! content_allowed
|
38
38
|
o.#{concat_method}(#{open_const})
|
39
|
-
rc.
|
39
|
+
rc.emitting_tag!(self, FORTITUDE_TEXT_PSEUDOTAG, content_or_attributes, nil) { } unless content_or_attributes.instance_variable_get("@html_safe") # :if record_emitting_tag
|
40
40
|
content_or_attributes.to_s.fortitude_append_escaped_string(o) # :if escape_direct_content
|
41
41
|
o.#{concat_method}(content_or_attributes.to_s) # :if ! escape_direct_content
|
42
42
|
if block_given?
|
@@ -52,7 +52,7 @@ def #{method_name}(content_or_attributes = nil, attributes = nil)
|
|
52
52
|
attributes.fortitude_append_as_attributes(o, nil)
|
53
53
|
o.#{concat_method}(#{partial_open_end_const})
|
54
54
|
|
55
|
-
rc.
|
55
|
+
rc.emitting_tag!(self, FORTITUDE_TEXT_PSEUDOTAG, content_or_attributes, nil) { } unless content_or_attributes.instance_variable_get("@html_safe") # :if record_emitting_tag
|
56
56
|
content_or_attributes.to_s.fortitude_append_escaped_string(o) # :if escape_direct_content
|
57
57
|
o.#{concat_method}(content_or_attributes.to_s) # :if ! escape_direct_content
|
58
58
|
if block_given?
|
@@ -62,7 +62,7 @@ def #{method_name}(content_or_attributes = nil, attributes = nil)
|
|
62
62
|
o.#{concat_method}(#{close_const})
|
63
63
|
end
|
64
64
|
rc.needs_newline! if format_output # :if needs_formatting && newline_before
|
65
|
-
end # :if
|
65
|
+
end # :if record_emitting_tag
|
66
66
|
|
67
67
|
FORTITUDE_NO_RETURN_VALUE_FROM_TAGS
|
68
68
|
end
|
@@ -1,9 +1,9 @@
|
|
1
1
|
def tag_text(s)
|
2
2
|
@_fortitude_rendering_context.about_to_output_non_whitespace! # :if format_output
|
3
3
|
|
4
|
-
unless s.instance_variable_get("@html_safe") # :if
|
5
|
-
@_fortitude_rendering_context.
|
6
|
-
end # :if
|
4
|
+
unless s.instance_variable_get("@html_safe") # :if record_emitting_tag
|
5
|
+
@_fortitude_rendering_context.emitting_tag!(self, FORTITUDE_TEXT_PSEUDOTAG, s, nil) { } # :if record_emitting_tag
|
6
|
+
end # :if record_emitting_tag
|
7
7
|
|
8
8
|
s.to_s.fortitude_append_escaped_string(@_fortitude_output_buffer_holder.output_buffer)
|
9
9
|
end
|
@@ -197,8 +197,10 @@ module Fortitude
|
|
197
197
|
# So, instead, we simply transform <tt>render :widget => ...</tt> into a <tt>render :text => ...</tt> of the
|
198
198
|
# widget's output, and let Rails take it away from there.
|
199
199
|
::ActionController::Base.class_eval do
|
200
|
-
def
|
201
|
-
@
|
200
|
+
def fortitude_rendering_context_for(delegate_object, yield_block)
|
201
|
+
@_fortitude_rendering_contexts ||= { }
|
202
|
+
@_fortitude_rendering_contexts[delegate_object.object_id] ||= create_fortitude_rendering_context(
|
203
|
+
:delegate_object => delegate_object, :yield_block => yield_block)
|
202
204
|
end
|
203
205
|
|
204
206
|
def create_fortitude_rendering_context(options)
|
@@ -208,7 +210,7 @@ module Fortitude
|
|
208
210
|
def render_with_fortitude(*args, &block)
|
209
211
|
if (options = args[0]).kind_of?(Hash)
|
210
212
|
if (widget = options[:widget])
|
211
|
-
rendering_context =
|
213
|
+
rendering_context = fortitude_rendering_context_for(self, nil)
|
212
214
|
widget.render_to(rendering_context)
|
213
215
|
|
214
216
|
options = options.dup
|
@@ -220,7 +222,7 @@ module Fortitude
|
|
220
222
|
elsif (widget_block = options[:inline]) && (options[:type] == :fortitude)
|
221
223
|
options.delete(:inline)
|
222
224
|
|
223
|
-
rendering_context =
|
225
|
+
rendering_context = fortitude_rendering_context_for(self, nil)
|
224
226
|
widget_class = Class.new(Fortitude::Widgets::Html5)
|
225
227
|
widget_class.use_instance_variables_for_assigns(true)
|
226
228
|
widget_class.extra_assigns(:use)
|
@@ -1,4 +1,5 @@
|
|
1
1
|
require 'fortitude/rendering_context'
|
2
|
+
require 'fortitude/erector'
|
2
3
|
|
3
4
|
::ActiveSupport::SafeBuffer.class_eval do
|
4
5
|
alias_method :fortitude_concat, :original_concat
|
@@ -10,7 +11,11 @@ module Fortitude
|
|
10
11
|
class Renderer
|
11
12
|
class << self
|
12
13
|
# TODO: Refactor this and render :widget => ... support into one method somewhere.
|
13
|
-
def render(widget_class, template_handler, local_assigns, &block)
|
14
|
+
def render(widget_class, template_handler, local_assigns, is_partial, &block)
|
15
|
+
if ::Fortitude::Erector.is_erector_widget_class?(widget_class)
|
16
|
+
return ::Erector::Rails.render(widget_class, template_handler, local_assigns, is_partial, &block)
|
17
|
+
end
|
18
|
+
|
14
19
|
total_assigns = template_handler.assigns.symbolize_keys.merge(local_assigns.symbolize_keys)
|
15
20
|
|
16
21
|
needed_assigns = if widget_class.extra_assigns == :use
|
@@ -21,9 +26,7 @@ module Fortitude
|
|
21
26
|
|
22
27
|
widget = widget_class.new(needed_assigns)
|
23
28
|
template_handler.with_output_buffer do
|
24
|
-
|
25
|
-
controller = template_handler.controller
|
26
|
-
rendering_context = controller.fortitude_rendering_context(rendering_context_options)
|
29
|
+
rendering_context = template_handler.controller.fortitude_rendering_context_for(template_handler, block)
|
27
30
|
|
28
31
|
# TODO: Refactor this -- both passing it into the constructor and setting yield_block here is gross.
|
29
32
|
#
|
@@ -6,10 +6,10 @@ module Fortitude
|
|
6
6
|
def call(template, &block)
|
7
7
|
require_dependency template.identifier
|
8
8
|
widget_class_name = "views/#{template.identifier =~ %r(views/([^.]*)(\..*)?\.rb) && $1}".camelize
|
9
|
-
is_partial = File.basename(template.identifier) =~ /^_/
|
9
|
+
is_partial = !! (File.basename(template.identifier) =~ /^_/)
|
10
10
|
|
11
11
|
<<-SRC
|
12
|
-
Fortitude::Rails::Renderer.render(#{widget_class_name}, self, local_assigns) { |*args| yield *args }
|
12
|
+
Fortitude::Rails::Renderer.render(#{widget_class_name}, self, local_assigns, #{is_partial.inspect}) { |*args| yield *args }
|
13
13
|
SRC
|
14
14
|
end
|
15
15
|
|
@@ -20,4 +20,19 @@ module Fortitude
|
|
20
20
|
end
|
21
21
|
end
|
22
22
|
|
23
|
-
ActionView::Template.
|
23
|
+
::ActionView::Template.class_eval do
|
24
|
+
class << self
|
25
|
+
def _fortitude_register_template_handler!
|
26
|
+
register_template_handler_without_fortitude(:rb, Fortitude::Rails::TemplateHandler.new)
|
27
|
+
end
|
28
|
+
|
29
|
+
def register_template_handler_with_fortitude(*args, &block)
|
30
|
+
register_template_handler_without_fortitude(*args, &block)
|
31
|
+
ActionView::Template._fortitude_register_template_handler!
|
32
|
+
end
|
33
|
+
|
34
|
+
alias_method_chain :register_template_handler, :fortitude
|
35
|
+
end
|
36
|
+
end
|
37
|
+
|
38
|
+
ActionView::Template._fortitude_register_template_handler!
|
@@ -1,4 +1,5 @@
|
|
1
1
|
require 'fortitude/support/instance_variable_set'
|
2
|
+
require 'fortitude/tags/render_widget_placeholder'
|
2
3
|
|
3
4
|
module Fortitude
|
4
5
|
class RenderingContext
|
@@ -66,9 +67,14 @@ module Fortitude
|
|
66
67
|
!! @attribute_validation_disabled
|
67
68
|
end
|
68
69
|
|
70
|
+
def record_render(args, &block)
|
71
|
+
record_widget(::Fortitude::Tags::RenderWidgetPlaceholder.new(args), &block)
|
72
|
+
end
|
73
|
+
|
69
74
|
def record_widget(widget)
|
70
75
|
start_widget!(widget)
|
71
76
|
@current_widget_nesting << widget
|
77
|
+
@current_element_nesting << widget
|
72
78
|
begin
|
73
79
|
yield
|
74
80
|
ensure
|
@@ -76,6 +82,10 @@ module Fortitude
|
|
76
82
|
unless last.equal?(widget)
|
77
83
|
raise "Something horrible happened -- the last widget we started was #{last}, but now we're ending #{widget}?!?"
|
78
84
|
end
|
85
|
+
last = @current_element_nesting.pop
|
86
|
+
unless last.equal?(widget)
|
87
|
+
raise "Something horrible happened -- the last element we started was #{last}, but now we're ending #{widget}?!?"
|
88
|
+
end
|
79
89
|
end_widget!(widget)
|
80
90
|
end
|
81
91
|
end
|
@@ -92,8 +102,12 @@ module Fortitude
|
|
92
102
|
@current_widget_nesting.length - 1
|
93
103
|
end
|
94
104
|
|
95
|
-
def
|
96
|
-
|
105
|
+
def parent_widget
|
106
|
+
@current_widget_nesting[-2]
|
107
|
+
end
|
108
|
+
|
109
|
+
def emitting_tag!(widget, tag_object, content_or_attributes, attributes)
|
110
|
+
validate_element_for_rules(widget, tag_object) if widget.class.enforce_element_nesting_rules
|
97
111
|
@current_element_nesting << tag_object
|
98
112
|
|
99
113
|
begin
|
@@ -106,6 +120,10 @@ module Fortitude
|
|
106
120
|
end
|
107
121
|
end
|
108
122
|
|
123
|
+
def current_element_nesting
|
124
|
+
@current_element_nesting
|
125
|
+
end
|
126
|
+
|
109
127
|
def format_output?
|
110
128
|
true
|
111
129
|
end
|
@@ -0,0 +1,19 @@
|
|
1
|
+
module Fortitude
|
2
|
+
module Tags
|
3
|
+
class RenderWidgetPlaceholder
|
4
|
+
attr_reader :render_args
|
5
|
+
|
6
|
+
def initialize(render_args)
|
7
|
+
@render_args = render_args
|
8
|
+
end
|
9
|
+
|
10
|
+
def name
|
11
|
+
:_fortitude_render_widget_placeholder
|
12
|
+
end
|
13
|
+
|
14
|
+
def validate_can_enclose!(widget, tag_object)
|
15
|
+
# nothing here, always OK
|
16
|
+
end
|
17
|
+
end
|
18
|
+
end
|
19
|
+
end
|
data/lib/fortitude/tags/tag.rb
CHANGED
@@ -116,7 +116,9 @@ module Fortitude
|
|
116
116
|
end
|
117
117
|
|
118
118
|
def define_method_on!(mod, options = {})
|
119
|
-
options.assert_valid_keys(
|
119
|
+
options.assert_valid_keys(
|
120
|
+
:record_emitting_tag, :enforce_attribute_rules, :enable_formatting,
|
121
|
+
:enforce_id_uniqueness, :close_void_tags)
|
120
122
|
|
121
123
|
unless mod.respond_to?(:fortitude_tag_support_included?) && mod.fortitude_tag_support_included?
|
122
124
|
mod.send(:include, ::Fortitude::Tags::TagSupport)
|
@@ -147,8 +149,8 @@ module Fortitude
|
|
147
149
|
end
|
148
150
|
|
149
151
|
text = Fortitude::MethodTemplates::SimpleTemplate.template('tag_method_template').result(
|
150
|
-
:name => name.to_s, :method_name =>
|
151
|
-
:
|
152
|
+
:name => name.to_s, :method_name => generated_method_name.to_s, :yield_call => yield_call, :concat_method => CONCAT_METHOD,
|
153
|
+
:record_emitting_tag => (!! options[:record_emitting_tag]),
|
152
154
|
:needs_attribute_rules => !! options[:enforce_attribute_rules],
|
153
155
|
:needs_id_uniqueness => !! options[:enforce_id_uniqueness],
|
154
156
|
:needs_formatting => needs_formatting, :content_allowed => @content_allowed,
|
@@ -160,7 +162,19 @@ module Fortitude
|
|
160
162
|
:partial_open_alone_end_const => tag_constant_name(:PARTIAL_OPEN_ALONE_END))
|
161
163
|
|
162
164
|
mod.module_eval(text)
|
163
|
-
mod.alias_method(
|
165
|
+
aliased_method_names.each { |an| mod.alias_method(an, generated_method_name) }
|
166
|
+
end
|
167
|
+
|
168
|
+
def generated_method_name
|
169
|
+
"tag_#{name}"
|
170
|
+
end
|
171
|
+
|
172
|
+
def aliased_method_names
|
173
|
+
[ name ]
|
174
|
+
end
|
175
|
+
|
176
|
+
def all_method_names
|
177
|
+
[ generated_method_name ] + aliased_method_names
|
164
178
|
end
|
165
179
|
|
166
180
|
private
|
@@ -2,7 +2,7 @@ require 'fortitude/errors'
|
|
2
2
|
|
3
3
|
module Fortitude
|
4
4
|
module Tags
|
5
|
-
TAG_RETURN_VALUE_SUPERCLASS =
|
5
|
+
TAG_RETURN_VALUE_SUPERCLASS = ::Object
|
6
6
|
|
7
7
|
class TagReturnValue < TAG_RETURN_VALUE_SUPERCLASS
|
8
8
|
def method_missing(name, *args)
|