提交 5ec2c7dc 编写于 作者: J Jeremy Kemper

Ruby 1.9: ERB template encoding using a magic comment at the top of the file

上级 e23554d7
*Edge*
* Ruby 1.9: ERB template encoding using a magic comment at the top of the file. [Jeremy Kemper]
<%# encoding: utf-8 %>
* Change integration test helpers to accept Rack environment instead of just HTTP Headers [Pratik Naik]
Before : get '/path', {}, 'Accept' => 'text/javascript'
......
......@@ -16,11 +16,7 @@ class ERB < TemplateHandler
self.default_format = Mime::HTML
def compile(template)
src = ::ERB.new("<% __in_erb_template=true %>#{template.source}", nil, erb_trim_mode, '@output_buffer').src
# Ruby 1.9 prepends an encoding to the source. However this is
# useless because you can only set an encoding on the first line
RUBY_VERSION >= '1.9' ? src.sub(/\A#coding:.*\n/, '') : src
::ERB.new("<% __in_erb_template=true %>#{template.source}", nil, erb_trim_mode, '@output_buffer').src
end
end
end
......
......@@ -52,16 +52,26 @@ def compile(locals, view)
locals_code = locals.keys.map! { |key| "#{key} = local_assigns[:#{key}];" }.join
code = @handler.call(self)
encoding_comment = $1 if code.sub!(/\A(#.*coding.*)\n/, '')
source = <<-end_src
def #{method_name}(local_assigns)
old_output_buffer = output_buffer;#{locals_code};#{@handler.call(self)}
old_output_buffer = output_buffer;#{locals_code};#{code}
ensure
self.output_buffer = old_output_buffer
end
end_src
if encoding_comment
source = "#{encoding_comment}\n#{source}"
line = -1
else
line = 0
end
begin
ActionView::Base::CompiledTemplates.module_eval(source, identifier, 0)
ActionView::Base::CompiledTemplates.module_eval(source, identifier, line)
method_name
rescue Exception => e # errors from template code
if logger = (view && view.logger)
......@@ -79,4 +89,4 @@ def build_method_name(locals)
"_render_template_#{@identifier.hash}_#{__id__}_#{locals.keys.hash}".gsub('-', "_")
end
end
end
\ No newline at end of file
end
<%# encoding: utf-8 -%>
Русский текст
日本語のテキスト
\ No newline at end of file
<%= "日".encoding %>
<%= @output_buffer.encoding %>
<%= __ENCODING__ %>
......@@ -249,7 +249,7 @@ def test_render_with_nested_layout
if '1.9'.respond_to?(:force_encoding)
def test_render_utf8_template
result = @view.render(:file => "test/utf8.html.erb", :layouts => "layouts/yield")
assert_equal "Русский текст\n日本語のテキスト", result
assert_equal "Русский текст\nUTF-8\nUTF-8\nUTF-8\n", result
assert_equal Encoding::UTF_8, result.encoding
end
end
......
Markdown is supported
0% .
You are about to add 0 people to the discussion. Proceed with caution.
先完成此消息的编辑!
想要评论请 注册