twitter_cldr 3.0.0.beta1 → 3.0.0
Sign up to get free protection for your applications and to get access to all the features.
- checksums.yaml +4 -4
- data/Gemfile +16 -2
- data/History.txt +9 -1
- data/README.md +297 -113
- data/Rakefile +97 -17
- data/lib/twitter_cldr/collation/collator.rb +12 -3
- data/lib/twitter_cldr/collation/trie_builder.rb +1 -1
- data/lib/twitter_cldr/{tokenizers/calendars → data_readers}/additional_date_format_selector.rb +6 -4
- data/lib/twitter_cldr/data_readers/calendar_data_reader.rb +91 -0
- data/lib/twitter_cldr/data_readers/data_reader.rb +32 -0
- data/lib/twitter_cldr/data_readers/date_data_reader.rb +26 -0
- data/lib/twitter_cldr/data_readers/date_time_data_reader.rb +41 -0
- data/lib/twitter_cldr/data_readers/number_data_reader.rb +142 -0
- data/lib/twitter_cldr/data_readers/time_data_reader.rb +26 -0
- data/lib/twitter_cldr/data_readers/timespan_data_reader.rb +122 -0
- data/lib/twitter_cldr/data_readers.rb +17 -0
- data/lib/twitter_cldr/formatters/calendars/{datetime_formatter.rb → date_time_formatter.rb} +27 -42
- data/lib/twitter_cldr/formatters/calendars/timespan_formatter.rb +3 -64
- data/lib/twitter_cldr/formatters/formatter.rb +39 -0
- data/lib/twitter_cldr/formatters/list_formatter.rb +22 -12
- data/lib/twitter_cldr/formatters/numbers/abbreviated/abbreviated_number_formatter.rb +5 -26
- data/lib/twitter_cldr/formatters/numbers/currency_formatter.rb +2 -11
- data/lib/twitter_cldr/formatters/numbers/decimal_formatter.rb +4 -2
- data/lib/twitter_cldr/formatters/numbers/number_formatter.rb +45 -27
- data/lib/twitter_cldr/formatters/numbers/percent_formatter.rb +3 -13
- data/lib/twitter_cldr/formatters/numbers/rbnf/formatters.rb +224 -0
- data/lib/twitter_cldr/formatters/numbers/rbnf/post_processors/chinese.rb +122 -0
- data/lib/twitter_cldr/formatters/numbers/rbnf/rule.rb +93 -0
- data/lib/twitter_cldr/formatters/numbers/rbnf/rule_group.rb +20 -0
- data/lib/twitter_cldr/formatters/numbers/rbnf/rule_parser.rb +86 -0
- data/lib/twitter_cldr/formatters/numbers/rbnf/rule_set.rb +259 -0
- data/lib/twitter_cldr/formatters/numbers/rbnf/substitution.rb +30 -0
- data/lib/twitter_cldr/formatters/numbers/rbnf.rb +127 -0
- data/lib/twitter_cldr/formatters/plurals/plural_formatter.rb +18 -6
- data/lib/twitter_cldr/formatters.rb +4 -5
- data/lib/twitter_cldr/localized/localized_array.rb +1 -1
- data/lib/twitter_cldr/localized/localized_date.rb +6 -3
- data/lib/twitter_cldr/localized/localized_datetime.rb +38 -15
- data/lib/twitter_cldr/localized/localized_number.rb +40 -24
- data/lib/twitter_cldr/localized/localized_object.rb +4 -4
- data/lib/twitter_cldr/localized/localized_string.rb +40 -7
- data/lib/twitter_cldr/localized/localized_time.rb +9 -2
- data/lib/twitter_cldr/localized/localized_timespan.rb +50 -5
- data/lib/twitter_cldr/normalization.rb +8 -19
- data/lib/twitter_cldr/parsers/parser.rb +50 -0
- data/lib/twitter_cldr/parsers/segmentation_parser.rb +137 -0
- data/lib/twitter_cldr/parsers/symbol_table.rb +30 -0
- data/lib/twitter_cldr/parsers/unicode_regex/character_class.rb +91 -0
- data/lib/twitter_cldr/parsers/unicode_regex/character_range.rb +39 -0
- data/lib/twitter_cldr/parsers/unicode_regex/character_set.rb +65 -0
- data/lib/twitter_cldr/parsers/unicode_regex/component.rb +50 -0
- data/lib/twitter_cldr/parsers/unicode_regex/literal.rb +83 -0
- data/lib/twitter_cldr/parsers/unicode_regex/unicode_string.rb +41 -0
- data/lib/twitter_cldr/parsers/unicode_regex_parser.rb +262 -0
- data/lib/twitter_cldr/parsers.rb +5 -1
- data/lib/twitter_cldr/resources/casefolder.rb.erb +64 -0
- data/lib/twitter_cldr/resources/casefolder_class_generator.rb +75 -0
- data/lib/twitter_cldr/resources/download.rb +10 -4
- data/lib/twitter_cldr/resources/icu_based_importer.rb +18 -0
- data/lib/twitter_cldr/resources/locales_resources_importer.rb +24 -13
- data/lib/twitter_cldr/resources/normalization_quick_check_importer.rb +1 -14
- data/lib/twitter_cldr/resources/rbnf_test_importer.rb +107 -0
- data/lib/twitter_cldr/resources/readme_renderer.rb +115 -0
- data/lib/twitter_cldr/resources/tailoring_importer.rb +2 -8
- data/lib/twitter_cldr/resources/uli/segment_exceptions_importer.rb +62 -0
- data/lib/twitter_cldr/resources/uli.rb +12 -0
- data/lib/twitter_cldr/resources/unicode_data_importer.rb +84 -14
- data/lib/twitter_cldr/resources/unicode_importer.rb +37 -0
- data/lib/twitter_cldr/resources/unicode_properties_importer.rb +79 -0
- data/lib/twitter_cldr/resources.rb +8 -1
- data/lib/twitter_cldr/shared/break_iterator.rb +213 -0
- data/lib/twitter_cldr/shared/calendar.rb +38 -14
- data/lib/twitter_cldr/shared/casefolder.rb +210 -0
- data/lib/twitter_cldr/shared/code_point.rb +103 -16
- data/lib/twitter_cldr/shared/numbering_system.rb +58 -0
- data/lib/twitter_cldr/shared/territories.rb +43 -1
- data/lib/twitter_cldr/shared/unicode_regex.rb +81 -0
- data/lib/twitter_cldr/shared.rb +13 -9
- data/lib/twitter_cldr/tokenizers/calendars/date_time_tokenizer.rb +77 -0
- data/lib/twitter_cldr/tokenizers/calendars/date_tokenizer.rb +14 -29
- data/lib/twitter_cldr/tokenizers/calendars/time_tokenizer.rb +13 -28
- data/lib/twitter_cldr/tokenizers/calendars/timespan_tokenizer.rb +11 -87
- data/lib/twitter_cldr/tokenizers/numbers/number_tokenizer.rb +16 -71
- data/lib/twitter_cldr/tokenizers/numbers/rbnf_tokenizer.rb +53 -0
- data/lib/twitter_cldr/tokenizers/pattern_tokenizer.rb +42 -0
- data/lib/twitter_cldr/tokenizers/segmentation/segmentation_tokenizer.rb +39 -0
- data/lib/twitter_cldr/tokenizers/tokenizer.rb +116 -0
- data/lib/twitter_cldr/tokenizers/unicode_regex/unicode_regex_tokenizer.rb +52 -0
- data/lib/twitter_cldr/tokenizers.rb +8 -4
- data/lib/twitter_cldr/utils/code_points.rb +1 -1
- data/lib/twitter_cldr/utils/range_set.rb +242 -0
- data/lib/twitter_cldr/utils/yaml.rb +17 -12
- data/lib/twitter_cldr/utils.rb +1 -1
- data/lib/twitter_cldr/version.rb +1 -1
- data/lib/twitter_cldr.rb +2 -1
- data/resources/custom/locales/sv/units.yml +8 -0
- data/resources/locales/af/calendars.yml +278 -224
- data/resources/locales/af/currencies.yml +954 -916
- data/resources/locales/af/languages.yml +583 -580
- data/resources/locales/af/layout.yml +5 -5
- data/resources/locales/af/lists.yml +23 -7
- data/resources/locales/af/numbers.yml +59 -54
- data/resources/locales/af/plurals.yml +2 -2
- data/resources/locales/af/rbnf.yml +261 -0
- data/resources/locales/af/territories.yml +264 -263
- data/resources/locales/ar/calendars.yml +287 -259
- data/resources/locales/ar/currencies.yml +1730 -1692
- data/resources/locales/ar/languages.yml +583 -580
- data/resources/locales/ar/layout.yml +5 -5
- data/resources/locales/ar/lists.yml +23 -7
- data/resources/locales/ar/numbers.yml +66 -61
- data/resources/locales/ar/plurals.yml +5 -8
- data/resources/locales/ar/rbnf.yml +519 -0
- data/resources/locales/ar/territories.yml +264 -263
- data/resources/locales/be/calendars.yml +238 -237
- data/resources/locales/be/currencies.yml +954 -917
- data/resources/locales/be/languages.yml +583 -580
- data/resources/locales/be/layout.yml +5 -5
- data/resources/locales/be/lists.yml +23 -7
- data/resources/locales/be/numbers.yml +62 -57
- data/resources/locales/be/plurals.yml +7 -4
- data/resources/locales/be/rbnf.yml +1288 -0
- data/resources/locales/be/territories.yml +264 -263
- data/resources/locales/bg/calendars.yml +278 -218
- data/resources/locales/bg/currencies.yml +955 -917
- data/resources/locales/bg/languages.yml +583 -580
- data/resources/locales/bg/layout.yml +5 -5
- data/resources/locales/bg/lists.yml +23 -7
- data/resources/locales/bg/numbers.yml +62 -57
- data/resources/locales/bg/plurals.yml +2 -2
- data/resources/locales/bg/rbnf.yml +280 -0
- data/resources/locales/bg/territories.yml +264 -263
- data/resources/locales/bn/calendars.yml +287 -225
- data/resources/locales/bn/currencies.yml +953 -916
- data/resources/locales/bn/languages.yml +583 -580
- data/resources/locales/bn/layout.yml +5 -5
- data/resources/locales/bn/lists.yml +23 -7
- data/resources/locales/bn/numbers.yml +62 -57
- data/resources/locales/bn/plurals.yml +2 -2
- data/resources/locales/bn/rbnf.yml +4 -0
- data/resources/locales/bn/territories.yml +264 -263
- data/resources/locales/ca/calendars.yml +278 -278
- data/resources/locales/ca/currencies.yml +953 -916
- data/resources/locales/ca/languages.yml +583 -580
- data/resources/locales/ca/layout.yml +5 -5
- data/resources/locales/ca/lists.yml +23 -7
- data/resources/locales/ca/numbers.yml +62 -57
- data/resources/locales/ca/plurals.yml +3 -2
- data/resources/locales/ca/rbnf.yml +756 -0
- data/resources/locales/ca/territories.yml +264 -263
- data/resources/locales/cs/calendars.yml +269 -262
- data/resources/locales/cs/currencies.yml +1483 -1172
- data/resources/locales/cs/languages.yml +583 -580
- data/resources/locales/cs/layout.yml +5 -5
- data/resources/locales/cs/lists.yml +23 -7
- data/resources/locales/cs/numbers.yml +64 -58
- data/resources/locales/cs/plurals.yml +6 -2
- data/resources/locales/cs/rbnf.yml +367 -0
- data/resources/locales/cs/territories.yml +264 -263
- data/resources/locales/cy/calendars.yml +275 -274
- data/resources/locales/cy/currencies.yml +1585 -1548
- data/resources/locales/cy/languages.yml +583 -580
- data/resources/locales/cy/layout.yml +5 -5
- data/resources/locales/cy/lists.yml +23 -7
- data/resources/locales/cy/numbers.yml +66 -61
- data/resources/locales/cy/plurals.yml +4 -3
- data/resources/locales/cy/rbnf.yml +298 -0
- data/resources/locales/cy/territories.yml +264 -263
- data/resources/locales/da/calendars.yml +281 -280
- data/resources/locales/da/currencies.yml +954 -916
- data/resources/locales/da/languages.yml +583 -580
- data/resources/locales/da/layout.yml +5 -5
- data/resources/locales/da/lists.yml +23 -7
- data/resources/locales/da/numbers.yml +62 -57
- data/resources/locales/da/plurals.yml +3 -2
- data/resources/locales/da/rbnf.yml +194 -0
- data/resources/locales/da/territories.yml +264 -263
- data/resources/locales/de/calendars.yml +294 -293
- data/resources/locales/de/currencies.yml +954 -916
- data/resources/locales/de/languages.yml +583 -580
- data/resources/locales/de/layout.yml +5 -5
- data/resources/locales/de/lists.yml +23 -7
- data/resources/locales/de/numbers.yml +62 -57
- data/resources/locales/de/plurals.yml +3 -2
- data/resources/locales/de/rbnf.yml +346 -0
- data/resources/locales/de/territories.yml +264 -263
- data/resources/locales/el/calendars.yml +279 -282
- data/resources/locales/el/currencies.yml +954 -916
- data/resources/locales/el/languages.yml +583 -580
- data/resources/locales/el/layout.yml +5 -5
- data/resources/locales/el/lists.yml +23 -7
- data/resources/locales/el/numbers.yml +62 -57
- data/resources/locales/el/plurals.yml +2 -2
- data/resources/locales/el/rbnf.yml +880 -0
- data/resources/locales/el/territories.yml +264 -263
- data/resources/locales/en/calendars.yml +192 -191
- data/resources/locales/en/currencies.yml +953 -915
- data/resources/locales/en/languages.yml +583 -580
- data/resources/locales/en/layout.yml +5 -5
- data/resources/locales/en/lists.yml +23 -7
- data/resources/locales/en/numbers.yml +62 -57
- data/resources/locales/en/plurals.yml +3 -2
- data/resources/locales/en/rbnf.yml +542 -0
- data/resources/locales/en/territories.yml +264 -263
- data/resources/locales/en-GB/calendars.yml +195 -194
- data/resources/locales/en-GB/currencies.yml +953 -915
- data/resources/locales/en-GB/languages.yml +583 -580
- data/resources/locales/en-GB/layout.yml +5 -5
- data/resources/locales/en-GB/lists.yml +23 -7
- data/resources/locales/en-GB/numbers.yml +62 -57
- data/resources/locales/en-GB/plurals.yml +2 -1
- data/resources/locales/en-GB/rbnf.yml +4 -0
- data/resources/locales/en-GB/territories.yml +264 -263
- data/resources/locales/es/calendars.yml +288 -238
- data/resources/locales/es/currencies.yml +953 -922
- data/resources/locales/es/languages.yml +583 -580
- data/resources/locales/es/layout.yml +5 -5
- data/resources/locales/es/lists.yml +23 -7
- data/resources/locales/es/numbers.yml +62 -57
- data/resources/locales/es/plurals.yml +2 -2
- data/resources/locales/es/rbnf.yml +913 -0
- data/resources/locales/es/territories.yml +264 -263
- data/resources/locales/eu/calendars.yml +277 -218
- data/resources/locales/eu/currencies.yml +953 -916
- data/resources/locales/eu/languages.yml +583 -580
- data/resources/locales/eu/layout.yml +5 -5
- data/resources/locales/eu/lists.yml +23 -7
- data/resources/locales/eu/numbers.yml +56 -51
- data/resources/locales/eu/plurals.yml +2 -2
- data/resources/locales/eu/rbnf.yml +4 -0
- data/resources/locales/eu/territories.yml +264 -263
- data/resources/locales/fa/calendars.yml +294 -293
- data/resources/locales/fa/currencies.yml +955 -916
- data/resources/locales/fa/languages.yml +583 -580
- data/resources/locales/fa/layout.yml +5 -5
- data/resources/locales/fa/lists.yml +23 -7
- data/resources/locales/fa/numbers.yml +62 -57
- data/resources/locales/fa/plurals.yml +2 -2
- data/resources/locales/fa/rbnf.yml +157 -0
- data/resources/locales/fa/territories.yml +264 -263
- data/resources/locales/fi/calendars.yml +284 -283
- data/resources/locales/fi/currencies.yml +953 -915
- data/resources/locales/fi/languages.yml +583 -580
- data/resources/locales/fi/layout.yml +5 -5
- data/resources/locales/fi/lists.yml +23 -7
- data/resources/locales/fi/numbers.yml +62 -57
- data/resources/locales/fi/plurals.yml +3 -2
- data/resources/locales/fi/rbnf.yml +206 -0
- data/resources/locales/fi/territories.yml +264 -263
- data/resources/locales/fil/calendars.yml +281 -230
- data/resources/locales/fil/currencies.yml +953 -916
- data/resources/locales/fil/languages.yml +583 -580
- data/resources/locales/fil/layout.yml +5 -5
- data/resources/locales/fil/lists.yml +23 -7
- data/resources/locales/fil/numbers.yml +62 -57
- data/resources/locales/fil/plurals.yml +3 -2
- data/resources/locales/fil/rbnf.yml +158 -0
- data/resources/locales/fil/territories.yml +264 -263
- data/resources/locales/fr/calendars.yml +297 -296
- data/resources/locales/fr/currencies.yml +968 -949
- data/resources/locales/fr/languages.yml +583 -580
- data/resources/locales/fr/layout.yml +5 -5
- data/resources/locales/fr/lists.yml +23 -7
- data/resources/locales/fr/numbers.yml +62 -57
- data/resources/locales/fr/plurals.yml +2 -2
- data/resources/locales/fr/rbnf.yml +621 -0
- data/resources/locales/fr/territories.yml +264 -263
- data/resources/locales/ga/calendars.yml +192 -191
- data/resources/locales/ga/currencies.yml +954 -916
- data/resources/locales/ga/languages.yml +583 -580
- data/resources/locales/ga/layout.yml +5 -5
- data/resources/locales/ga/lists.yml +23 -7
- data/resources/locales/ga/numbers.yml +62 -57
- data/resources/locales/ga/plurals.yml +4 -3
- data/resources/locales/ga/rbnf.yml +615 -0
- data/resources/locales/ga/territories.yml +264 -263
- data/resources/locales/gl/calendars.yml +283 -217
- data/resources/locales/gl/currencies.yml +953 -916
- data/resources/locales/gl/languages.yml +583 -580
- data/resources/locales/gl/layout.yml +5 -5
- data/resources/locales/gl/lists.yml +23 -7
- data/resources/locales/gl/numbers.yml +62 -57
- data/resources/locales/gl/plurals.yml +3 -2
- data/resources/locales/gl/rbnf.yml +4 -0
- data/resources/locales/gl/territories.yml +264 -263
- data/resources/locales/he/calendars.yml +248 -220
- data/resources/locales/he/currencies.yml +992 -932
- data/resources/locales/he/languages.yml +583 -580
- data/resources/locales/he/layout.yml +5 -5
- data/resources/locales/he/lists.yml +23 -7
- data/resources/locales/he/numbers.yml +64 -59
- data/resources/locales/he/plurals.yml +6 -3
- data/resources/locales/he/rbnf.yml +1029 -0
- data/resources/locales/he/territories.yml +264 -263
- data/resources/locales/hi/calendars.yml +284 -216
- data/resources/locales/hi/currencies.yml +953 -915
- data/resources/locales/hi/languages.yml +583 -580
- data/resources/locales/hi/layout.yml +5 -5
- data/resources/locales/hi/lists.yml +23 -7
- data/resources/locales/hi/numbers.yml +60 -55
- data/resources/locales/hi/plurals.yml +2 -2
- data/resources/locales/hi/rbnf.yml +430 -0
- data/resources/locales/hi/territories.yml +264 -263
- data/resources/locales/hr/calendars.yml +308 -307
- data/resources/locales/hr/currencies.yml +1248 -1504
- data/resources/locales/hr/languages.yml +583 -580
- data/resources/locales/hr/layout.yml +5 -5
- data/resources/locales/hr/lists.yml +23 -7
- data/resources/locales/hr/numbers.yml +63 -59
- data/resources/locales/hr/plurals.yml +12 -4
- data/resources/locales/hr/rbnf.yml +599 -0
- data/resources/locales/hr/territories.yml +264 -263
- data/resources/locales/hu/calendars.yml +285 -284
- data/resources/locales/hu/currencies.yml +954 -916
- data/resources/locales/hu/languages.yml +583 -580
- data/resources/locales/hu/layout.yml +5 -5
- data/resources/locales/hu/lists.yml +23 -7
- data/resources/locales/hu/numbers.yml +62 -57
- data/resources/locales/hu/plurals.yml +2 -2
- data/resources/locales/hu/rbnf.yml +363 -0
- data/resources/locales/hu/territories.yml +264 -263
- data/resources/locales/id/calendars.yml +276 -275
- data/resources/locales/id/currencies.yml +954 -916
- data/resources/locales/id/languages.yml +583 -580
- data/resources/locales/id/layout.yml +5 -5
- data/resources/locales/id/lists.yml +23 -7
- data/resources/locales/id/numbers.yml +61 -56
- data/resources/locales/id/plurals.yml +2 -2
- data/resources/locales/id/rbnf.yml +121 -0
- data/resources/locales/id/territories.yml +264 -263
- data/resources/locales/is/calendars.yml +281 -242
- data/resources/locales/is/currencies.yml +954 -916
- data/resources/locales/is/languages.yml +583 -580
- data/resources/locales/is/layout.yml +5 -5
- data/resources/locales/is/lists.yml +23 -7
- data/resources/locales/is/numbers.yml +62 -57
- data/resources/locales/is/plurals.yml +5 -2
- data/resources/locales/is/rbnf.yml +326 -0
- data/resources/locales/is/territories.yml +264 -263
- data/resources/locales/it/calendars.yml +275 -260
- data/resources/locales/it/currencies.yml +953 -920
- data/resources/locales/it/languages.yml +583 -580
- data/resources/locales/it/layout.yml +5 -5
- data/resources/locales/it/lists.yml +23 -7
- data/resources/locales/it/numbers.yml +59 -54
- data/resources/locales/it/plurals.yml +3 -2
- data/resources/locales/it/rbnf.yml +1189 -0
- data/resources/locales/it/territories.yml +264 -263
- data/resources/locales/ja/calendars.yml +269 -207
- data/resources/locales/ja/currencies.yml +953 -915
- data/resources/locales/ja/languages.yml +583 -580
- data/resources/locales/ja/layout.yml +5 -5
- data/resources/locales/ja/lists.yml +23 -7
- data/resources/locales/ja/numbers.yml +62 -57
- data/resources/locales/ja/plurals.yml +2 -2
- data/resources/locales/ja/rbnf.yml +209 -0
- data/resources/locales/ja/territories.yml +264 -263
- data/resources/locales/ko/calendars.yml +246 -213
- data/resources/locales/ko/currencies.yml +953 -915
- data/resources/locales/ko/languages.yml +583 -580
- data/resources/locales/ko/layout.yml +5 -5
- data/resources/locales/ko/lists.yml +23 -7
- data/resources/locales/ko/numbers.yml +60 -55
- data/resources/locales/ko/plurals.yml +2 -2
- data/resources/locales/ko/rbnf.yml +722 -0
- data/resources/locales/ko/territories.yml +264 -263
- data/resources/locales/lv/calendars.yml +286 -285
- data/resources/locales/lv/currencies.yml +1122 -1084
- data/resources/locales/lv/languages.yml +583 -580
- data/resources/locales/lv/layout.yml +5 -5
- data/resources/locales/lv/lists.yml +23 -7
- data/resources/locales/lv/numbers.yml +63 -58
- data/resources/locales/lv/plurals.yml +11 -3
- data/resources/locales/lv/rbnf.yml +238 -0
- data/resources/locales/lv/territories.yml +264 -263
- data/resources/locales/ms/calendars.yml +280 -279
- data/resources/locales/ms/currencies.yml +954 -916
- data/resources/locales/ms/languages.yml +583 -580
- data/resources/locales/ms/layout.yml +5 -5
- data/resources/locales/ms/lists.yml +23 -7
- data/resources/locales/ms/numbers.yml +62 -57
- data/resources/locales/ms/plurals.yml +2 -2
- data/resources/locales/ms/rbnf.yml +130 -0
- data/resources/locales/ms/territories.yml +264 -263
- data/resources/locales/nb/calendars.yml +284 -283
- data/resources/locales/nb/currencies.yml +958 -916
- data/resources/locales/nb/languages.yml +583 -580
- data/resources/locales/nb/layout.yml +5 -5
- data/resources/locales/nb/lists.yml +23 -7
- data/resources/locales/nb/numbers.yml +62 -57
- data/resources/locales/nb/plurals.yml +2 -2
- data/resources/locales/nb/rbnf.yml +191 -0
- data/resources/locales/nb/territories.yml +264 -263
- data/resources/locales/nl/calendars.yml +285 -284
- data/resources/locales/nl/currencies.yml +953 -917
- data/resources/locales/nl/languages.yml +583 -580
- data/resources/locales/nl/layout.yml +5 -5
- data/resources/locales/nl/lists.yml +23 -7
- data/resources/locales/nl/numbers.yml +62 -57
- data/resources/locales/nl/plurals.yml +3 -2
- data/resources/locales/nl/rbnf.yml +320 -0
- data/resources/locales/nl/territories.yml +264 -263
- data/resources/locales/pl/calendars.yml +288 -287
- data/resources/locales/pl/currencies.yml +1326 -1284
- data/resources/locales/pl/languages.yml +583 -580
- data/resources/locales/pl/layout.yml +5 -5
- data/resources/locales/pl/lists.yml +23 -7
- data/resources/locales/pl/numbers.yml +64 -59
- data/resources/locales/pl/plurals.yml +11 -4
- data/resources/locales/pl/rbnf.yml +410 -0
- data/resources/locales/pl/territories.yml +264 -263
- data/resources/locales/pt/calendars.yml +290 -289
- data/resources/locales/pt/currencies.yml +954 -916
- data/resources/locales/pt/languages.yml +583 -580
- data/resources/locales/pt/layout.yml +5 -5
- data/resources/locales/pt/lists.yml +23 -7
- data/resources/locales/pt/numbers.yml +62 -57
- data/resources/locales/pt/plurals.yml +4 -2
- data/resources/locales/pt/rbnf.yml +586 -0
- data/resources/locales/pt/territories.yml +264 -263
- data/resources/locales/ro/calendars.yml +284 -283
- data/resources/locales/ro/currencies.yml +1170 -1132
- data/resources/locales/ro/languages.yml +583 -580
- data/resources/locales/ro/layout.yml +5 -5
- data/resources/locales/ro/lists.yml +23 -7
- data/resources/locales/ro/numbers.yml +63 -58
- data/resources/locales/ro/plurals.yml +5 -2
- data/resources/locales/ro/rbnf.yml +250 -0
- data/resources/locales/ro/territories.yml +264 -263
- data/resources/locales/ru/calendars.yml +282 -281
- data/resources/locales/ru/currencies.yml +1118 -1247
- data/resources/locales/ru/languages.yml +583 -580
- data/resources/locales/ru/layout.yml +5 -5
- data/resources/locales/ru/lists.yml +23 -7
- data/resources/locales/ru/numbers.yml +63 -59
- data/resources/locales/ru/plurals.yml +8 -4
- data/resources/locales/ru/rbnf.yml +385 -0
- data/resources/locales/ru/territories.yml +264 -263
- data/resources/locales/sk/calendars.yml +254 -251
- data/resources/locales/sk/currencies.yml +1174 -1008
- data/resources/locales/sk/languages.yml +583 -580
- data/resources/locales/sk/layout.yml +5 -5
- data/resources/locales/sk/lists.yml +23 -7
- data/resources/locales/sk/numbers.yml +64 -58
- data/resources/locales/sk/plurals.yml +6 -2
- data/resources/locales/sk/rbnf.yml +304 -0
- data/resources/locales/sk/territories.yml +264 -263
- data/resources/locales/sq/calendars.yml +283 -206
- data/resources/locales/sq/currencies.yml +954 -916
- data/resources/locales/sq/languages.yml +583 -580
- data/resources/locales/sq/layout.yml +5 -5
- data/resources/locales/sq/lists.yml +23 -7
- data/resources/locales/sq/numbers.yml +62 -57
- data/resources/locales/sq/plurals.yml +2 -2
- data/resources/locales/sq/rbnf.yml +181 -0
- data/resources/locales/sq/territories.yml +264 -263
- data/resources/locales/sr/calendars.yml +290 -289
- data/resources/locales/sr/currencies.yml +1251 -1508
- data/resources/locales/sr/languages.yml +583 -580
- data/resources/locales/sr/layout.yml +5 -5
- data/resources/locales/sr/lists.yml +23 -7
- data/resources/locales/sr/numbers.yml +62 -58
- data/resources/locales/sr/plurals.yml +12 -4
- data/resources/locales/sr/rbnf.yml +429 -0
- data/resources/locales/sr/territories.yml +264 -263
- data/resources/locales/sv/calendars.yml +290 -289
- data/resources/locales/sv/currencies.yml +960 -930
- data/resources/locales/sv/languages.yml +583 -580
- data/resources/locales/sv/layout.yml +5 -5
- data/resources/locales/sv/lists.yml +23 -7
- data/resources/locales/sv/numbers.yml +63 -58
- data/resources/locales/sv/plurals.yml +3 -2
- data/resources/locales/sv/rbnf.yml +692 -0
- data/resources/locales/sv/territories.yml +264 -263
- data/resources/locales/ta/calendars.yml +281 -266
- data/resources/locales/ta/currencies.yml +953 -915
- data/resources/locales/ta/languages.yml +583 -580
- data/resources/locales/ta/layout.yml +5 -5
- data/resources/locales/ta/lists.yml +23 -7
- data/resources/locales/ta/numbers.yml +62 -57
- data/resources/locales/ta/plurals.yml +2 -2
- data/resources/locales/ta/rbnf.yml +241 -0
- data/resources/locales/ta/territories.yml +264 -263
- data/resources/locales/th/calendars.yml +278 -289
- data/resources/locales/th/currencies.yml +953 -915
- data/resources/locales/th/languages.yml +583 -580
- data/resources/locales/th/layout.yml +5 -5
- data/resources/locales/th/lists.yml +23 -7
- data/resources/locales/th/numbers.yml +62 -57
- data/resources/locales/th/plurals.yml +2 -2
- data/resources/locales/th/rbnf.yml +119 -0
- data/resources/locales/th/territories.yml +264 -263
- data/resources/locales/tr/calendars.yml +287 -286
- data/resources/locales/tr/currencies.yml +953 -916
- data/resources/locales/tr/languages.yml +583 -580
- data/resources/locales/tr/layout.yml +5 -5
- data/resources/locales/tr/lists.yml +23 -7
- data/resources/locales/tr/numbers.yml +61 -56
- data/resources/locales/tr/plurals.yml +2 -2
- data/resources/locales/tr/rbnf.yml +277 -0
- data/resources/locales/tr/territories.yml +264 -263
- data/resources/locales/uk/calendars.yml +286 -252
- data/resources/locales/uk/currencies.yml +1311 -1070
- data/resources/locales/uk/languages.yml +583 -580
- data/resources/locales/uk/layout.yml +5 -5
- data/resources/locales/uk/lists.yml +23 -7
- data/resources/locales/uk/numbers.yml +64 -59
- data/resources/locales/uk/plurals.yml +10 -4
- data/resources/locales/uk/rbnf.yml +430 -0
- data/resources/locales/uk/territories.yml +264 -263
- data/resources/locales/ur/calendars.yml +267 -228
- data/resources/locales/ur/currencies.yml +954 -916
- data/resources/locales/ur/languages.yml +583 -580
- data/resources/locales/ur/layout.yml +5 -5
- data/resources/locales/ur/lists.yml +23 -7
- data/resources/locales/ur/numbers.yml +62 -57
- data/resources/locales/ur/plurals.yml +3 -2
- data/resources/locales/ur/rbnf.yml +4 -0
- data/resources/locales/ur/territories.yml +264 -263
- data/resources/locales/vi/calendars.yml +256 -236
- data/resources/locales/vi/currencies.yml +953 -915
- data/resources/locales/vi/languages.yml +583 -580
- data/resources/locales/vi/layout.yml +5 -5
- data/resources/locales/vi/lists.yml +23 -7
- data/resources/locales/vi/numbers.yml +62 -57
- data/resources/locales/vi/plurals.yml +2 -2
- data/resources/locales/vi/rbnf.yml +164 -0
- data/resources/locales/vi/territories.yml +264 -263
- data/resources/locales/zh/calendars.yml +266 -265
- data/resources/locales/zh/currencies.yml +953 -915
- data/resources/locales/zh/languages.yml +583 -580
- data/resources/locales/zh/layout.yml +5 -5
- data/resources/locales/zh/lists.yml +23 -7
- data/resources/locales/zh/numbers.yml +62 -57
- data/resources/locales/zh/plurals.yml +2 -2
- data/resources/locales/zh/rbnf.yml +689 -0
- data/resources/locales/zh/territories.yml +264 -263
- data/resources/locales/zh-Hant/calendars.yml +266 -265
- data/resources/locales/zh-Hant/currencies.yml +955 -915
- data/resources/locales/zh-Hant/languages.yml +583 -580
- data/resources/locales/zh-Hant/layout.yml +5 -5
- data/resources/locales/zh-Hant/lists.yml +23 -7
- data/resources/locales/zh-Hant/numbers.yml +62 -57
- data/resources/locales/zh-Hant/plurals.yml +2 -2
- data/resources/locales/zh-Hant/rbnf.yml +647 -0
- data/resources/locales/zh-Hant/territories.yml +264 -263
- data/resources/shared/currency_digits_and_rounding.yml +67 -64
- data/resources/shared/numbering_systems.yml +176 -0
- data/resources/shared/rbnf_root.yml +1573 -0
- data/resources/shared/segments/segments_root.yml +728 -0
- data/resources/shared/segments/tailorings/en.yml +8 -0
- data/resources/uli/segments/de.yml +128 -0
- data/resources/uli/segments/en.yml +154 -0
- data/resources/uli/segments/es.yml +112 -0
- data/resources/uli/segments/fr.yml +47 -0
- data/resources/uli/segments/it.yml +37 -0
- data/resources/uli/segments/pt.yml +173 -0
- data/resources/uli/segments/ru.yml +10 -0
- data/resources/unicode_data/casefolding.yml +4765 -0
- data/resources/unicode_data/indices/bidi_class.yml +4572 -0
- data/resources/unicode_data/indices/bidi_mirrored.yml +3087 -0
- data/resources/unicode_data/indices/category.yml +10918 -0
- data/resources/unicode_data/indices/keys.yml +101 -0
- data/resources/unicode_data/properties/line_break.yml +9269 -0
- data/resources/unicode_data/properties/sentence_break.yml +8067 -0
- data/resources/unicode_data/properties/word_break.yml +3001 -0
- data/spec/collation/collation_spec.rb +2 -1
- data/spec/collation/collator_spec.rb +4 -3
- data/spec/collation/tailoring_spec.rb +2 -2
- data/spec/collation/tailoring_tests/he.txt +5 -2
- data/spec/{tokenizers/calendars → data_readers}/additional_date_format_selector_spec.rb +13 -13
- data/spec/data_readers/date_time_data_reader_spec.rb +26 -0
- data/spec/data_readers/number_data_reader_spec.rb +18 -0
- data/spec/data_readers/timespan_data_reader.rb +22 -0
- data/spec/formatters/calendars/datetime_formatter_spec.rb +18 -22
- data/spec/formatters/list_formatter_spec.rb +16 -87
- data/spec/formatters/numbers/abbreviated/abbreviated_number_formatter_spec.rb +15 -59
- data/spec/formatters/numbers/abbreviated/long_decimal_formatter_spec.rb +32 -17
- data/spec/formatters/numbers/abbreviated/short_decimal_formatter_spec.rb +33 -17
- data/spec/formatters/numbers/currency_formatter_spec.rb +18 -13
- data/spec/formatters/numbers/decimal_formatter_spec.rb +16 -18
- data/spec/formatters/numbers/number_formatter_spec.rb +40 -31
- data/spec/formatters/numbers/percent_formatter_spec.rb +14 -6
- data/spec/formatters/numbers/rbnf/allowed_failures.yml +74 -0
- data/spec/formatters/numbers/rbnf/locales/af/rbnf_test.yml +706 -0
- data/spec/formatters/numbers/rbnf/locales/ar/rbnf_test.yml +706 -0
- data/spec/formatters/numbers/rbnf/locales/be/rbnf_test.yml +1174 -0
- data/spec/formatters/numbers/rbnf/locales/bg/rbnf_test.yml +706 -0
- data/spec/formatters/numbers/rbnf/locales/bn/rbnf_test.yml +1291 -0
- data/spec/formatters/numbers/rbnf/locales/ca/rbnf_test.yml +1174 -0
- data/spec/formatters/numbers/rbnf/locales/cs/rbnf_test.yml +823 -0
- data/spec/formatters/numbers/rbnf/locales/cy/rbnf_test.yml +940 -0
- data/spec/formatters/numbers/rbnf/locales/da/rbnf_test.yml +940 -0
- data/spec/formatters/numbers/rbnf/locales/de/rbnf_test.yml +940 -0
- data/spec/formatters/numbers/rbnf/locales/el/rbnf_test.yml +1174 -0
- data/spec/formatters/numbers/rbnf/locales/en/rbnf_test.yml +1291 -0
- data/spec/formatters/numbers/rbnf/locales/en-GB/rbnf_test.yml +1291 -0
- data/spec/formatters/numbers/rbnf/locales/es/rbnf_test.yml +1642 -0
- data/spec/formatters/numbers/rbnf/locales/eu/rbnf_test.yml +1291 -0
- data/spec/formatters/numbers/rbnf/locales/fa/rbnf_test.yml +589 -0
- data/spec/formatters/numbers/rbnf/locales/fi/rbnf_test.yml +706 -0
- data/spec/formatters/numbers/rbnf/locales/fil/rbnf_test.yml +706 -0
- data/spec/formatters/numbers/rbnf/locales/fr/rbnf_test.yml +1408 -0
- data/spec/formatters/numbers/rbnf/locales/ga/rbnf_test.yml +940 -0
- data/spec/formatters/numbers/rbnf/locales/gl/rbnf_test.yml +1291 -0
- data/spec/formatters/numbers/rbnf/locales/he/rbnf_test.yml +1057 -0
- data/spec/formatters/numbers/rbnf/locales/hi/rbnf_test.yml +823 -0
- data/spec/formatters/numbers/rbnf/locales/hr/rbnf_test.yml +1174 -0
- data/spec/formatters/numbers/rbnf/locales/hu/rbnf_test.yml +940 -0
- data/spec/formatters/numbers/rbnf/locales/id/rbnf_test.yml +706 -0
- data/spec/formatters/numbers/rbnf/locales/is/rbnf_test.yml +823 -0
- data/spec/formatters/numbers/rbnf/locales/it/rbnf_test.yml +1174 -0
- data/spec/formatters/numbers/rbnf/locales/ja/rbnf_test.yml +823 -0
- data/spec/formatters/numbers/rbnf/locales/ko/rbnf_test.yml +1408 -0
- data/spec/formatters/numbers/rbnf/locales/lv/rbnf_test.yml +706 -0
- data/spec/formatters/numbers/rbnf/locales/ms/rbnf_test.yml +706 -0
- data/spec/formatters/numbers/rbnf/locales/nb/rbnf_test.yml +940 -0
- data/spec/formatters/numbers/rbnf/locales/nl/rbnf_test.yml +706 -0
- data/spec/formatters/numbers/rbnf/locales/pl/rbnf_test.yml +823 -0
- data/spec/formatters/numbers/rbnf/locales/pt/rbnf_test.yml +1174 -0
- data/spec/formatters/numbers/rbnf/locales/ro/rbnf_test.yml +823 -0
- data/spec/formatters/numbers/rbnf/locales/ru/rbnf_test.yml +823 -0
- data/spec/formatters/numbers/rbnf/locales/sk/rbnf_test.yml +823 -0
- data/spec/formatters/numbers/rbnf/locales/sq/rbnf_test.yml +706 -0
- data/spec/formatters/numbers/rbnf/locales/sr/rbnf_test.yml +940 -0
- data/spec/formatters/numbers/rbnf/locales/sv/rbnf_test.yml +1876 -0
- data/spec/formatters/numbers/rbnf/locales/ta/rbnf_test.yml +706 -0
- data/spec/formatters/numbers/rbnf/locales/th/rbnf_test.yml +706 -0
- data/spec/formatters/numbers/rbnf/locales/tr/rbnf_test.yml +706 -0
- data/spec/formatters/numbers/rbnf/locales/uk/rbnf_test.yml +823 -0
- data/spec/formatters/numbers/rbnf/locales/ur/rbnf_test.yml +1291 -0
- data/spec/formatters/numbers/rbnf/locales/vi/rbnf_test.yml +706 -0
- data/spec/formatters/numbers/rbnf/locales/zh/rbnf_test.yml +940 -0
- data/spec/formatters/numbers/rbnf/locales/zh-Hant/rbnf_test.yml +940 -0
- data/spec/formatters/numbers/rbnf/rbnf_spec.rb +98 -0
- data/spec/formatters/plurals/plural_formatter_spec.rb +4 -4
- data/spec/formatters/plurals/rules_spec.rb +5 -5
- data/spec/localized/localized_date_spec.rb +1 -1
- data/spec/localized/localized_datetime_spec.rb +8 -13
- data/spec/localized/localized_number_spec.rb +17 -32
- data/spec/localized/localized_object_spec.rb +0 -5
- data/spec/localized/localized_string_spec.rb +40 -2
- data/spec/localized/localized_time_spec.rb +3 -6
- data/spec/localized/localized_timespan_spec.rb +144 -0
- data/spec/normalization_spec.rb +12 -12
- data/spec/parsers/number_parser_spec.rb +5 -5
- data/spec/parsers/parser_spec.rb +60 -0
- data/spec/parsers/segmentation_parser_spec.rb +96 -0
- data/spec/parsers/symbol_table_spec.rb +32 -0
- data/spec/parsers/unicode_regex/character_class_spec.rb +117 -0
- data/spec/parsers/unicode_regex/character_range_spec.rb +21 -0
- data/spec/parsers/unicode_regex/character_set_spec.rb +36 -0
- data/spec/parsers/unicode_regex/literal_spec.rb +34 -0
- data/spec/parsers/unicode_regex/unicode_string_spec.rb +22 -0
- data/spec/parsers/unicode_regex_parser_spec.rb +86 -0
- data/spec/readme_spec.rb +8 -269
- data/spec/shared/break_iterator_spec.rb +72 -0
- data/spec/shared/calendar_spec.rb +5 -4
- data/spec/shared/casefolder_spec.rb +30 -0
- data/spec/shared/casefolding.txt +251 -0
- data/spec/shared/casefolding_expected.txt +251 -0
- data/spec/shared/code_point_spec.rb +44 -14
- data/spec/shared/numbering_system_spec.rb +41 -0
- data/spec/shared/territories_spec.rb +14 -6
- data/spec/shared/unicode_regex_spec.rb +203 -0
- data/spec/spec_helper.rb +17 -0
- data/spec/tokenizers/calendars/date_tokenizer_spec.rb +26 -30
- data/spec/tokenizers/calendars/datetime_tokenizer_spec.rb +11 -90
- data/spec/tokenizers/calendars/time_tokenizer_spec.rb +5 -5
- data/spec/tokenizers/calendars/timespan_tokenizer_spec.rb +17 -7
- data/spec/tokenizers/numbers/number_tokenizer_spec.rb +28 -27
- data/spec/tokenizers/segmentation/segmentation_tokenizer_spec.rb +40 -0
- data/spec/tokenizers/unicode_regex/unicode_regex_tokenizer_spec.rb +190 -0
- data/spec/utils/range_set_spec.rb +171 -0
- data/spec/utils/yaml/yaml_spec.rb +62 -51
- data/twitter_cldr.gemspec +1 -1
- metadata +199 -30
- data/lib/twitter_cldr/formatters/base.rb +0 -47
- data/lib/twitter_cldr/formatters/calendars/date_formatter.rb +0 -19
- data/lib/twitter_cldr/formatters/calendars/time_formatter.rb +0 -19
- data/lib/twitter_cldr/normalization/base.rb +0 -37
- data/lib/twitter_cldr/normalization/hangul.rb +0 -79
- data/lib/twitter_cldr/normalization/nfc.rb +0 -24
- data/lib/twitter_cldr/normalization/nfd.rb +0 -26
- data/lib/twitter_cldr/normalization/nfkc.rb +0 -114
- data/lib/twitter_cldr/normalization/nfkd.rb +0 -120
- data/lib/twitter_cldr/normalization/quick_check.rb +0 -41
- data/lib/twitter_cldr/tokenizers/base.rb +0 -169
- data/lib/twitter_cldr/tokenizers/calendars/datetime_tokenizer.rb +0 -131
- data/lib/twitter_cldr/utils/territories.rb +0 -56
- data/spec/formatters/base_spec.rb +0 -18
- data/spec/formatters/calendars/timespan_formatter_spec.rb +0 -112
- data/spec/normalization/NormalizationTestShort.txt +0 -602
- data/spec/normalization/base_spec.rb +0 -16
- data/spec/normalization/hangul_spec.rb +0 -42
- data/spec/normalization/normalization_spec.rb +0 -113
- data/spec/tokenizers/base_spec.rb +0 -259
- data/spec/utils/territories_spec.rb +0 -16
@@ -5,88 +5,33 @@
|
|
5
5
|
|
6
6
|
module TwitterCldr
|
7
7
|
module Tokenizers
|
8
|
-
class NumberTokenizer
|
9
|
-
ABBREVIATED_MIN_POWER = 3
|
10
|
-
ABBREVIATED_MAX_POWER = 14
|
8
|
+
class NumberTokenizer
|
11
9
|
|
12
|
-
|
13
|
-
TOKEN_SPLITTER_REGEX = /([^0*#,\.]*)([0#,\.]+)([^0*#,\.]*)$/
|
14
|
-
TOKEN_TYPE_REGEXES = {
|
15
|
-
:pattern => { :regex => /[0?#,\.]*/, :priority => 1 },
|
16
|
-
:plaintext => { :regex => //, :priority => 2 }
|
17
|
-
}
|
10
|
+
attr_reader :data_reader
|
18
11
|
|
19
|
-
def initialize(
|
20
|
-
|
21
|
-
|
22
|
-
@token_splitter_regexes = {
|
23
|
-
:else => TOKEN_SPLITTER_REGEX
|
24
|
-
}
|
25
|
-
|
26
|
-
@token_type_regexes = {
|
27
|
-
:else => TOKEN_TYPE_REGEXES
|
28
|
-
}
|
29
|
-
|
30
|
-
@base_path = [:numbers, :formats]
|
31
|
-
@symbol_path = [:numbers, :symbols]
|
32
|
-
|
33
|
-
@paths = {
|
34
|
-
:default => [:decimal, :patterns],
|
35
|
-
:decimal => [:decimal, :patterns],
|
36
|
-
:long_decimal => [:decimal, :patterns, :long],
|
37
|
-
:short_decimal => [:decimal, :patterns, :short],
|
38
|
-
:currency => [:currency, :patterns],
|
39
|
-
:percent => [:percent, :patterns]
|
40
|
-
}
|
41
|
-
end
|
42
|
-
|
43
|
-
def tokens(options = {})
|
44
|
-
@type = options[:type] || :default
|
45
|
-
@format = options[:format] || :default
|
46
|
-
|
47
|
-
path = full_path
|
48
|
-
positive, negative = traverse(path).to_s.split(/;/)
|
49
|
-
sign = options[:sign] || :positive
|
50
|
-
|
51
|
-
pattern = case sign
|
52
|
-
when :negative
|
53
|
-
if negative
|
54
|
-
"#{symbols[:minus] || '-'}#{negative}"
|
55
|
-
else
|
56
|
-
"#{symbols[:minus] || '-'}#{positive}"
|
57
|
-
end
|
58
|
-
else
|
59
|
-
positive
|
60
|
-
end
|
61
|
-
|
62
|
-
tokens_for_pattern(pattern, path, [sign])
|
12
|
+
def initialize(data_reader)
|
13
|
+
@data_reader = data_reader
|
63
14
|
end
|
64
15
|
|
65
|
-
def
|
66
|
-
|
67
|
-
end
|
16
|
+
def tokenize(pattern)
|
17
|
+
tokens = PatternTokenizer.new(data_reader, tokenizer).tokenize(pattern)
|
68
18
|
|
69
|
-
|
70
|
-
|
71
|
-
|
72
|
-
|
19
|
+
if tokens.first.value == ""
|
20
|
+
tokens[1..-1]
|
21
|
+
else
|
22
|
+
tokens
|
73
23
|
end
|
74
24
|
end
|
75
25
|
|
76
|
-
|
26
|
+
private
|
77
27
|
|
78
|
-
def
|
79
|
-
@
|
28
|
+
def tokenizer
|
29
|
+
@tokenizer ||= Tokenizer.new([
|
30
|
+
TokenRecognizer.new(:pattern, /[0?#,\.]+/),
|
31
|
+
TokenRecognizer.new(:plaintext, //),
|
32
|
+
], /([^0*#,\.]*)([0#,\.]+)([^0*#,\.]*)$/, false)
|
80
33
|
end
|
81
34
|
|
82
|
-
def init_resources
|
83
|
-
@resource = TwitterCldr.get_locale_resource(@locale, :numbers)[TwitterCldr.convert_locale(@locale)]
|
84
|
-
end
|
85
|
-
|
86
|
-
def pattern_for(resource)
|
87
|
-
# can't go any deeper, so return original pattern (which should NOT be a hash, by the way)
|
88
|
-
resource
|
89
|
-
end
|
90
35
|
end
|
91
36
|
end
|
92
37
|
end
|
@@ -0,0 +1,53 @@
|
|
1
|
+
# encoding: UTF-8
|
2
|
+
|
3
|
+
# Copyright 2012 Twitter, Inc
|
4
|
+
# http://www.apache.org/licenses/LICENSE-2.0
|
5
|
+
|
6
|
+
module TwitterCldr
|
7
|
+
module Tokenizers
|
8
|
+
class RbnfTokenizer
|
9
|
+
|
10
|
+
def tokenize(pattern)
|
11
|
+
PatternTokenizer.new(nil, tokenizer).tokenize(pattern)
|
12
|
+
end
|
13
|
+
|
14
|
+
private
|
15
|
+
|
16
|
+
def tokenizer
|
17
|
+
# i.e. %spellout-numbering, %%2d-year
|
18
|
+
rule_regex = if RUBY_VERSION <= "1.8.7"
|
19
|
+
/%%?[\w\-]+/u
|
20
|
+
else
|
21
|
+
Regexp.new("%%?[[:word:]\-]+")
|
22
|
+
end
|
23
|
+
|
24
|
+
recognizers = [
|
25
|
+
# special rule descriptors
|
26
|
+
TokenRecognizer.new(:negative, /-x/),
|
27
|
+
TokenRecognizer.new(:improper_fraction, /x\.x/),
|
28
|
+
TokenRecognizer.new(:proper_fraction, /0\.x/),
|
29
|
+
TokenRecognizer.new(:master, /x\.0/),
|
30
|
+
|
31
|
+
# normal rule descriptors
|
32
|
+
TokenRecognizer.new(:equals, /=/),
|
33
|
+
TokenRecognizer.new(:rule, rule_regex),
|
34
|
+
TokenRecognizer.new(:right_arrow, />/),
|
35
|
+
TokenRecognizer.new(:left_arrow, /</),
|
36
|
+
TokenRecognizer.new(:open_bracket, /\[/),
|
37
|
+
TokenRecognizer.new(:close_bracket, /\]/),
|
38
|
+
TokenRecognizer.new(:decimal, /[0#][0#,\.]+/),
|
39
|
+
|
40
|
+
# ending
|
41
|
+
TokenRecognizer.new(:semicolon, /;/),
|
42
|
+
]
|
43
|
+
|
44
|
+
@tokenizer ||= Tokenizer.new(
|
45
|
+
recognizers + [
|
46
|
+
TokenRecognizer.new(:plaintext, //) # catch-all
|
47
|
+
]
|
48
|
+
)
|
49
|
+
end
|
50
|
+
|
51
|
+
end
|
52
|
+
end
|
53
|
+
end
|
@@ -0,0 +1,42 @@
|
|
1
|
+
# encoding: UTF-8
|
2
|
+
|
3
|
+
# Copyright 2012 Twitter, Inc
|
4
|
+
# http://www.apache.org/licenses/LICENSE-2.0
|
5
|
+
|
6
|
+
module TwitterCldr
|
7
|
+
module Tokenizers
|
8
|
+
class PatternTokenizer
|
9
|
+
|
10
|
+
attr_reader :data_reader, :tokenizer
|
11
|
+
|
12
|
+
def initialize(data_reader, tokenizer)
|
13
|
+
@data_reader = data_reader
|
14
|
+
@tokenizer = tokenizer
|
15
|
+
end
|
16
|
+
|
17
|
+
def tokenize(pattern)
|
18
|
+
tokenizer.tokenize(expand(pattern))
|
19
|
+
end
|
20
|
+
|
21
|
+
private
|
22
|
+
|
23
|
+
def expand(pattern)
|
24
|
+
if pattern.is_a?(Symbol)
|
25
|
+
# symbols mean another path was given
|
26
|
+
path = pattern.to_s.split(".").map(&:to_sym)
|
27
|
+
data = data_reader.pattern_at_path(path)
|
28
|
+
next_pattern = data.is_a?(Hash) ? data[:pattern] : data
|
29
|
+
expand_pattern(next_pattern)
|
30
|
+
elsif pattern.is_a?(Hash)
|
31
|
+
pattern.inject({}) do |ret, (key, val)|
|
32
|
+
ret[key] = expand(val)
|
33
|
+
ret
|
34
|
+
end
|
35
|
+
else
|
36
|
+
pattern
|
37
|
+
end
|
38
|
+
end
|
39
|
+
|
40
|
+
end
|
41
|
+
end
|
42
|
+
end
|
@@ -0,0 +1,39 @@
|
|
1
|
+
# encoding: UTF-8
|
2
|
+
|
3
|
+
# Copyright 2012 Twitter, Inc
|
4
|
+
# http://www.apache.org/licenses/LICENSE-2.0
|
5
|
+
|
6
|
+
module TwitterCldr
|
7
|
+
module Tokenizers
|
8
|
+
class SegmentationTokenizer
|
9
|
+
|
10
|
+
def tokenize(pattern)
|
11
|
+
# according to the spec, whitespace should be ignored
|
12
|
+
tokenizer.tokenize(pattern).reject do |token|
|
13
|
+
token.value.strip.empty?
|
14
|
+
end
|
15
|
+
end
|
16
|
+
|
17
|
+
private
|
18
|
+
|
19
|
+
def tokenizer
|
20
|
+
@tokenizer ||= begin
|
21
|
+
recognizers = [
|
22
|
+
TokenRecognizer.new(:break, /\303\267/u) do |val| # ÷ character
|
23
|
+
val.strip
|
24
|
+
end,
|
25
|
+
|
26
|
+
TokenRecognizer.new(:no_break, /\303\227/u) do |val| # × character
|
27
|
+
val.strip
|
28
|
+
end
|
29
|
+
]
|
30
|
+
|
31
|
+
ur_tokenizer = UnicodeRegexTokenizer.new
|
32
|
+
ur_tokenizer.insert_before(:string, *recognizers)
|
33
|
+
ur_tokenizer
|
34
|
+
end
|
35
|
+
end
|
36
|
+
|
37
|
+
end
|
38
|
+
end
|
39
|
+
end
|
@@ -0,0 +1,116 @@
|
|
1
|
+
# encoding: UTF-8
|
2
|
+
|
3
|
+
# Copyright 2012 Twitter, Inc
|
4
|
+
# http://www.apache.org/licenses/LICENSE-2.0
|
5
|
+
|
6
|
+
module TwitterCldr
|
7
|
+
module Tokenizers
|
8
|
+
|
9
|
+
class TokenRecognizer
|
10
|
+
|
11
|
+
attr_reader :token_type, :regex, :content, :cleaner
|
12
|
+
|
13
|
+
def initialize(token_type, regex, content = nil, &block)
|
14
|
+
@token_type = token_type
|
15
|
+
@regex = regex
|
16
|
+
@content = content
|
17
|
+
@cleaner = block
|
18
|
+
end
|
19
|
+
|
20
|
+
def recognizes?(text)
|
21
|
+
!!(text =~ regex)
|
22
|
+
end
|
23
|
+
|
24
|
+
def clean(val)
|
25
|
+
if cleaner
|
26
|
+
cleaner.call(val)
|
27
|
+
else
|
28
|
+
val
|
29
|
+
end
|
30
|
+
end
|
31
|
+
|
32
|
+
end
|
33
|
+
|
34
|
+
class Tokenizer
|
35
|
+
|
36
|
+
attr_reader :recognizers, :custom_splitter, :remove_empty_entries
|
37
|
+
|
38
|
+
def self.union(*tokenizers)
|
39
|
+
recognizers = tokenizers.inject([]) do |ret, tokenizer|
|
40
|
+
ret + tokenizer.recognizers.inject([]) do |recog_ret, recognizer|
|
41
|
+
if (block_given? && yield(recognizer)) || !block_given?
|
42
|
+
recog_ret << recognizer
|
43
|
+
end
|
44
|
+
recog_ret
|
45
|
+
end
|
46
|
+
end
|
47
|
+
|
48
|
+
splitter = if tokenizers.all?(&:custom_splitter)
|
49
|
+
Regexp.compile(
|
50
|
+
tokenizers.map do |tokenizer|
|
51
|
+
tokenizer.custom_splitter.source
|
52
|
+
end.join("|")
|
53
|
+
)
|
54
|
+
end
|
55
|
+
|
56
|
+
new(recognizers, splitter)
|
57
|
+
end
|
58
|
+
|
59
|
+
def initialize(recognizers, splitter = nil, remove_empty_entries = true)
|
60
|
+
@recognizers = recognizers
|
61
|
+
@custom_splitter = splitter
|
62
|
+
@remove_empty_entries = remove_empty_entries
|
63
|
+
end
|
64
|
+
|
65
|
+
def recognizer_at(token_type)
|
66
|
+
recognizers.find { |r| r.token_type == token_type }
|
67
|
+
end
|
68
|
+
|
69
|
+
def insert_before(token_type, *new_recognizers)
|
70
|
+
idx = recognizers.find_index { |rec| rec.token_type == token_type }
|
71
|
+
recognizers.insert(idx, *new_recognizers)
|
72
|
+
clear_splitter
|
73
|
+
nil
|
74
|
+
end
|
75
|
+
|
76
|
+
def tokenize(text)
|
77
|
+
text.split(splitter).inject([]) do |ret, token_text|
|
78
|
+
recognizer = recognizers.find do |recognizer|
|
79
|
+
recognizer.recognizes?(token_text)
|
80
|
+
end
|
81
|
+
|
82
|
+
if recognizer.token_type == :composite
|
83
|
+
content = token_text.match(recognizer.content)[1]
|
84
|
+
ret << CompositeToken.new(tokenize(content))
|
85
|
+
else
|
86
|
+
cleaned_text = recognizer.clean(token_text)
|
87
|
+
|
88
|
+
if (remove_empty_entries && cleaned_text.size > 0) || !remove_empty_entries
|
89
|
+
ret << Token.new(
|
90
|
+
:value => cleaned_text,
|
91
|
+
:type => recognizer.token_type
|
92
|
+
)
|
93
|
+
end
|
94
|
+
end
|
95
|
+
|
96
|
+
ret
|
97
|
+
end
|
98
|
+
end
|
99
|
+
|
100
|
+
private
|
101
|
+
|
102
|
+
def splitter
|
103
|
+
@splitter ||= (@custom_splitter || Regexp.new(
|
104
|
+
"(" + recognizers.map do |recognizer|
|
105
|
+
recognizer.regex.source
|
106
|
+
end.join("|") + ")"
|
107
|
+
))
|
108
|
+
end
|
109
|
+
|
110
|
+
def clear_splitter
|
111
|
+
@splitter = nil
|
112
|
+
end
|
113
|
+
|
114
|
+
end
|
115
|
+
end
|
116
|
+
end
|
@@ -0,0 +1,52 @@
|
|
1
|
+
# encoding: UTF-8
|
2
|
+
|
3
|
+
# Copyright 2012 Twitter, Inc
|
4
|
+
# http://www.apache.org/licenses/LICENSE-2.0
|
5
|
+
|
6
|
+
module TwitterCldr
|
7
|
+
module Tokenizers
|
8
|
+
class UnicodeRegexTokenizer
|
9
|
+
|
10
|
+
extend Forwardable
|
11
|
+
def_delegator :tokenizer, :insert_before
|
12
|
+
|
13
|
+
def tokenize(pattern)
|
14
|
+
tokenizer.tokenize(pattern)
|
15
|
+
end
|
16
|
+
|
17
|
+
private
|
18
|
+
|
19
|
+
def tokenizer
|
20
|
+
@tokenizer ||= begin
|
21
|
+
recognizers = [
|
22
|
+
# The variable name can contain letters and digits, but must start with a letter.
|
23
|
+
TokenRecognizer.new(:variable, /\$\w[\w\d]*/),
|
24
|
+
TokenRecognizer.new(:character_set, /\[:\w+:\]|\\p\{[\w=]+\}/), # [:Lu:] or \p{Lu} or \p{Sentence_Break=CF}
|
25
|
+
TokenRecognizer.new(:negated_character_set, /\[:\^\w+:\]|\\P\{[\w=]+\}/), #[:^Lu:] or \P{Lu}
|
26
|
+
TokenRecognizer.new(:unicode_char, /\\u\{?[a-fA-F0-9]{1,6}\}?/),
|
27
|
+
TokenRecognizer.new(:multichar_string, /\{\w+\}/u),
|
28
|
+
|
29
|
+
TokenRecognizer.new(:escaped_character, /\\./),
|
30
|
+
TokenRecognizer.new(:negate, /\^/),
|
31
|
+
TokenRecognizer.new(:ampersand, /&/),
|
32
|
+
TokenRecognizer.new(:pipe, /\|/),
|
33
|
+
TokenRecognizer.new(:dash, /-/),
|
34
|
+
|
35
|
+
# stuff that shouldn't be converted to codepoints
|
36
|
+
TokenRecognizer.new(:special_char, /\{\d,?\d?\}|[$?:{}()*+\.,\/\\]/),
|
37
|
+
|
38
|
+
TokenRecognizer.new(:open_bracket, /\[/),
|
39
|
+
TokenRecognizer.new(:close_bracket, /\]/),
|
40
|
+
|
41
|
+
TokenRecognizer.new(:string, //) do |val|
|
42
|
+
val == " " ? val : val.strip
|
43
|
+
end
|
44
|
+
]
|
45
|
+
|
46
|
+
Tokenizer.new(recognizers)
|
47
|
+
end
|
48
|
+
end
|
49
|
+
|
50
|
+
end
|
51
|
+
end
|
52
|
+
end
|
@@ -6,14 +6,18 @@
|
|
6
6
|
module TwitterCldr
|
7
7
|
module Tokenizers
|
8
8
|
autoload :Base, 'twitter_cldr/tokenizers/base'
|
9
|
-
autoload :CompositeToken, 'twitter_cldr/tokenizers/composite_token'
|
10
|
-
autoload :KeyPath, 'twitter_cldr/tokenizers/key_path'
|
11
9
|
autoload :Token, 'twitter_cldr/tokenizers/token'
|
12
|
-
autoload :
|
10
|
+
autoload :CompositeToken, 'twitter_cldr/tokenizers/composite_token'
|
11
|
+
autoload :Tokenizer, 'twitter_cldr/tokenizers/tokenizer'
|
12
|
+
autoload :TokenRecognizer, 'twitter_cldr/tokenizers/tokenizer'
|
13
|
+
autoload :PatternTokenizer, 'twitter_cldr/tokenizers/pattern_tokenizer'
|
14
|
+
autoload :DateTimeTokenizer, 'twitter_cldr/tokenizers/calendars/date_time_tokenizer'
|
13
15
|
autoload :DateTokenizer, 'twitter_cldr/tokenizers/calendars/date_tokenizer'
|
14
16
|
autoload :TimeTokenizer, 'twitter_cldr/tokenizers/calendars/time_tokenizer'
|
15
17
|
autoload :NumberTokenizer, 'twitter_cldr/tokenizers/numbers/number_tokenizer'
|
18
|
+
autoload :RbnfTokenizer, 'twitter_cldr/tokenizers/numbers/rbnf_tokenizer'
|
16
19
|
autoload :TimespanTokenizer, 'twitter_cldr/tokenizers/calendars/timespan_tokenizer'
|
17
|
-
autoload :
|
20
|
+
autoload :UnicodeRegexTokenizer, 'twitter_cldr/tokenizers/unicode_regex/unicode_regex_tokenizer'
|
21
|
+
autoload :SegmentationTokenizer, 'twitter_cldr/tokenizers/segmentation/segmentation_tokenizer'
|
18
22
|
end
|
19
23
|
end
|
@@ -0,0 +1,242 @@
|
|
1
|
+
# encoding: UTF-8
|
2
|
+
|
3
|
+
# Copyright 2012 Twitter, Inc
|
4
|
+
# http://www.apache.org/licenses/LICENSE-2.0
|
5
|
+
|
6
|
+
require 'set'
|
7
|
+
|
8
|
+
module TwitterCldr
|
9
|
+
module Utils
|
10
|
+
|
11
|
+
# An integer set, implemented under the hood with ranges. The idea is
|
12
|
+
# that it's more efficient to store sequential data in ranges rather
|
13
|
+
# than as single elements. By definition, RangeSets contain no duplicates.
|
14
|
+
class RangeSet
|
15
|
+
|
16
|
+
attr_reader :ranges
|
17
|
+
|
18
|
+
class << self
|
19
|
+
|
20
|
+
def from_array(array)
|
21
|
+
new(rangify(array))
|
22
|
+
end
|
23
|
+
|
24
|
+
# Turns an array of integers into ranges. The "compress" option indicates
|
25
|
+
# wether or not to turn isolated elements into zero-length ranges or leave
|
26
|
+
# them as single elements.
|
27
|
+
#
|
28
|
+
# For example:
|
29
|
+
# rangify([1, 2, 4], false) returns [1..2, 4..4]
|
30
|
+
# rangify([1, 2, 4], true) returns [1..2, 4]
|
31
|
+
def rangify(list, compress = false)
|
32
|
+
last_item = nil
|
33
|
+
|
34
|
+
list.sort.inject([]) do |ret, item|
|
35
|
+
if last_item
|
36
|
+
diff = item - last_item
|
37
|
+
|
38
|
+
if diff > 0
|
39
|
+
if diff == 1
|
40
|
+
ret[-1] << item
|
41
|
+
else
|
42
|
+
ret << [item]
|
43
|
+
end
|
44
|
+
|
45
|
+
last_item = item
|
46
|
+
end
|
47
|
+
else
|
48
|
+
ret << [item]
|
49
|
+
last_item = item
|
50
|
+
end
|
51
|
+
|
52
|
+
ret
|
53
|
+
end.map do |sub_list|
|
54
|
+
if compress && sub_list.size == 1
|
55
|
+
sub_list.first
|
56
|
+
else
|
57
|
+
sub_list.first..sub_list.last
|
58
|
+
end
|
59
|
+
end
|
60
|
+
end
|
61
|
+
|
62
|
+
end
|
63
|
+
|
64
|
+
def initialize(ranges)
|
65
|
+
@ranges = ranges
|
66
|
+
flatten
|
67
|
+
end
|
68
|
+
|
69
|
+
def to_a(compress = false)
|
70
|
+
if compress
|
71
|
+
ranges.map do |range|
|
72
|
+
if range.first == range.last
|
73
|
+
range.first
|
74
|
+
else
|
75
|
+
range
|
76
|
+
end
|
77
|
+
end
|
78
|
+
else
|
79
|
+
ranges.dup
|
80
|
+
end
|
81
|
+
end
|
82
|
+
|
83
|
+
def to_full_a
|
84
|
+
ranges.inject([]) do |ret, range|
|
85
|
+
ret + range.to_a
|
86
|
+
end
|
87
|
+
end
|
88
|
+
|
89
|
+
def to_set
|
90
|
+
Set.new(to_full_a)
|
91
|
+
end
|
92
|
+
|
93
|
+
def include?(obj)
|
94
|
+
case obj
|
95
|
+
when Numeric
|
96
|
+
ranges.any? { |range| range.include?(obj) }
|
97
|
+
when Range
|
98
|
+
ranges.any? do |range|
|
99
|
+
range.first <= obj.first && range.last >= obj.last
|
100
|
+
end
|
101
|
+
else
|
102
|
+
false
|
103
|
+
end
|
104
|
+
end
|
105
|
+
|
106
|
+
def empty?
|
107
|
+
ranges.empty?
|
108
|
+
end
|
109
|
+
|
110
|
+
def union(range_set)
|
111
|
+
self.class.new(range_set.ranges + ranges)
|
112
|
+
end
|
113
|
+
|
114
|
+
def intersection(range_set)
|
115
|
+
new_ranges = []
|
116
|
+
|
117
|
+
range_set.ranges.each do |their_range|
|
118
|
+
ranges.each do |our_range|
|
119
|
+
if overlap?(their_range, our_range)
|
120
|
+
if intrsc = find_intersection(our_range, their_range)
|
121
|
+
new_ranges << intrsc
|
122
|
+
end
|
123
|
+
end
|
124
|
+
end
|
125
|
+
end
|
126
|
+
|
127
|
+
self.class.new(new_ranges)
|
128
|
+
end
|
129
|
+
|
130
|
+
def subtract(range_set)
|
131
|
+
return self if range_set.empty?
|
132
|
+
remaining = range_set.ranges.dup
|
133
|
+
current_ranges = ranges.dup
|
134
|
+
new_ranges = []
|
135
|
+
|
136
|
+
while their_range = remaining.shift
|
137
|
+
new_ranges = []
|
138
|
+
|
139
|
+
current_ranges.each do |our_range|
|
140
|
+
if overlap?(their_range, our_range)
|
141
|
+
new_ranges += find_subtraction(their_range, our_range)
|
142
|
+
else
|
143
|
+
new_ranges << our_range
|
144
|
+
end
|
145
|
+
end
|
146
|
+
|
147
|
+
current_ranges = new_ranges
|
148
|
+
end
|
149
|
+
|
150
|
+
self.class.new(new_ranges)
|
151
|
+
end
|
152
|
+
|
153
|
+
# symmetric difference (the union without the intersection)
|
154
|
+
# http://en.wikipedia.org/wiki/Symmetric_difference
|
155
|
+
def difference(range_set)
|
156
|
+
union(range_set).subtract(intersection(range_set))
|
157
|
+
end
|
158
|
+
|
159
|
+
private
|
160
|
+
|
161
|
+
def flatten
|
162
|
+
return if ranges.size <= 1
|
163
|
+
|
164
|
+
sorted_ranges = ranges.sort do |a, b|
|
165
|
+
if is_numeric_range?(a) && is_numeric_range?(b)
|
166
|
+
a.first <=> b.first
|
167
|
+
else
|
168
|
+
1
|
169
|
+
end
|
170
|
+
end
|
171
|
+
|
172
|
+
new_ranges = [sorted_ranges.first]
|
173
|
+
|
174
|
+
sorted_ranges.each do |range|
|
175
|
+
previous_range = new_ranges.pop
|
176
|
+
|
177
|
+
if adjacent?(previous_range, range) || overlap?(previous_range, range)
|
178
|
+
new_ranges.push(
|
179
|
+
[range.first, previous_range.first].min..[range.last, previous_range.last].max
|
180
|
+
)
|
181
|
+
else
|
182
|
+
new_ranges.push(previous_range)
|
183
|
+
new_ranges.push(range)
|
184
|
+
end
|
185
|
+
end
|
186
|
+
|
187
|
+
@ranges = new_ranges
|
188
|
+
end
|
189
|
+
|
190
|
+
# returns true if range1 and range2 are within 1 of each other
|
191
|
+
def adjacent?(range1, range2)
|
192
|
+
is_numeric_range?(range1) && is_numeric_range?(range2) &&
|
193
|
+
(range1.last == range2.first - 1 || range2.first == range1.last + 1)
|
194
|
+
end
|
195
|
+
|
196
|
+
def overlap?(range1, range2)
|
197
|
+
is_numeric_range?(range1) && is_numeric_range?(range2) && (
|
198
|
+
(range1.last >= range2.first && range1.last <= range2.last) ||
|
199
|
+
(range1.first >= range2.first && range1.first <= range2.last) ||
|
200
|
+
(range1.first <= range2.first && range1.last >= range2.last)
|
201
|
+
)
|
202
|
+
end
|
203
|
+
|
204
|
+
def find_intersection(range1, range2)
|
205
|
+
# range2 entirely contains range1
|
206
|
+
if range2.first <= range1.first && range1.last <= range2.last
|
207
|
+
range1.dup
|
208
|
+
elsif range1.last >= range2.first && range1.last <= range2.last
|
209
|
+
range2.first..range1.last
|
210
|
+
elsif range1.first >= range2.first && range1.first <= range2.last
|
211
|
+
range1.first..range2.last
|
212
|
+
elsif range1.first <= range2.first && range1.last >= range2.last
|
213
|
+
[range1.first, range2.first].max..[range1.last, range2.last].min
|
214
|
+
end
|
215
|
+
end
|
216
|
+
|
217
|
+
# subtracts range1 from range2 (range2 - range1)
|
218
|
+
def find_subtraction(range1, range2)
|
219
|
+
# case: range1 contains range2 entirely (also handles equal case)
|
220
|
+
result = if range1.first <= range2.first && range2.last <= range1.last
|
221
|
+
[]
|
222
|
+
# case: range1 comes in the middle
|
223
|
+
elsif range2.first <= range1.first && range2.last >= range1.last
|
224
|
+
[range2.first..(range1.first - 1), (range1.last + 1)..range2.last]
|
225
|
+
# case: range1 trails
|
226
|
+
elsif range2.last >= range1.first && range1.last >= range2.last
|
227
|
+
[range2.first..(range1.first - 1)]
|
228
|
+
# case: range1 leads
|
229
|
+
elsif range1.last >= range2.first && range1.first <= range2.first
|
230
|
+
[(range1.last + 1)..range2.last]
|
231
|
+
end
|
232
|
+
|
233
|
+
result.reject { |r| r.first > r.last }
|
234
|
+
end
|
235
|
+
|
236
|
+
def is_numeric_range?(range)
|
237
|
+
range.first.is_a?(Numeric) && range.last.is_a?(Numeric)
|
238
|
+
end
|
239
|
+
|
240
|
+
end
|
241
|
+
end
|
242
|
+
end
|