rutils 0.1.1 → 0.1.2
Sign up to get free protection for your applications and to get access to all the features.
- data/CHANGELOG +3 -0
- data/README +32 -10
- data/lib/pluralizer/pluralizer.rb +6 -6
- data/lib/rutils.rb +4 -1
- data/lib/transliteration/transliteration.rb +67 -68
- data/test/t_transliteration.rb +66 -1
- metadata +2 -2
data/CHANGELOG
CHANGED
data/README
CHANGED
@@ -19,6 +19,11 @@ Gilenson работает медленнее).
|
|
19
19
|
|
20
20
|
Если вы используете RuTils для сайта под mod_ruby воспользуйтесь директивой RubyKanjiCode в своем httpd.conf.
|
21
21
|
|
22
|
+
Большое спасибо Роману Иванову aka Kukutz и Николаю Яремко aka Kuso Mendokuzee за реализацию большинства алгоритмов
|
23
|
+
на PHP.
|
24
|
+
|
25
|
+
Разработку RuTils ведут Julik[http://live.julik.nl] и Mash[http://imfo.ru]
|
26
|
+
|
22
27
|
== Cумма прописью и выбор числительного
|
23
28
|
|
24
29
|
RuTils реализует сумму прописью для целых и дробных чисел, с дополнительным учетом рода. Например:
|
@@ -35,23 +40,37 @@ RuTils реализует сумму прописью для целых и др
|
|
35
40
|
|
36
41
|
== Транслит
|
37
42
|
|
38
|
-
RuTils на данный момент реализует простейший транслит "в одну сторону".
|
43
|
+
RuTils на данный момент реализует простейший транслит "в одну сторону" и "взаимно-однозначный транслит" (BiDi-транслит).
|
44
|
+
|
45
|
+
Простейший транслит "в одну сторону".
|
39
46
|
|
40
47
|
"Вот такое вот дело".translify => "Vot takoye vot delo"
|
41
48
|
"Несомненный прогресс по сравнению с PHP".dirify => "nesomnennyi-progress-po-sravneniu-s-php"
|
42
49
|
|
43
|
-
|
50
|
+
== BiDi-транслит.
|
51
|
+
|
52
|
+
Порт BiDiTranslit[http://pixel-apes.com/translit/article#h256-10] от Pixel Apes.
|
53
|
+
Реализует транслитерацию "в обе стороны", предоставляя возможность получить валидный URL
|
54
|
+
из строки, содержащей русские и английские буквы. С некоторыми потерями (запятых и прочих
|
55
|
+
"слабозначащих" символов) возможно восстановление исходной строки.
|
56
|
+
|
57
|
+
Два режима работы:
|
58
|
+
|
59
|
+
* Уничтожение всех слешей, которые встретятся во входной строке. В этом случае методы вызываются с передачей в них false. Например, "Web/Скрипты".bidi_translify(false)
|
60
|
+
* Пропуск слэшей (используется по умолчанию). Например, "Web/+Skripty".bidi_detranslify
|
61
|
+
|
62
|
+
"WebРазработка/Скрипты".bidi_translify => "Web+Razrabotka+/+Skripty"
|
63
|
+
"+Ustanovka__+mod_perl".bidi_detranslify => "Установка mod_perl"
|
64
|
+
"WebРазработка/Мимо".bidi_translify(false) => "Web+RazrabotkaMimo"
|
65
|
+
"+PKHP+/Scripts".bidi_translify(false) => "ПХПScripts"
|
44
66
|
|
45
67
|
== Обработка русской типографики в HTML
|
46
68
|
|
47
|
-
|
48
|
-
Pixel Apes
|
69
|
+
Gilenson - порт Typografica[http://pixel-apes.com/typografica] от
|
70
|
+
Pixel Apes. Тыпографица - механизм автоматической расстановки подстановок в тексте
|
49
71
|
перед его выводом в HTML, оформляющий неразрывные пробелы, типографские кавычки
|
50
72
|
и реализующая элементарные макроподстановки.
|
51
73
|
|
52
|
-
Большое спасибо Роману Иванову aka Kukutz и Николаю Яремко aka Kuso Mendokuzee за изначальную реализацию
|
53
|
-
на PHP.
|
54
|
-
|
55
74
|
Имейте в виду, что на баги в Gilenson жаловаться разработчикам Typografica не стоит -
|
56
75
|
они вас не поймут и будут правы. Поддержку Gilenson PixelApes не осуществляют.
|
57
76
|
|
@@ -81,14 +100,17 @@ Textile английские кавычки и типографские знак
|
|
81
100
|
Если вы хотите использовать rutils как дополенние к Rails в одном конкретном приложении, скопируйте
|
82
101
|
директорию rutils в папку vendor/plugins вашего приложения. Вы можете воспользоваться командой
|
83
102
|
rutilize чтобы сделать это автоматически. После этого вы сможете использовать RuTils без
|
84
|
-
необходимости установки gem'
|
103
|
+
необходимости установки gem'а на вашем сервере.
|
85
104
|
|
86
|
-
$ rutilize /Sites/
|
105
|
+
$ rutilize /Sites/my_app1 /Sites/my_app2 /Sites/my_another_app
|
106
|
+
|
107
|
+
Вы можете свободно распространять RuTils со своим Rails-приложением при условии сохранения структуры
|
108
|
+
и файла README.
|
87
109
|
|
88
110
|
== Требования
|
89
111
|
|
90
112
|
* Ruby 1.8.2, немного прямых рук.
|
91
|
-
* Rake[http://rake.rubyforge.org], Rails, RedCloth и BlueCloth для выполнения тестов
|
113
|
+
* Rake[http://rake.rubyforge.org], Rails[http://rubyonrails.org], RedCloth[http://www.whytheluckystiff.net/ruby/redcloth/] и BlueCloth[http://www.deveiate.org/projects/BlueCloth] для выполнения тестов
|
92
114
|
|
93
115
|
== Как использовать
|
94
116
|
|
@@ -157,12 +157,12 @@ module RuTils
|
|
157
157
|
it << ["десятитысячная", "десятитысячных"]
|
158
158
|
it << ["стотысячная", "стотысячных"]
|
159
159
|
it << ["миллионная", "милллионных"]
|
160
|
-
|
161
|
-
|
162
|
-
|
163
|
-
|
164
|
-
|
165
|
-
|
160
|
+
it << ["десятимиллионная", "десятимилллионных", "десятимиллионных"]
|
161
|
+
it << ["стомиллионная", "стомилллионных", "стомиллионных"]
|
162
|
+
it << ["миллиардная", "миллиардных", "миллиардных"]
|
163
|
+
it << ["десятимиллиардная", "десятимиллиардных", "десятимиллиардных"]
|
164
|
+
it << ["стомиллиардная", "стомиллиардных", "стомиллиардных"]
|
165
|
+
it << ["триллионная", "триллионных", "триллионных"]
|
166
166
|
|
167
167
|
while it[signs].nil?
|
168
168
|
remainder = (remainder/10).round
|
data/lib/rutils.rb
CHANGED
@@ -4,10 +4,13 @@ require 'jcode' # вот от этого надо бы избавиться - с
|
|
4
4
|
|
5
5
|
# Главный контейнер модуля
|
6
6
|
module RuTils
|
7
|
+
# Папка, куда установлен модуль RuTils. Нужно чтобы автоматически копировать RuTils в другие приложения.
|
7
8
|
INSTALLATION_DIRECTORY = File.expand_path(File.dirname(__FILE__) + '/../')
|
8
9
|
MAJOR = 0
|
9
10
|
MINOR = 1
|
10
|
-
TINY =
|
11
|
+
TINY = 2
|
12
|
+
|
13
|
+
# Версия RuTils
|
11
14
|
VERSION = "#{MAJOR}.#{MINOR}.#{TINY}"
|
12
15
|
end
|
13
16
|
|
@@ -58,77 +58,76 @@ end
|
|
58
58
|
|
59
59
|
# Реализует транслитерацию "в обе стороны", дающую возможность автоматически использовать URL как ключ записи
|
60
60
|
module RuTils::Transliteration::BiDi #:nodoc:
|
61
|
-
|
62
|
-
|
63
|
-
|
64
|
-
|
65
|
-
|
66
|
-
|
67
|
-
|
68
|
-
|
69
|
-
|
70
|
-
|
71
|
-
|
72
|
-
|
73
|
-
|
74
|
-
|
75
|
-
|
76
|
-
|
77
|
-
|
78
|
-
|
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
|
+
# " "=>"__","_"=>"__"
|
77
|
+
# так сразу не получится, будут проблемы с "Ь"=>"_'"
|
78
|
+
}.sort do |one, two|
|
79
|
+
two[1].jsize <=> one[1].jsize
|
80
|
+
end
|
79
81
|
|
80
|
-
|
81
|
-
|
82
|
-
|
83
|
-
|
84
|
-
|
85
|
-
|
86
|
-
|
87
|
-
|
88
|
-
|
89
|
-
|
90
|
-
|
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]
|
82
|
+
TABLE_FROM = TABLE_TO.unshift([" ","__"]).clone
|
83
|
+
TABLE_TO.unshift(["_","__"])
|
84
|
+
|
85
|
+
def self.translify(str, allow_slashes = true)
|
86
|
+
slash = allow_slashes ? '/' : '';
|
87
|
+
|
88
|
+
s = str.clone.gsub(/[^\- _0-9a-zA-ZА-ёЁ#{slash}]/, '')
|
89
|
+
lang_fr = s.scan(/[А-ёЁ ]+/)
|
90
|
+
lang_fr.each do |fr|
|
91
|
+
TABLE_TO.each do | translation |
|
92
|
+
fr.gsub!(/#{translation[0]}/, translation[1])
|
113
93
|
end
|
114
94
|
end
|
115
95
|
|
116
|
-
|
117
|
-
|
118
|
-
|
119
|
-
|
120
|
-
|
121
|
-
|
122
|
-
|
123
|
-
|
124
|
-
|
96
|
+
lang_sr = s.scan(/[0-9A-Za-z\_\-\.\/\']+/)
|
97
|
+
|
98
|
+
string = ""
|
99
|
+
if s =~ /\A[А-ёЁ ]/
|
100
|
+
lang_fr, lang_sr = lang_sr, lang_fr
|
101
|
+
string = "+"
|
102
|
+
end
|
103
|
+
|
104
|
+
0.upto([lang_fr.length, lang_sr.length].min-1) do |x|
|
105
|
+
string += lang_sr[x] + "+" + lang_fr[x] + "+";
|
106
|
+
end
|
107
|
+
|
108
|
+
if (lang_fr.length < lang_sr.length)
|
109
|
+
string += lang_sr[lang_sr.length-1]
|
110
|
+
else
|
111
|
+
string[0, string.length-1]
|
112
|
+
end
|
113
|
+
end
|
114
|
+
|
115
|
+
def self.detranslify(str, allow_slashes = true)
|
116
|
+
slash = allow_slashes ? '/' : '';
|
117
|
+
|
118
|
+
str.split('/').inject(out = "") do |out, pg|
|
119
|
+
strings = pg.split('+')
|
120
|
+
1.step(strings.length-1, 2) do |x|
|
121
|
+
TABLE_FROM.each do | translation |
|
122
|
+
strings[x].gsub!(/#{translation[1]}/, translation[0])
|
125
123
|
end
|
126
|
-
out << slash << strings.to_s
|
127
124
|
end
|
128
|
-
out
|
125
|
+
out << slash << strings.to_s
|
129
126
|
end
|
127
|
+
out[slash.length, out.length-slash.length]
|
128
|
+
end
|
130
129
|
end
|
131
|
-
|
130
|
+
|
132
131
|
# Реализует транслитерацию любого объекта, реализующего String или to_s
|
133
132
|
module RuTils::Transliteration::StringFormatting
|
134
133
|
|
@@ -148,23 +147,23 @@ module RuTils::Transliteration::StringFormatting
|
|
148
147
|
end
|
149
148
|
|
150
149
|
# Транслитерирует строку (взаимно-однозначный транслит), и возвращает измененную строку
|
151
|
-
def bidi_translify(allow_slashes = true)
|
150
|
+
def bidi_translify(allow_slashes = true)
|
152
151
|
RuTils::Transliteration::BiDi::translify(self.to_s, allow_slashes)
|
153
152
|
end
|
154
153
|
|
155
154
|
# Транслитерирует строку (взаимно-однозначный транслит), меняя объект
|
156
|
-
def bidi_translify!(allow_slashes = true)
|
155
|
+
def bidi_translify!(allow_slashes = true)
|
157
156
|
self.replace(RuTils::Transliteration::BiDi::translify(self.to_s, allow_slashes))
|
158
157
|
end
|
159
158
|
|
160
159
|
# Заменяет латиницу на кириллицу (взаимно-однозначный транслит), меняя объект
|
161
|
-
def bidi_detranslify!(allow_slashes = true)
|
160
|
+
def bidi_detranslify!(allow_slashes = true)
|
162
161
|
self.replace(RuTils::Transliteration::BiDi::detranslify(self.to_s, allow_slashes))
|
163
162
|
end
|
164
163
|
|
165
164
|
# Заменяет латиницу на кириллицу (взаимно-однозначный транслит), и возвращает измененную строку
|
166
|
-
def bidi_detranslify(allow_slashes = true)
|
167
|
-
RuTils::Transliteration::BiDi::detranslify(self.to_s, allow_slashes
|
165
|
+
def bidi_detranslify(allow_slashes = true)
|
166
|
+
RuTils::Transliteration::BiDi::detranslify(self.to_s, allow_slashes)
|
168
167
|
end
|
169
168
|
end
|
170
169
|
|
data/test/t_transliteration.rb
CHANGED
@@ -4,7 +4,7 @@ require File.dirname(__FILE__) + '/../lib/rutils'
|
|
4
4
|
|
5
5
|
|
6
6
|
class TranslitTest < Test::Unit::TestCase
|
7
|
-
|
7
|
+
|
8
8
|
def setup
|
9
9
|
@string = "Это кусок строки русских букв v peremshku s latinizey i амперсандом (pozor!) & something"
|
10
10
|
end
|
@@ -22,4 +22,69 @@ class TranslitTest < Test::Unit::TestCase
|
|
22
22
|
assert_equal "eto-kusok-stroki-ruskih-bukv-v-peremshku-s-latinizey-i-ampersandom-pozor-and-something", @string.dirify
|
23
23
|
assert_equal "esche-ruskiy-tekst", "Еще РусСКий теКст".dirify
|
24
24
|
end
|
25
|
+
end
|
26
|
+
|
27
|
+
|
28
|
+
class BiDiTranslitTest < Test::Unit::TestCase
|
29
|
+
|
30
|
+
def setup
|
31
|
+
@strings_all_with_slash = {
|
32
|
+
"ThisIsРусскийName/ДляВас/ДемонстрацияOfSwitching" => "ThisIs+Russkijj+Name/+DljaVas+/+Demonstracija+OfSwitching",
|
33
|
+
"Андрэ Нортон Зачумлённый корабльzip" => "+Andreh__Norton__Zachumljonnyjj__korabl'+zip",
|
34
|
+
"Эй Эгегей" => "+EHjj__EHgegejj",
|
35
|
+
"эй-эй" => "+ehjj+-+ehjj",
|
36
|
+
"WebРазработка/Скрипты" => "Web+Razrabotka+/+Skripty",
|
37
|
+
"Смотрите зайцы -- нас много" => "+Smotrite__zajjcy__+--+__nas__mnogo",
|
38
|
+
"Привет Родина" => "+Privet__Rodina",
|
39
|
+
"ЙухХа" => "+JJukhKHa",
|
40
|
+
"Ыхыхых Its English text" => "+Ykhykhykh__+Its+__+English+__+text",
|
41
|
+
"Пьянь" => "+P'jan'",
|
42
|
+
"----____" => "----____",
|
43
|
+
"Madonna - Свежия Песенки" => "Madonna+__+-+__Svezhija__Pesenki",
|
44
|
+
"58-49" => "58-49",
|
45
|
+
"Въезд ГЛЯНЬ ВЪЕЗД" => "+V~ezd__GLJAN_'__V_~EZD",
|
46
|
+
"----____" => "----____",
|
47
|
+
"Въезд ГЛЯНь ВЪЕЗД" => "+V~ezd__GLJAN'__V_~EZD",
|
48
|
+
"Установка mod_perl" => "+Ustanovka__+mod_perl",
|
49
|
+
"Проверка__двери неразумной" => "+Proverka+__+dveri__nerazumnojj",
|
50
|
+
"Проверка_ дверцы" => "+Proverka+_+__dvercy",
|
51
|
+
"Кровать устала _ь" => "+Krovat'__ustala__+_+'",
|
52
|
+
"test__bed" => "test__bed",
|
53
|
+
"test_ bed" => "test_+__+bed",
|
54
|
+
"test__ __bed" => "test__+__+__bed",
|
55
|
+
"a_-_b-_-c" => "a_-_b-_-c",
|
56
|
+
"a - b _ c" => "a+__+-+__+b+__+_+__+c",
|
57
|
+
}
|
58
|
+
|
59
|
+
@strings_tran_without_slash = {
|
60
|
+
"Андрэ/ Н/о/ртон /Зачум//лённый корабль/z/ip" => "+Andreh__Norton__Zachumljonnyjj__korabl'+zip",
|
61
|
+
"WebРазработка/Мимо" => "Web+RazrabotkaMimo",
|
62
|
+
"test_/_bed" => "test__bed",
|
63
|
+
}
|
64
|
+
|
65
|
+
@strings_detran_without_slash = {
|
66
|
+
"Webds" => "/We/bds/",
|
67
|
+
"WebРазработкаМимо" => "Web/+Razrabotka+/+Mimo",
|
68
|
+
"WebСкрипты" => "Web/+Skripty",
|
69
|
+
"ПХПScripts" => "+PKHP+/Scripts",
|
70
|
+
}
|
71
|
+
end
|
72
|
+
|
73
|
+
def test_bidi_translify
|
74
|
+
@strings_all_with_slash.each do |strFrom, strTo|
|
75
|
+
assert_equal strTo, strFrom.bidi_translify
|
76
|
+
end
|
77
|
+
@strings_tran_without_slash.each do |strFrom, strTo|
|
78
|
+
assert_equal strTo, strFrom.bidi_translify(false)
|
79
|
+
end
|
80
|
+
end
|
81
|
+
|
82
|
+
def test_bidi_detranslify
|
83
|
+
@strings_all_with_slash.each do |strTo, strFrom|
|
84
|
+
assert_equal strTo, strFrom.bidi_detranslify
|
85
|
+
end
|
86
|
+
@strings_detran_without_slash.each do |strTo, strFrom|
|
87
|
+
assert_equal strTo, strFrom.bidi_detranslify(false)
|
88
|
+
end
|
89
|
+
end
|
25
90
|
end
|
metadata
CHANGED
@@ -3,8 +3,8 @@ rubygems_version: 0.8.11
|
|
3
3
|
specification_version: 1
|
4
4
|
name: rutils
|
5
5
|
version: !ruby/object:Gem::Version
|
6
|
-
version: 0.1.
|
7
|
-
date: 2005-
|
6
|
+
version: 0.1.2
|
7
|
+
date: 2005-11-01 00:00:00 +01:00
|
8
8
|
summary: Simple processing of russian strings
|
9
9
|
require_paths:
|
10
10
|
- lib
|