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 CHANGED
@@ -1,3 +1,6 @@
1
+ Версия 0.1.2 - 01.11.2005
2
+ * Добавлен BiDi-транслит c тестами (mash)
3
+
1
4
  Версия 0.04 - 20.10.2005
2
5
  * Чистка документации
3
6
 
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
- В ближайшее время будет добавлен BiDi-транслит.
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
- RuTils включает Gilenson - порт Тыпографицы[http://pixel-apes.com/typografica] от
48
- Pixel Apes на Ruby. Тыпографица - механизм автоматической расстановки подстановок в тексте
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/my_app
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
- # it << ["десятимиллионная", "десятимилллионных", "десятимиллионных"]
161
- # it << ["стомиллионная", "стомилллионных", "стомиллионных"]
162
- # it << ["миллиардная", "миллиардных", "миллиардных"]
163
- # it << ["десятимиллиардная", "десятимиллиардных", "десятимиллиардных"]
164
- # it << ["стомиллиардная", "стомиллиардных", "стомиллиардных"]
165
- # it << ["триллионная", "триллионных", "триллионных"]
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 = 1
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
- 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
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
- # 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]
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
- 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
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[slash.length, out.length-1]
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) #:nodoc:
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) #:nodoc:
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) #:nodoc:
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) #:nodoc:
167
- RuTils::Transliteration::BiDi::detranslify(self.to_s, allow_slashes = true)
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
 
@@ -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.1
7
- date: 2005-10-29 00:00:00 +02:00
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