rutils 0.0.3
Sign up to get free protection for your applications and to get access to all the features.
- data/CHANGELOG +5 -0
- data/README +104 -0
- data/TODO +26 -0
- data/bin/gilensize +8 -0
- data/lib/datetime/datetime.rb +61 -0
- data/lib/gilenson/gilenson.rb +280 -0
- data/lib/gilenson/gilenson_port.rb +332 -0
- data/lib/integration/blue_cloth_override.rb +8 -0
- data/lib/integration/integration.rb +24 -0
- data/lib/integration/rails_date_helper_override.rb +66 -0
- data/lib/integration/red_cloth_override.rb +17 -0
- data/lib/pluralizer/pluralizer.rb +208 -0
- data/lib/rutils.rb +14 -0
- data/lib/transliteration/transliteration.rb +173 -0
- data/test/run_tests.rb +4 -0
- data/test/t_datetime.rb +10 -0
- data/test/t_gilenson.rb +42 -0
- data/test/t_integration.rb +43 -0
- data/test/t_pluralize.rb +60 -0
- data/test/t_transliteration.rb +25 -0
- data/test/t_typografica.rb +57 -0
- metadata +73 -0
@@ -0,0 +1,173 @@
|
|
1
|
+
module RuTils
|
2
|
+
module Transliteration #:nodoc:
|
3
|
+
end
|
4
|
+
end
|
5
|
+
|
6
|
+
# Реулизует простейшую транслитерацию
|
7
|
+
# "вот мы и здесь".translify => "vot my i zdes"
|
8
|
+
# "vot my i zdes".detranslify => "вот мы и здесь"
|
9
|
+
module RuTils::Transliteration::Simple
|
10
|
+
TABLE = {
|
11
|
+
"Ґ"=>"G","Ё"=>"YO","Є"=>"E","Ї"=>"YI","І"=>"I",
|
12
|
+
"і"=>"i","ґ"=>"g","ё"=>"yo","№"=>"#","є"=>"e",
|
13
|
+
"ї"=>"yi","А"=>"A","Б"=>"B","В"=>"V","Г"=>"G",
|
14
|
+
"Д"=>"D","Е"=>"E","Ж"=>"ZH","З"=>"Z","И"=>"I",
|
15
|
+
"Й"=>"Y","К"=>"K","Л"=>"L","М"=>"M","Н"=>"N",
|
16
|
+
"О"=>"O","П"=>"P","Р"=>"R","С"=>"S","Т"=>"T",
|
17
|
+
"У"=>"U","Ф"=>"F","Х"=>"H","Ц"=>"TS","Ч"=>"CH",
|
18
|
+
"Ш"=>"SH","Щ"=>"SCH","Ъ"=>"'","Ы"=>"YI","Ь"=>"",
|
19
|
+
"Э"=>"E","Ю"=>"YU","Я"=>"YA","а"=>"a","б"=>"b",
|
20
|
+
"в"=>"v","г"=>"g","д"=>"d","е"=>"e","ж"=>"zh",
|
21
|
+
"з"=>"z","и"=>"i","й"=>"y","к"=>"k","л"=>"l",
|
22
|
+
"м"=>"m","н"=>"n","о"=>"o","п"=>"p","р"=>"r",
|
23
|
+
"с"=>"s","т"=>"t","у"=>"u","ф"=>"f","х"=>"h",
|
24
|
+
"ц"=>"ts","ч"=>"ch","ш"=>"sh","щ"=>"sch","ъ"=>"'",
|
25
|
+
"ы"=>"yi","ь"=>"","э"=>"e","ю"=>"yu","я"=>"ya"
|
26
|
+
}.sort do | one, two|
|
27
|
+
two[1].size <=> one[1].size
|
28
|
+
end
|
29
|
+
|
30
|
+
# Заменяет кириллицу в строке на латиницу
|
31
|
+
def self.translify(str)
|
32
|
+
s = str.clone
|
33
|
+
TABLE.each do | translation |
|
34
|
+
s = s.gsub(/#{translation[0]}/, translation[1])
|
35
|
+
end
|
36
|
+
s
|
37
|
+
end
|
38
|
+
|
39
|
+
# Заменяет латиницу на кириллицу
|
40
|
+
def self.detranslify(str)
|
41
|
+
s = str.clone
|
42
|
+
TABLE.each do | translation |
|
43
|
+
s.gsub!(/#{translation[1]}/, translation[0])
|
44
|
+
end
|
45
|
+
s
|
46
|
+
end
|
47
|
+
|
48
|
+
# Транслитерирует строку, делая ее пригодной для применения как имя директории или URL
|
49
|
+
def self.dirify(string)
|
50
|
+
st = self.translify(string)
|
51
|
+
st.gsub!(/(\s\&\s)|(\s\&\;\s)/, ' and ') # convert & to "and"
|
52
|
+
st.gsub!(/\W/, ' ') #replace non-chars
|
53
|
+
st.gsub!(/(_)$/, '') #trailing underscores
|
54
|
+
st.gsub!(/^(_)/, '') #leading unders
|
55
|
+
st.strip.translify.gsub(/(\s)/,'-').downcase.squeeze
|
56
|
+
end
|
57
|
+
end
|
58
|
+
|
59
|
+
# Реулизует транслитерацию "в обе стороны", дающую возможность автоматически использовать URL как ключ записи
|
60
|
+
module RuTils::Transliteration::BiDi
|
61
|
+
TABLE_TO = {
|
62
|
+
"А"=>"A","Б"=>"B","В"=>"V","Г"=>"G","Д"=>"D",
|
63
|
+
"Е"=>"E","Ё"=>"JO","Ж"=>"ZH","З"=>"Z","И"=>"I",
|
64
|
+
"Й"=>"JJ","К"=>"K","Л"=>"L","М"=>"M","Н"=>"N",
|
65
|
+
"О"=>"O","П"=>"P","Р"=>"R","С"=>"S","Т"=>"T",
|
66
|
+
"У"=>"U","Ф"=>"F","Х"=>"KH","Ц"=>"C","Ч"=>"CH",
|
67
|
+
"Ш"=>"SH","Щ"=>"SHH","Ъ"=>"_~","Ы"=>"Y","Ь"=>"_'",
|
68
|
+
"Э"=>"EH","Ю"=>"JU","Я"=>"JA","а"=>"a","б"=>"b",
|
69
|
+
"в"=>"v","г"=>"g","д"=>"d","е"=>"e","ё"=>"jo",
|
70
|
+
"ж"=>"zh","з"=>"z","и"=>"i","й"=>"jj","к"=>"k",
|
71
|
+
"л"=>"l","м"=>"m","н"=>"n","о"=>"o","п"=>"p",
|
72
|
+
"р"=>"r","с"=>"s","т"=>"t","у"=>"u","ф"=>"f",
|
73
|
+
"х"=>"kh","ц"=>"c","ч"=>"ch","ш"=>"sh","щ"=>"shh",
|
74
|
+
"ъ"=>"~","ы"=>"y","ь"=>"'","э"=>"eh","ю"=>"ju",
|
75
|
+
"я"=>"ja"," "=>"__","_"=>"__"
|
76
|
+
}.sort do |one, two|
|
77
|
+
two[1].jsize <=> one[1].jsize
|
78
|
+
end
|
79
|
+
|
80
|
+
#
|
81
|
+
# TABLE_FROM = TABLE_TO.clone.reject{|i| i[0] == '_' } или какньть еще - покрасившее
|
82
|
+
#
|
83
|
+
TABLE_FROM = TABLE_TO.clone
|
84
|
+
TABLE_FROM.slice!(6) # remove "_"=>"__" from "Hash"
|
85
|
+
|
86
|
+
def self.translify(str, allow_slashes = true)
|
87
|
+
slash = allow_slashes ? '/' : '';
|
88
|
+
|
89
|
+
s = str.clone.gsub(/[^\- _0-9a-zA-ZА-ёЁ#{slash}]/, '')
|
90
|
+
lang_fr = s.scan(/[А-ёЁ ]+/)
|
91
|
+
lang_fr.each do |fr|
|
92
|
+
TABLE_TO.each do | translation |
|
93
|
+
fr.gsub!(/#{translation[0]}/, translation[1])
|
94
|
+
end
|
95
|
+
end
|
96
|
+
|
97
|
+
lang_sr = s.scan(/[0-9A-Za-z\_\-\.\/\']+/)
|
98
|
+
|
99
|
+
string = ""
|
100
|
+
if s =~ /\A[А-ёЁ ]/
|
101
|
+
lang_fr, lang_sr = lang_sr, lang_fr
|
102
|
+
string = "+"
|
103
|
+
end
|
104
|
+
|
105
|
+
0.upto([lang_fr.length, lang_sr.length].min-1) do |x|
|
106
|
+
string += lang_sr[x] + "+" + lang_fr[x] + "+";
|
107
|
+
end
|
108
|
+
|
109
|
+
if (lang_fr.length < lang_sr.length)
|
110
|
+
string += lang_sr[lang_sr.length-1]
|
111
|
+
else
|
112
|
+
string[0, string.length-1]
|
113
|
+
end
|
114
|
+
end
|
115
|
+
|
116
|
+
def self.detranslify(str, allow_slashes = true)
|
117
|
+
slash = allow_slashes ? '/' : '';
|
118
|
+
|
119
|
+
str.split('/').inject("") do | out, pg|
|
120
|
+
strings = pg.split('+')
|
121
|
+
1.step(strings.length-1, 2) do |x|
|
122
|
+
TABLE_FROM.each do | translation |
|
123
|
+
strings[x].gsub!(/#{translation[1]}/, translation[0])
|
124
|
+
end
|
125
|
+
end
|
126
|
+
out << slash << strings.to_s
|
127
|
+
end
|
128
|
+
out[slash.length, out.length-1]
|
129
|
+
end
|
130
|
+
end
|
131
|
+
|
132
|
+
# Реализует транслитерацию любого объекта, реализующего String или to_s
|
133
|
+
module RuTils::Transliteration::StringFormatting
|
134
|
+
|
135
|
+
#Транслитерирует строку в латиницу, и возвращает измененную строку
|
136
|
+
def translify
|
137
|
+
RuTils::Transliteration::Simple::translify(self.to_s)
|
138
|
+
end
|
139
|
+
|
140
|
+
#Транслитерирует строку, меняя объект
|
141
|
+
def translify!
|
142
|
+
self.replace(self.translify)
|
143
|
+
end
|
144
|
+
|
145
|
+
# Транслитерирует строку, делая ее пригодной для применения как имя директории или URL
|
146
|
+
def dirify
|
147
|
+
RuTils::Transliteration::Simple::dirify(self.to_s)
|
148
|
+
end
|
149
|
+
|
150
|
+
# Транслитерирует строку (взаимно-однозначный транслит), и возвращает измененную строку
|
151
|
+
def bidi_translify(allow_slashes = true)
|
152
|
+
RuTils::Transliteration::BiDi::translify(self.to_s, allow_slashes)
|
153
|
+
end
|
154
|
+
|
155
|
+
# Транслитерирует строку (взаимно-однозначный транслит), меняя объект
|
156
|
+
def bidi_translify!(allow_slashes = true)
|
157
|
+
self.replace(RuTils::Transliteration::BiDi::translify(self.to_s, allow_slashes))
|
158
|
+
end
|
159
|
+
|
160
|
+
# Заменяет латиницу на кириллицу (взаимно-однозначный транслит), меняя объект
|
161
|
+
def bidi_detranslify!(allow_slashes = true)
|
162
|
+
self.replace(RuTils::Transliteration::BiDi::detranslify(self.to_s, allow_slashes))
|
163
|
+
end
|
164
|
+
|
165
|
+
# Заменяет латиницу на кириллицу (взаимно-однозначный транслит), и возвращает измененную строку
|
166
|
+
def bidi_detranslify(allow_slashes = true)
|
167
|
+
RuTils::Transliteration::BiDi::detranslify(self.to_s, allow_slashes = true)
|
168
|
+
end
|
169
|
+
end
|
170
|
+
|
171
|
+
class String
|
172
|
+
include RuTils::Transliteration::StringFormatting
|
173
|
+
end
|
data/test/run_tests.rb
ADDED
data/test/t_datetime.rb
ADDED
@@ -0,0 +1,10 @@
|
|
1
|
+
$KCODE = 'u'
|
2
|
+
require 'test/unit'
|
3
|
+
require File.dirname(__FILE__) + '/../lib/rutils'
|
4
|
+
|
5
|
+
class DistanceOfTimeTest < Test::Unit::TestCase
|
6
|
+
def test_distance_of_time_in_words
|
7
|
+
assert_equal "меньше минуты", RuTils::DateTime::distance_of_time_in_words(0, 50)
|
8
|
+
assert_equal "две минуты", RuTils::DateTime::distance_of_time_in_words(0, 140)
|
9
|
+
end
|
10
|
+
end
|
data/test/t_gilenson.rb
ADDED
@@ -0,0 +1,42 @@
|
|
1
|
+
$KCODE = 'u'
|
2
|
+
require 'test/unit'
|
3
|
+
require File.dirname(__FILE__) + '/../lib/rutils'
|
4
|
+
|
5
|
+
|
6
|
+
# Cюда идут наши тесты типографа. Мы содержим их отдельно поскольку набор тестов Типографицы нами не контролируется.
|
7
|
+
# Когда у рутилей появятся собственные баги под каждый баг следует завести тест
|
8
|
+
class GilensonOwnTest < Test::Unit::TestCase
|
9
|
+
|
10
|
+
# Проверка изъятия тагов и помещения их На Место©
|
11
|
+
# характерно что пока мы не рефакторнули все как следует можно проверять
|
12
|
+
# только конечный результат трансформации - что глючно до безобразия
|
13
|
+
def test_tag_lift
|
14
|
+
assert_equal "Вот такие<tag some='foo>' /> <tagmore></tagmore> дела", "Вот такие<tag some='foo>' /> <tagmore></tagmore> дела".gilensize
|
15
|
+
end
|
16
|
+
|
17
|
+
def test_byte_pass
|
18
|
+
assert_equal '<p>Теперь добираться до офиса Студии автортранспортом стало удобнее. ' +
|
19
|
+
'Для этого мы разместили в разделе <a href="#">«Контакт»</a> окно вебкамеры, ' +
|
20
|
+
'которая непрерывно транслирует дорожную обстановку на Садовом кольце по адресу Земляной Вал, 23. <br>' +
|
21
|
+
'Удачной дороги! </p>',
|
22
|
+
'<p>Теперь добираться до офиса Студии автортранспортом стало удобнее. ' +
|
23
|
+
'Для этого мы разместили в разделе <a href="#">«Контакт»</a> окно вебкамеры, ' +
|
24
|
+
'которая непрерывно транслирует дорожную обстановку на Садовом кольце по адресу Земляной Вал, 23. <br>' +
|
25
|
+
'Удачной дороги! </p>'.gilensize
|
26
|
+
end
|
27
|
+
|
28
|
+
end
|
29
|
+
|
30
|
+
# class TypograficaTrakoEntries < Test::Unit::TestCase
|
31
|
+
# def test_cpp
|
32
|
+
# assert_equal "C++-API", "C++-API".gilensize
|
33
|
+
# end
|
34
|
+
#
|
35
|
+
# def test_symmetricity # http://pixel-apes.com/typografica/trako/12
|
36
|
+
# assert_equal "«Справка 09»", '"Справка 09"'.gilensize
|
37
|
+
# end
|
38
|
+
#
|
39
|
+
# def test_paths # http://pixel-apes.com/typografica/trako/13
|
40
|
+
# assert_equal "«c:\www\sites\»", '"c:\www\sites\"'.gilensize
|
41
|
+
# end
|
42
|
+
# end
|
@@ -0,0 +1,43 @@
|
|
1
|
+
$KCODE = 'u'
|
2
|
+
require 'test/unit'
|
3
|
+
require 'rubygems'
|
4
|
+
|
5
|
+
require_gem 'RedCloth'
|
6
|
+
require_gem 'BlueCloth'
|
7
|
+
|
8
|
+
|
9
|
+
require File.dirname(__FILE__) + '/../lib/rutils'
|
10
|
+
|
11
|
+
# Весь integration надо грузить после патчимых пакетов
|
12
|
+
load File.dirname(__FILE__) + '/../lib/integration/integration.rb'
|
13
|
+
|
14
|
+
class IntegrationTest < Test::Unit::TestCase
|
15
|
+
def setup
|
16
|
+
RuTils::overrides = true
|
17
|
+
end
|
18
|
+
|
19
|
+
def test_integration_flag
|
20
|
+
RuTils::overrides = false
|
21
|
+
assert !RuTils::overrides_enabled?
|
22
|
+
RuTils::overrides = true
|
23
|
+
assert RuTils::overrides_enabled?
|
24
|
+
end
|
25
|
+
end
|
26
|
+
|
27
|
+
# Интеграция с RedCloth - Textile.
|
28
|
+
# Нужно иметь в виду что Textile осуществляет свою обработку типографики, которую мы подменяем!
|
29
|
+
class TextileIntegrationTest < IntegrationTest
|
30
|
+
def test_integration_textile
|
31
|
+
assert_equal "<p>И вот «они пошли туда», и шли шли шли</p>",
|
32
|
+
RedCloth.new('И вот "они пошли туда", и шли шли шли').to_html
|
33
|
+
end
|
34
|
+
end
|
35
|
+
|
36
|
+
# Интеграция с BlueCloth - Markdown
|
37
|
+
# Сам Markdown никакой обработки типографики не производит (это делает RubyPants, но вряд ли его кто-то юзает на практике)
|
38
|
+
class MarkdownIntegrationTest < IntegrationTest
|
39
|
+
def test_integration_markdown
|
40
|
+
assert_equal "<p>И вот «они пошли туда», и шли шли шли</p>",
|
41
|
+
BlueCloth.new('И вот "они пошли туда", и шли шли шли').to_html
|
42
|
+
end
|
43
|
+
end
|
data/test/t_pluralize.rb
ADDED
@@ -0,0 +1,60 @@
|
|
1
|
+
$KCODE = 'u'
|
2
|
+
require 'test/unit'
|
3
|
+
require File.dirname(__FILE__) + '/../lib/rutils'
|
4
|
+
|
5
|
+
|
6
|
+
class PropisjuTestCase < Test::Unit::TestCase
|
7
|
+
def test_ints
|
8
|
+
assert_equal "пятьсот двадцать три", 523.propisju
|
9
|
+
assert_equal "шесть тысяч семьсот двадцать семь", 6727.propisju
|
10
|
+
assert_equal "восемь миллионов шестьсот пятьдесят два", 8000652.propisju
|
11
|
+
assert_equal "восемь миллионов шестьсот пятьдесят две", 8000652.propisju(2)
|
12
|
+
assert_equal "восемь миллионов шестьсот пятьдесят два", 8000652.propisju(3)
|
13
|
+
assert_equal "сорок пять", 45.propisju
|
14
|
+
assert_equal "пять", 5.propisju
|
15
|
+
assert_equal "шестьсот двенадцать", 612.propisju
|
16
|
+
assert_equal "двадцать пять колес", 25.propisju_items(3, "колесо", "колеса", "колес")
|
17
|
+
assert_equal "двадцать одна подстава", 21.propisju_items(2, "подстава", "подставы", "подстав")
|
18
|
+
end
|
19
|
+
|
20
|
+
def test_floats
|
21
|
+
assert_equal "шесть целых пять десятых", (6.50).propisju
|
22
|
+
assert_equal "триста сорок одна целая девять десятых", (341.9).propisju
|
23
|
+
assert_equal "триста сорок одна целая двести сорок пять тысячных", (341.245).propisju
|
24
|
+
assert_equal "двести три целых сорок одна сотая", (203.41).propisju
|
25
|
+
assert_equal "четыреста сорок две целых пять десятых", (442.50000).propisju
|
26
|
+
end
|
27
|
+
|
28
|
+
def test_items
|
29
|
+
assert_equal "чемодана", 523.items("чемодан", "чемодана", "чемоданов")
|
30
|
+
assert_equal "партий", 6727.items("партия", "партии", "партий")
|
31
|
+
assert_equal "козлов", 45.items("козел", "козла", "козлов")
|
32
|
+
assert_equal "колес", 260.items("колесо", "колеса", "колес")
|
33
|
+
end
|
34
|
+
end
|
35
|
+
|
36
|
+
#class PluralizeTestCase < Test::Unit::TestCase
|
37
|
+
#
|
38
|
+
# def test_males
|
39
|
+
# assert_equal "гада", "гад".ru_pluralize(3)
|
40
|
+
# assert_equal "враг", "враг".ru_pluralize(1)
|
41
|
+
# assert_equal "сцепа", "сцеп".ru_pluralize(2)
|
42
|
+
# assert_equal "огня", "огонь".ru_pluralize(2)
|
43
|
+
# assert_equal "огней", "огонь".ru_pluralize(6)
|
44
|
+
# end
|
45
|
+
#
|
46
|
+
# def test_females
|
47
|
+
# assert_equal "сволочей", "сволочь".ru_pluralize(6)
|
48
|
+
# assert_equal "весны", "весна".ru_pluralize(3)
|
49
|
+
# assert_equal "чета", "четы".ru_pluralize(2)
|
50
|
+
# assert_equal "чета", "чет".ru_pluralize(5)
|
51
|
+
# assert_equal "вони", "вонь".ru_pluralize(3)
|
52
|
+
# assert_equal "воней", "вонь".ru_pluralize(6)
|
53
|
+
# end
|
54
|
+
#
|
55
|
+
# def test_middles
|
56
|
+
# assert_equal "окна", "окно".ru_pluralize(2)
|
57
|
+
# assert_equal "колес", "колесо".ru_pluralize(15)
|
58
|
+
# assert_equal "насилий", "насилие".ru_pluralize(5)
|
59
|
+
# end
|
60
|
+
#end
|
@@ -0,0 +1,25 @@
|
|
1
|
+
$KCODE = 'u'
|
2
|
+
require 'test/unit'
|
3
|
+
require File.dirname(__FILE__) + '/../lib/rutils'
|
4
|
+
|
5
|
+
|
6
|
+
class TranslitTest < Test::Unit::TestCase
|
7
|
+
|
8
|
+
def setup
|
9
|
+
@string = "Это кусок строки русских букв v peremshku s latinizey i амперсандом (pozor!) & something"
|
10
|
+
end
|
11
|
+
|
12
|
+
def test_translify
|
13
|
+
assert_equal "sch", 'щ'.translify
|
14
|
+
assert_equal "upuschenie", 'упущение'.translify
|
15
|
+
assert_equal "sh", 'ш'.translify
|
16
|
+
assert_equal "ts", 'ц'.translify
|
17
|
+
assert_equal "Eto kusok stroki russkih bukv v peremshku s latinizey i ampersandom (pozor!) & something", @string.translify
|
18
|
+
assert_equal "Это просто некий текст".translify, "Eto prosto nekiy tekst"
|
19
|
+
end
|
20
|
+
|
21
|
+
def test_dirify
|
22
|
+
assert_equal "eto-kusok-stroki-ruskih-bukv-v-peremshku-s-latinizey-i-ampersandom-pozor-and-something", @string.dirify
|
23
|
+
assert_equal "esche-ruskiy-tekst", "Еще РусСКий теКст".dirify
|
24
|
+
end
|
25
|
+
end
|
@@ -0,0 +1,57 @@
|
|
1
|
+
$KCODE = 'u'
|
2
|
+
require 'test/unit'
|
3
|
+
require File.dirname(__FILE__) + '/../lib/rutils'
|
4
|
+
|
5
|
+
# Тесты Гиленсона - обычный набор тестов к Тыпографице с сайта pixel-apes. Все "наши" тесты Гиленсона идут в другой test case!
|
6
|
+
class TypograficaComplianceTest < Test::Unit::TestCase
|
7
|
+
|
8
|
+
def test_phones
|
9
|
+
assert_equal '<nobr>3–12–30</nobr>', '3-12-30'.gilensize
|
10
|
+
assert_equal '<nobr>12–34–56</nobr>', '12-34-56'.gilensize
|
11
|
+
assert_equal '<nobr>88–25–04</nobr>', '88-25-04'.gilensize
|
12
|
+
assert_equal '+7 <nobr>(99284) 65–818</nobr>', '+7 (99284) 65-818'.gilensize
|
13
|
+
assert_equal '<nobr>725–01–10</nobr>', '725-01-10'.gilensize
|
14
|
+
end
|
15
|
+
|
16
|
+
def test_address
|
17
|
+
assert_equal 'табл. 2, рис. 2.10', 'табл. 2, рис. 2.10'.gilensize
|
18
|
+
assert_equal 'офис 415, оф.340, д.5, ул. Народной Воли, пл. Малышева', 'офис 415, оф.340, д.5, ул. Народной Воли, пл. Малышева'.gilensize
|
19
|
+
end
|
20
|
+
|
21
|
+
def test_specials
|
22
|
+
assert_equal '© 2002, © 2003, © 2004, © 2005 — тоже без пробелов: ©2002, ©Кукуц. однако: варианты (а) и (с)', '(с) 2002, (С) 2003, (c) 2004, (C) 2005 -- тоже без пробелов: (с)2002, (c)Кукуц. однако: варианты (а) и (с)'.gilensize
|
23
|
+
assert_equal '+5°С, +7°C, –5°F', '+5^С, +17^C, -275^F'.gilensize
|
24
|
+
assert_equal 'об этом подробнее — читай §25', 'об этом подробнее -- читай (p)25'.gilensize
|
25
|
+
assert_equal 'один же минус – краткое тире', 'один же минус - краткое тире'.gilensize
|
26
|
+
assert_equal 'Sharpdesign™, Microsoft<sup>®</sup>', 'Sharpdesign(tm), Microsoft(r)'.gilensize
|
27
|
+
end
|
28
|
+
|
29
|
+
def test_breaking
|
30
|
+
assert_equal 'скажи, мне, ведь не даром! Москва, клеймённая пожаром. Французу отдана', 'скажи ,мне, ведь не даром !Москва, клеймённая пожаром .Французу отдана'.gilensize
|
31
|
+
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
|
32
|
+
assert_equal 'при установке командой строки в ?page=help <nobr>бла-бла-бла-бла</nobr>', 'при установке командой строки в ?page=help бла-бла-бла-бла'.gilensize
|
33
|
+
assert_equal 'как интересно будет переноситься со строки на строку <nobr>что-то</nobr> разделённое дефисом, ведь дефис тот тоже ведь из наших. <nobr>Какие-то</nobr> браузеры думают, что следует переносить и его...', 'как интересно будет переноситься со строки на строку что-то разделённое дефисом, ведь дефис тот тоже ведь из наших. Какие-то браузеры думают, что следует переносить и его...'.gilensize
|
34
|
+
end
|
35
|
+
|
36
|
+
def test_quotes
|
37
|
+
assert_equal 'english “quotes” should be quite like this', 'english "quotes" should be quite like this'.gilensize
|
38
|
+
assert_equal 'русские же «оформляются» подобным образом', 'русские же "оформляются" подобным образом'.gilensize
|
39
|
+
assert_equal 'кавычки «расставлены» “in a chaotic order”', 'кавычки "расставлены" "in a chaotic order"'.gilensize
|
40
|
+
assert_equal 'диагональ моего монитора — 17", а размер пениса — 1,5"', 'диагональ моего монитора -- 17", а размер пениса -- 1,5"'.gilensize
|
41
|
+
assert_equal 'в толщину, «вложенные “quotes” вот так», “or it «будет вложено» elsewhere”', 'в толщину, "вложенные "quotes" вот так", "or it "будет вложено" elsewhere"'.gilensize
|
42
|
+
assert_equal '“complicated «кавычки», «странные “includements” кавычек»', '"complicated "кавычки", "странные "includements" кавычек"'.gilensize
|
43
|
+
assert_equal '“double “quotes”', '"double "quotes"'.gilensize
|
44
|
+
assert_equal '«дважды вложенные «кавычки»', '"дважды вложенные "кавычки"'.gilensize
|
45
|
+
assert_equal '«01/02/03», дискеты в 5.25"', '"01/02/03", дискеты в 5.25"'.gilensize
|
46
|
+
assert_equal 'после троеточия правая кавычка — «Вот...»', 'после троеточия правая кавычка -- "Вот..."'.gilensize
|
47
|
+
assert_equal 'setlocale(LC_ALL, “ru_RU.UTF8”);', 'setlocale(LC_ALL, "ru_RU.UTF8");'.gilensize
|
48
|
+
assert_equal '“read, write, delete” с флагом “only_mine”', '"read, write, delete" с флагом "only_mine"'.gilensize
|
49
|
+
assert_equal '«Двоеточие:», «такую умную тему должен писать чувак умеющий скрипты скриптить.»', '"Двоеточие:", "такую умную тему должен писать чувак умеющий скрипты скриптить."'.gilensize
|
50
|
+
assert_equal '(«Вики != HTML» — «Вики != HTML» — («всякая чушь»))', '("Вики != HTML" -- "Вики != HTML" -- ("всякая чушь"))'.gilensize
|
51
|
+
assert_equal '«фигня123», “fignya123”', '"фигня123", "fignya123"'.gilensize
|
52
|
+
# assert_equal '«сбалансированные «кавычки<!--notypo--><!--/notypo--> (четыре в конце) — связано с синтаксисом ваки', '"сбалансированные "кавычки"""" (четыре в конце) -- связано с синтаксисом ваки'.gilensize
|
53
|
+
assert_equal '«несбалансированные «кавычки""" (три в конце) — связано с синтаксисом ваки', '"несбалансированные "кавычки""" (три в конце) -- связано с синтаксисом ваки'.gilensize
|
54
|
+
assert_equal '«разноязыкие quotes»', '"разноязыкие quotes"'.gilensize
|
55
|
+
assert_equal '«multilanguage кавычки»', '"multilanguage кавычки"'.gilensize
|
56
|
+
end
|
57
|
+
end
|
metadata
ADDED
@@ -0,0 +1,73 @@
|
|
1
|
+
--- !ruby/object:Gem::Specification
|
2
|
+
rubygems_version: 0.8.11
|
3
|
+
specification_version: 1
|
4
|
+
name: rutils
|
5
|
+
version: !ruby/object:Gem::Version
|
6
|
+
version: 0.0.3
|
7
|
+
date: 2005-10-19 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
|
15
|
+
and HTML beautification"
|
16
|
+
autorequire: rutils
|
17
|
+
default_executable:
|
18
|
+
bindir: bin
|
19
|
+
has_rdoc: true
|
20
|
+
required_ruby_version: !ruby/object:Gem::Version::Requirement
|
21
|
+
requirements:
|
22
|
+
-
|
23
|
+
- ">"
|
24
|
+
- !ruby/object:Gem::Version
|
25
|
+
version: 0.0.0
|
26
|
+
version:
|
27
|
+
platform: ruby
|
28
|
+
signing_key:
|
29
|
+
cert_chain:
|
30
|
+
authors:
|
31
|
+
- Julian "Julik" Tarkhanov
|
32
|
+
files:
|
33
|
+
- bin/gilensize
|
34
|
+
- test/run_tests.rb
|
35
|
+
- test/t_datetime.rb
|
36
|
+
- test/t_gilenson.rb
|
37
|
+
- test/t_integration.rb
|
38
|
+
- test/t_pluralize.rb
|
39
|
+
- test/t_transliteration.rb
|
40
|
+
- test/t_typografica.rb
|
41
|
+
- lib/datetime
|
42
|
+
- lib/gilenson
|
43
|
+
- lib/integration
|
44
|
+
- lib/pluralizer
|
45
|
+
- lib/rutils.rb
|
46
|
+
- lib/transliteration
|
47
|
+
- lib/datetime/datetime.rb
|
48
|
+
- lib/gilenson/gilenson.rb
|
49
|
+
- lib/gilenson/gilenson_port.rb
|
50
|
+
- lib/integration/blue_cloth_override.rb
|
51
|
+
- lib/integration/integration.rb
|
52
|
+
- lib/integration/rails_date_helper_override.rb
|
53
|
+
- lib/integration/red_cloth_override.rb
|
54
|
+
- lib/pluralizer/pluralizer.rb
|
55
|
+
- lib/transliteration/transliteration.rb
|
56
|
+
- README
|
57
|
+
- TODO
|
58
|
+
- CHANGELOG
|
59
|
+
test_files:
|
60
|
+
- test/run_tests.rb
|
61
|
+
rdoc_options:
|
62
|
+
- "--main=README"
|
63
|
+
- "--line-numbers"
|
64
|
+
- "--charset=utf-8"
|
65
|
+
extra_rdoc_files:
|
66
|
+
- README
|
67
|
+
- TODO
|
68
|
+
- CHANGELOG
|
69
|
+
executables:
|
70
|
+
- gilensize
|
71
|
+
extensions: []
|
72
|
+
requirements: []
|
73
|
+
dependencies: []
|