Deprecate block_called_from_erb? pending a solution for getting it into apps

This commit is contained in:
Carlhuda
2010-03-09 18:00:28 -08:00
committed by wycats
parent f30b7a0903
commit 4464b8e87b
9 changed files with 154 additions and 64 deletions

View File

@@ -10,6 +10,7 @@ module ActionView #:nodoc:
autoload :CsrfHelper, 'action_view/helpers/csrf_helper'
autoload :DateHelper, 'action_view/helpers/date_helper'
autoload :DebugHelper, 'action_view/helpers/debug_helper'
autoload :DeprecatedBlockHelpers, 'action_view/helpers/deprecated_block_helpers'
autoload :FormHelper, 'action_view/helpers/form_helper'
autoload :FormOptionsHelper, 'action_view/helpers/form_options_helper'
autoload :FormTagHelper, 'action_view/helpers/form_tag_helper'

View File

@@ -30,14 +30,10 @@ module ActionView
# <b><%= @greeting %></b>
# </body></html>
#
def capture(*args, &block)
# Return captured buffer in erb.
if block_called_from_erb?(block)
with_output_buffer { block.call(*args) }
else
# Return block result otherwise, but protect buffer also.
with_output_buffer { return block.call(*args) }
end
def capture(*args)
value = nil
buffer = with_output_buffer { value = yield *args }
buffer.presence || value
end
# Calling content_for stores a block of markup in an identifier for later use.
@@ -143,7 +139,7 @@ module ActionView
# Defaults to a new empty string.
def with_output_buffer(buf = nil) #:nodoc:
unless buf
buf = ActiveSupport::SafeBuffer.new
buf = ActionView::OutputBuffer.new
buf.force_encoding(output_buffer.encoding) if buf.respond_to?(:force_encoding)
end
self.output_buffer, old_buffer = buf, output_buffer

View File

@@ -0,0 +1,35 @@
module ActionView
module Helpers
module DeprecatedBlockHelpers
extend ActiveSupport::Concern
include ActionView::Helpers::TagHelper
include ActionView::Helpers::TextHelper
include ActionView::Helpers::JavaScriptHelper
def content_tag(*, &block)
block_called_from_erb?(block) ? safe_concat(super) : super
end
def javascript_tag(*, &block)
block_called_from_erb?(block) ? safe_concat(super) : super
end
BLOCK_CALLED_FROM_ERB = 'defined? __in_erb_template'
if RUBY_VERSION < '1.9.0'
# Check whether we're called from an erb template.
# We'd return a string in any other case, but erb <%= ... %>
# can't take an <% end %> later on, so we have to use <% ... %>
# and implicitly concat.
def block_called_from_erb?(block)
block && eval(BLOCK_CALLED_FROM_ERB, block)
end
else
def block_called_from_erb?(block)
block && eval(BLOCK_CALLED_FROM_ERB, block.binding)
end
end
end
end
end

View File

@@ -83,13 +83,7 @@ module ActionView
content_or_options_with_block
end
tag = content_tag(:script, javascript_cdata_section(content), html_options.merge(:type => Mime::JS))
if block_called_from_erb?(block)
safe_concat(tag)
else
tag
end
content_tag(:script, javascript_cdata_section(content), html_options.merge(:type => Mime::JS))
end
def javascript_cdata_section(content) #:nodoc:

View File

@@ -7,6 +7,9 @@ module ActionView
module TagHelper
include ERB::Util
extend ActiveSupport::Concern
include CaptureHelper
BOOLEAN_ATTRIBUTES = %w(disabled readonly multiple checked autobuffer
autoplay controls loop selected hidden scoped async
defer reversed ismap seemless muted required
@@ -69,13 +72,7 @@ module ActionView
def content_tag(name, content_or_options_with_block = nil, options = nil, escape = true, &block)
if block_given?
options = content_or_options_with_block if content_or_options_with_block.is_a?(Hash)
content_tag = content_tag_string(name, capture(&block), options, escape)
if block_called_from_erb?(block)
safe_concat(content_tag)
else
content_tag
end
content_tag_string(name, capture(&block), options, escape)
else
content_tag_string(name, content_or_options_with_block, options, escape)
end
@@ -109,21 +106,6 @@ module ActionView
end
private
BLOCK_CALLED_FROM_ERB = 'defined? __in_erb_template'
if RUBY_VERSION < '1.9.0'
# Check whether we're called from an erb template.
# We'd return a string in any other case, but erb <%= ... %>
# can't take an <% end %> later on, so we have to use <% ... %>
# and implicitly concat.
def block_called_from_erb?(block)
block && eval(BLOCK_CALLED_FROM_ERB, block)
end
else
def block_called_from_erb?(block)
block && eval(BLOCK_CALLED_FROM_ERB, block.binding)
end
end
def content_tag_string(name, content, options, escape = true)
tag_options = tag_options(options, escape) if options

View File

@@ -3,10 +3,46 @@ require 'active_support/core_ext/string/output_safety'
require 'erubis'
module ActionView
class OutputBuffer
def initialize
@buffer = ActiveSupport::SafeBuffer.new
end
def safe_concat(value)
@buffer.safe_concat(value)
end
def <<(value)
@buffer << value.to_s
end
def length
@buffer.length
end
def [](*args)
@buffer[*args]
end
def to_s
@buffer.to_s
end
def empty?
@buffer.empty?
end
if "".respond_to?(:force_encoding)
def force_encoding(encoding)
@buffer.force_encoding(encoding)
end
end
end
module Template::Handlers
class Erubis < ::Erubis::Eruby
def add_preamble(src)
src << "@output_buffer = ActiveSupport::SafeBuffer.new;"
src << "@output_buffer = ActionView::OutputBuffer.new;"
end
def add_text(src, text)
@@ -15,10 +51,10 @@ module ActionView
end
def add_expr_literal(src, code)
if code =~ /\s*raw\s+(.*)/
src << "@output_buffer.safe_concat((" << $1 << ").to_s);"
if code =~ /(do|\{)(\s*\|[^|]*\|)?\s*\Z/
src << '@output_buffer << ' << code
else
src << '@output_buffer << ((' << code << ').to_s);'
src << '@output_buffer << (' << code << ');'
end
end
@@ -42,7 +78,7 @@ module ActionView
self.erb_trim_mode = '-'
self.default_format = Mime::HTML
cattr_accessor :erb_implementation
self.erb_implementation = Erubis

View File

@@ -0,0 +1,60 @@
require "abstract_unit"
module ERBTest
module SharedTagHelpers
extend ActiveSupport::Testing::Declarative
def render_content(start, inside)
template = block_helper(start, inside)
ActionView::Template::Handlers::Erubis.new(template).evaluate(context.new)
end
test "percent equals works for content_tag" do
assert_equal "<div>Hello world</div>", render_content("content_tag(:div)", "Hello world")
end
test "percent equals works for javascript_tag" do
expected_output = "<script type=\"text/javascript\">\n//<![CDATA[\nalert('Hello')\n//]]>\n</script>"
assert_equal expected_output, render_content("javascript_tag", "alert('Hello')")
end
test "percent equals works for javascript_tag with options" do
expected_output = "<script id=\"the_js_tag\" type=\"text/javascript\">\n//<![CDATA[\nalert('Hello')\n//]]>\n</script>"
assert_equal expected_output, render_content("javascript_tag(:id => 'the_js_tag')", "alert('Hello')")
end
end
class TagHelperTest < ActiveSupport::TestCase
def context
Class.new do
include ActionView::Helpers::TagHelper
include ActionView::Helpers::JavaScriptHelper
attr_accessor :output_buffer
end
end
def block_helper(str, rest)
"<%= #{str} do %>#{rest}<% end %>"
end
include SharedTagHelpers
end
class DeprecatedTagHelperTest < ActiveSupport::TestCase
def context
Class.new do
include ActionView::Helpers::TagHelper
include ActionView::Helpers::JavaScriptHelper
include ActionView::Helpers::DeprecatedBlockHelpers
attr_accessor :output_buffer
end
end
def block_helper(str, rest)
"<% __in_erb_template=true %><% #{str} do %>#{rest}<% end %>"
end
include SharedTagHelpers
end
end

View File

@@ -74,18 +74,6 @@ class JavaScriptHelperTest < ActionView::TestCase
javascript_tag("alert('hello')", :id => "the_js_tag")
end
def test_javascript_tag_with_block_in_erb
__in_erb_template = ''
javascript_tag { concat "alert('hello')" }
assert_dom_equal "<script type=\"text/javascript\">\n//<![CDATA[\nalert('hello')\n//]]>\n</script>", output_buffer
end
def test_javascript_tag_with_block_and_options_in_erb
__in_erb_template = ''
javascript_tag(:id => "the_js_tag") { concat "alert('hello')" }
assert_dom_equal "<script id=\"the_js_tag\" type=\"text/javascript\">\n//<![CDATA[\nalert('hello')\n//]]>\n</script>", output_buffer
end
def test_javascript_cdata_section
assert_dom_equal "\n//<![CDATA[\nalert('hello')\n//]]>\n", javascript_cdata_section("alert('hello')")
end

View File

@@ -42,15 +42,13 @@ class TagHelperTest < ActionView::TestCase
end
def test_content_tag_with_block_in_erb
__in_erb_template = ''
content_tag(:div) { concat "Hello world!" }
assert_dom_equal "<div>Hello world!</div>", output_buffer
buffer = content_tag(:div) { concat "Hello world!" }
assert_dom_equal "<div>Hello world!</div>", buffer
end
def test_content_tag_with_block_and_options_in_erb
__in_erb_template = ''
content_tag(:div, :class => "green") { concat "Hello world!" }
assert_dom_equal %(<div class="green">Hello world!</div>), output_buffer
buffer = content_tag(:div, :class => "green") { concat "Hello world!" }
assert_dom_equal %(<div class="green">Hello world!</div>), buffer
end
def test_content_tag_with_block_and_options_out_of_erb
@@ -68,10 +66,10 @@ class TagHelperTest < ActionView::TestCase
output_buffer
end
# TAG TODO: Move this into a real template
def test_content_tag_nested_in_content_tag_in_erb
__in_erb_template = true
content_tag("p") { concat content_tag("b", "Hello") }
assert_equal '<p><b>Hello</b></p>', output_buffer
buffer = content_tag("p") { concat content_tag("b", "Hello") }
assert_equal '<p><b>Hello</b></p>', buffer
end
def test_content_tag_with_escaped_array_class