rutils 0.1.5 → 0.1.6

Sign up to get free protection for your applications and to get access to all the features.
data/CHANGELOG CHANGED
@@ -1,4 +1,13 @@
1
- Версия 0.1.4 - 08.05.2006
1
+ CVS
2
+
3
+ Версия 0.1.6 - 18.08.2006
4
+ * Удалили jcode, он нам не сильно нужен (julik)
5
+ * В простом транслите Шипилов - Schipilov вместо SCHipilov (julik)
6
+ * Тесты интеграции валятся явно и громко если зависимые модули на машине отсутствуют (julik)
7
+ * Масса крошечных твиков чтобы сделать все немножко аккуратнее (julik)
8
+ * Родительный падеж (RU_INFLECTED_MONTHNAMES) для месяцев после числа (%d %B == 31 декабря) в strftime (mash)
9
+
10
+ Версия 0.1.5 - 08.05.2006
2
11
  * Транслитераторы вынесены в отдельные файлы (julik)
3
12
  * Починен баг с передачей часа в нужном падеже в distance_of_time (anonyomous)
4
13
  * Добавлены корректные методы публикации доков, сменены параметры их генерации (julik)
data/TODO CHANGED
@@ -2,16 +2,10 @@
2
2
 
3
3
  ==Даты
4
4
 
5
- * Применять INFLECTED_MONTHNAMES если имя месяца следует за днем
6
-
7
5
  ==Gilenson
8
6
 
9
- * Пара красивых примеров в README
10
-
11
7
  ==Pluralization
12
8
 
13
9
  * Истинная плюрализация без передачи рода и вариантов (как в Rails)
14
10
 
15
11
  ==Rails
16
-
17
- * закончить меню выбора стран и начинать помогать делать Multilingual Rails
@@ -39,6 +39,7 @@ module RuTils
39
39
  date.gsub!(/%a/, Date::RU_ABBR_DAYNAMES[time.wday])
40
40
  date.gsub!(/%A/, Date::RU_DAYNAMES[time.wday])
41
41
  date.gsub!(/%b/, Date::RU_ABBR_MONTHNAMES[time.mon])
42
+ date.gsub!(/%d(\s)*%B/, time.day.to_s + '\1' + Date::RU_INFLECTED_MONTHNAMES[time.mon])
42
43
  date.gsub!(/%B/, Date::RU_MONTHNAMES[time.mon])
43
44
  date.gsub!(@@ignored, '%%')
44
45
  end
@@ -183,7 +183,7 @@ class RuTils::Gilenson::Formatter
183
183
 
184
184
  # Для маркера мы применяем invalid UTF-sequence чтобы его НЕЛЬЗЯ было перепутать с частью
185
185
  # любого другого мультибайтного глифа. Thanks to huNter.
186
- REPLACEMENT_MARKER = "\xF0\xF0\xF0\xF0" #:nodoc:
186
+ REPLACEMENT_MARKER = RuTils::SUBSTITUTION_MARKER #:nodoc:
187
187
 
188
188
  # Кто придумал “? Не учите людей плохому...
189
189
  # Привет А.Лебедеву http://www.artlebedev.ru/kovodstvo/62/
@@ -375,8 +375,7 @@ class RuTils::Gilenson::Formatter
375
375
 
376
376
  # Позволяет получить процедуру, при вызове возвращающую значение глифа
377
377
  def lookup(glyph_to_lookup)
378
- gil = self
379
- return Proc.new { gil.glyph[glyph_to_lookup] }
378
+ return Proc.new { self.glyph[glyph_to_lookup] }
380
379
  end
381
380
 
382
381
  # Подставляет "символы" (двоеточие + имя глифа) на нужное значение глифа заданное в данном форматтере
@@ -411,7 +410,7 @@ class RuTils::Gilenson::Formatter
411
410
 
412
411
  # Кинуть ошибку если настройка нам неизвестна
413
412
  unknown_settings = args_hash.keys.collect{|k|k.to_s} - @settings.keys.collect { |k| k.to_s }
414
- raise RuTils::Gilenson::UnknownSetting, unknown_settings unless unknown_settings.empty?
413
+ raise RuTils::Gilenson::UnknownSetting, unknown_settings if unknown_settings.any?
415
414
 
416
415
  args_hash.each_pair do | key, value |
417
416
  @settings[key.to_s] = (value ? true : false)
@@ -517,15 +516,11 @@ class RuTils::Gilenson::Formatter
517
516
  def process_laquo(text)
518
517
  text.gsub!( /\"\"/ui, self.glyph[:quot]*2);
519
518
  text.gsub!( /(^|\s|#{@mark_tag}|>|\()\"((#{@mark_tag})*[~0-9ёЁA-Za-zА-Яа-я\-:\/\.])/ui, '\1'+self.glyph[:laquo]+'\2');
520
- # nb: wacko only regexp follows:
521
- # text.gsub!( /(^|\s|#{@mark_tag}|>|\()\"((#{#{@mark_tag}|\/#{self.glyph[:nbsp]}|\/|\!)*[~0-9ёЁA-Za-zА-Яа-я\-:\/\.])/ui, '\1'+self.glyph[:laquo]+'\2')
522
519
  _text = '""';
523
520
  until _text == text do
524
521
  _text = text;
525
- text.gsub!( /(#{self.glyph[:laquo]}([^\"]*)[ёЁA-Za-zА-Яа-я0-9\.\-:\/\?\!](#{@mark_tag})*)\"/sui, '\1'+self.glyph[:raquo])
526
- # nb: wacko only regexps follows:
527
- #text.gsub!( /(#{self.glyph[:laquo]}([^\"]*)[ёЁA-Za-zА-Яа-я0-9\.\-:\/](#{@mark_tag})*\?(#{#{@mark_tag})*)\"/sui, '\1'+self.glyph[:raquo])
528
- # text.gsub!( /(#{self.glyph[:raquo]}([^\"]*)[ёЁA-Za-zА-Яа-я0-9\.\-:\/](#{@mark_tag}|\/|\!)*)\"/sui, '\1'+self.glyph[:raquo])
522
+ text.gsub!( /(#{self.glyph[:laquo]}([^\"]*)[ёЁA-Za-zА-Яа-я0-9\.\-:\/\?\!](#{@mark_tag})*)\"/sui,
523
+ '\1'+self.glyph[:raquo])
529
524
  end
530
525
  end
531
526
 
@@ -563,13 +558,9 @@ class RuTils::Gilenson::Formatter
563
558
 
564
559
  text.gsub!(/(\s+)([a-zа-яА-Я]{1,2}[\)\]\!\?,\.;]{0,3}\s$)/ui, self.glyph[:nbsp]+'\2')
565
560
 
566
- for i in @glueleft
567
- text.gsub!( /(\s)(#{i})(\s+)/sui, '\1\2' + self.glyph[:nbsp])
568
- end
561
+ @glueleft.each { | i | text.gsub!( /(\s)(#{i})(\s+)/sui, '\1\2' + self.glyph[:nbsp]) }
569
562
 
570
- for i in @glueright
571
- text.gsub!( /(\s)(#{i})(\s+)/sui, self.glyph[:nbsp]+'\2\3')
572
- end
563
+ @glueright.each { | i | text.gsub!( /(\s)(#{i})(\s+)/sui, self.glyph[:nbsp]+'\2\3') }
573
564
 
574
565
  text.strip!
575
566
  end
@@ -594,7 +585,6 @@ class RuTils::Gilenson::Formatter
594
585
  # Все глифы
595
586
  @glyph.values.each do | entity |
596
587
  next unless entity =~ /^&#(\d+);/
597
-
598
588
  text.gsub!(/#{entity}/, entity_to_raw_utf8(entity))
599
589
  end
600
590
  end
@@ -606,10 +596,11 @@ class RuTils::Gilenson::Formatter
606
596
  end
607
597
  end #end Gilenson
608
598
 
609
- class RuTils::Gilenson::UnknownSetting < RuntimeError #:nodoc:
599
+ # Выбрасывается если форматтеру задается неизвестная настройка
600
+ class RuTils::Gilenson::UnknownSetting < RuntimeError
610
601
  end
611
602
 
612
- module RuTils::Gilenson::StringFormatting #:nodoc:
603
+ module RuTils::Gilenson::StringFormatting
613
604
  # Форматирует строку с помощью Gilenson::Formatter. Все дополнительные опции передаются форматтеру.
614
605
  def gilensize(*args)
615
606
  opts = args.last.is_a?(Hash) ? args.last : {}
@@ -4,7 +4,9 @@ module RuTils
4
4
  # Метод позволяет проверить, включена ли перегрузка функций других модулей.
5
5
  # Попутно он спрашивает модуль Locale (если таковой имеется) является ли русский
6
6
  # текущим языком, и если является, включает перегрузку функций имплицитно.
7
- # Модуль Locale можно получить как часть Multilingual Rails.
7
+ # Это позволяет подчинить настройку перегруженных функций настроенной локали.
8
+ # Модуль Locale можно получить как часть Multilingual Rails, как часть Ruby-Gettext или как отдельный
9
+ # модуль ruby-locale. Мы поддерживаем все три.
8
10
  def self.overrides_enabled?
9
11
  if defined?(Locale) and Locale.respond_to?(:current)
10
12
  return true if Locale.current.to_s.split('_').first == 'ru'
@@ -1,6 +1,6 @@
1
1
  if defined?(Object::RedCloth) and (!RedCloth.instance_methods.include?(:stock_pgl))
2
2
  # RuTils выполняет перегрузку Textile Glyphs в RedCloth, перенося форматирование спецсимволов на Gilenson.
3
- class Object::RedCloth < String #:nodoc:
3
+ class ::Object::RedCloth < String #:nodoc:
4
4
 
5
5
  # Этот метод в RedCloth при наличии Гиленсона надо отключать
6
6
  alias_method :stock_htmlesc, :htmlesc
@@ -9,7 +9,7 @@ if defined?(Object::RedCloth) and (!RedCloth.instance_methods.include?(:stock_pg
9
9
  end
10
10
 
11
11
  # А этот метод обрабатывает Textile Glyphs - ту самую типографицу.
12
- # Вместо того чтобы влезать в таблицы мы просто заменим Textile Glyphs - и все будут рады.
12
+ # Вместо того чтобы влезать в чужие таблицы мы просто заменим Textile Glyphs на Gilenson - и все будут рады.
13
13
  alias_method :stock_pgl, :pgl
14
14
  def pgl(text) #:nodoc:
15
15
  RuTils::overrides_enabled? ? text.replace(RuTils::Gilenson::Formatter.new(text).to_html) : stock_pgl(text)
data/lib/rutils.rb CHANGED
@@ -1,6 +1,4 @@
1
1
  $KCODE = 'u'
2
- require 'jcode' # вот от этого надо бы избавиться - скопировать jsize из jcode и поместить его в свой namespace
3
-
4
2
 
5
3
  # Главный контейнер модуля
6
4
  module RuTils
@@ -8,20 +6,20 @@ module RuTils
8
6
  INSTALLATION_DIRECTORY = File.expand_path(File.dirname(__FILE__) + '/../') #:nodoc:
9
7
  MAJOR = 0
10
8
  MINOR = 1
11
- TINY = 5
9
+ TINY = 6
12
10
 
13
11
  # Версия RuTils
14
12
  VERSION = [MAJOR, MINOR ,TINY].join('.') #:nodoc:
15
13
 
16
- # Стандартный маркер для подстановок
17
- SUBSTITUTION_MARKER = "\xFF\xFF\xFF\xFF" #:nodoc:
14
+ # Стандартный маркер для подстановок - invalid UTF sequence
15
+ SUBSTITUTION_MARKER = "\xF0\xF0\xF0\xF0" #:nodoc:
18
16
 
19
17
  def self.load_component(name) #:nodoc:
20
- require RuTils::INSTALLATION_DIRECTORY + "/lib/#{name}/#{name}"
18
+ require File.join(RuTils::INSTALLATION_DIRECTORY, "lib", name.to_s, name.to_s)
21
19
  end
22
20
 
23
21
  def self.reload_component(name) #:nodoc:
24
- load RuTils::INSTALLATION_DIRECTORY + "/lib/#{name}/#{name}.rb"
22
+ load File.join(RuTils::INSTALLATION_DIRECTORY, "lib", name.to_s, "#{name}.rb")
25
23
  end
26
24
  end
27
25
 
@@ -18,7 +18,7 @@ module RuTils::Transliteration::BiDi
18
18
  # " "=>"__","_"=>"__"
19
19
  # так сразу не получится, будут проблемы с "Ь"=>"_'"
20
20
  }.sort do |one, two|
21
- two[1].jsize <=> one[1].jsize
21
+ two[1].split(//).size <=> one[1].split(//).size
22
22
  end
23
23
 
24
24
  TABLE_FROM = TABLE_TO.unshift([" ","__"]).clone
@@ -2,16 +2,9 @@
2
2
  # "вот мы и здесь".translify => "vot my i zdes"
3
3
  # "vot my i zdes".detranslify => "вот мы и здесь"
4
4
  module RuTils::Transliteration::Simple
5
- TABLE = {
6
- "Ґ"=>"G","Ё"=>"YO","Є"=>"E","Ї"=>"YI","І"=>"I",
5
+ TABLE_LOWER = {
7
6
  "і"=>"i","ґ"=>"g","ё"=>"yo","№"=>"#","є"=>"e",
8
- "ї"=>"yi","А"=>"A","Б"=>"B","В"=>"V","Г"=>"G",
9
- "Д"=>"D","Е"=>"E","Ж"=>"ZH","З"=>"Z","И"=>"I",
10
- "Й"=>"Y","К"=>"K","Л"=>"L","М"=>"M","Н"=>"N",
11
- "О"=>"O","П"=>"P","Р"=>"R","С"=>"S","Т"=>"T",
12
- "У"=>"U","Ф"=>"F","Х"=>"H","Ц"=>"TS","Ч"=>"CH",
13
- "Ш"=>"SH","Щ"=>"SCH","Ъ"=>"'","Ы"=>"YI","Ь"=>"",
14
- "Э"=>"E","Ю"=>"YU","Я"=>"YA","а"=>"a","б"=>"b",
7
+ "ї"=>"yi","а"=>"a","б"=>"b",
15
8
  "в"=>"v","г"=>"g","д"=>"d","е"=>"e","ж"=>"zh",
16
9
  "з"=>"z","и"=>"i","й"=>"y","к"=>"k","л"=>"l",
17
10
  "м"=>"m","н"=>"n","о"=>"o","п"=>"p","р"=>"r",
@@ -22,22 +15,49 @@ module RuTils::Transliteration::Simple
22
15
  two[1].size <=> one[1].size
23
16
  end
24
17
 
25
- # Заменяет кириллицу в строке на латиницу
26
- def self.translify(str)
27
- s = str.clone
28
- TABLE.each do | translation |
29
- s = s.gsub(/#{translation[0]}/, translation[1])
30
- end
31
- s
18
+ TABLE_UPPER = {
19
+ "Ґ"=>"G","Ё"=>"YO","Є"=>"E","Ї"=>"YI","І"=>"I",
20
+ "А"=>"A","Б"=>"B","В"=>"V","Г"=>"G",
21
+ "Д"=>"D","Е"=>"E","Ж"=>"ZH","З"=>"Z","И"=>"I",
22
+ "Й"=>"Y","К"=>"K","Л"=>"L","М"=>"M","Н"=>"N",
23
+ "О"=>"O","П"=>"P","Р"=>"R","С"=>"S","Т"=>"T",
24
+ "У"=>"U","Ф"=>"F","Х"=>"H","Ц"=>"TS","Ч"=>"CH",
25
+ "Ш"=>"SH","Щ"=>"SCH","Ъ"=>"'","Ы"=>"YI","Ь"=>"",
26
+ "Э"=>"E","Ю"=>"YU","Я"=>"YA",
27
+ }.sort do | one, two|
28
+ two[1].size <=> one[1].size
32
29
  end
33
30
 
34
- # Заменяет латиницу на кириллицу
35
- def self.detranslify(str)
36
- s = str.clone
37
- TABLE.each do | translation |
38
- s.gsub!(/#{translation[1]}/, translation[0])
31
+ TABLE = TABLE_UPPER + TABLE_LOWER
32
+
33
+ # Заменяет кириллицу в строке на латиницу
34
+ def self.translify(str)
35
+ chars = str.split(//)
36
+
37
+ lowers = TABLE_LOWER.map{|e| e[0] }
38
+ uppers = TABLE_UPPER.map{|e| e[0] }
39
+
40
+ hashtable = {}
41
+ TABLE.each do | item |
42
+ hashtable[item[0]] = item[1]
43
+ end
44
+
45
+ result = ''
46
+ chars.each_with_index do | char, index |
47
+ if uppers.include?(char) && lowers.include?(chars[index+1])
48
+ # Combined case. Here we deal with Latin letters so there is no problem to use
49
+ # Ruby's builtin upcase_downcase
50
+ ch = hashtable[char].downcase.capitalize
51
+ result << ch
52
+ elsif uppers.include?(char)
53
+ result << hashtable[char]
54
+ elsif lowers.include?(char)
55
+ result << hashtable[char]
56
+ else
57
+ result << char
58
+ end
39
59
  end
40
- s
60
+ return result
41
61
  end
42
62
 
43
63
  # Транслитерирует строку, делая ее пригодной для применения как имя директории или URL
data/test/t_datetime.rb CHANGED
@@ -20,7 +20,8 @@ class StrftimeRuTest < Test::Unit::TestCase
20
20
  assert_equal "сб, суббота, дек, декабрь", Time.local(2005,"dec",31).strftime("%a, %A, %b, %B")
21
21
  assert_equal "%a, %A, %b, %B", Time.local(2005,"dec",31).strftime("%%a, %%A, %%b, %%B")
22
22
  assert_equal "%сб, %суббота, %дек, %декабрь", Time.local(2005,"dec",31).strftime("%%%a, %%%A, %%%b, %%%B")
23
- assert_equal "Сегодня: 31 декабрь, суббота, 2005 год", Time.local(2005,"dec",31).strftime("Сегодня: %d %B, %A, %Y год")
23
+ assert_equal "Сегодня: 31 декабря, суббота, 2005 года", Time.local(2005,"dec",31).strftime("Сегодня: %d %B, %A, %Y года")
24
+ assert_equal "Сегодня: ноябрь, 30 число, дождик в четверг, а год у нас - 2006", Time.local(2006,11,30).strftime("Сегодня: %B, %d число, дождик в %A, а год у нас - %Y")
24
25
 
25
26
  date = Date.new(2005, 11, 9)
26
27
  assert_equal "ноя ноябрь ср среда", "#{Date::RU_ABBR_MONTHNAMES[date.mon]} #{Date::RU_MONTHNAMES[date.mon]} #{Date::RU_ABBR_DAYNAMES[date.wday]} #{Date::RU_DAYNAMES[date.wday]}"
@@ -2,9 +2,23 @@ $KCODE = 'u'
2
2
  require 'test/unit'
3
3
  require 'rubygems'
4
4
 
5
- require 'action_view'
6
- require_gem 'RedCloth'
7
- require_gem 'BlueCloth'
5
+ begin
6
+ require 'action_view' unless defined?(ActionView)
7
+ rescue LoadError
8
+ $skip_rails = true
9
+ end
10
+
11
+ begin
12
+ require 'RedCloth' unless defined?(RedCloth)
13
+ rescue LoadError
14
+ $skip_redcloth = true
15
+ end
16
+
17
+ begin
18
+ require 'BlueCloth' unless defined?(BlueCloth)
19
+ rescue LoadError
20
+ $skip_bluecloth = true
21
+ end
8
22
 
9
23
  require File.dirname(__FILE__) + '/../lib/rutils'
10
24
  load File.dirname(__FILE__) + '/../lib/integration/integration.rb'
@@ -26,6 +40,8 @@ end
26
40
  # Нужно иметь в виду что Textile осуществляет свою обработку типографики, которую мы подменяем!
27
41
  class TextileIntegrationTest < Test::Unit::TestCase
28
42
  def test_integration_textile
43
+ raise "You must have RedCloth to test Textile integration" and return if $skip_redcloth
44
+
29
45
  RuTils::overrides = true
30
46
  assert RuTils.overrides_enabled?
31
47
  assert_equal "<p>И&#160;вот &#171;они пошли туда&#187;, и&#160;шли шли&#160;шли</p>",
@@ -42,6 +58,8 @@ end
42
58
  # Сам Markdown никакой обработки типографики не производит (это делает RubyPants, но вряд ли его кто-то юзает на практике)
43
59
  class MarkdownIntegrationTest < Test::Unit::TestCase
44
60
  def test_integration_markdown
61
+ raise "You must have BlueCloth to test Markdown integration" and return if $skip_bluecloth
62
+
45
63
  RuTils::overrides = true
46
64
  assert RuTils.overrides_enabled?
47
65
  assert_equal "<p>И вот&#160;&#171;они пошли туда&#187;, и&#160;шли шли&#160;шли</p>",
@@ -57,6 +75,8 @@ end
57
75
  # Перегрузка helper'ов Rails
58
76
  class RailsHelpersOverrideTest < Test::Unit::TestCase
59
77
  def test_distance_of_time_in_words
78
+ raise "You must have Rails to test ActionView integration" and return if $skip_rails
79
+
60
80
  eval 'class Foo
61
81
  include ActionView::Helpers::DateHelper
62
82
  def get_dst
@@ -11,12 +11,29 @@ class TranslitTest < Test::Unit::TestCase
11
11
 
12
12
  def test_translify
13
13
  assert_equal "sch", 'щ'.translify
14
- assert_equal "upuschenie", 'упущение'.translify
14
+ assert_equal "stansyi", "стансы".translify
15
+ assert_equal "upuschenie", 'упущение'.translify
15
16
  assert_equal "sh", 'ш'.translify
17
+ assert_equal "SH", 'Ш'.translify
16
18
  assert_equal "ts", 'ц'.translify
17
19
  assert_equal "Eto kusok stroki russkih bukv v peremshku s latinizey i ampersandom (pozor!) & something", @string.translify
18
20
  assert_equal "Это просто некий текст".translify, "Eto prosto nekiy tekst"
21
+
22
+ assert_equal "NEVEROYATNOE UPUSCHENIE", 'НЕВЕРОЯТНОЕ УПУЩЕНИЕ'.translify
23
+ assert_equal "Neveroyatnoe Upuschenie", 'Невероятное Упущение'.translify
24
+ assert_equal "Sherstyanoy Zayats", 'Шерстяной Заяц'.translify
25
+ assert_equal "N.P. Sherstyakov", 'Н.П. Шерстяков'.translify
26
+ assert_equal "SHAROVARYI", 'ШАРОВАРЫ'.translify
19
27
  end
28
+
29
+ # def test_detranslify
30
+ # puts "Шерстяной негодяй"
31
+ # assert_equal "щ", "sch".detranslify
32
+ # assert_equal "Щ", "SCH".detranslify
33
+ # assert_equal "Щ", "Sch".detranslify
34
+ # assert_equal "Щукин", "Schukin".detranslify
35
+ # assert_equal "Шерстяной негодяй", "Scherstyanoy negodyay".detranslify
36
+ # end
20
37
 
21
38
  def test_dirify
22
39
  assert_equal "eto-kusok-stroki-ruskih-bukv-v-peremshku-s-latinizey-i-ampersandom-pozor-and-something", @string.dirify
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.5
7
- date: 2006-05-09 00:00:00 +02:00
6
+ version: 0.1.6
7
+ date: 2006-08-18 00:00:00 +02:00
8
8
  summary: Simple processing of russian strings
9
9
  require_paths:
10
10
  - lib