rutils 0.2.3 → 0.2.4
Sign up to get free protection for your applications and to get access to all the features.
- data/{CHANGELOG → History.txt} +49 -18
- data/Manifest.txt +27 -0
- data/README.txt +214 -0
- data/Rakefile.rb +48 -120
- data/{TODO → TODO.txt} +1 -4
- data/bin/gilensize +8 -4
- data/bin/rutilize +0 -0
- data/lib/datetime/datetime.rb +15 -17
- data/lib/gilenson/gilenson.rb +74 -60
- data/lib/integration/blue_cloth_override.rb +7 -3
- data/lib/integration/integration.rb +2 -2
- data/lib/integration/rails_date_helper_override.rb +91 -57
- data/lib/integration/red_cloth_override.rb +8 -8
- data/lib/pluralizer/pluralizer.rb +4 -0
- data/lib/rutils.rb +11 -6
- data/lib/transliteration/bidi.rb +8 -1
- data/test/t_datetime.rb +16 -1
- data/test/t_gilenson.rb +45 -23
- data/test/t_integration.rb +73 -29
- data/test/t_pluralize.rb +2 -0
- metadata +78 -62
- data/README +0 -192
- data/lib/gilenson/gilenson_port.rb +0 -321
- data/test/t_typografica.rb +0 -57
data/test/t_gilenson.rb
CHANGED
@@ -27,11 +27,11 @@ class GilensonOwnTest < Test::Unit::TestCase
|
|
27
27
|
end
|
28
28
|
|
29
29
|
def test_phones
|
30
|
-
assert_equal '<nobr>3–12–30</
|
31
|
-
assert_equal '<nobr>12–34–56</
|
32
|
-
assert_equal '<nobr>88–25–04</
|
33
|
-
assert_equal '+7 <nobr>(99284) 65–818</
|
34
|
-
assert_equal '<nobr>725–01–10</
|
30
|
+
assert_equal '<span class="nobr">3–12–30</span>', '3-12-30'.gilensize
|
31
|
+
assert_equal '<span class="nobr">12–34–56</span>', '12-34-56'.gilensize
|
32
|
+
assert_equal '<span class="nobr">88–25–04</span>', '88-25-04'.gilensize
|
33
|
+
assert_equal '+7 <span class="nobr">(99284) 65–818</span>', '+7 (99284) 65-818'.gilensize
|
34
|
+
assert_equal '<span class="nobr">725–01–10</span>', '725-01-10'.gilensize
|
35
35
|
end
|
36
36
|
|
37
37
|
def test_acronyms_with_html_output
|
@@ -78,10 +78,23 @@ class GilensonOwnTest < Test::Unit::TestCase
|
|
78
78
|
def test_breaking
|
79
79
|
assert_equal 'скажи, мне, ведь не даром! Москва, клеймённая пожаром. Французу отдана', 'скажи ,мне, ведь не даром !Москва, клеймённая пожаром .Французу отдана'.gilensize
|
80
80
|
assert_equal 'so be it, my liege. Tiny dwellers roam thru midnight! Hell raised, the Balrog is hiding in your backyard!', 'so be it ,my liege .Tiny dwellers roam thru midnight !Hell raised, the Balrog is hiding in your backyard!'.gilensize
|
81
|
-
assert_equal 'при установке командой строки в ?page=help <nobr>бла-бла-бла-бла</
|
82
|
-
assert_equal 'как интересно будет переноситься со строки на строку <nobr>что-то</
|
81
|
+
assert_equal 'при установке командой строки в ?page=help <span class="nobr">бла-бла-бла-бла</span>', 'при установке командой строки в ?page=help бла-бла-бла-бла'.gilensize
|
82
|
+
assert_equal 'как интересно будет переноситься со строки на строку <span class="nobr">что-то</span> разделённое дефисом, ведь дефис тот тоже ведь из наших. <span class="nobr">Какие-то</span> браузеры думают, что следует переносить и его…', 'как интересно будет переноситься со строки на строку что-то разделённое дефисом, ведь дефис тот тоже ведь из наших. Какие-то браузеры думают, что следует переносить и его...'.gilensize
|
83
83
|
end
|
84
84
|
|
85
|
+
def test_forced_quotes
|
86
|
+
assert_equal 'кавычки «расставлены» “in a chaotic order”',
|
87
|
+
'кавычки "расставлены" "in a chaotic order"'.gilensize
|
88
|
+
assert_equal 'кавычки “расставлены” “in a chaotic order”',
|
89
|
+
'кавычки "расставлены" "in a chaotic order"'.gilensize(:enforce_en_quotes => true)
|
90
|
+
assert_equal 'кавычки «расставлены» «in a chaotic order»',
|
91
|
+
'кавычки "расставлены" "in a chaotic order"'.gilensize(:enforce_ru_quotes => true)
|
92
|
+
end
|
93
|
+
|
94
|
+
#def test_quotes_and_inch
|
95
|
+
# assert_equal "«This one is 12ₖ»", '"This one is 12""'.gilensize
|
96
|
+
#end
|
97
|
+
|
85
98
|
def test_quotes
|
86
99
|
assert_equal 'english “quotes” should be quite like this', 'english "quotes" should be quite like this'.gilensize
|
87
100
|
assert_equal 'русские же «оформляются» подобным образом', 'русские же "оформляются" подобным образом'.gilensize
|
@@ -146,10 +159,15 @@ class GilensonOwnTest < Test::Unit::TestCase
|
|
146
159
|
assert_equal "сказали мы?!!!", "сказали мы?!!!".gilensize
|
147
160
|
assert_equal "сказали нам", "сказали нам".gilensize
|
148
161
|
assert_equal "(сказали им)", "(сказали им)".gilensize
|
162
|
+
assert_equal "Справка 09", 'Справка 09'.gilensize
|
163
|
+
end
|
164
|
+
|
165
|
+
def test_wordglue_combined_with_glyphs # http://pixel-apes.com/typografica/trako/12
|
166
|
+
assert_equal "«Справка 09»", '"Справка 09"'.gilensize(:wordglue => true)
|
149
167
|
end
|
150
168
|
|
151
169
|
def test_marker_bypass
|
152
|
-
assert_equal "<p><nobr>МИЭЛЬ-Недвижимость</
|
170
|
+
assert_equal "<p><span class=\"nobr\">МИЭЛЬ-Недвижимость</span></p>", "<p>МИЭЛЬ-Недвижимость</p>".gilensize
|
153
171
|
end
|
154
172
|
|
155
173
|
def test_skip_code
|
@@ -338,6 +356,18 @@ class GilensonConfigurationTest < Test::Unit::TestCase
|
|
338
356
|
assert_raise(RuTils::Gilenson::UnknownSetting) { @gilenson.configure!(:bararara => true) }
|
339
357
|
end
|
340
358
|
|
359
|
+
def test_raise_on_unknown_setting_via_gilensize
|
360
|
+
assert_raise(RuTils::Gilenson::UnknownSetting) { "s".gilensize(:bararara => true) }
|
361
|
+
end
|
362
|
+
|
363
|
+
def test_backslash_does_not_suppress_quote # http://pixel-apes.com/typografica/trako/13, но с латинскими кавычками
|
364
|
+
assert_equal "“c:\\www\\sites\\”", '"c:\www\sites\"'.gilensize
|
365
|
+
end
|
366
|
+
|
367
|
+
def test_cpp
|
368
|
+
assert_equal "C++-API", "C++-API".gilensize
|
369
|
+
end
|
370
|
+
|
341
371
|
def test_raw_utf8_output
|
342
372
|
@gilenson.configure!(:raw_output=>true)
|
343
373
|
assert_equal '阪 Это просто «кавычки»',
|
@@ -348,18 +378,10 @@ class GilensonConfigurationTest < Test::Unit::TestCase
|
|
348
378
|
assert @gilenson.configure(:raw_output=>true)
|
349
379
|
assert @gilenson.configure!(:raw_output=>true)
|
350
380
|
end
|
351
|
-
|
352
|
-
|
353
|
-
|
354
|
-
|
355
|
-
|
356
|
-
|
357
|
-
|
358
|
-
# def test_symmetricity # http://pixel-apes.com/typografica/trako/12
|
359
|
-
# assert_equal "«Справка 09»", '"Справка 09"'.gilensize
|
360
|
-
# end
|
361
|
-
#
|
362
|
-
# def test_paths # http://pixel-apes.com/typografica/trako/13
|
363
|
-
# assert_equal '«c:\www\sites\»', '"c:\www\sites\"'.gilensize
|
364
|
-
# end
|
365
|
-
# end
|
381
|
+
|
382
|
+
def test_explicit_nobr
|
383
|
+
@gilenson.glyph[:nob_open] = '[NOB]'
|
384
|
+
@gilenson.glyph[:nob_close] = '[NOBC]'
|
385
|
+
assert_equal '[NOB]3–12–30[NOBC]', @gilenson.process('3-12-30')
|
386
|
+
end
|
387
|
+
end
|
data/test/t_integration.rb
CHANGED
@@ -1,6 +1,12 @@
|
|
1
1
|
$KCODE = 'u'
|
2
|
-
require 'test/unit'
|
3
2
|
require 'rubygems'
|
3
|
+
require 'test/unit'
|
4
|
+
|
5
|
+
begin
|
6
|
+
require 'multi_rails_init'
|
7
|
+
rescue LoadError
|
8
|
+
$stderr.puts "Please install multi_rails for regression testing!"
|
9
|
+
end
|
4
10
|
|
5
11
|
begin
|
6
12
|
require 'action_controller' unless defined?(ActionController)
|
@@ -85,41 +91,79 @@ class MarkdownIntegrationTest < Test::Unit::TestCase
|
|
85
91
|
end
|
86
92
|
end
|
87
93
|
|
88
|
-
TEST_DATE =
|
94
|
+
TEST_DATE = Date.parse("1983-10-15") # coincidentially...
|
89
95
|
TEST_TIME = Time.local(1983, 10, 15, 12, 15) # also coincidentially...
|
96
|
+
|
90
97
|
# Перегрузка helper'ов Rails
|
91
98
|
class RailsHelpersOverrideTest < Test::Unit::TestCase
|
92
|
-
|
99
|
+
# Вспомогательный класс для тестирования перегруженного DateHelper
|
100
|
+
class HelperStub
|
101
|
+
# для тестирования to_datetime_select_tag
|
102
|
+
def date_field; TEST_TIME; end
|
103
|
+
end
|
104
|
+
|
105
|
+
def setup
|
93
106
|
raise "You must have Rails to test ActionView integration" and return if $skip_rails
|
94
107
|
|
95
|
-
eval 'class HelperTester
|
96
|
-
include ActionView::Helpers::DateHelper
|
97
|
-
def get_distance
|
98
|
-
distance_of_time_in_words(Time.now - 20.minutes, Time.now)
|
99
|
-
end
|
100
|
-
|
101
|
-
def get_select_month
|
102
|
-
select_month(TEST_DATE)
|
103
|
-
end
|
104
|
-
|
105
|
-
def get_date_select
|
106
|
-
select_date(TEST_DATE)
|
107
|
-
end
|
108
|
-
|
109
|
-
def get_date_select_without_day
|
110
|
-
select_date(TEST_DATE, :order => [:month, :year])
|
111
|
-
end
|
112
|
-
|
113
|
-
end'
|
114
|
-
|
115
108
|
RuTils::overrides = true
|
116
|
-
|
117
|
-
|
118
|
-
|
119
|
-
|
120
|
-
|
109
|
+
# А никто и не говорил что класс должен быть один :-)
|
110
|
+
k = Class.new(HelperStub)
|
111
|
+
[ActionView::Helpers::TagHelper, ActionView::Helpers::DateHelper].each{|m| k.send(:include, m)}
|
112
|
+
@stub = k.new
|
113
|
+
end
|
114
|
+
|
115
|
+
def test_distance_of_time_in_words
|
116
|
+
assert_equal "20 минут", @stub.distance_of_time_in_words(Time.now - 20.minutes, Time.now)
|
117
|
+
end
|
118
|
+
|
119
|
+
# TODO - TextMate это не хайлайтит, и это _крайне_ достает
|
120
|
+
def test_select_month
|
121
|
+
assert_match /июль/, @stub.select_month(TEST_DATE),
|
122
|
+
"Месяц в выборе месяца должен быть указан в именительном падеже"
|
123
|
+
assert_match />7\<\/option\>/, @stub.select_month(TEST_DATE, :use_month_numbers => true),
|
124
|
+
"Хелпер select_month с номером месяца вместо названия месяца"
|
125
|
+
assert_match /10\ \-\ октябрь/, @stub.select_month(TEST_DATE, :add_month_numbers => true),
|
126
|
+
"Хелпер select_month с номером и названием месяца"
|
127
|
+
assert_match /\>июн\<\/option\>/, @stub.select_month(TEST_DATE, :use_short_month => true),
|
128
|
+
"Короткое имя месяца при использовании опции :use_short_month"
|
129
|
+
assert_match /name\=\"date\[foobar\]\"/, @stub.select_month(TEST_DATE, :field_name => "foobar"),
|
130
|
+
"Хелпер select_month должен принимать опцию :field_name"
|
131
|
+
assert_match /type\=\"hidden\".+value\=\"10\"/m, @stub.select_month(TEST_DATE, :use_hidden => true),
|
132
|
+
"Хелпер select_month должен принимать опцию :use_hidden"
|
133
|
+
end
|
134
|
+
|
135
|
+
def test_select_date
|
136
|
+
assert_match /date\_day.+date\_month.+date\_year/m, @stub.select_date(TEST_DATE),
|
137
|
+
"Хелпер select_date должен выводить поля в следующем порядке: день, месяц, год"
|
138
|
+
assert_match /декабря/, @stub.select_date(TEST_DATE),
|
139
|
+
"Имя месяца должно быть указано в родительном падеже"
|
140
|
+
assert_match /декабря/, @stub.select_date(TEST_DATE, :order => [:month, :year]),
|
121
141
|
"Хелпер select_date не позволяет опускать фрагменты, имя месяца должно быть указано в родительном падеже"
|
122
|
-
|
142
|
+
assert_match @stub.select_date, @stub.select_date(Time.now),
|
143
|
+
"Хелпер select_date без параметров работает с текущей датой"
|
144
|
+
end
|
145
|
+
|
146
|
+
def test_select_datetime
|
147
|
+
assert_match /date\_day.+date\_month.+date\_year/m, @stub.select_datetime(TEST_TIME),
|
148
|
+
"Хелпер select_datetime должен выводить поля в следующем порядке: день, месяц, год"
|
149
|
+
end
|
150
|
+
|
151
|
+
def test_html_options
|
152
|
+
if ActionView::Helpers::DateHelper::DATE_HELPERS_RECEIVE_HTML_OPTIONS
|
153
|
+
assert_match /id\=\"foobar\"/m, @stub.select_month(TEST_DATE, {}, :id => "foobar"),
|
154
|
+
"Хелпер select_month принимает html_options"
|
155
|
+
|
156
|
+
assert_match /id\=\"foobar\"/m, @stub.select_date(TEST_DATE, {}, :id => "foobar"),
|
157
|
+
"Хелпер select_date принимает html_options"
|
158
|
+
end
|
159
|
+
end
|
160
|
+
|
161
|
+
def test_instance_tag
|
162
|
+
@it = ActionView::Helpers::InstanceTag.new(:stub, :date_field, self).to_datetime_select_tag
|
163
|
+
assert_match /\>10\<.+\>октября\<.+\>1983\</m, @it,
|
164
|
+
"to_datetime_select_rag должен выводить поля в следующем порядке: день, месяц, год"
|
165
|
+
assert_match /июля/m, @it,
|
166
|
+
"to_datetime_select_tag выводит месяц в родительном падеже"
|
123
167
|
end
|
124
168
|
end
|
125
169
|
|
data/test/t_pluralize.rb
CHANGED
@@ -39,6 +39,8 @@ class PropisjuTestCase < Test::Unit::TestCase
|
|
39
39
|
assert_equal "триста сорок три рубля двадцать копеек", (343.20).rublej
|
40
40
|
assert_equal "сорок две копейки", (0.4187).rublej
|
41
41
|
assert_equal "триста тридцать два рубля", (331.995).rublej
|
42
|
+
assert_equal "один рубль", 1.rubl
|
43
|
+
assert_equal "три рубля четырнадцать копеек", (3.14).rublja
|
42
44
|
end
|
43
45
|
end
|
44
46
|
|
metadata
CHANGED
@@ -1,86 +1,102 @@
|
|
1
1
|
--- !ruby/object:Gem::Specification
|
2
|
-
rubygems_version: 0.9.2
|
3
|
-
specification_version: 1
|
4
2
|
name: rutils
|
5
3
|
version: !ruby/object:Gem::Version
|
6
|
-
version: 0.2.
|
7
|
-
date: 2007-09-27 00:00:00 +02:00
|
8
|
-
summary: Simple processing of russian strings
|
9
|
-
require_paths:
|
10
|
-
- lib
|
11
|
-
email: me@julik.nl
|
12
|
-
homepage: http://rubyforge.org/projects/rutils
|
13
|
-
rubyforge_project: rutils
|
14
|
-
description: Allows simple processing of russian strings - transliteration, numerals as text and HTML beautification
|
15
|
-
autorequire: rutils
|
16
|
-
default_executable:
|
17
|
-
bindir: bin
|
18
|
-
has_rdoc: true
|
19
|
-
required_ruby_version: !ruby/object:Gem::Version::Requirement
|
20
|
-
requirements:
|
21
|
-
- - ">"
|
22
|
-
- !ruby/object:Gem::Version
|
23
|
-
version: 0.0.0
|
24
|
-
version:
|
4
|
+
version: 0.2.4
|
25
5
|
platform: ruby
|
26
|
-
signing_key:
|
27
|
-
cert_chain:
|
28
|
-
post_install_message:
|
29
6
|
authors:
|
30
|
-
- Julian
|
7
|
+
- Julian 'Julik' Tarkhanov
|
8
|
+
- Danil Ivanov
|
9
|
+
- Yaroslav Markin
|
10
|
+
autorequire:
|
11
|
+
bindir: bin
|
12
|
+
cert_chain: []
|
13
|
+
|
14
|
+
date: 2008-07-10 00:00:00 +04:00
|
15
|
+
default_executable:
|
16
|
+
dependencies:
|
17
|
+
- !ruby/object:Gem::Dependency
|
18
|
+
name: hoe
|
19
|
+
type: :development
|
20
|
+
version_requirement:
|
21
|
+
version_requirements: !ruby/object:Gem::Requirement
|
22
|
+
requirements:
|
23
|
+
- - ">="
|
24
|
+
- !ruby/object:Gem::Version
|
25
|
+
version: 1.7.0
|
26
|
+
version:
|
27
|
+
description: Simple processing of russian strings
|
28
|
+
email:
|
29
|
+
- me@julik.nl
|
30
|
+
- yaroslav@markin.net
|
31
|
+
executables:
|
32
|
+
- gilensize
|
33
|
+
- rutilize
|
34
|
+
extensions: []
|
35
|
+
|
36
|
+
extra_rdoc_files:
|
37
|
+
- History.txt
|
38
|
+
- Manifest.txt
|
39
|
+
- README.txt
|
40
|
+
- TODO.txt
|
31
41
|
files:
|
42
|
+
- History.txt
|
43
|
+
- Manifest.txt
|
44
|
+
- README.txt
|
45
|
+
- Rakefile.rb
|
46
|
+
- TODO.txt
|
32
47
|
- bin/gilensize
|
33
48
|
- bin/rutilize
|
34
|
-
-
|
35
|
-
- test/t_datetime.rb
|
36
|
-
- test/t_gilenson.rb
|
37
|
-
- test/t_integration.rb
|
38
|
-
- test/t_pluralize.rb
|
39
|
-
- test/t_rutils_base.rb
|
40
|
-
- test/t_transliteration.rb
|
41
|
-
- test/t_typografica.rb
|
42
|
-
- lib/countries
|
49
|
+
- init.rb
|
43
50
|
- lib/countries/countries.rb
|
44
|
-
- lib/datetime
|
45
51
|
- lib/datetime/datetime.rb
|
46
|
-
- lib/gilenson
|
47
52
|
- lib/gilenson/gilenson.rb
|
48
|
-
- lib/gilenson/gilenson_port.rb
|
49
|
-
- lib/integration
|
50
53
|
- lib/integration/blue_cloth_override.rb
|
51
54
|
- lib/integration/integration.rb
|
52
55
|
- lib/integration/rails_date_helper_override.rb
|
53
56
|
- lib/integration/red_cloth_override.rb
|
54
|
-
- lib/pluralizer
|
55
57
|
- lib/pluralizer/pluralizer.rb
|
56
58
|
- lib/rutils.rb
|
57
|
-
- lib/transliteration
|
58
59
|
- lib/transliteration/bidi.rb
|
59
60
|
- lib/transliteration/simple.rb
|
60
61
|
- lib/transliteration/transliteration.rb
|
61
|
-
- CHANGELOG
|
62
|
-
- init.rb
|
63
|
-
- Rakefile.rb
|
64
|
-
- README
|
65
|
-
- TODO
|
66
|
-
test_files:
|
67
62
|
- test/run_tests.rb
|
63
|
+
- test/t_datetime.rb
|
64
|
+
- test/t_gilenson.rb
|
65
|
+
- test/t_integration.rb
|
66
|
+
- test/t_pluralize.rb
|
67
|
+
- test/t_rutils_base.rb
|
68
|
+
- test/t_transliteration.rb
|
69
|
+
has_rdoc: true
|
70
|
+
homepage: http://rutils.rubyforge.org
|
71
|
+
post_install_message:
|
68
72
|
rdoc_options:
|
69
|
-
- --main
|
70
|
-
-
|
71
|
-
|
72
|
-
-
|
73
|
-
|
74
|
-
|
75
|
-
-
|
76
|
-
-
|
77
|
-
|
78
|
-
|
79
|
-
|
80
|
-
|
81
|
-
|
82
|
-
|
73
|
+
- --main
|
74
|
+
- README.txt
|
75
|
+
require_paths:
|
76
|
+
- lib
|
77
|
+
required_ruby_version: !ruby/object:Gem::Requirement
|
78
|
+
requirements:
|
79
|
+
- - ">="
|
80
|
+
- !ruby/object:Gem::Version
|
81
|
+
version: "0"
|
82
|
+
version:
|
83
|
+
required_rubygems_version: !ruby/object:Gem::Requirement
|
84
|
+
requirements:
|
85
|
+
- - ">="
|
86
|
+
- !ruby/object:Gem::Version
|
87
|
+
version: "0"
|
88
|
+
version:
|
83
89
|
requirements: []
|
84
90
|
|
85
|
-
|
86
|
-
|
91
|
+
rubyforge_project: rutils
|
92
|
+
rubygems_version: 1.2.0
|
93
|
+
signing_key:
|
94
|
+
specification_version: 2
|
95
|
+
summary: Simple processing of russian strings
|
96
|
+
test_files:
|
97
|
+
- test/t_datetime.rb
|
98
|
+
- test/t_gilenson.rb
|
99
|
+
- test/t_integration.rb
|
100
|
+
- test/t_pluralize.rb
|
101
|
+
- test/t_rutils_base.rb
|
102
|
+
- test/t_transliteration.rb
|
data/README
DELETED
@@ -1,192 +0,0 @@
|
|
1
|
-
== Добро пожаловать в RuTils
|
2
|
-
|
3
|
-
RuTils - простой обработчик русского текста на Ruby. Основная цель RuTils - сделать
|
4
|
-
разработку русскоязычных приложений на Ruby (и Rails) максимально простой и приятной (в идеале - столь же
|
5
|
-
простой как и разработку оных на английском)
|
6
|
-
|
7
|
-
Весь функционал RuTils поддерживает только UTF-8 (настройка $KCODE / KanjiCode 'u'). Стандартно работа RuTils проверяется
|
8
|
-
как на стандартной версии Ruby, так и на парсере регулярных выражений Oniguruma (правда имейте в виду, что с ним
|
9
|
-
Gilenson работает медленнее).
|
10
|
-
|
11
|
-
Пожалуйста упоминайте версию при сообщении ошибок. Версию RUTILS всегда можно узнать в константе
|
12
|
-
|
13
|
-
RuTils::VERSION
|
14
|
-
|
15
|
-
Удостоверьтесь, что ваш скрипт правильно обрабатывает Unicode - то есть:
|
16
|
-
|
17
|
-
* Переменная $KCODE включена в режим 'u'
|
18
|
-
* Все строки которые вы собираетесь обрабатывать уже в кодировке UTF-8
|
19
|
-
|
20
|
-
Если вы используете RuTils для сайта под mod_ruby воспользуйтесь директивой RubyKanjiCode в своем httpd.conf.
|
21
|
-
|
22
|
-
Большое спасибо Роману Иванову aka Kukutz и Николаю Яремко aka Kuso Mendokuzee за реализацию большинства алгоритмов
|
23
|
-
на PHP.
|
24
|
-
|
25
|
-
Разработку RuTils ведут Julik[http://live.julik.nl] и Mash[http://imfo.ru]
|
26
|
-
|
27
|
-
== Cумма прописью и выбор числительного
|
28
|
-
|
29
|
-
RuTils реализует сумму прописью для целых и дробных чисел, с дополнительным учетом рода. Например:
|
30
|
-
|
31
|
-
4.propisju => "четыре"
|
32
|
-
345.propisju => "триста сорок пять"
|
33
|
-
231.propisju(2) => "двести тридцать одна"
|
34
|
-
341.propisju_items(1, "чемодан", "чемодана", "чемоданов") => "триста сорок один чемодан"
|
35
|
-
(212.40).propisju_items(2, "сволочь", "сволочи", "сволочей") => "двести двенадцать целых четыре десятых сволочи"
|
36
|
-
|
37
|
-
Также реализуется выбор варианта числительного в зависимости от числа
|
38
|
-
|
39
|
-
15.items("кодер", "кодера", "кодеров") => "кодеров"
|
40
|
-
|
41
|
-
и вывод "суммы прописью" для денежных сумм
|
42
|
-
|
43
|
-
(413.2).rublej => "четыреста тринадцать рублей двадцать копеек"
|
44
|
-
|
45
|
-
== Транслит
|
46
|
-
|
47
|
-
RuTils на данный момент реализует простейший транслит "в одну сторону" и "взаимно-однозначный транслит" (BiDi-транслит).
|
48
|
-
|
49
|
-
Простейший транслит "в одну сторону".
|
50
|
-
|
51
|
-
"Вот такое вот дело".translify => "Vot takoye vot delo"
|
52
|
-
"Несомненный прогресс по сравнению с PHP".dirify => "nesomnennyi-progress-po-sravneniu-s-php"
|
53
|
-
|
54
|
-
== BiDi-транслит
|
55
|
-
|
56
|
-
Порт BiDiTranslit[http://pixel-apes.com/translit/article#h256-10] от Pixel Apes.
|
57
|
-
Реализует транслитерацию "в обе стороны", предоставляя возможность получить валидный URL
|
58
|
-
из строки, содержащей русские и английские буквы. С некоторыми потерями (запятых и прочих
|
59
|
-
"слабозначащих" символов) возможно восстановление исходной строки.
|
60
|
-
|
61
|
-
Два режима работы:
|
62
|
-
|
63
|
-
* Уничтожение всех слешей, которые встретятся во входной строке. В этом случае методы вызываются с передачей в них false. Например, "Web/Скрипты".bidi_translify(false)
|
64
|
-
* Пропуск слэшей (используется по умолчанию). Например, "Web/+Skripty".bidi_detranslify
|
65
|
-
|
66
|
-
"WebРазработка/Скрипты".bidi_translify => "Web+Razrabotka+/+Skripty"
|
67
|
-
"+Ustanovka__+mod_perl".bidi_detranslify => "Установка mod_perl"
|
68
|
-
"WebРазработка/Мимо".bidi_translify(false) => "Web+RazrabotkaMimo"
|
69
|
-
"+PKHP+/Scripts".bidi_detranslify(false) => "ПХПScripts"
|
70
|
-
|
71
|
-
== Обработка русской типографики в HTML
|
72
|
-
|
73
|
-
Gilenson - порт Typografica[http://pixel-apes.com/typografica] от
|
74
|
-
Pixel Apes. Тыпографица - механизм автоматической расстановки подстановок в тексте
|
75
|
-
перед его выводом в HTML, оформляющий неразрывные пробелы, типографские кавычки
|
76
|
-
и тому подобные "украшательства".
|
77
|
-
|
78
|
-
Gilenson расставит в тексте "умные" правильные кавычки (русские - для кириллицы, английские - для латиницы),
|
79
|
-
заменит "хитрые" пунктуационные символы на entities и отформатирует знаки типа (c), (tm), телефоны и адреса.
|
80
|
-
|
81
|
-
%q{"И это называется языком?", -- таков был его вопрос}.gilensize =>
|
82
|
-
"«И это называется языком?», — таков был его вопрос"
|
83
|
-
|
84
|
-
Более подробная документация по Gilenson доступна в документах к RuTils::Gilenson::Formatter
|
85
|
-
|
86
|
-
В комплекте также есть скрипт gilensize, которым можно поточно обрабатывать Unicode-тексты в среде UNIX
|
87
|
-
пользуясь стандартным выводом
|
88
|
-
|
89
|
-
$ cat myfile.txt | gilensize > myfile.html
|
90
|
-
|
91
|
-
== Даты
|
92
|
-
|
93
|
-
В класс Date введены следующие константы:
|
94
|
-
* RU_MONTHNAMES (Январь Февраль Март...)
|
95
|
-
* RU_DAYNAMES (Воскресенье Понедельник...)
|
96
|
-
* RU_ABBR_MONTHNAMES (Янв Фев Мар...)
|
97
|
-
* RU_ABBR_DAYNAMES (Вск Пн Вт Ср...)
|
98
|
-
* RU_INFLECTED_MONTHNAMES (Января Февраля Марта...)
|
99
|
-
* RU_DAYNAMES_E (первое второе третье...)
|
100
|
-
|
101
|
-
Пример использования:
|
102
|
-
|
103
|
-
require 'date'
|
104
|
-
date = Date.new(2005, 11, 9)
|
105
|
-
puts "#{Date::RU_ABBR_MONTHNAMES[date.mon]}" => Ноя
|
106
|
-
puts "#{Date::RU_MONTHNAMES[date.mon]}" => Ноябрь
|
107
|
-
puts "#{Date::RU_ABBR_DAYNAMES[date.wday]}" => Ср
|
108
|
-
puts "#{Date::RU_DAYNAMES[date.wday]}" => Среда
|
109
|
-
|
110
|
-
При включенной перезагрузке функций (RuTils::overrides_enabled) осуществляется "покрытие" стандартной
|
111
|
-
функции Time#strftime ("родную" #strftime можно продолжать использовать через alias-метод #strftime_norutils):
|
112
|
-
|
113
|
-
Time.local(2005,"dec",31).strftime("%a, %A, %b, %B") => "Сб, Суббота, Дек, Декабрь"
|
114
|
-
Time.local(2005,"dec",31).strftime_norutils("%a, %A, %b, %B") => "Sat, Saturday, Dec, December"
|
115
|
-
|
116
|
-
== Интеграция с Rails, RedCloth и BlueCloth
|
117
|
-
|
118
|
-
RuTils в первую очередь задумывался как максимально "прозрачный" механизм обработки русского текста
|
119
|
-
в контексте Rails-приложения. В связи с этим RuTils "вторгается" в работу других Ruby-модулей
|
120
|
-
и изменяет механизм их работы.
|
121
|
-
|
122
|
-
Если вы используете RuTils в одном приложении с RedCloth или BlueCloth,
|
123
|
-
RuTils автоматически будет обрабатывать типографику во всех текстах, пропускаемых через них. Имейте в виду, что для
|
124
|
-
корректной работы этой функции RuTils надо загружать *после* модулей RedCloth и BlueCloth.
|
125
|
-
|
126
|
-
Помимо этого RuTils заставляет следующие функции Rails говорить по-русски:
|
127
|
-
|
128
|
-
* Меню выбора даты (+date_select+ и +datetime_select+) будут выводиться с русскими именами месяцев
|
129
|
-
* +distance_of_time_in_words+ будет выводить русские описания длительности ("более 2 часов")
|
130
|
-
|
131
|
-
Перегрузку всех функций других модулей можно включать и отключать в любое время
|
132
|
-
с помощью метода RuTils::overrides=. Когда перегрузка выключена, все сторонние библиотеки будут работать
|
133
|
-
в стандартном режиме (например, RedCloth будет расставлять английские типографские кавычки). Это нужно
|
134
|
-
когда вам нужно переключиться на английский (или любой другой язык) без перезапуска приложения.
|
135
|
-
|
136
|
-
Если вы хотите использовать rutils как дополнение к Rails в одном конкретном приложении, скопируйте
|
137
|
-
директорию rutils в папку vendor/plugins вашего приложения. Вы можете воспользоваться командой
|
138
|
-
rutilize чтобы сделать это автоматически. После этого вы сможете использовать RuTils без
|
139
|
-
необходимости установки gem'а на вашем сервере (не забудьте перезапустить приложение чтобы вгрузить в него RuTils).
|
140
|
-
|
141
|
-
$ rutilize /Sites/my_app1 /Sites/my_app2 /Sites/my_another_app
|
142
|
-
|
143
|
-
Вы можете свободно распространять RuTils со своим Rails-приложением при условии сохранения структуры
|
144
|
-
и файла README.
|
145
|
-
|
146
|
-
== Требования
|
147
|
-
|
148
|
-
* Ruby 1.8.2, немного прямых рук.
|
149
|
-
* Rake[http://rake.rubyforge.org], Rails[http://rubyonrails.org], RedCloth[http://www.whytheluckystiff.net/ruby/redcloth/] и BlueCloth[http://www.deveiate.org/projects/BlueCloth] для выполнения тестов
|
150
|
-
|
151
|
-
== Как использовать
|
152
|
-
|
153
|
-
Просто включите rutils в свою программу как gem
|
154
|
-
|
155
|
-
require_gem 'rutils'
|
156
|
-
|
157
|
-
или как библиотеку
|
158
|
-
|
159
|
-
require 'rutils'
|
160
|
-
|
161
|
-
== Где получить помощь
|
162
|
-
|
163
|
-
На странице проекта на RubyForge[http://rubyforge.org/projects/rutils]
|
164
|
-
|
165
|
-
== Работает ли это с текстом в кодировке Windows-1251
|
166
|
-
|
167
|
-
Нет и никогда не будет.
|
168
|
-
|
169
|
-
== Реальные проекты
|
170
|
-
|
171
|
-
В настоящее время RuTils используется на следующих сайтах:
|
172
|
-
|
173
|
-
* http://artonica.ru
|
174
|
-
* http://radar.cinemac.ru
|
175
|
-
|
176
|
-
Если вы используете RuTils в своей работе пожалуйста сообщайте нам об этом чтобы мы могли включить ваши приложения и сайты в список.
|
177
|
-
|
178
|
-
== Как ускорить реализацию новых функций
|
179
|
-
|
180
|
-
Воспользуйтесь трекером на RubyForge. Опишите нужный вам функционал и приложите (по возможности) тесты, которым этот функционал должен удовлетворять. Схему организации тестов вы можете скопировать из собственных тестов RuTils.
|
181
|
-
|
182
|
-
Если вы пишете исходный код, который войдет в RuTils или в тестовые наборы, пожалуйста следуйте следующим правилам оформления кода:
|
183
|
-
|
184
|
-
* Unix line breaks (LF)
|
185
|
-
* Кодировка файлов - строго UTF-8 без BOM (Byte Order Mark)
|
186
|
-
* Отступы в 2 пробела, без табуляций.
|
187
|
-
* Однострочные блоки с фигурными скобками, многострочные - с +do ... end+
|
188
|
-
* Все другие конвенции нормального написания Ruby-кода (http://www.rubygarden.org/ruby/ruby?RubyStyleGuide)
|
189
|
-
|
190
|
-
Мы используем пробелы поскольку табулятор означает автозаполнение в IRB (Interactive Ruby Shell)
|
191
|
-
|
192
|
-
Если вы хотите участвовать в разработке RuTils пользуйтесь CVS проекта.
|