rutils 0.2.5 → 1.0.0

Sign up to get free protection for your applications and to get access to all the features.
Files changed (50) hide show
  1. data/History.txt +9 -0
  2. data/Manifest.txt +22 -15
  3. data/README.txt +54 -41
  4. data/Rakefile.rb +9 -26
  5. data/TODO.txt +2 -3
  6. data/WHAT_HAS_CHANGED.txt +44 -0
  7. data/init.rb +20 -2
  8. data/lib/countries/countries.rb +1 -0
  9. data/lib/datetime/datetime.rb +1 -0
  10. data/lib/gilenson/bluecloth_extra.rb +7 -0
  11. data/lib/gilenson/gilenson.rb +39 -30
  12. data/lib/gilenson/helper.rb +34 -0
  13. data/lib/gilenson/maruku_extra.rb +19 -0
  14. data/lib/gilenson/rdiscount_extra.rb +7 -0
  15. data/lib/gilenson/redcloth_extra.rb +42 -0
  16. data/lib/integration/integration.rb +1 -11
  17. data/lib/integration/rails_date_helper_override.rb +103 -105
  18. data/lib/integration/rails_pre_filter.rb +1 -0
  19. data/lib/pluralizer/pluralizer.rb +14 -13
  20. data/lib/rutils.rb +15 -25
  21. data/lib/transliteration/bidi.rb +15 -72
  22. data/lib/transliteration/simple.rb +1 -0
  23. data/lib/transliteration/transliteration.rb +11 -9
  24. data/lib/version.rb +5 -0
  25. data/test/extras/integration_bluecloth.rb +13 -0
  26. data/test/extras/integration_maruku.rb +15 -0
  27. data/test/{test_rails_filter.rb → extras/integration_rails_filter.rb} +3 -1
  28. data/test/extras/integration_rails_gilenson_helpers.rb +80 -0
  29. data/test/{test_rails_helpers.rb → extras/integration_rails_helpers.rb} +15 -3
  30. data/test/extras/integration_rdiscount.rb +15 -0
  31. data/test/extras/integration_redcloth3.rb +18 -0
  32. data/test/extras/integration_redcloth4.rb +19 -0
  33. data/test/run_tests.rb +2 -2
  34. data/test/{t_datetime.rb → test_datetime.rb} +1 -2
  35. data/test/{t_gilenson.rb → test_gilenson.rb} +15 -6
  36. data/test/test_integration.rb +22 -0
  37. data/test/test_integration_flag.rb +18 -0
  38. data/test/{t_pluralize.rb → test_pluralize.rb} +3 -2
  39. data/test/{t_rutils_base.rb → test_rutils_base.rb} +1 -0
  40. data/test/test_transliteration.rb +53 -0
  41. metadata +35 -26
  42. data/lib/integration/blue_cloth_override.rb +0 -12
  43. data/lib/integration/red_cloth_four.rb +0 -24
  44. data/lib/integration/red_cloth_override.rb +0 -7
  45. data/lib/integration/red_cloth_three.rb +0 -25
  46. data/test/t_integration.rb +0 -46
  47. data/test/t_transliteration.rb +0 -109
  48. data/test/test_integration_bluecloth.rb +0 -17
  49. data/test/test_integration_redcloth3.rb +0 -31
  50. data/test/test_integration_redcloth4.rb +0 -31
@@ -0,0 +1,34 @@
1
+ # -*- encoding: utf-8 -*-
2
+ # Включается на правах хелпера в Rails-приложение
3
+ module RuTils::Gilenson::Helper
4
+
5
+ # Возвращает текст обработанный Гиленсоном
6
+ def gilensize(text, options = {})
7
+ return "" if text.blank?
8
+ f = RuTils::Gilenson::Formatter.new
9
+ f.configure!(options)
10
+ f.process(text)
11
+ end
12
+
13
+ # Возвращает текст обработанный Текстилем и Гиленсоном
14
+ # <i>Метод доступен только при включенном RedCloth</i>
15
+ def textilize(text)
16
+ return "" if text.blank?
17
+ if RuTils.overrides_enabled?
18
+ RuTils::Gilenson::RedClothExtra.new(text, [ :hard_breaks ]).to_html
19
+ else
20
+ super(text)
21
+ end
22
+ end
23
+
24
+ # Возвращает текст с кодом Markdown превращенным в HTML, попутно обработанный Гиленсоном
25
+ # <i>Метод доступен только при наличии BlueCloth</i>.
26
+ def markdown(text)
27
+ return "" if text.blank?
28
+ if RuTils.overrides_enabled?
29
+ RuTils::Gilenson::BlueClothExtra.new(text).to_html
30
+ else
31
+ super(text)
32
+ end
33
+ end
34
+ end
@@ -0,0 +1,19 @@
1
+ # -*- encoding: utf-8 -*-
2
+ # Maruku с поддержкой Gilenson
3
+ class RuTils::Gilenson::MarukuExtra < Maruku
4
+ def to_html(*anything)
5
+ suspended = super
6
+
7
+ # Return quotes to original state
8
+ [187, 171, 8220, 8221].map do |e|
9
+ suspended.gsub! /&\##{e};/, '"'
10
+ end
11
+
12
+ # Return spaces to original state
13
+ [160].map do |e|
14
+ suspended.gsub! /&\##{e};/, ' '
15
+ end
16
+
17
+ suspended.gilensize
18
+ end
19
+ end
@@ -0,0 +1,7 @@
1
+ # -*- encoding: utf-8 -*-
2
+ # RDiscount с поддержкой Gilenson
3
+ class RuTils::Gilenson::RDiscountExtra < RDiscount
4
+ def to_html(*opts)
5
+ RuTils::Gilenson::Formatter.new(super(*opts)).to_html
6
+ end
7
+ end
@@ -0,0 +1,42 @@
1
+ # -*- encoding: utf-8 -*-
2
+ if RedCloth.class == Module
3
+ # RedCloth 4 - частичная поддержка
4
+ class RuTils::Gilenson::RedClothExtra < RedCloth::TextileDoc
5
+ def to_html(*anything)
6
+ suspended = super(*anything)
7
+
8
+ # Return quotes to original state
9
+ [187, 171, 8220, 8221].map do |e|
10
+ suspended.gsub! /&\##{e};/, '"'
11
+ end
12
+
13
+ # Return spaces to original state
14
+ [160].map do |e|
15
+ suspended.gsub! /&\##{e};/, ' '
16
+ end
17
+
18
+ suspended.gilensize
19
+ end
20
+ end
21
+ else
22
+ # RedCloth 3 - RuTils выполняет перегрузку Textile Glyphs в RedCloth, перенося форматирование спецсимволов на Gilenson.
23
+ # Применять как стандартный RedCloth
24
+ # RuTils::Gilenson::RedClothExtra.new(some_text).to_html
25
+ class RuTils::Gilenson::RedClothExtra < RedCloth
26
+ # Этот метод в RedCloth при наличии Гиленсона становится заглушкой
27
+ def htmlesc(text, mode=0)
28
+ text
29
+ end
30
+
31
+ # А этот метод обрабатывает Textile Glyphs - ту самую типографицу.
32
+ # Вместо того чтобы влезать в чужие таблицы мы просто заменим Textile Glyphs на Gilenson - и все будут рады.
33
+ def pgl(text) #:nodoc:
34
+ # Подвешиваем пробелы в начале и в конце каждого блока. Тряпка требует чтобы эти пробелы приехали
35
+ # назад нетронутыми.
36
+ spaces = Array.new(2,'')
37
+ text.gsub!(/\A([\s]+)/) { spaces[0] = $1; '' }
38
+ text.gsub!(/(\s+)\Z/) { spaces[1] = $1; '' }
39
+ text.replace(spaces[0].to_s + RuTils::Gilenson::Formatter.new(text).to_html + spaces[1].to_s)
40
+ end
41
+ end
42
+ end
@@ -1,11 +1 @@
1
- module RuTils
2
- # Вновь выполняет перегрузку. Делать это надо после того, как в программу импортированы
3
- # другие модули.
4
- def self.reload_integrations!
5
- load File.dirname(__FILE__) + '/blue_cloth_override.rb'
6
- load File.dirname(__FILE__) + '/red_cloth_override.rb'
7
- load File.dirname(__FILE__) + '/rails_date_helper_override.rb'
8
- end
9
- end
10
-
11
- RuTils::reload_integrations!
1
+ require File.dirname(__FILE__) + '/rails_date_helper_override' if defined?(ActionView)
@@ -1,129 +1,127 @@
1
- if defined?(Object::ActionView)
2
- module Object::ActionView::Helpers::DateHelper
3
- # Несколько хаков для корректной работы модуля с Rails 1.2--2.0 одновременно с Rails 2.1 и выше.
1
+ # -*- encoding: utf-8 -*-
2
+ module Object::ActionView::Helpers::DateHelper
3
+ # Несколько хаков для корректной работы модуля с Rails 1.2--2.0 одновременно с Rails 2.1 и выше.
4
4
 
5
- # Хелперы DateHelper принимают параметр <tt>html_options</tt> (идет последним) начиная с Rails 2.1.
6
- # Нужно понять, имеем ли мы дело с Rails 2.1+, для этого проверяем наличие классметода helper_modules у
7
- # ActionView::Base, который появился как раз в версии 2.1.
8
- DATE_HELPERS_RECEIVE_HTML_OPTIONS = ActionView::Base.respond_to?(:helper_modules) #:nodoc:
5
+ # Хелперы DateHelper принимают параметр <tt>html_options</tt> (идет последним) начиная с Rails 2.1.
6
+ # Нужно понять, имеем ли мы дело с Rails 2.1+, для этого проверяем наличие классметода helper_modules у
7
+ # ActionView::Base, который появился как раз в версии 2.1.
8
+ DATE_HELPERS_RECEIVE_HTML_OPTIONS = ActionView::Base.respond_to?(:helper_modules) #:nodoc:
9
9
 
10
- # В Rails Edge (2.1+) определяется <tt>Time.current</tt> для работы с временными зонами.
11
- unless Time.respond_to? :current
12
- class << ::Time # :nodoc:
13
- def current; now; end
14
- end
10
+ # В Rails Edge (2.1+) определяется <tt>Time.current</tt> для работы с временными зонами.
11
+ unless Time.respond_to? :current
12
+ class << ::Time # :nodoc:
13
+ def current; now; end
15
14
  end
15
+ end
16
16
 
17
- # В Rails Edge (2.1+) определяется <tt>Date.current</tt> для работы с временными зонами.
18
- unless Date.respond_to? :current
19
- class << ::Date # :nodoc:
20
- def current; now; end
21
- end
22
- end
23
-
24
- # Заменяет <tt>ActionView::Helpers::DateHelper::distance_of_time_in_words</tt> на русское сообщение.
25
- #
26
- # Целые числа интерпретируются как секунды.
27
- # <tt>distance_of_time_in_words(50)</tt> возвращает "меньше минуты".
28
- alias :stock_distance_of_time_in_words :distance_of_time_in_words
29
- def distance_of_time_in_words(*args)
30
- RuTils::overrides_enabled? ? RuTils::DateTime::distance_of_time_in_words(*args) : stock_distance_of_time_in_words
17
+ # В Rails Edge (2.1+) определяется <tt>Date.current</tt> для работы с временными зонами.
18
+ unless Date.respond_to? :current
19
+ class << ::Date # :nodoc:
20
+ def current; now; end
31
21
  end
22
+ end
32
23
 
33
- # Заменяет ActionView::Helpers::DateHelper::select_month меню выбора русских месяцев.
34
- #
35
- # select_month(Date.today) # Использует ключи "Январь", "Март"
36
- # select_month(Date.today, :use_month_numbers => true) # Использует ключи "1", "3"
37
- # select_month(Date.today, :add_month_numbers => true) # Использует ключи "1 - Январь", "3 - Март"
38
- def select_month(date, options = {}, html_options = {})
39
- locale = options[:locale] unless RuTils::overrides_enabled?
40
-
41
- val = date ? (date.kind_of?(Fixnum) ? date : date.month) : ''
42
- if options[:use_hidden]
43
- if self.class.private_instance_methods.include? "_date_hidden_html"
44
- _date_hidden_html(options[:field_name] || 'month', val, options)
45
- else
46
- hidden_html(options[:field_name] || 'month', val, options)
24
+ # Заменяет <tt>ActionView::Helpers::DateHelper::distance_of_time_in_words</tt> на русское сообщение.
25
+ #
26
+ # Целые числа интерпретируются как секунды.
27
+ # <tt>distance_of_time_in_words(50)</tt> возвращает "меньше минуты".
28
+ alias :stock_distance_of_time_in_words :distance_of_time_in_words
29
+ def distance_of_time_in_words(*args)
30
+ RuTils::overrides_enabled? ? RuTils::DateTime::distance_of_time_in_words(*args) : stock_distance_of_time_in_words
31
+ end
32
+
33
+ # Заменяет ActionView::Helpers::DateHelper::select_month меню выбора русских месяцев.
34
+ #
35
+ # select_month(Date.today) # Использует ключи "Январь", "Март"
36
+ # select_month(Date.today, :use_month_numbers => true) # Использует ключи "1", "3"
37
+ # select_month(Date.today, :add_month_numbers => true) # Использует ключи "1 - Январь", "3 - Март"
38
+ def select_month(date, options = {}, html_options = {})
39
+ locale = options[:locale] unless RuTils::overrides_enabled?
40
+
41
+ val = date ? (date.kind_of?(Fixnum) ? date : date.month) : ''
42
+ if options[:use_hidden]
43
+ if self.class.private_instance_methods.include? "_date_hidden_html"
44
+ _date_hidden_html(options[:field_name] || 'month', val, options)
45
+ else
46
+ hidden_html(options[:field_name] || 'month', val, options)
47
+ end
48
+ else
49
+ month_options = []
50
+ if RuTils::overrides_enabled?
51
+ month_names = case true
52
+ when options[:use_short_month]
53
+ Date::RU_ABBR_MONTHNAMES
54
+ # использование в контексте date_select с днями требует родительный падеж
55
+ when options[:order] && options[:order].include?(:day)
56
+ Date::RU_INFLECTED_MONTHNAMES
57
+ else
58
+ Date::RU_MONTHNAMES
47
59
  end
48
60
  else
49
- month_options = []
50
- if RuTils::overrides_enabled?
51
- month_names = case true
52
- when options[:use_short_month]
53
- Date::RU_ABBR_MONTHNAMES
54
- # использование в контексте date_select с днями требует родительный падеж
55
- when options[:order] && options[:order].include?(:day)
56
- Date::RU_INFLECTED_MONTHNAMES
57
- else
58
- Date::RU_MONTHNAMES
61
+ if defined? I18n
62
+ month_names = options[:use_month_names] || begin
63
+ key = options[:use_short_month] ? :'date.abbr_month_names' : :'date.month_names'
64
+ I18n.translate key, :locale => locale
59
65
  end
60
66
  else
61
- if defined? I18n
62
- month_names = options[:use_month_names] || begin
63
- key = options[:use_short_month] ? :'date.abbr_month_names' : :'date.month_names'
64
- I18n.translate key, :locale => locale
65
- end
66
- else
67
- month_names = options[:use_short_month] ? Date::ABBR_MONTHNAMES : Date::MONTHNAMES
68
- end
67
+ month_names = options[:use_short_month] ? Date::ABBR_MONTHNAMES : Date::MONTHNAMES
69
68
  end
70
- month_names.unshift(nil) if month_names.size < 13
69
+ end
70
+ month_names.unshift(nil) if month_names.size < 13
71
71
 
72
- 1.upto(12) do |month_number|
73
- month_name = if options[:use_month_numbers]
74
- month_number
75
- elsif options[:add_month_numbers]
76
- month_number.to_s + ' - ' + month_names[month_number]
77
- else
78
- month_names[month_number]
79
- end
80
-
81
- month_options << ((val == month_number) ?
82
- content_tag(:option, month_name, :value => month_number, :selected => "selected") :
83
- content_tag(:option, month_name, :value => month_number)
84
- )
85
- month_options << "\n"
86
- end
87
-
88
- if DATE_HELPERS_RECEIVE_HTML_OPTIONS
89
- if self.class.private_instance_methods.include? "_date_select_html"
90
- _date_select_html(options[:field_name] || 'month', month_options.join, options, html_options)
91
- else
92
- select_html(options[:field_name] || 'month', month_options.join, options, html_options)
93
- end
72
+ 1.upto(12) do |month_number|
73
+ month_name = if options[:use_month_numbers]
74
+ month_number
75
+ elsif options[:add_month_numbers]
76
+ month_number.to_s + ' - ' + month_names[month_number]
94
77
  else
95
- select_html(options[:field_name] || 'month', month_options.join, options)
78
+ month_names[month_number]
96
79
  end
80
+
81
+ month_options << ((val == month_number) ?
82
+ content_tag(:option, month_name, :value => month_number, :selected => "selected") :
83
+ content_tag(:option, month_name, :value => month_number)
84
+ )
85
+ month_options << "\n"
97
86
  end
98
- end
99
-
100
- alias :stock_select_date :select_date
101
- # Заменяет ActionView::Helpers::DateHelper::select_date меню выбора русской даты.
102
- def select_date(date = Date.current, options = {}, html_options = {})
103
- options[:order] ||= [:day, :month, :year]
87
+
104
88
  if DATE_HELPERS_RECEIVE_HTML_OPTIONS
105
- stock_select_date(date, options, html_options)
89
+ if self.class.private_instance_methods.include? "_date_select_html"
90
+ _date_select_html(options[:field_name] || 'month', month_options.join, options, html_options)
91
+ else
92
+ select_html(options[:field_name] || 'month', month_options.join, options, html_options)
93
+ end
106
94
  else
107
- stock_select_date(date, options)
95
+ select_html(options[:field_name] || 'month', month_options.join, options)
108
96
  end
109
97
  end
110
98
  end
111
99
 
112
- module Object::ActionView::Helpers
113
- if defined?(InstanceTag) && InstanceTag.private_method_defined?(:date_or_time_select)
114
- class InstanceTag #:nodoc:
115
- private
116
- alias :stock_date_or_time_select :date_or_time_select
117
- def date_or_time_select(options, html_options = {})
118
- options[:order] ||= [:day, :month, :year]
119
- if DATE_HELPERS_RECEIVE_HTML_OPTIONS
120
- stock_date_or_time_select(options, html_options)
121
- else
122
- stock_date_or_time_select(options)
123
- end
100
+ alias :stock_select_date :select_date
101
+ # Заменяет ActionView::Helpers::DateHelper::select_date меню выбора русской даты.
102
+ def select_date(date = Date.current, options = {}, html_options = {})
103
+ options[:order] ||= [:day, :month, :year]
104
+ if DATE_HELPERS_RECEIVE_HTML_OPTIONS
105
+ stock_select_date(date, options, html_options)
106
+ else
107
+ stock_select_date(date, options)
108
+ end
109
+ end
110
+ end
111
+
112
+ module Object::ActionView::Helpers
113
+ if defined?(InstanceTag) && InstanceTag.private_method_defined?(:date_or_time_select)
114
+ class InstanceTag #:nodoc:
115
+ private
116
+ alias :stock_date_or_time_select :date_or_time_select
117
+ def date_or_time_select(options, html_options = {})
118
+ options[:order] ||= [:day, :month, :year]
119
+ if DATE_HELPERS_RECEIVE_HTML_OPTIONS
120
+ stock_date_or_time_select(options, html_options)
121
+ else
122
+ stock_date_or_time_select(options)
124
123
  end
125
- end
124
+ end
126
125
  end
127
126
  end
128
-
129
- end #endif
127
+ end
@@ -1,3 +1,4 @@
1
+ # -*- encoding: utf-8 -*-
1
2
  class ActionController::Base
2
3
  before_filter { RuTils::overrides = true }
3
4
  end
@@ -1,3 +1,4 @@
1
+ # -*- encoding: utf-8 -*-
1
2
  module RuTils
2
3
  module Pluralization #:nodoc:
3
4
  # Выбирает нужный падеж существительного в зависимости от числа
@@ -97,10 +98,10 @@ module RuTils
97
98
  rest = rest % 100
98
99
  rest1 = rest / 10
99
100
  ones = ""
100
- case rest1
101
- when 0 then tens = ""
101
+ tens = case rest1
102
+ when 0 then ""
102
103
  when 1 # особый случай
103
- tens = case rest
104
+ case rest
104
105
  when 10 then "десять "
105
106
  when 11 then "одиннадцать "
106
107
  when 12 then "двенадцать "
@@ -112,14 +113,14 @@ module RuTils
112
113
  when 18 then "восемнадцать "
113
114
  when 19 then "девятнадцать "
114
115
  end
115
- when 2: tens = "двадцать "
116
- when 3: tens = "тридцать "
117
- when 4: tens = "сорок "
118
- when 5: tens = "пятьдесят "
119
- when 6: tens = "шестьдесят "
120
- when 7: tens = "семьдесят "
121
- when 8: tens = "восемьдесят "
122
- when 9: tens = "девяносто "
116
+ when 2 then "двадцать "
117
+ when 3 then "тридцать "
118
+ when 4 then "сорок "
119
+ when 5 then "пятьдесят "
120
+ when 6 then "шестьдесят "
121
+ when 7 then "семьдесят "
122
+ when 8 then "восемьдесят "
123
+ when 9 then "девяносто "
123
124
  end
124
125
  #
125
126
  if rest1 < 1 or rest1 > 1 # единицы
@@ -156,8 +157,8 @@ module RuTils
156
157
  end
157
158
 
158
159
  # сборка строки
159
- st = ''
160
- return [(st << hundreds.to_s << tens.to_s << ones.to_s << end_word.to_s << " " << into.to_s).strip, tmp_val]
160
+ plural = [hundreds, tens, ones, end_word, " ", into].join.strip
161
+ return [plural, tmp_val]
161
162
  end
162
163
 
163
164
  # Реализует вывод прописью любого объекта, реализующего Float
data/lib/rutils.rb CHANGED
@@ -1,24 +1,20 @@
1
+ # -*- encoding: utf-8 -*-
1
2
  $KCODE = 'u'
2
3
 
4
+ require File.dirname(__FILE__) + '/version'
5
+
3
6
  # Главный контейнер модуля
4
7
  module RuTils
5
- #:stopdoc:
6
-
7
8
  # Папка, куда установлен модуль RuTils. Нужно чтобы автоматически копировать RuTils в другие приложения.
8
9
  INSTALLATION_DIRECTORY = File.expand_path(File.dirname(__FILE__) + '/../') #:nodoc:
9
- MAJOR = 0 #:nodoc:
10
- MINOR = 2 #:nodoc:
11
- TINY = 5 #:nodoc:
12
-
13
- # Стандартный маркер для подстановок - invalid UTF sequence
14
- SUBSTITUTION_MARKER = "\xF0\xF0\xF0\xF0" #:nodoc:
15
-
16
- # :startdoc:
17
10
 
18
- # Версия RuTils
19
- VERSION = [MAJOR, MINOR ,TINY].join('.')
11
+ # Стандартный маркер для подстановок - Unicode Character 'OBJECT REPLACEMENT CHARACTER' (U+FFFC)
12
+ # http://unicode.org/reports/tr20/tr20-1.html
13
+ # Он официально применяется для обозначения вложенного обьекта
14
+ SUBSTITUTION_MARKER = [0xEF, 0xBF, 0xBC].pack("U*").freeze
20
15
 
21
- @@overrides = true
16
+ class RemovedFeature < RuntimeError
17
+ end
22
18
 
23
19
  # Метод позволяет проверить, включена ли перегрузка функций других модулей.
24
20
  # Попутно он спрашивает модуль Locale (если таковой имеется) является ли русский
@@ -37,28 +33,22 @@ module RuTils
37
33
 
38
34
  # Включает или выключает перегрузки других модулей. Полезно, например, в случае когда нужно рендерить страницу
39
35
  # сайта на нескольких языках и нужно отключить русское оформление текста для других языков.
36
+ #
37
+ # Флаг overrides в RuTils работают в контексте текущей нити
40
38
  def overrides=(new_override_flag)
41
39
  Thread.current[:rutils_overrided_enabled] = (new_override_flag ? true : false)
42
40
  end
43
41
  module_function :overrides=
44
42
 
45
- def self.thread_local_or_own_flag
43
+ def self.thread_local_or_own_flag #:nodoc:
46
44
  Thread.current.keys.include?(:rutils_overrided_enabled) ? Thread.current[:rutils_overrided_enabled] : false
47
45
  end
48
46
 
49
47
  def self.load_component(name) #:nodoc:
50
48
  require File.join(RuTils::INSTALLATION_DIRECTORY, "lib", name.to_s, name.to_s)
51
49
  end
52
-
53
- def self.reload_component(name) #:nodoc:
54
- load File.join(RuTils::INSTALLATION_DIRECTORY, "lib", name.to_s, "#{name}.rb")
55
- end
56
50
  end
57
51
 
58
-
59
- RuTils::load_component :pluralizer #Выбор числительного и сумма прописью
60
- RuTils::load_component :gilenson # Гиленсон
61
- RuTils::load_component :datetime # Дата и время без локалей
62
- RuTils::load_component :transliteration # Транслит
63
- RuTils::load_component :integration # Интеграция с rails, textile и тд
64
- RuTils::load_component :countries # Данные о странах на русском и английском
52
+ [:pluralizer, :gilenson, :datetime, :transliteration, :integration, :countries].each do | submodule |
53
+ require File.join(RuTils::INSTALLATION_DIRECTORY, "lib", submodule.to_s, submodule.to_s)
54
+ end