Skip to content

Commit

Permalink
Check if source is encoding aware.
Browse files Browse the repository at this point in the history
  • Loading branch information
josevalim committed Dec 20, 2011
1 parent 19292a7 commit 45e85c3
Showing 1 changed file with 30 additions and 32 deletions.
62 changes: 30 additions & 32 deletions actionpack/lib/action_view/template.rb
Expand Up @@ -173,7 +173,7 @@ def inspect
@inspect ||= defined?(Rails.root) ? identifier.sub("#{Rails.root}/", '') : identifier
end

# This method is responsible for properly setting he encoding of the
# This method is responsible for properly setting the encoding of the
# source. Until this point, we assume that the source is BINARY data.
# If no additional information is supplied, we assume the encoding is
# the same as <tt>Encoding.default_external</tt>.
Expand All @@ -184,38 +184,36 @@ def inspect
# before passing the source on to the template engine, leaving a
# blank line in its stead.
def encode!
return unless source.encoding == Encoding::BINARY

if source.encoding_aware?
# Look for # encoding: *. If we find one, we'll encode the
# String in that encoding, otherwise, we'll use the
# default external encoding.
if source.sub!(/\A#{ENCODING_FLAG}/, '')
encoding = magic_encoding = $1
else
encoding = Encoding.default_external
end
return unless source.encoding_aware? && source.encoding == Encoding::BINARY

# Look for # encoding: *. If we find one, we'll encode the
# String in that encoding, otherwise, we'll use the
# default external encoding.
if source.sub!(/\A#{ENCODING_FLAG}/, '')
encoding = magic_encoding = $1
else
encoding = Encoding.default_external
end

# Tag the source with the default external encoding
# or the encoding specified in the file
source.force_encoding(encoding)

# If the user didn't specify an encoding, and the handler
# handles encodings, we simply pass the String as is to
# the handler (with the default_external tag)
if !magic_encoding && @handler.respond_to?(:handles_encoding?) && @handler.handles_encoding?
source
# Otherwise, if the String is valid in the encoding,
# encode immediately to default_internal. This means
# that if a handler doesn't handle encodings, it will
# always get Strings in the default_internal
elsif source.valid_encoding?
source.encode!
# Otherwise, since the String is invalid in the encoding
# specified, raise an exception
else
raise WrongEncodingError.new(source, encoding)
end
# Tag the source with the default external encoding
# or the encoding specified in the file
source.force_encoding(encoding)

# If the user didn't specify an encoding, and the handler
# handles encodings, we simply pass the String as is to
# the handler (with the default_external tag)
if !magic_encoding && @handler.respond_to?(:handles_encoding?) && @handler.handles_encoding?
source
# Otherwise, if the String is valid in the encoding,
# encode immediately to default_internal. This means
# that if a handler doesn't handle encodings, it will
# always get Strings in the default_internal
elsif source.valid_encoding?
source.encode!
# Otherwise, since the String is invalid in the encoding
# specified, raise an exception
else
raise WrongEncodingError.new(source, encoding)
end
end

Expand Down

0 comments on commit 45e85c3

Please sign in to comment.