i18n-inflector 2.5.1 → 2.6.1
This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
- data.tar.gz.sig +0 -0
- data/ChangeLog +80 -0
- data/Gemfile +8 -5
- data/Gemfile.lock +27 -0
- data/Manifest.txt +2 -0
- data/README.rdoc +27 -1
- data/Rakefile +14 -4
- data/ci/i18n-inflector.gemspec +7 -6
- data/ci/i18nv4-Gemfile +1 -1
- data/ci/i18nv4-Gemfile.lock +25 -0
- data/docs/HISTORY +22 -0
- data/docs/TODO +2 -1
- data/docs/USAGE +28 -0
- data/lib/i18n-inflector/api.rb +111 -107
- data/lib/i18n-inflector/api_strict.rb +164 -21
- data/lib/i18n-inflector/backend.rb +10 -7
- data/lib/i18n-inflector/config.rb +19 -19
- data/lib/i18n-inflector/errors.rb +13 -13
- data/lib/i18n-inflector/hset.rb +1 -1
- data/lib/i18n-inflector/inflection_data.rb +52 -59
- data/lib/i18n-inflector/inflection_data_strict.rb +49 -40
- data/lib/i18n-inflector/inflector.rb +3 -3
- data/lib/i18n-inflector/interpolate.rb +68 -37
- data/lib/i18n-inflector/lazy_enum.rb +119 -32
- data/lib/i18n-inflector/long_comments.rb +1 -1
- data/lib/i18n-inflector/options.rb +3 -3
- data/lib/i18n-inflector/version.rb +2 -2
- metadata +38 -27
- metadata.gz.sig +0 -0
data/lib/i18n-inflector/hset.rb
CHANGED
@@ -2,7 +2,7 @@
|
|
2
2
|
#
|
3
3
|
# Author:: Paweł Wilk (mailto:pw@gnu.org)
|
4
4
|
# Copyright:: (c) 2011 by Paweł Wilk
|
5
|
-
# License:: This program is licensed under the terms of {file:docs/LGPL GNU Lesser General Public License} or {file:COPYING Ruby License}.
|
5
|
+
# License:: This program is licensed under the terms of {file:docs/LGPL GNU Lesser General Public License} or {file:docs/COPYING Ruby License}.
|
6
6
|
#
|
7
7
|
# This file contains more intuitive version of Set.
|
8
8
|
|
@@ -2,7 +2,7 @@
|
|
2
2
|
#
|
3
3
|
# Author:: Paweł Wilk (mailto:pw@gnu.org)
|
4
4
|
# Copyright:: (c) 2011 by Paweł Wilk
|
5
|
-
# License:: This program is licensed under the terms of {file:docs/LGPL GNU Lesser General Public License} or {file:COPYING Ruby License}.
|
5
|
+
# License:: This program is licensed under the terms of {file:docs/LGPL GNU Lesser General Public License} or {file:docs/COPYING Ruby License}.
|
6
6
|
#
|
7
7
|
# This file contains class that is used to keep
|
8
8
|
# inflection data.
|
@@ -21,9 +21,9 @@ module I18n
|
|
21
21
|
def initialize(locale=nil)
|
22
22
|
@kinds = Hash.new(false)
|
23
23
|
@tokens = Hash.new(DUMMY_TOKEN)
|
24
|
-
@defaults = Hash.new
|
25
|
-
@known_kinds = nil
|
26
24
|
@lazy_tokens = LazyHashEnumerator.new(@tokens)
|
25
|
+
@lazy_kinds = LazyArrayEnumerator.new(@kinds)
|
26
|
+
@defaults = Hash.new
|
27
27
|
@locale = locale
|
28
28
|
end
|
29
29
|
|
@@ -75,7 +75,6 @@ module I18n
|
|
75
75
|
@tokens[token][:kind] = kind.to_sym
|
76
76
|
@tokens[token][:description] = description.to_s
|
77
77
|
@kinds[kind] = true
|
78
|
-
@known_kinds = nil
|
79
78
|
end
|
80
79
|
|
81
80
|
# Tests if the token is a true token.
|
@@ -157,94 +156,95 @@ module I18n
|
|
157
156
|
kind.nil? ? true : o[:kind] == kind
|
158
157
|
end
|
159
158
|
|
160
|
-
#
|
159
|
+
# Iterates through all the true tokens (not aliases).
|
161
160
|
#
|
162
|
-
# @return [
|
163
|
-
#
|
164
|
-
# @
|
161
|
+
# @return [LazyHashEnumerator] the lazy enumerator (<tt>token => description</tt>)
|
162
|
+
# @yield [token, description] optional block in which each token will be yielded
|
163
|
+
# @yieldparam [Symbol] token a token
|
164
|
+
# @yieldparam [String] description a description string for a token
|
165
|
+
# @yieldreturn [LazyHashEnumerator] the lazy enumerator
|
166
|
+
# @overload each_true_token
|
165
167
|
# Reads all the true tokens (not aliases).
|
166
|
-
# @return [
|
167
|
-
#
|
168
|
-
# @overload get_true_tokens(kind)
|
168
|
+
# @return [LazyHashEnumerator] the lazy enumerator (<tt>token => description</tt>)
|
169
|
+
# @overload each_true_token(kind)
|
169
170
|
# Reads all the true tokens (not aliases) of the given +kind+.
|
170
171
|
# @param [Symbol] kind the identifier of a kind
|
171
|
-
# @return [
|
172
|
-
|
173
|
-
def get_true_tokens(kind=nil)
|
172
|
+
# @return [LazyHashEnumerator] the lazy enumerator (<tt>token => description</tt>)
|
173
|
+
def each_true_token(kind=nil, &block)
|
174
174
|
t = @lazy_tokens
|
175
175
|
t = t.select { |token,data| data[:kind] == kind } unless kind.nil?
|
176
176
|
t.select { |token,data| data[:target].nil? }.
|
177
|
-
map { |token,data| data[:description] }.
|
178
|
-
to_h
|
177
|
+
map { |token,data| data[:description] }.each(&block)
|
179
178
|
end
|
180
179
|
|
181
|
-
#
|
180
|
+
# Iterates through all the aliases.
|
182
181
|
#
|
183
|
-
# @return [
|
184
|
-
#
|
185
|
-
# @
|
182
|
+
# @return [LazyHashEnumerator] the lazy enumerator (<tt>alias => target</tt>)
|
183
|
+
# @yield [alias, target] optional block in which each alias will be yielded
|
184
|
+
# @yieldparam [Symbol] alias an alias
|
185
|
+
# @yieldparam [Symbol] target a name of the target token
|
186
|
+
# @yieldreturn [LazyHashEnumerator] the lazy enumerator
|
187
|
+
# @overload each_alias
|
186
188
|
# Reads all the aliases.
|
187
|
-
# @return [
|
188
|
-
#
|
189
|
-
# @overload get_aliases(kind)
|
189
|
+
# @return [LazyHashEnumerator] the lazy enumerator (<tt>alias => target</tt>)
|
190
|
+
# @overload each_alias(kind)
|
190
191
|
# Reads all the aliases of the given +kind+.
|
191
192
|
# @param [Symbol] kind the identifier of a kind
|
192
|
-
# @return [
|
193
|
-
|
194
|
-
def get_aliases(kind=nil)
|
193
|
+
# @return [LazyHashEnumerator] the lazy enumerator (<tt>alias => target</tt>)
|
194
|
+
def each_alias(kind=nil, &block)
|
195
195
|
t = @lazy_tokens
|
196
196
|
t = t.select { |token,data| data[:kind] == kind } unless kind.nil?
|
197
197
|
t.reject { |token,data| data[:target].nil? }.
|
198
|
-
map { |token,data| data[:target] }.
|
199
|
-
to_h
|
198
|
+
map { |token,data| data[:target] }.each(&block)
|
200
199
|
end
|
201
200
|
|
202
|
-
#
|
201
|
+
# Iterates through all the tokens in a way that it is possible to
|
203
202
|
# distinguish true tokens from aliases.
|
204
203
|
#
|
205
204
|
# @note True tokens have descriptions (String) and aliases
|
206
205
|
# have targets (Symbol) assigned.
|
207
|
-
# @return [
|
208
|
-
#
|
209
|
-
# @
|
206
|
+
# @return [LazyHashEnumerator] the lazy enumerator (<tt>token => description|target</tt>)
|
207
|
+
# @yield [token, value] optional block in which each token will be yielded
|
208
|
+
# @yieldparam [Symbol] token a token
|
209
|
+
# @yieldparam [Symbol, String] value a description string for a token or a target (if alias)
|
210
|
+
# @yieldreturn [LazyHashEnumerator] the lazy enumerator
|
211
|
+
# @overload each_raw_token
|
210
212
|
# Reads all the tokens in a way that it is possible to
|
211
213
|
# distinguish true tokens from aliases.
|
212
|
-
# @return [
|
213
|
-
#
|
214
|
-
# @overload get_raw_tokens(kind)
|
214
|
+
# @return [LazyHashEnumerator] the lazy enumerator (<tt>token => description|target</tt>)
|
215
|
+
# @overload each_raw_token(kind)
|
215
216
|
# Reads all the tokens of the given +kind+ in a way
|
216
217
|
# that it is possible to distinguish true tokens from aliases.
|
217
218
|
# @param [Symbol] kind the identifier of a kind
|
218
|
-
# @return [
|
219
|
-
|
220
|
-
def get_raw_tokens(kind=nil)
|
219
|
+
# @return [LazyHashEnumerator] the lazy enumerator (<tt>token => description|target</tt>)
|
220
|
+
def each_raw_token(kind=nil, &block)
|
221
221
|
t = @lazy_tokens
|
222
222
|
t = t.select { |token,data| data[:kind] == kind } unless kind.nil?
|
223
223
|
t.map { |token,data| data[:target] || data[:description] }.
|
224
|
-
|
224
|
+
each(&block)
|
225
225
|
end
|
226
226
|
|
227
|
-
#
|
227
|
+
# Iterates through all the tokens (including aliases).
|
228
228
|
#
|
229
|
-
# @note Use {#
|
229
|
+
# @note Use {#each_raw_token} if you want to distinguish
|
230
230
|
# true tokens from aliases.
|
231
|
-
# @return [
|
232
|
-
#
|
233
|
-
# @
|
231
|
+
# @return return [LazyHashEnumerator] the lazy enumerator (<tt>token => description</tt>)
|
232
|
+
# @yield [token, description] optional block in which each token will be yielded
|
233
|
+
# @yieldparam [Symbol] token a token
|
234
|
+
# @yieldparam [String] description a description string for a token
|
235
|
+
# @yieldreturn [LazyHashEnumerator] the lazy enumerator
|
236
|
+
# @overload each_token
|
234
237
|
# Reads all the tokens (including aliases).
|
235
|
-
# @return [
|
236
|
-
#
|
237
|
-
# @overload get_tokens(kind)
|
238
|
+
# @return return [LazyHashEnumerator] the lazy enumerator (<tt>token => description</tt>)
|
239
|
+
# @overload each_token(kind)
|
238
240
|
# Reads all the tokens (including aliases) of the
|
239
241
|
# given +kind+.
|
240
242
|
# @param [Symbol] kind the identifier of a kind
|
241
|
-
# @return [
|
242
|
-
|
243
|
-
def get_tokens(kind=nil)
|
243
|
+
# @return [LazyHashEnumerator] the lazy enumerator (<tt>token => description</tt>)
|
244
|
+
def each_token(kind=nil, &block)
|
244
245
|
t = @lazy_tokens
|
245
246
|
t = t.select { |token,data| data[:kind] == kind } unless kind.nil?
|
246
|
-
t.map { |token,data| data[:description] }.
|
247
|
-
to_h
|
247
|
+
t.map { |token,data| data[:description] }.each(&block)
|
248
248
|
end
|
249
249
|
|
250
250
|
# Gets a target token for the alias.
|
@@ -317,13 +317,6 @@ module I18n
|
|
317
317
|
k == kind ? r : nil
|
318
318
|
end
|
319
319
|
|
320
|
-
# Gets all known kinds.
|
321
|
-
#
|
322
|
-
# @return [Array<Symbol>] an array containing all the known kinds
|
323
|
-
def get_kinds
|
324
|
-
@known_kinds ||= @kinds.keys
|
325
|
-
end
|
326
|
-
|
327
320
|
# Reads the default token of a kind.
|
328
321
|
#
|
329
322
|
# @note It will always return true token (not an alias).
|
@@ -2,7 +2,7 @@
|
|
2
2
|
#
|
3
3
|
# Author:: Paweł Wilk (mailto:pw@gnu.org)
|
4
4
|
# Copyright:: (c) 2011 by Paweł Wilk
|
5
|
-
# License:: This program is licensed under the terms of {file:docs/LGPL GNU Lesser General Public License} or {file:COPYING Ruby License}.
|
5
|
+
# License:: This program is licensed under the terms of {file:docs/LGPL GNU Lesser General Public License} or {file:docs/COPYING Ruby License}.
|
6
6
|
#
|
7
7
|
# This file contains class that is used to keep
|
8
8
|
# inflection data for strict kinds.
|
@@ -26,15 +26,11 @@ module I18n
|
|
26
26
|
# It makes chaining calls to internal data easier.
|
27
27
|
DUMMY_TOKENS = Hash.new(DUMMY_TOKEN).freeze
|
28
28
|
|
29
|
-
# This constant contains a dummy iterator for hash of hashes.
|
30
|
-
# It makes chaining calls to internal data easier.
|
31
|
-
DUMMY_T_LAZY = LazyHashEnumerator.new(DUMMY_TOKENS).freeze
|
32
|
-
|
33
29
|
# This constant contains a dummy hash. It makes
|
34
30
|
# chaining calls to internal data easier.
|
35
31
|
DUMMY_HASH = Hash.new.freeze
|
36
32
|
|
37
|
-
# Locale
|
33
|
+
# Locale this database works for.
|
38
34
|
attr_reader :locale
|
39
35
|
|
40
36
|
# Initializes internal structures.
|
@@ -43,9 +39,8 @@ module I18n
|
|
43
39
|
# the object to be labeled with
|
44
40
|
def initialize(locale=nil)
|
45
41
|
@tokens = Hash.new(DUMMY_TOKENS)
|
46
|
-
@
|
42
|
+
@lazy_kinds = LazyArrayEnumerator.new(@tokens)
|
47
43
|
@defaults = Hash.new
|
48
|
-
@known_kinds = nil
|
49
44
|
@locale = locale
|
50
45
|
end
|
51
46
|
|
@@ -83,9 +78,7 @@ module I18n
|
|
83
78
|
kind = kind.to_sym
|
84
79
|
kind_tree = @tokens[kind]
|
85
80
|
if kind_tree.equal?(DUMMY_TOKENS)
|
86
|
-
@known_kinds = nil
|
87
81
|
kind_tree = @tokens[kind] = Hash.new(DUMMY_TOKEN)
|
88
|
-
@lazy_tokens[kind] = LazyHashEnumerator.new(kind_tree)
|
89
82
|
end
|
90
83
|
token = kind_tree[token] = {}
|
91
84
|
token[:description] = description.to_s
|
@@ -155,56 +148,70 @@ module I18n
|
|
155
148
|
not @tokens[kind][alias_name][:target].nil?
|
156
149
|
end
|
157
150
|
|
158
|
-
#
|
151
|
+
# Iterates through all the true tokens (not aliases) of the
|
159
152
|
# given strict kind.
|
160
153
|
#
|
161
154
|
# @param [Symbol] kind the identifier of a kind
|
162
|
-
# @return [
|
163
|
-
#
|
164
|
-
|
165
|
-
|
166
|
-
|
155
|
+
# @return [LazyHashEnumerator] the lazy enumerator (<tt>token => description</tt>)
|
156
|
+
# @yield [token, description] optional block in which each token will be yielded
|
157
|
+
# @yieldparam [Symbol] token a token
|
158
|
+
# @yieldparam [String] description a description string for a token
|
159
|
+
# @yieldreturn [LazyHashEnumerator] the lazy enumerator
|
160
|
+
def each_true_token(kind, &block)
|
161
|
+
LazyHashEnumerator.new(@tokens[kind]).
|
162
|
+
select { |token,data| data[:target].nil? }.
|
167
163
|
map { |token,data| data[:description] }.
|
168
|
-
|
164
|
+
each(&block)
|
169
165
|
end
|
170
166
|
|
171
|
-
#
|
167
|
+
# Iterates through all the aliases of the given strict kind.
|
172
168
|
#
|
173
169
|
# @param [Symbol] kind the identifier of a kind
|
174
|
-
# @return [
|
175
|
-
#
|
176
|
-
|
177
|
-
|
170
|
+
# @return [LazyHashEnumerator] the lazy enumerator (<tt>token => target</tt>)
|
171
|
+
# @yield [alias, target] optional block in which each alias will be yielded
|
172
|
+
# @yieldparam [Symbol] alias an alias
|
173
|
+
# @yieldparam [Symbol] target a name of the target token
|
174
|
+
# @yieldreturn [LazyHashEnumerator] the lazy enumerator
|
175
|
+
def each_alias(kind, &block)
|
176
|
+
LazyHashEnumerator.new(@tokens[kind]).
|
178
177
|
reject { |token,data| data[:target].nil? }.
|
179
178
|
map { |token,data| data[:target] }.
|
180
|
-
|
179
|
+
each(&block)
|
181
180
|
end
|
182
181
|
|
183
|
-
#
|
182
|
+
# Iterates through all the tokens of the given strict kind
|
184
183
|
# in a way that it is possible to
|
185
184
|
# distinguish true tokens from aliases.
|
186
185
|
#
|
187
186
|
# @note True tokens have descriptions (String) and aliases
|
188
187
|
# have targets (Symbol) assigned.
|
189
188
|
# @param [Symbol] kind the identifier of a kind
|
190
|
-
# @return [
|
191
|
-
#
|
192
|
-
|
193
|
-
|
189
|
+
# @return [LazyHashEnumerator] the lazy enumerator (<tt>token => description|target</tt>)
|
190
|
+
# @yield [token, value] optional block in which each token will be yielded
|
191
|
+
# @yieldparam [Symbol] token a token
|
192
|
+
# @yieldparam [Symbol, String] value a description string for a token or a target (if alias)
|
193
|
+
# @yieldreturn [LazyHashEnumerator] the lazy enumerator
|
194
|
+
def each_raw_token(kind, &block)
|
195
|
+
LazyHashEnumerator.new(@tokens[kind]).
|
194
196
|
map { |token,data| data[:target] || data[:description] }.
|
195
|
-
|
197
|
+
each(&block)
|
196
198
|
end
|
197
199
|
|
198
|
-
#
|
200
|
+
# Iterates through all the tokens (including aliases) of the given
|
199
201
|
# strict kind.
|
200
202
|
#
|
201
|
-
# @note Use {#
|
203
|
+
# @note Use {#each_raw_token} if you want to distinguish
|
202
204
|
# true tokens from aliases.
|
203
205
|
# @param [Symbol] kind the identifier of a kind
|
204
|
-
# @return [
|
205
|
-
#
|
206
|
-
|
207
|
-
|
206
|
+
# @return [LazyHashEnumerator] the lazy enumerator (<tt>token => description</tt>)
|
207
|
+
# @yield [token, description] optional block in which each token will be yielded
|
208
|
+
# @yieldparam [Symbol] token a token
|
209
|
+
# @yieldparam [String] description a description string for a token
|
210
|
+
# @yieldreturn [LazyHashEnumerator] the lazy enumerator
|
211
|
+
def each_token(kind, &block)
|
212
|
+
LazyHashEnumerator.new(@tokens[kind]).
|
213
|
+
map{ |token,data| data[:description] }.
|
214
|
+
each(&block)
|
208
215
|
end
|
209
216
|
|
210
217
|
# Gets a target token for the given alias of a strict kind.
|
@@ -249,12 +256,14 @@ module I18n
|
|
249
256
|
o[:target].nil? ? token : o[:target]
|
250
257
|
end
|
251
258
|
|
252
|
-
#
|
259
|
+
# Iterates through all known strict kinds.
|
253
260
|
#
|
254
|
-
# @return [
|
255
|
-
#
|
256
|
-
|
257
|
-
|
261
|
+
# @return [LazyArrayEnumerator] the lazy enumerator
|
262
|
+
# @yield [kind] optional block in which each kind will be yielded
|
263
|
+
# @yieldparam [Symbol] kind the inflection kind
|
264
|
+
# @yieldreturn [LazyArrayEnumerator] the lazy enumerator
|
265
|
+
def each_kind(&block)
|
266
|
+
@lazy_kinds.map{|k,v| k}.each(&block)
|
258
267
|
end
|
259
268
|
|
260
269
|
# Reads the default token of a strict kind.
|
@@ -2,7 +2,7 @@
|
|
2
2
|
#
|
3
3
|
# Author:: Paweł Wilk (mailto:pw@gnu.org)
|
4
4
|
# Copyright:: (c) 2011 by Paweł Wilk
|
5
|
-
# License:: This program is licensed under the terms of {file:docs/LGPL GNU Lesser General Public License} or {file:COPYING Ruby License}.
|
5
|
+
# License:: This program is licensed under the terms of {file:docs/LGPL GNU Lesser General Public License} or {file:docs/COPYING Ruby License}.
|
6
6
|
#
|
7
7
|
# This file contains a stub of I18n::Inflector module,
|
8
8
|
# which extends I18n by adding the ability
|
@@ -22,7 +22,7 @@ module I18n
|
|
22
22
|
end
|
23
23
|
end
|
24
24
|
|
25
|
-
# @version 2.
|
25
|
+
# @version 2.6
|
26
26
|
# @api public
|
27
27
|
#
|
28
28
|
# This module contains inflection classes and modules for enabling
|
@@ -32,7 +32,7 @@ module I18n
|
|
32
32
|
# so it will interpolate additional inflection data present
|
33
33
|
# in translations.
|
34
34
|
#
|
35
|
-
# @see file:USAGE
|
35
|
+
# @see file:docs/USAGE
|
36
36
|
module Inflector
|
37
37
|
|
38
38
|
end # module Inflector
|
@@ -2,7 +2,7 @@
|
|
2
2
|
#
|
3
3
|
# Author:: Paweł Wilk (mailto:pw@gnu.org)
|
4
4
|
# Copyright:: (c) 2011 by Paweł Wilk
|
5
|
-
# License:: This program is licensed under the terms of {file:docs/LGPL GNU Lesser General Public License} or {file:COPYING Ruby License}.
|
5
|
+
# License:: This program is licensed under the terms of {file:docs/LGPL GNU Lesser General Public License} or {file:docs/COPYING Ruby License}.
|
6
6
|
#
|
7
7
|
# This file contains I18n::Inflector::Interpolate module,
|
8
8
|
# which is included in the API.
|
@@ -44,6 +44,7 @@ module I18n
|
|
44
44
|
# that overrides global setting (see: {I18n::Inflector::InflectionOptions#interpolate_symbols})
|
45
45
|
# @return [String] the string with interpolated patterns
|
46
46
|
def interpolate(string, locale, options = {})
|
47
|
+
@inflector_opt_cache = nil
|
47
48
|
|
48
49
|
case string
|
49
50
|
|
@@ -96,18 +97,21 @@ module I18n
|
|
96
97
|
suff = key.delete(:@suffix).to_s
|
97
98
|
kind = key.delete(:@kind).to_s
|
98
99
|
free = key.delete(:@free)
|
99
|
-
free = free.nil? ? "" : (Operators::Tokens::OR
|
100
|
+
free = free.nil? ? "" : ("" << Operators::Tokens::OR << free.to_s)
|
100
101
|
|
101
|
-
pref
|
102
|
-
key.map { |k,v| k.to_s
|
103
|
-
join(Operators::Tokens::OR)
|
102
|
+
"" << pref << Markers::PATTERN << kind << Markers::PATTERN_BEGIN <<
|
103
|
+
key.map { |k,v| "" << k.to_s << Operators::Tokens::ASSIGN << v.to_s }.
|
104
|
+
join(Operators::Tokens::OR) << free << Markers::PATTERN_END << suff
|
104
105
|
end
|
105
106
|
|
106
107
|
private
|
107
108
|
|
108
109
|
# @private
|
109
110
|
def interpolate_core(string, locale, options)
|
110
|
-
|
111
|
+
|
112
|
+
@inflector_opt_cache ||= options.except(*Reserved::KEYS)
|
113
|
+
passed_kinds = @inflector_opt_cache
|
114
|
+
|
111
115
|
raises = options[:inflector_raises]
|
112
116
|
aliased_patterns = options[:inflector_aliased_patterns]
|
113
117
|
unknown_defaults = options[:inflector_unknown_defaults]
|
@@ -117,11 +121,11 @@ module I18n
|
|
117
121
|
idb_strict = @idb_strict[locale]
|
118
122
|
|
119
123
|
string.gsub(PATTERN_REGEXP) do
|
120
|
-
pattern_fix = $1
|
121
|
-
strict_kind = $2
|
122
|
-
pattern_content = $3
|
123
|
-
multipattern = $4
|
124
|
-
ext_pattern = $&
|
124
|
+
pattern_fix = $1 # character sticked to the left side of a pattern
|
125
|
+
strict_kind = $2 # strict kind(s) if any
|
126
|
+
pattern_content = $3 # content of a pattern
|
127
|
+
multipattern = $4 # another pattern(s) sticked to the right side of a pattern
|
128
|
+
ext_pattern = $& # the matching string
|
125
129
|
|
126
130
|
# initialize some defaults
|
127
131
|
ext_freetext = ''
|
@@ -141,11 +145,13 @@ module I18n
|
|
141
145
|
patterns = []
|
142
146
|
patterns << pattern_content
|
143
147
|
patterns += multipattern.scan(MULTI_REGEXP).flatten
|
144
|
-
next
|
145
|
-
|
146
|
-
|
147
|
-
|
148
|
-
|
148
|
+
next "" << pattern_fix <<
|
149
|
+
patterns.map do |content|
|
150
|
+
interpolate_core("" << Markers::PATTERN << strict_kind <<
|
151
|
+
Markers::PATTERN_BEGIN << content <<
|
152
|
+
Markers::PATTERN_END,
|
153
|
+
locale, options)
|
154
|
+
end.join
|
149
155
|
end
|
150
156
|
|
151
157
|
# set parsed kind if strict kind is given (named pattern is parsed)
|
@@ -156,7 +162,7 @@ module I18n
|
|
156
162
|
default_token = nil
|
157
163
|
subdb = idb
|
158
164
|
else
|
159
|
-
sym_parsed_kind = (Markers::STRICT_KIND
|
165
|
+
sym_parsed_kind = ("" << Markers::STRICT_KIND << strict_kind).to_sym
|
160
166
|
|
161
167
|
if strict_kind.include?(Operators::Tokens::AND)
|
162
168
|
|
@@ -181,10 +187,10 @@ module I18n
|
|
181
187
|
!idb_strict.has_kind?(strict_kind.to_sym))
|
182
188
|
raise I18n::InvalidInflectionKind.new(locale, ext_pattern, sym_parsed_kind) if raises
|
183
189
|
# Take a free text for invalid kind and return it
|
184
|
-
next pattern_fix
|
185
|
-
|
186
|
-
|
187
|
-
|
190
|
+
next "" << pattern_fix << pattern_content.scan(TOKENS_REGEXP).reverse.
|
191
|
+
select { |t,v,f| t.nil? && !f.nil? }.
|
192
|
+
map { |t,v,f| f.to_s }.
|
193
|
+
first.to_s
|
188
194
|
else
|
189
195
|
strict_kind = strict_kind.to_sym
|
190
196
|
parsed_kind = strict_kind
|
@@ -197,11 +203,12 @@ module I18n
|
|
197
203
|
|
198
204
|
# process pattern content's
|
199
205
|
pattern_content.scan(TOKENS_REGEXP) do
|
200
|
-
ext_token = $1.to_s
|
201
|
-
ext_value = $2.to_s
|
202
|
-
ext_freetext = $3.to_s
|
206
|
+
ext_token = $1.to_s # token(s)
|
207
|
+
ext_value = $2.to_s # value of token(s)
|
208
|
+
ext_freetext = $3.to_s # freetext if any
|
209
|
+
ext_tokens = nil
|
203
210
|
tokens = Hash.new(false)
|
204
|
-
negatives = Hash.new(false)
|
211
|
+
negatives = Hash.new(false)
|
205
212
|
kind = nil
|
206
213
|
passed_token = nil
|
207
214
|
result = nil
|
@@ -219,18 +226,20 @@ module I18n
|
|
219
226
|
|
220
227
|
# unroll wildcard token
|
221
228
|
if ext_token == Operators::Tokens::WILDCARD
|
222
|
-
|
223
229
|
if parsed_kind.nil?
|
224
230
|
# wildcard for a regular kind that we do not know yet
|
225
231
|
wildcard_value = ext_value
|
226
232
|
else
|
227
233
|
# wildcard for a known strict or regular kind
|
228
|
-
|
234
|
+
ext_tokens = subdb.each_true_token(parsed_kind).each_key.map{|k|k.to_s}
|
229
235
|
end
|
230
236
|
end
|
231
237
|
|
232
|
-
# split tokens
|
233
|
-
ext_token.split(Operators::Token::OR)
|
238
|
+
# split groupped tokens if comma is present and put into fast list
|
239
|
+
ext_tokens = ext_token.split(Operators::Token::OR) if ext_tokens.nil?
|
240
|
+
|
241
|
+
# for each token from group
|
242
|
+
ext_tokens.each do |t|
|
234
243
|
# token name corrupted
|
235
244
|
if t.to_s.empty?
|
236
245
|
raise I18n::InvalidInflectionToken.new(locale, ext_pattern, t) if raises
|
@@ -306,20 +315,29 @@ module I18n
|
|
306
315
|
|
307
316
|
# get passed token from options or from a default token
|
308
317
|
if passed_kinds.has_key?(expected_kind)
|
318
|
+
|
309
319
|
passed_token = passed_kinds[expected_kind]
|
320
|
+
|
310
321
|
if passed_token.is_a?(Method)
|
322
|
+
|
311
323
|
passed_token = passed_token.call { next expected_kind, locale }
|
312
|
-
passed_kinds[expected_kind] = passed_token
|
324
|
+
passed_kinds[expected_kind] = passed_token # cache the result
|
325
|
+
|
313
326
|
elsif passed_token.is_a?(Proc)
|
327
|
+
|
314
328
|
passed_token = passed_token.call(expected_kind, locale)
|
315
|
-
passed_kinds[expected_kind] = passed_token
|
329
|
+
passed_kinds[expected_kind] = passed_token # cache the result
|
330
|
+
|
316
331
|
end
|
332
|
+
|
317
333
|
orig_passed_token = passed_token
|
334
|
+
|
318
335
|
# validate passed token's name
|
319
336
|
if Reserved::Tokens.invalid?(passed_token, :OPTION)
|
320
337
|
raise I18n::InvalidInflectionOption.new(locale, ext_pattern, orig_passed_token) if raises
|
321
338
|
passed_token = default_token if unknown_defaults
|
322
339
|
end
|
340
|
+
|
323
341
|
else
|
324
342
|
# current inflection option wasn't found
|
325
343
|
# but delay this exception because we might use
|
@@ -432,7 +450,7 @@ module I18n
|
|
432
450
|
|
433
451
|
end
|
434
452
|
|
435
|
-
pattern_fix
|
453
|
+
"" << pattern_fix << (result || ext_freetext)
|
436
454
|
|
437
455
|
end # single pattern processing
|
438
456
|
|
@@ -469,13 +487,26 @@ module I18n
|
|
469
487
|
results = tokens.split(Operators::Tokens::AND).map do |token|
|
470
488
|
raise IndexError.new if token.empty?
|
471
489
|
if value == Markers::LOUD_VALUE
|
472
|
-
r = interpolate_core(Markers::PATTERN
|
473
|
-
|
474
|
-
|
490
|
+
r = interpolate_core("" << Markers::PATTERN <<
|
491
|
+
kinds.next.to_s <<
|
492
|
+
Markers::PATTERN_BEGIN <<
|
493
|
+
token.to_s <<
|
494
|
+
Operators::Tokens::ASSIGN <<
|
495
|
+
value.to_s <<
|
496
|
+
Operators::Tokens::OR <<
|
497
|
+
Markers::PATTERN <<
|
498
|
+
Markers::PATTERN_END,
|
499
|
+
locale, options)
|
475
500
|
break if r == Markers::PATTERN # using this marker only as a helper to indicate empty result!
|
476
501
|
else
|
477
|
-
r = interpolate_core(Markers::PATTERN
|
478
|
-
|
502
|
+
r = interpolate_core("" << Markers::PATTERN <<
|
503
|
+
kinds.next.to_s <<
|
504
|
+
Markers::PATTERN_BEGIN <<
|
505
|
+
token.to_s <<
|
506
|
+
Operators::Tokens::ASSIGN <<
|
507
|
+
value.to_s <<
|
508
|
+
Markers::PATTERN_END,
|
509
|
+
locale, options)
|
479
510
|
break if r != value # stop with this set, because something is not matching
|
480
511
|
end
|
481
512
|
r
|