lib/twitter_cldr/js/mustache/implementation/tokenizers/numbers/number_tokenizer.coffee (50 lines of code) (raw):
# Copyright 2012 Twitter, Inc
# http://www.apache.org/licenses/LICENSE-2.0
class TwitterCldr.NumberTokenizer
constructor : (@data_reader) ->
@special_symbols_map = {
'.' : '{DOT}',
',' : '{COMMA}',
'0' : '{ZERO}',
'#' : '{POUND}',
'¤' : '{CURRENCY}',
'%' : '{PERCENT}',
'E' : '{SCIENTIFIC}'
}
@inverse_special_symbols_map = {}
for k, v of @special_symbols_map
@inverse_special_symbols_map[v] = k
@special_symbols_regex = new RegExp("'(?:" + (
[(TwitterCldr.Utilities.regex_escape(k)) for k, v of @special_symbols_map]
).join('|') + ")'")
@inverse_special_symbols_regex = new RegExp(
(
[TwitterCldr.Utilities.regex_escape(k) for k, v of @inverse_special_symbols_map]
).join('|'))
recognizers = [
new TwitterCldr.TokenRecognizer("pattern", new RegExp(/[0?#,\.]+/)),
new TwitterCldr.TokenRecognizer("plaintext", new RegExp(/[\s\S]*/)),
]
@tokenizer = new TwitterCldr.Tokenizer(
recognizers,
new RegExp(/([^0*#,\.]*)([0#,\.]+)([^0*#,\.]*)$/),
false
)
splitter_source = (r.regex.source for r in recognizers).join("|")
splitter = new RegExp(splitter_source)
tokenize : (pattern) ->
escaped_pattern = pattern.replace(@special_symbols_regex,
(match) ->
@special_symbols_map[match].slice(1, @special_symbols_map[match].length-1)
)
tokens = (
new TwitterCldr.PatternTokenizer(@data_reader, @tokenizer)
).tokenize(escaped_pattern)
for token in tokens
token.value = token.value.replace(@inverse_special_symbols_regex,
(match) ->
@inverse_special_symbols_map[match]
)
if tokens[0].value is ""
tokens.slice(1)
else tokens