Skip to content

Commit

Permalink
Speed up for Backend::Simple#interpolate
Browse files Browse the repository at this point in the history
  • Loading branch information
Luca Guidi authored and Sven Fuchs committed Aug 30, 2008
1 parent 09a73c0 commit 9e1ac6b
Showing 1 changed file with 20 additions and 17 deletions.
37 changes: 20 additions & 17 deletions lib/i18n/backend/simple.rb
Expand Up @@ -3,6 +3,9 @@
module I18n
module Backend
class Simple
INTERPOLATION_RESERVED_KEYS = %w(scope default)
MATCH = /(\\\\)?\{\{([^\}]+)\}\}/

# Accepts a list of paths to translation files. Loads translations from
# plain Ruby (*.rb) or YAML files (*.yml). See #load_rb and #load_yml
# for details.
Expand Down Expand Up @@ -114,29 +117,29 @@ def pluralize(locale, entry, count)
# the <tt>{{...}}</tt> key in a string (once for the string and once for the
# interpolation).
def interpolate(locale, string, values = {})
return string if !string.is_a?(String)
return string unless string.is_a?(String)

string = string.gsub(/%d/, '{{count}}').gsub(/%s/, '{{value}}')

if string.respond_to?(:force_encoding)
original_encoding = string.encoding
string.force_encoding(Encoding::BINARY)
end
s = StringScanner.new(string)

while s.skip_until(/\{\{/)
s.string[s.pos - 3, 1] = '' and next if s.pre_match[-1, 1] == '\\'
start_pos = s.pos - 2
key = s.scan_until(/\}\}/)[0..-3]
end_pos = s.pos - 1
original_encoding = string.encoding
string.force_encoding(Encoding::BINARY)
end

raise ReservedInterpolationKey.new(key, string) if %w(scope default).include?(key)
raise MissingInterpolationArgument.new(key, string) unless values.has_key? key.to_sym
result = string.gsub(MATCH) do
escaped, pattern, key = $1, $2, $2.to_sym

s.string[start_pos..end_pos] = values[key.to_sym].to_s
s.unscan
if escaped
pattern
elsif INTERPOLATION_RESERVED_KEYS.include?(pattern)
raise ReservedInterpolationKey.new(pattern, string)
elsif !values.include?(key)
raise MissingInterpolationArgument.new(pattern, string)
else
values[key].to_s
end
end

result = s.string

result.force_encoding(original_encoding) if original_encoding
result
end
Expand Down

0 comments on commit 9e1ac6b

Please sign in to comment.