rutils 0.1.2 → 0.1.3

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.
@@ -1,45 +1,25 @@
1
1
  if defined?(Object::ActionView)
2
- module Object::ActionView #:nodoc:
3
- module Helpers
4
- module DateHelper
2
+ module Object::ActionView::Helpers::DateHelper
5
3
 
6
- # Reports the approximate distance in time between two Time objects or integers.
7
- # For example, if the distance is 47 minutes, it'll return
8
- # "about 1 hour". See the source for the complete wording list.
4
+ # Заменяет ActionView::Helpers::DateHelper::distance_of_time_in_words на русское сообщение.
9
5
  #
10
- # Integers are interpreted as seconds. So,
11
- # <tt>distance_of_time_in_words(50)</tt> returns "less than a minute".
12
- #
13
- # Set <tt>include_seconds</tt> to true if you want more detailed approximations if distance < 1 minute
6
+ # Целые числа интерпретируются как секунды
7
+ # <tt>distance_of_time_in_words(50)</tt> возвращает "меньше минуты".
14
8
 
15
9
  alias :stock_distance_of_time_in_words :distance_of_time_in_words
16
10
  def distance_of_time_in_words(*args)
17
11
  RuTils::overrides_enabled? ? RuTils::DateTime::distance_of_time_in_words(*args) : stock_distance_of_time_in_words
18
12
  end
19
13
 
20
- # Like distance_of_time_in_words, but where <tt>to_time</tt> is fixed to <tt>Time.now</tt>.
21
- def time_ago_in_words(from_time, include_seconds = false)
22
- distance_of_time_in_words(from_time, Time.now, include_seconds)
23
- end
24
-
25
- # Returns a select tag with options for each of the months January through December with the current month selected.
26
- # The month names are presented as keys (what's shown to the user) and the month numbers (1-12) are used as values
27
- # (what's submitted to the server). It's also possible to use month numbers for the presentation instead of names --
28
- # set the <tt>:use_month_numbers</tt> key in +options+ to true for this to happen. If you want both numbers and names,
29
- # set the <tt>:add_month_numbers</tt> key in +options+ to true. Examples:
30
- #
31
- # select_month(Date.today) # Will use keys like "January", "March"
32
- # select_month(Date.today, :use_month_numbers => true) # Will use keys like "1", "3"
33
- # select_month(Date.today, :add_month_numbers => true) # Will use keys like "1 - January", "3 - March"
34
- #
35
- # Override the field name using the <tt>:field_name</tt> option, 'month' by default.
14
+ # Заменяет ActionView::Helpers::DateHelper::select_month меню выбора русской даты.
36
15
  #
37
- # If you would prefer to show month names as abbreviations, set the
38
- # <tt>:use_short_month</tt> key in +options+ to true.
16
+ # select_month(Date.today) # Использует ключи "Январь", "Март"
17
+ # select_month(Date.today, :use_month_numbers => true) # Использует ключи "1", "3"
18
+ # select_month(Date.today, :add_month_numbers => true) # Использует ключи "1 - Январь", "3 - Март"
39
19
  def select_month(date, options = {})
40
20
  month_options = []
41
21
  if RuTils::overrides_enabled?
42
- month_names = options[:use_short_month] ? RuTils::DateTime::ABBR_MONTHNAMES : RuTils::DateTime::MONTHNAMES
22
+ month_names = options[:use_short_month] ? Date::RU_ABBR_MONTHNAMES : Date::RU_INFLECTED_MONTHNAMES
43
23
  else
44
24
  month_names = options[:use_short_month] ? Date::ABBR_MONTHNAMES : Date::MONTHNAMES
45
25
  end
@@ -60,7 +40,5 @@ if defined?(Object::ActionView)
60
40
 
61
41
  select_html(options[:field_name] || 'month', month_options, options[:prefix], options[:include_blank], options[:discard_type], options[:disabled])
62
42
  end
63
- end
64
- end
65
43
  end
66
44
  end #endif
@@ -1,7 +1,8 @@
1
1
  if defined?(Object::RedCloth)
2
2
  # RuTils выполняет перегрузку Textile Glyphs в RedCloth, перенося форматирование спецсимволов на Gilenson.
3
3
  class Object::RedCloth < String #:nodoc:
4
- # Этот метод в RedCloth эскейпит слишком много HTML, нам ничего не оставляет :-)
4
+
5
+ # Этот метод в RedCloth при наличии Гиленсона надо отключать
5
6
  alias_method :stock_htmlesc, :htmlesc
6
7
  def htmlesc(text, mode=0) #:nodoc:
7
8
  RuTils::overrides_enabled? ? text : stock_htmlesc(text, mode)
@@ -1,215 +1,236 @@
1
1
  module RuTils
2
- module Pluralization #:nodoc:
3
- # Выбирает нужный падеж существительного в зависимости от числа
4
- def self.choose_plural(amount, *variants)
2
+ module Pluralization #:nodoc:
3
+ # Выбирает нужный падеж существительного в зависимости от числа
4
+ def self.choose_plural(amount, *variants)
5
5
  variant = (amount%10==1 && amount%100!=11 ? 1 : amount%10>=2 && amount%10<=4 && (amount%100<10 || amount%100>=20) ? 2 : 3)
6
6
  variants[variant-1]
7
- end
7
+ end
8
+
9
+ def self.rublej(amount)
10
+ pts = []
11
+
12
+ pts << RuTils::Pluralization::sum_string(amount.to_i, 1, "рубль", "рубля", "рублей") unless amount.to_i == 0
13
+ if amount.kind_of?(Float)
14
+ remainder = (amount.divmod(1)[1]*100).round
15
+ if (remainder == 100)
16
+ pts = [RuTils::Pluralization::sum_string(amount.to_i+1, 1, 'рубль', 'рубля', 'рублей')]
17
+ else
18
+ pts << RuTils::Pluralization::sum_string(remainder.to_i, 2, 'копейка', 'копейки', 'копеек')
19
+ end
20
+ end
21
+
22
+ pts.join(' ')
23
+ end
8
24
 
9
- # Выполняет преобразование числа из цифрого вида в символьное
10
- # amount - числительное
11
- # gender = 1 - мужской, = 2 - женский, = 3 - средний
12
- # one_item - именительный падеж единственного числа (= 1)
13
- # two_items - родительный падеж единственного числа (= 2-4)
14
- # five_items - родительный падеж множественного числа ( = 5-10)
15
- def self.sum_string(amount, gender, one_item='', two_items='', five_items='')
16
- into = ''
17
- tmp_val ||= 0
18
-
19
- return "ноль " + five_items if amount == 0
25
+ # Выполняет преобразование числа из цифрого вида в символьное
26
+ # amount - числительное
27
+ # gender = 1 - мужской, = 2 - женский, = 3 - средний
28
+ # one_item - именительный падеж единственного числа (= 1)
29
+ # two_items - родительный падеж единственного числа (= 2-4)
30
+ # five_items - родительный падеж множественного числа ( = 5-10)
31
+ def self.sum_string(amount, gender, one_item='', two_items='', five_items='')
32
+ into = ''
33
+ tmp_val ||= 0
20
34
 
21
- tmp_val = amount
35
+ return "ноль " + five_items if amount == 0
22
36
 
23
- # единицы
24
- into, tmp_val = sum_string_fn(into, tmp_val, gender, one_item, two_items, five_items)
37
+ tmp_val = amount
25
38
 
26
- return into if tmp_val == 0
39
+ # единицы
40
+ into, tmp_val = sum_string_fn(into, tmp_val, gender, one_item, two_items, five_items)
27
41
 
28
- # тысячи
29
- into, tmp_val = sum_string_fn(into, tmp_val, 2, "тысяча", "тысячи", "тысяч")
42
+ return into if tmp_val == 0
30
43
 
31
- return into if tmp_val == 0
44
+ # тысячи
45
+ into, tmp_val = sum_string_fn(into, tmp_val, 2, "тысяча", "тысячи", "тысяч")
32
46
 
33
- # миллионы
34
- into, tmp_val = sum_string_fn(into, tmp_val, 1, "миллион", "миллиона", "миллионов")
47
+ return into if tmp_val == 0
35
48
 
36
- return into if tmp_val == 0
49
+ # миллионы
50
+ into, tmp_val = sum_string_fn(into, tmp_val, 1, "миллион", "миллиона", "миллионов")
37
51
 
38
- # миллиардов
39
- into, tmp_val = sum_string_fn(into, tmp_val, 1, "миллиард", "миллиарда", "миллиардов")
40
- return into
41
- end
52
+ return into if tmp_val == 0
42
53
 
54
+ # миллиардов
55
+ into, tmp_val = sum_string_fn(into, tmp_val, 1, "миллиард", "миллиарда", "миллиардов")
56
+ return into
57
+ end
58
+
43
59
  private
44
- def self.sum_string_fn(into, tmp_val, gender, one_item='', two_items='', five_items='')
45
- rest, rest1, end_word, ones, tens, hundreds = [nil]*6
46
- #
47
- rest = tmp_val % 1000
48
- tmp_val = tmp_val / 1000
49
- if rest == 0
50
- # последние три знака нулевые
51
- into = five_items + " " if into == ""
52
- return [into, tmp_val]
53
- end
54
- #
55
- # начинаем подсчет с Rest
56
- end_word = five_items
57
- # сотни
58
- hundreds = case rest / 100
59
- when 0 then ""
60
- when 1 then "сто "
61
- when 2 then "двести "
62
- when 3 then "триста "
63
- when 4 then "четыреста "
64
- when 5 then "пятьсот "
65
- when 6 then "шестьсот "
66
- when 7 then "семьсот "
67
- when 8 then "восемьсот "
68
- when 9 then "девятьсот "
69
- end
70
-
71
- # десятки
72
- rest = rest % 100
73
- rest1 = rest / 10
74
- ones = ""
75
- case rest1
76
- when 0 then tens = ""
77
- when 1 # особый случай
78
- tens = case rest
79
- when 10 then "десять "
80
- when 11 then "одиннадцать "
81
- when 12 then "двенадцать "
82
- when 13 then "тринадцать "
83
- when 14 then "четырнадцать "
84
- when 15 then "пятнадцать "
85
- when 16 then "шестнадцать "
86
- when 17 then "семнадцать "
87
- when 18 then "восемнадцать "
88
- when 19 then "девятнадцать "
89
- end
90
- when 2: tens = "двадцать "
91
- when 3: tens = "тридцать "
92
- when 4: tens = "сорок "
93
- when 5: tens = "пятьдесят "
94
- when 6: tens = "шестьдесят "
95
- when 7: tens = "семьдесят "
96
- when 8: tens = "восемьдесят "
97
- when 9: tens = "девяносто "
98
- end
99
- #
100
- if rest1 < 1 or rest1 > 1 # единицы
101
- case rest % 10
102
- when 1
103
- ones = case gender
104
- when 1 then "один "
105
- when 2 then "одна "
106
- when 3 then "одно "
107
- end
108
- end_word = one_item
109
- when 2
110
- if gender == 2
111
- ones = "две "
112
- else
113
- ones = "два "
114
- end
115
- end_word = two_items
116
- when 3
117
- ones = "три " if end_word = two_items
118
- when 4
119
- ones = "четыре " if end_word = two_items
120
- when 5
121
- ones = "пять "
122
- when 6
123
- ones = "шесть "
124
- when 7
125
- ones = "семь "
126
- when 8
127
- ones = "восемь "
128
- when 9
129
- ones = "девять "
130
- end
131
- end
132
-
133
- # сборка строки
134
- st = ''
135
- return [(st << hundreds.to_s << tens.to_s << ones.to_s << end_word.to_s << " " << into.to_s).strip, tmp_val]
136
- end
137
-
138
- # Реализует вывод прописью любого объекта, реализующего Float
139
- module FloatFormatting
140
-
141
- # Выдает сумму прописью с учетом дробной доли. Дробная доля округляется до миллионной, или (если
142
- # дробная доля оканчивается на нули) до ближайшей доли ( 500 тысячных округляется до 5 десятых).
143
- # Дополнительный аргумент - род существительного (1 - мужской, 2- женский, 3-средний)
144
- def propisju(gender = 2)
145
- raise "Это не число!" if self.nan?
146
-
147
- st = RuTils::Pluralization::sum_string(self.to_i, gender, "целая", "целых", "целых")
148
- it = []
149
-
150
- remainder = self.to_s.match(/\.(\d+)/)[1]
151
-
152
- signs = remainder.to_s.size- 1
153
-
154
- it << ["десятая", "десятых"]
155
- it << ["сотая", "сотых"]
156
- it << ["тысячная", "тысячных"]
157
- it << ["десятитысячная", "десятитысячных"]
158
- it << ["стотысячная", "стотысячных"]
159
- it << ["миллионная", "милллионных"]
160
- it << ["десятимиллионная", "десятимилллионных", "десятимиллионных"]
161
- it << ["стомиллионная", "стомилллионных", "стомиллионных"]
162
- it << ["миллиардная", "миллиардных", "миллиардных"]
163
- it << ["десятимиллиардная", "десятимиллиардных", "десятимиллиардных"]
164
- it << ["стомиллиардная", "стомиллиардных", "стомиллиардных"]
165
- it << ["триллионная", "триллионных", "триллионных"]
166
-
167
- while it[signs].nil?
168
- remainder = (remainder/10).round
169
- signs = remainder.to_s.size- 1
170
- end
171
-
172
- suf1, suf2, suf3 = it[signs][0], it[signs][1], it[signs][2]
173
- st + " " + RuTils::Pluralization::sum_string(remainder.to_i, 2, suf1, suf2, suf2)
174
- end
175
-
176
- def propisju_items(gender=1, *forms)
177
- if self == self.to_i
178
- return self.to_i.propisju_items(gender, *forms)
179
- else
180
- self.propisju(gender) + " " + forms[1]
60
+ def self.sum_string_fn(into, tmp_val, gender, one_item='', two_items='', five_items='')
61
+ rest, rest1, end_word, ones, tens, hundreds = [nil]*6
62
+ #
63
+ rest = tmp_val % 1000
64
+ tmp_val = tmp_val / 1000
65
+ if rest == 0
66
+ # последние три знака нулевые
67
+ into = five_items + " " if into == ""
68
+ return [into, tmp_val]
69
+ end
70
+ #
71
+ # начинаем подсчет с Rest
72
+ end_word = five_items
73
+ # сотни
74
+ hundreds = case rest / 100
75
+ when 0 then ""
76
+ when 1 then "сто "
77
+ when 2 then "двести "
78
+ when 3 then "триста "
79
+ when 4 then "четыреста "
80
+ when 5 then "пятьсот "
81
+ when 6 then "шестьсот "
82
+ when 7 then "семьсот "
83
+ when 8 then "восемьсот "
84
+ when 9 then "девятьсот "
85
+ end
86
+
87
+ # десятки
88
+ rest = rest % 100
89
+ rest1 = rest / 10
90
+ ones = ""
91
+ case rest1
92
+ when 0 then tens = ""
93
+ when 1 # особый случай
94
+ tens = case rest
95
+ when 10 then "десять "
96
+ when 11 then "одиннадцать "
97
+ when 12 then "двенадцать "
98
+ when 13 then "тринадцать "
99
+ when 14 then "четырнадцать "
100
+ when 15 then "пятнадцать "
101
+ when 16 then "шестнадцать "
102
+ when 17 then "семнадцать "
103
+ when 18 then "восемнадцать "
104
+ when 19 then "девятнадцать "
105
+ end
106
+ when 2: tens = "двадцать "
107
+ when 3: tens = "тридцать "
108
+ when 4: tens = "сорок "
109
+ when 5: tens = "пятьдесят "
110
+ when 6: tens = "шестьдесят "
111
+ when 7: tens = "семьдесят "
112
+ when 8: tens = "восемьдесят "
113
+ when 9: tens = "девяносто "
114
+ end
115
+ #
116
+ if rest1 < 1 or rest1 > 1 # единицы
117
+ case rest % 10
118
+ when 1
119
+ ones = case gender
120
+ when 1 then "один "
121
+ when 2 then "одна "
122
+ when 3 then "одно "
123
+ end
124
+ end_word = one_item
125
+ when 2
126
+ if gender == 2
127
+ ones = "две "
128
+ else
129
+ ones = "два "
130
+ end
131
+ end_word = two_items
132
+ when 3
133
+ ones = "три " if end_word = two_items
134
+ when 4
135
+ ones = "четыре " if end_word = two_items
136
+ when 5
137
+ ones = "пять "
138
+ when 6
139
+ ones = "шесть "
140
+ when 7
141
+ ones = "семь "
142
+ when 8
143
+ ones = "восемь "
144
+ when 9
145
+ ones = "девять "
181
146
  end
182
- end
183
-
184
- end
185
-
186
- # Реализует вывод прописью любого объекта, реализующего Numeric
187
- module NumericFormatting
188
- # Выбирает корректный вариант числительного в зависимости от рода и числа и оформляет сумму прописью
189
- # 234.propisju => "двести сорок три"
190
- # 221.propisju(2) => "двести двадцать одна"
191
- def propisju(gender = 1)
192
- RuTils::Pluralization::sum_string(self, gender, "")
193
- end
194
-
195
- def propisju_items(gender=1, *forms)
196
- self.propisju(gender) + " " + RuTils::Pluralization::choose_plural(self.to_i, *forms)
197
- end
198
-
199
- # Выбирает корректный вариант числительного в зависимости от рода и числа. Например:
200
- # * 4.items("колесо", "колеса", "колес") => "колеса"
201
- def items(one_item, two_items, five_items)
202
- RuTils::Pluralization::choose_plural(self, one_item, two_items, five_items)
203
- end
204
- end
205
- end
147
+ end
148
+
149
+ # сборка строки
150
+ st = ''
151
+ return [(st << hundreds.to_s << tens.to_s << ones.to_s << end_word.to_s << " " << into.to_s).strip, tmp_val]
152
+ end
153
+
154
+ # Реализует вывод прописью любого объекта, реализующего Float
155
+ module FloatFormatting
156
+
157
+ # Выдает сумму прописью с учетом дробной доли. Дробная доля округляется до миллионной, или (если
158
+ # дробная доля оканчивается на нули) до ближайшей доли ( 500 тысячных округляется до 5 десятых).
159
+ # Дополнительный аргумент - род существительного (1 - мужской, 2- женский, 3-средний)
160
+ def propisju(gender = 2)
161
+ raise "Это не число!" if self.nan?
162
+
163
+ st = RuTils::Pluralization::sum_string(self.to_i, gender, "целая", "целых", "целых")
164
+
165
+ remainder = self.to_s.match(/\.(\d+)/)[1]
166
+
167
+ signs = remainder.to_s.size- 1
168
+
169
+ it = [["десятая", "десятых"]]
170
+ it << ["сотая", "сотых"]
171
+ it << ["тысячная", "тысячных"]
172
+ it << ["десятитысячная", "десятитысячных"]
173
+ it << ["стотысячная", "стотысячных"]
174
+ it << ["миллионная", "милллионных"]
175
+ it << ["десятимиллионная", "десятимилллионных", "десятимиллионных"]
176
+ it << ["стомиллионная", "стомилллионных", "стомиллионных"]
177
+ it << ["миллиардная", "миллиардных", "миллиардных"]
178
+ it << ["десятимиллиардная", "десятимиллиардных", "десятимиллиардных"]
179
+ it << ["стомиллиардная", "стомиллиардных", "стомиллиардных"]
180
+ it << ["триллионная", "триллионных", "триллионных"]
181
+
182
+ while it[signs].nil?
183
+ remainder = (remainder/10).round
184
+ signs = remainder.to_s.size- 1
185
+ end
186
+
187
+ suf1, suf2, suf3 = it[signs][0], it[signs][1], it[signs][2]
188
+ st + " " + RuTils::Pluralization::sum_string(remainder.to_i, 2, suf1, suf2, suf2)
189
+ end
190
+
191
+ def propisju_items(gender=1, *forms)
192
+ if self == self.to_i
193
+ return self.to_i.propisju_items(gender, *forms)
194
+ else
195
+ self.propisju(gender) + " " + forms[1]
196
+ end
197
+ end
198
+
199
+ end
200
+
201
+ # Реализует вывод прописью любого объекта, реализующего Numeric
202
+ module NumericFormatting
203
+ # Выбирает корректный вариант числительного в зависимости от рода и числа и оформляет сумму прописью
204
+ # 234.propisju => "двести сорок три"
205
+ # 221.propisju(2) => "двести двадцать одна"
206
+ def propisju(gender = 1)
207
+ RuTils::Pluralization::sum_string(self, gender, "")
208
+ end
209
+
210
+ def propisju_items(gender=1, *forms)
211
+ self.propisju(gender) + " " + RuTils::Pluralization::choose_plural(self.to_i, *forms)
212
+ end
213
+
214
+ # Выбирает корректный вариант числительного в зависимости от рода и числа. Например:
215
+ # * 4.items("колесо", "колеса", "колес") => "колеса"
216
+ def items(one_item, two_items, five_items)
217
+ RuTils::Pluralization::choose_plural(self, one_item, two_items, five_items)
218
+ end
219
+
220
+ # Выводит сумму в рублях прописью. Например:
221
+ # * (15.4).rublej => "пятнадцать рублей сорок копеек"
222
+ def rublej
223
+ RuTils::Pluralization::rublej(self)
224
+ end
225
+ end
226
+ end
206
227
  end
207
228
 
208
229
  class Object::Numeric
209
- include RuTils::Pluralization::NumericFormatting
230
+ include RuTils::Pluralization::NumericFormatting
210
231
  end
211
232
 
212
233
 
213
234
  class Object::Float
214
- include RuTils::Pluralization::FloatFormatting
235
+ include RuTils::Pluralization::FloatFormatting
215
236
  end
data/lib/rutils.rb CHANGED
@@ -5,18 +5,30 @@ require 'jcode' # вот от этого надо бы избавиться - с
5
5
  # Главный контейнер модуля
6
6
  module RuTils
7
7
  # Папка, куда установлен модуль RuTils. Нужно чтобы автоматически копировать RuTils в другие приложения.
8
- INSTALLATION_DIRECTORY = File.expand_path(File.dirname(__FILE__) + '/../')
9
- MAJOR = 0
10
- MINOR = 1
11
- TINY = 2
8
+ INSTALLATION_DIRECTORY = File.expand_path(File.dirname(__FILE__) + '/../') #:nodoc:
9
+ MAJOR = 0 #:nodoc:
10
+ MINOR = 1 #:nodoc:
11
+ TINY = 3 #:nodoc:
12
12
 
13
13
  # Версия RuTils
14
- VERSION = "#{MAJOR}.#{MINOR}.#{TINY}"
14
+ VERSION = [MAJOR, MINOR ,TINY].join('.')
15
+
16
+ # Стандартный маркер для подстановок
17
+ SUBSTITUTION_MARKER = "\xFF\xFF\xFF\xFF" #:nodoc:
18
+
19
+ def self.load_component(name) #:nodoc:
20
+ require RuTils::INSTALLATION_DIRECTORY + "/lib/#{name}/#{name}"
21
+ end
22
+
23
+ def self.reload_component(name) #:nodoc:
24
+ load RuTils::INSTALLATION_DIRECTORY + "/lib/#{name}/#{name}.rb"
25
+ end
15
26
  end
16
27
 
17
- require File.dirname(__FILE__) + '/pluralizer/pluralizer'
18
- require File.dirname(__FILE__) + '/gilenson/gilenson_port' #Предельно идентичный порт Тыпографицы
19
- #require File.dirname(__FILE__) + '/gilenson/gilenson' #Гиленсон, рефакторенный нами - todo
20
- require File.dirname(__FILE__) + '/datetime/datetime' # Дата и время без локалей
21
- require File.dirname(__FILE__) + '/transliteration/transliteration' # Транслит
22
- require File.dirname(__FILE__) + '/integration/integration' # Интеграция с rails, textile и тд
28
+
29
+ RuTils::load_component :pluralizer #Выбор числительного и сумма прописью
30
+ RuTils::load_component :gilenson # Гиленсон
31
+ RuTils::load_component :datetime # Дата и время без локалей
32
+ RuTils::load_component :transliteration # Транслит
33
+ RuTils::load_component :integration # Интеграция с rails, textile и тд
34
+ RuTils::load_component :countries # Данные о странах на русском и английском