fortitude 0.9.1-java → 0.9.2-java

Sign up to get free protection for your applications and to get access to all the features.
Files changed (113) hide show
  1. checksums.yaml +4 -4
  2. data/.gitignore +1 -1
  3. data/.travis.yml +28 -22
  4. data/CHANGES.md +50 -0
  5. data/CONTRIBUTORS.md +1 -0
  6. data/doc/.gitignore +18 -0
  7. data/doc/Gemfile +21 -0
  8. data/doc/config.rb +92 -0
  9. data/doc/source/images/background.png +0 -0
  10. data/doc/source/images/middleman.png +0 -0
  11. data/doc/source/images/why/icon_button.png +0 -0
  12. data/doc/source/images/why/icon_button@2x.png +0 -0
  13. data/doc/source/images/why/modal_dialog@2x.png +0 -0
  14. data/doc/source/index.html.pcss +96 -0
  15. data/doc/source/index.html.rb +66 -0
  16. data/doc/source/javascripts/all.js +1 -0
  17. data/doc/source/javascripts/highlight.pack.js +1 -0
  18. data/doc/source/layouts/layout.rb +55 -0
  19. data/doc/source/portable/fortitude-bootstrap.rb +53 -0
  20. data/doc/source/shared/base.pcss +62 -0
  21. data/doc/source/shared/base.rb +30 -0
  22. data/doc/source/shared/common.rb +55 -0
  23. data/doc/source/shared/standard_page.rb +40 -0
  24. data/doc/source/stylesheets/_shared_prefix.scss +25 -0
  25. data/doc/source/stylesheets/all.css.scss +7 -0
  26. data/doc/source/stylesheets/basics.css.scss +20 -0
  27. data/doc/source/stylesheets/bootstrap_importer.css.scss +1 -0
  28. data/doc/source/stylesheets/highlight/arta.css +140 -0
  29. data/doc/source/stylesheets/highlight/ascetic.css +52 -0
  30. data/doc/source/stylesheets/highlight/atelier-dune.dark.css +95 -0
  31. data/doc/source/stylesheets/highlight/atelier-dune.light.css +95 -0
  32. data/doc/source/stylesheets/highlight/atelier-forest.dark.css +95 -0
  33. data/doc/source/stylesheets/highlight/atelier-forest.light.css +95 -0
  34. data/doc/source/stylesheets/highlight/atelier-heath.dark.css +95 -0
  35. data/doc/source/stylesheets/highlight/atelier-heath.light.css +95 -0
  36. data/doc/source/stylesheets/highlight/atelier-lakeside.dark.css +95 -0
  37. data/doc/source/stylesheets/highlight/atelier-lakeside.light.css +95 -0
  38. data/doc/source/stylesheets/highlight/atelier-seaside.dark.css +95 -0
  39. data/doc/source/stylesheets/highlight/atelier-seaside.light.css +95 -0
  40. data/doc/source/stylesheets/highlight/brown_paper.css +104 -0
  41. data/doc/source/stylesheets/highlight/brown_papersq.png +0 -0
  42. data/doc/source/stylesheets/highlight/codepen-embed.css +108 -0
  43. data/doc/source/stylesheets/highlight/color-brewer.css +168 -0
  44. data/doc/source/stylesheets/highlight/dark.css +104 -0
  45. data/doc/source/stylesheets/highlight/default.css +152 -0
  46. data/doc/source/stylesheets/highlight/docco.css +135 -0
  47. data/doc/source/stylesheets/highlight/far.css +111 -0
  48. data/doc/source/stylesheets/highlight/foundation.css +136 -0
  49. data/doc/source/stylesheets/highlight/github.css +124 -0
  50. data/doc/source/stylesheets/highlight/googlecode.css +147 -0
  51. data/doc/source/stylesheets/highlight/hybrid.css +170 -0
  52. data/doc/source/stylesheets/highlight/idea.css +125 -0
  53. data/doc/source/stylesheets/highlight/ir_black.css +109 -0
  54. data/doc/source/stylesheets/highlight/kimbie.dark.css +96 -0
  55. data/doc/source/stylesheets/highlight/kimbie.light.css +96 -0
  56. data/doc/source/stylesheets/highlight/magula.css +121 -0
  57. data/doc/source/stylesheets/highlight/mono-blue.css +69 -0
  58. data/doc/source/stylesheets/highlight/monokai.css +127 -0
  59. data/doc/source/stylesheets/highlight/monokai_sublime.css +154 -0
  60. data/doc/source/stylesheets/highlight/obsidian.css +153 -0
  61. data/doc/source/stylesheets/highlight/paraiso.dark.css +95 -0
  62. data/doc/source/stylesheets/highlight/paraiso.light.css +95 -0
  63. data/doc/source/stylesheets/highlight/pojoaque.css +107 -0
  64. data/doc/source/stylesheets/highlight/pojoaque.jpg +0 -0
  65. data/doc/source/stylesheets/highlight/railscasts.css +187 -0
  66. data/doc/source/stylesheets/highlight/rainbow.css +108 -0
  67. data/doc/source/stylesheets/highlight/school_book.css +112 -0
  68. data/doc/source/stylesheets/highlight/school_book.png +0 -0
  69. data/doc/source/stylesheets/highlight/solarized_dark.css +108 -0
  70. data/doc/source/stylesheets/highlight/solarized_light.css +108 -0
  71. data/doc/source/stylesheets/highlight/sunburst.css +164 -0
  72. data/doc/source/stylesheets/highlight/tomorrow-night-blue.css +95 -0
  73. data/doc/source/stylesheets/highlight/tomorrow-night-bright.css +94 -0
  74. data/doc/source/stylesheets/highlight/tomorrow-night-eighties.css +94 -0
  75. data/doc/source/stylesheets/highlight/tomorrow-night.css +95 -0
  76. data/doc/source/stylesheets/highlight/tomorrow.css +92 -0
  77. data/doc/source/stylesheets/highlight/vs.css +93 -0
  78. data/doc/source/stylesheets/highlight/xcode.css +158 -0
  79. data/doc/source/stylesheets/highlight/zenburn.css +118 -0
  80. data/doc/source/why/a_larger_view.html.rb +774 -0
  81. data/doc/source/why/a_simple_helper.html.rb +332 -0
  82. data/doc/source/why/building_a_rich_modal_dialog.html.rb +156 -0
  83. data/doc/source/why/commonality_and_inheritance.html.rb +564 -0
  84. data/doc/source/why/example_list.rb +60 -0
  85. data/doc/source/why/example_page.rb +116 -0
  86. data/doc/source/why/index.html.rb +86 -0
  87. data/doc/source/why/other_benefits.html.rb +110 -0
  88. data/fortitude.gemspec +6 -1
  89. data/lib/fortitude/doctypes/html4_tags_strict.rb +1 -0
  90. data/lib/fortitude/doctypes/html5.rb +1 -0
  91. data/lib/fortitude/method_templates/tag_method_template.rb.smpl +27 -14
  92. data/lib/fortitude/rails/helpers.rb +2 -2
  93. data/lib/fortitude/rendering_context.rb +10 -1
  94. data/lib/fortitude/tags/tag.rb +3 -2
  95. data/lib/fortitude/tags/tag_support.rb +8 -3
  96. data/lib/fortitude/tilt/fortitude_template.rb +6 -2
  97. data/lib/fortitude/version.rb +1 -1
  98. data/lib/fortitude/widget.rb +2 -0
  99. data/lib/fortitude/widget/convenience.rb +30 -0
  100. data/lib/fortitude/widget/files.rb +22 -11
  101. data/lib/fortitude/widget/needs.rb +5 -3
  102. data/spec/helpers/system_helpers.rb +1 -0
  103. data/spec/rails/development_mode_system_spec.rb +0 -1
  104. data/spec/rails/rendering_system_spec.rb +20 -1
  105. data/spec/rails/templates/rendering_system_spec/app/controllers/rendering_system_spec_controller.rb +13 -0
  106. data/spec/rails/templates/rendering_system_spec/app/views/rendering_system_spec/render_hash_subclass.rb +18 -0
  107. data/spec/rails/templates/rendering_system_spec/lib/my_hash.rb +5 -0
  108. data/spec/system/convenience_methods_system_spec.rb +166 -0
  109. data/spec/system/formatting_system_spec.rb +25 -1
  110. data/spec/system/tag_rendering_system_spec.rb +73 -0
  111. data/spec/system/tilt_system_spec.rb +31 -0
  112. data/spec/system/widget_class_from_spec.rb +20 -4
  113. metadata +91 -4
@@ -0,0 +1,60 @@
1
+ module Views
2
+ module Why
3
+ module ExampleList
4
+ EXAMPLES = begin
5
+ out = [
6
+ { :subpath => 'a_simple_helper', :title => 'A Simple Helper' },
7
+ { :subpath => 'a_larger_view', :title => 'A Larger View' },
8
+ { :subpath => 'commonality_and_inheritance', :title => 'Commonality and Inheritance' },
9
+ { :subpath => 'building_a_rich_modal_dialog', :title => 'Building a Rich Modal Dialog' }
10
+ ]
11
+ out.each_with_index do |hash, index|
12
+ hash[:number] = (index + 1)
13
+ hash[:path] = "/why/#{hash[:subpath]}.html"
14
+ end
15
+ out
16
+ end
17
+
18
+ def first_example
19
+ EXAMPLES[0]
20
+ end
21
+
22
+ def number_of_examples
23
+ EXAMPLES.length
24
+ end
25
+
26
+ def this_example_number
27
+ this_example[:number] if this_example
28
+ end
29
+
30
+ def example_by_number(number)
31
+ EXAMPLES.detect { |e| e[:number] == number }
32
+ end
33
+
34
+ def this_example
35
+ @this_example ||= begin
36
+ request_path = request[:path]
37
+ request_path = "/#{request_path}" unless request_path.start_with?("/")
38
+
39
+ out = EXAMPLES.detect { |e| e[:path] == request_path }
40
+ out || :none
41
+ end
42
+ @this_example unless @this_example == :none
43
+ end
44
+
45
+ def example_title(example)
46
+ "Example #{example[:number]}. #{example[:title]}"
47
+ end
48
+
49
+ def next_example
50
+ @next_example ||= begin
51
+ if this_example_number
52
+ example_by_number(this_example_number + 1)
53
+ else
54
+ first_example
55
+ end
56
+ end
57
+ end
58
+ end
59
+ end
60
+ end
@@ -0,0 +1,116 @@
1
+ require 'source/shared/standard_page'
2
+ require 'source/why/example_list'
3
+
4
+ module Views
5
+ module Why
6
+ class ExamplePage < Views::Shared::StandardPage
7
+ include Views::Why::ExampleList
8
+
9
+ css %{
10
+ .example_link {
11
+ font-family: $heading-font;
12
+
13
+ .next {
14
+ font-weight: $heading-font-light-weight;
15
+ font-size: 18px;
16
+ margin-right: 10px;
17
+ }
18
+
19
+ a {
20
+ font-weight: $heading-font-heavy-weight;
21
+ font-size: 20px;
22
+ }
23
+
24
+ padding: 20px;
25
+ margin-left: auto;
26
+ margin-right: 0;
27
+ margin-top: 40px;
28
+ margin-bottom: 40px;
29
+
30
+ background-color: $bold-translucent;
31
+
32
+ text-align: right;
33
+ }
34
+
35
+ h4 { margin-top: 25px; }
36
+ }
37
+
38
+ def page_content
39
+ big_title "Why use Fortitude?"
40
+ example_body
41
+ end
42
+
43
+ def example_body
44
+ standard_text_row {
45
+ show_example_title
46
+ example_intro
47
+
48
+ section {
49
+ h4 "What We’re Trying To Do"
50
+ example_description
51
+ }
52
+
53
+ section {
54
+ h4 "Using Standard Templating Engines"
55
+ using_standard_engines
56
+ }
57
+
58
+ section {
59
+ h4 "Issues with Standard Templating Engines"
60
+ standard_engine_issues
61
+ }
62
+
63
+ section {
64
+ h4 "Using Fortitude"
65
+ using_fortitude
66
+ }
67
+
68
+ section {
69
+ h4 "The Benefits"
70
+ fortitude_benefits
71
+ }
72
+
73
+ link_to_next_example if next_example
74
+ }
75
+ end
76
+
77
+ def show_example_title
78
+ h3 example_title(this_example)
79
+ end
80
+
81
+ def example_intro
82
+ raise "Must override in #{self.class.name}"
83
+ end
84
+
85
+ def example_description
86
+ raise "Must override in #{self.class.name}"
87
+ end
88
+
89
+ def using_standard_engines
90
+ raise "Must override in #{self.class.name}"
91
+ end
92
+
93
+ def standard_engine_issues
94
+ raise "Must override in #{self.class.name}"
95
+ end
96
+
97
+ def using_fortitude
98
+ raise "Must override in #{self.class.name}"
99
+ end
100
+
101
+ def fortitude_benefits
102
+ raise "Must override in #{self.class.name}"
103
+ end
104
+
105
+ def link_to_next_example
106
+ e = next_example
107
+ div(:class => 'example_link') {
108
+ span "next", :class => 'next'
109
+ a(:href => e[:path]) {
110
+ text example_title(e)
111
+ }
112
+ }
113
+ end
114
+ end
115
+ end
116
+ end
@@ -0,0 +1,86 @@
1
+ require 'source/why/example_page'
2
+
3
+ module Views
4
+ module Why
5
+ class Index < Views::Why::ExamplePage
6
+ def example_body
7
+ standard_text_row {
8
+ bang_intro
9
+ examples_setup
10
+
11
+ link_to_next_example
12
+ }
13
+ end
14
+
15
+ def bang_intro
16
+ p %{There is exactly one overwhelming reason to use Fortitude:}
17
+
18
+ emphatic_pullquote %{It allows you to write vastly better-factored views.}
19
+
20
+ p %{With Fortitude, you can turn this:}
21
+
22
+ erb <<-EOS
23
+ <div class="container main outermost" id="main-container">
24
+ <div class="row primary">
25
+ <div class="col-sm-7">
26
+ <figure class="source">
27
+ <figcaption>example_code_1.rb</figcaption>
28
+ <pre class="ruby">
29
+ [ 1, 2, 3 ].map { |x| x * 2 } # =&gt; [ 2, 4, 6 ]
30
+ </pre>
31
+ </figure>
32
+
33
+ <%= render :partial => '/shared/buttons/icon_button', :locals => {
34
+ :target => conditional_refresh_url(:user => @user),
35
+ :icon_name => 'refresh',
36
+ :tooltip_html => "<p>Refresh this page</p>"
37
+ } %>
38
+ </div>
39
+ </div>
40
+ </div>
41
+ EOS
42
+
43
+ p %{Into this:}
44
+
45
+ fortitude <<-EOS
46
+ simple_page {
47
+ ruby "example_code_1.rb", "[ 1, 2, 3 ].map { |x| x * 2 } # => [ 2, 4, 6 ]"
48
+
49
+ icon_button(:refresh, conditional_refresh_url(:user => @user)) {
50
+ p "Refresh this page"
51
+ }
52
+ }
53
+ EOS
54
+
55
+ p {
56
+ text %{…and that’s just the beginning. With Fortitude, you can }
57
+ strong "refactor your views into the methods that are right for your application"
58
+ text ". This means:"
59
+ }
60
+
61
+ ul {
62
+ li "You’ll be able to enhance, modify, and debug views much faster."
63
+ li %{You’ll build new views faster — and this pace will accelerate as
64
+ your codebase grows, not decelerate.}
65
+ li "You’ll have fewer bugs in your views, and spend less time debugging them."
66
+ li {
67
+ text "You’ll "
68
+ em "enjoy"
69
+ text " building views much more."
70
+ }
71
+ }
72
+ end
73
+
74
+ def examples_setup
75
+ p %{Fortitude expresses your views using a Ruby DSL that models HTML;
76
+ this allows you to bring all the power of Ruby to bear on your views.
77
+ The difference this makes in the long run is enormous.}
78
+
79
+ p %{It’s easiest to explain by example.
80
+ Follow the link below, and you’ll see #{number_of_examples.humanize}
81
+ examples of using Fortitude to refactor common view problems into clear, concise,
82
+ powerful code.}
83
+ end
84
+ end
85
+ end
86
+ end
@@ -0,0 +1,110 @@
1
+ module Views
2
+ module Why
3
+ class OtherBenefits < Views::Shared::Base
4
+ def content
5
+ container {
6
+ jumbotron {
7
+ h2 "Other Benefits of Fortitude"
8
+ }
9
+
10
+ row {
11
+ columns(:small => 3) { }
12
+ columns(:small => 7) {
13
+ p {
14
+ text %{Next to }
15
+ a("the power Fortitude gives you to factor your views", :href => '/why')
16
+ text %{, its other
17
+ benefits pale by comparison. It’s not that these advantages are even all that small,
18
+ it’s that being able to factor your views well is so important that it’s by far the biggest
19
+ reason to use Fortitude. Even so, it’s worth listing these other benefits of Fortitude:}
20
+ }
21
+
22
+ ul {
23
+ li {
24
+ strong "Speed"
25
+ text %{: Fortitude is currently the fastest general-purpose templating engine
26
+ for Ruby — 20-40% faster than ERb, 4-5x faster than HAML, and 30-40x faster than Erector.}
27
+ }
28
+ li {
29
+ strong "Syntax"
30
+ text %{: Fortitude makes it impossible to make an HTML syntax error, like
31
+ forgetting to close a tag or mismatching tags. If your view parses as Ruby, you’re guaranteed
32
+ to produce syntactically-valid HTML.}
33
+ }
34
+ li {
35
+ strong "Semantics"
36
+ text %{: Fortitude can automatically enforce many of the rules
37
+ of HTML, like which elements can nest within which others (}
38
+ em "e.g."
39
+ text %{, you can’t put a }
40
+ code "<div>"
41
+ text " inside a "
42
+ code "<p>"
43
+ text "), which attributes an element can have (for example, "
44
+ code "<video>"
45
+ text " can have "
46
+ code "width"
47
+ text " and "
48
+ code "height"
49
+ text " attributes, but "
50
+ code "<audio>"
51
+ text " cannot), and — perhaps most usefully — that no two elements on a page can "
52
+ text "have the same "
53
+ code "id"
54
+ text %{. And when you make a mistake, you get an extremely clear error message, even
55
+ referring you to the proper part of the HTML specification to check what went wrong.}
56
+ }
57
+ li {
58
+ strong "Formatting"
59
+ text %{: Fortitude can produce beautifully-formatted, perfectly-indented HTML — even across
60
+ view boundaries. Conversely, in production, it automatically produces highly-compressed HTML
61
+ to minimize page weight.}
62
+ }
63
+ li {
64
+ strong "Traceability"
65
+ text %{: When working with a large codebase, it can be very frustrating trying to track
66
+ down which partial is responsible for generating a particular piece of content. In development,
67
+ Fortitude emits HTML comments above and below every partial, telling you exactly what's
68
+ being rendered and with what variable assignments — making it a piece of cake to figure
69
+ out which file you need to edit to change something.}
70
+ }
71
+ li {
72
+ strong "Interoperability"
73
+ text %{: Fortitude interoperates perfectly with your existing templating engine(s)
74
+ (like ERb or HAML) and views. You can start using it on new views, or convert existing views
75
+ at any pace you like. There’s even a tool, }
76
+ a(:href => "https://github.com/ageweke/html2fortitude") {
77
+ code "html2fortitude"
78
+ }
79
+ text ", that automatically converts ERb views to Fortitue."
80
+ }
81
+ li {
82
+ strong "Compatibility"
83
+ text %{: Fortitude is compatible with Ruby 1.8.7–2.2.}
84
+ em "x"
85
+ text %{, including JRuby, and all versions of Rails from 3.0.}
86
+ em "x"
87
+ text %{ through 4.2.}
88
+ em "x"
89
+ text %{. It also is fully compatible with the wonderful }
90
+ a("Tilt", :href => "https://github.com/rtomayko/tilt")
91
+ text %{ meta-templating framework, so any tool that uses Tilt can use Fortitude.
92
+ (For example, the documentation you’re reading right now was built using }
93
+ a("Middleman", :href => "http://middlemanapp.com/")
94
+ text ", using Fortitude as the templating engine.)"
95
+ }
96
+ }
97
+
98
+ p {
99
+ text %{Still not convinced? }
100
+ a("Read more about how powerful it can be to factor your views well", :href => '/why')
101
+ text "."
102
+ }
103
+ }
104
+ columns(:small => 2) { }
105
+ }
106
+ }
107
+ end
108
+ end
109
+ end
110
+ end
@@ -39,5 +39,10 @@ Gem::Specification.new do |s|
39
39
  s.add_development_dependency "rake-compiler"
40
40
  s.add_development_dependency "json"
41
41
  s.add_development_dependency "tilt", "~> 2.0"
42
- s.add_development_dependency "oop_rails_server", ">= 0.0.3"
42
+ s.add_development_dependency "oop_rails_server", ">= 0.0.7"
43
+
44
+ # This is because i18n >= 0.7 is incompatible with Ruby 1.8.x.
45
+ if RUBY_VERSION =~ /^1\.8\./
46
+ s.add_development_dependency "i18n", "~> 0.6.0", "< 0.7.0"
47
+ end
43
48
  end
@@ -107,6 +107,7 @@ module Fortitude
107
107
  :spec => 'http://www.w3.org/TR/html401/struct/text.html#h-9.3.2.1'
108
108
  tag :pre, :newline_before => true, :valid_attributes => ATTRS_ATTRIBUTES,
109
109
  :can_enclose => INLINE_CONTENT - %w{img object big small sub sup},
110
+ :suppress_formatting_inside => true,
110
111
  :spec => 'http://www.w3.org/TR/html401/struct/text.html#h-9.3.4'
111
112
  tag :ins, :valid_attributes => ATTRS_ATTRIBUTES + %w{cite datetime}, :can_enclose => FLOW_CONTENT,
112
113
  :spec => 'http://www.w3.org/TR/html401/struct/text.html#h-9.4'
@@ -152,6 +152,7 @@ module Fortitude
152
152
  html5_tag :hr, :newline_before => true, :content_allowed => false,
153
153
  :spec => 'http://www.w3.org/TR/html5/grouping-content.html#the-hr-element'
154
154
  html5_tag :pre, :newline_before => true, :can_enclose => PHRASING_CONTENT,
155
+ :suppress_formatting_inside => true,
155
156
  :spec => 'http://www.w3.org/TR/html5/grouping-content.html#the-pre-element'
156
157
  html5_tag :blockquote, :newline_before => true, :can_enclose => FLOW_CONTENT, :valid_attributes => %w{cite},
157
158
  :spec => 'http://www.w3.org/TR/html5/grouping-content.html#the-blockquote-element'
@@ -17,9 +17,12 @@ def #{method_name}(content_or_attributes = nil, attributes = nil)
17
17
  if block_given?
18
18
  _fortitude_raise_no_content_allowed_error(#{tag_object_const}) # :if ! content_allowed
19
19
  o.#{concat_method}(#{open_const})
20
- #{yield_call}
21
- o = @_fortitude_output_buffer_holder.output_buffer
22
- o.#{concat_method}(#{close_const})
20
+ begin
21
+ #{yield_call}
22
+ o = @_fortitude_output_buffer_holder.output_buffer
23
+ ensure
24
+ o.#{concat_method}(#{close_const})
25
+ end
23
26
  else
24
27
  o.#{concat_method}(#{alone_const})
25
28
  end
@@ -37,9 +40,12 @@ def #{method_name}(content_or_attributes = nil, attributes = nil)
37
40
  if block_given?
38
41
  _fortitude_raise_no_content_allowed_error(#{tag_object_const}) # :if ! content_allowed
39
42
  o.#{concat_method}(#{partial_open_end_const})
40
- #{yield_call}
41
- o = @_fortitude_output_buffer_holder.output_buffer
42
- o.#{concat_method}(#{close_const})
43
+ begin
44
+ #{yield_call}
45
+ ensure
46
+ o = @_fortitude_output_buffer_holder.output_buffer
47
+ o.#{concat_method}(#{close_const})
48
+ end
43
49
  else
44
50
  o.#{concat_method}(#{partial_open_alone_end_const})
45
51
  end
@@ -49,12 +55,16 @@ def #{method_name}(content_or_attributes = nil, attributes = nil)
49
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
50
56
  content_or_attributes.to_s.fortitude_append_escaped_string(o) # :if escape_direct_content
51
57
  o.#{concat_method}(content_or_attributes.to_s) # :if ! escape_direct_content
52
- if block_given?
53
- _fortitude_raise_no_content_allowed_error(#{tag_object_const}) # :if ! content_allowed
54
- #{yield_call}
58
+
59
+ begin
60
+ if block_given?
61
+ _fortitude_raise_no_content_allowed_error(#{tag_object_const}) # :if ! content_allowed
62
+ #{yield_call}
63
+ end
64
+ ensure
55
65
  o = @_fortitude_output_buffer_holder.output_buffer
66
+ o.#{concat_method}(#{close_const})
56
67
  end
57
- o.#{concat_method}(#{close_const})
58
68
  else
59
69
  _fortitude_raise_no_content_allowed_error(#{tag_object_const}) # :if ! content_allowed
60
70
  this_tag.validate_attributes(self, attributes) # :if needs_attribute_rules
@@ -66,12 +76,15 @@ def #{method_name}(content_or_attributes = nil, attributes = nil)
66
76
  rc.emitting_tag!(self, FORTITUDE_TEXT_PSEUDOTAG, content_or_attributes, nil) { } unless content_or_attributes.instance_variable_get('@html_safe') # :if record_emitting_tag
67
77
  content_or_attributes.to_s.fortitude_append_escaped_string(o) # :if escape_direct_content
68
78
  o.#{concat_method}(content_or_attributes.to_s) # :if ! escape_direct_content
69
- if block_given?
70
- _fortitude_raise_no_content_allowed_error(#{tag_object_const}) # :if ! content_allowed
71
- #{yield_call}
79
+ begin
80
+ if block_given?
81
+ _fortitude_raise_no_content_allowed_error(#{tag_object_const}) # :if ! content_allowed
82
+ #{yield_call}
83
+ end
84
+ ensure
72
85
  o = @_fortitude_output_buffer_holder.output_buffer
86
+ o.#{concat_method}(#{close_const})
73
87
  end
74
- o.#{concat_method}(#{close_const})
75
88
  end
76
89
  rc.needs_newline! if format_output # :if needs_formatting && newline_before
77
90
  end # :if record_emitting_tag