rutils 0.1.2 → 0.1.3

Sign up to get free protection for your applications and to get access to all the features.
@@ -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 # Данные о странах на русском и английском