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 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