rutils 0.1.1 → 0.1.2
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.
- 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
|