rutils 0.1.5 → 0.1.6

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