rutils 0.2.5 → 1.0.0

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.
Files changed (50) hide show
  1. data/History.txt +9 -0
  2. data/Manifest.txt +22 -15
  3. data/README.txt +54 -41
  4. data/Rakefile.rb +9 -26
  5. data/TODO.txt +2 -3
  6. data/WHAT_HAS_CHANGED.txt +44 -0
  7. data/init.rb +20 -2
  8. data/lib/countries/countries.rb +1 -0
  9. data/lib/datetime/datetime.rb +1 -0
  10. data/lib/gilenson/bluecloth_extra.rb +7 -0
  11. data/lib/gilenson/gilenson.rb +39 -30
  12. data/lib/gilenson/helper.rb +34 -0
  13. data/lib/gilenson/maruku_extra.rb +19 -0
  14. data/lib/gilenson/rdiscount_extra.rb +7 -0
  15. data/lib/gilenson/redcloth_extra.rb +42 -0
  16. data/lib/integration/integration.rb +1 -11
  17. data/lib/integration/rails_date_helper_override.rb +103 -105
  18. data/lib/integration/rails_pre_filter.rb +1 -0
  19. data/lib/pluralizer/pluralizer.rb +14 -13
  20. data/lib/rutils.rb +15 -25
  21. data/lib/transliteration/bidi.rb +15 -72
  22. data/lib/transliteration/simple.rb +1 -0
  23. data/lib/transliteration/transliteration.rb +11 -9
  24. data/lib/version.rb +5 -0
  25. data/test/extras/integration_bluecloth.rb +13 -0
  26. data/test/extras/integration_maruku.rb +15 -0
  27. data/test/{test_rails_filter.rb → extras/integration_rails_filter.rb} +3 -1
  28. data/test/extras/integration_rails_gilenson_helpers.rb +80 -0
  29. data/test/{test_rails_helpers.rb → extras/integration_rails_helpers.rb} +15 -3
  30. data/test/extras/integration_rdiscount.rb +15 -0
  31. data/test/extras/integration_redcloth3.rb +18 -0
  32. data/test/extras/integration_redcloth4.rb +19 -0
  33. data/test/run_tests.rb +2 -2
  34. data/test/{t_datetime.rb → test_datetime.rb} +1 -2
  35. data/test/{t_gilenson.rb → test_gilenson.rb} +15 -6
  36. data/test/test_integration.rb +22 -0
  37. data/test/test_integration_flag.rb +18 -0
  38. data/test/{t_pluralize.rb → test_pluralize.rb} +3 -2
  39. data/test/{t_rutils_base.rb → test_rutils_base.rb} +1 -0
  40. data/test/test_transliteration.rb +53 -0
  41. metadata +35 -26
  42. data/lib/integration/blue_cloth_override.rb +0 -12
  43. data/lib/integration/red_cloth_four.rb +0 -24
  44. data/lib/integration/red_cloth_override.rb +0 -7
  45. data/lib/integration/red_cloth_three.rb +0 -25
  46. data/test/t_integration.rb +0 -46
  47. data/test/t_transliteration.rb +0 -109
  48. data/test/test_integration_bluecloth.rb +0 -17
  49. data/test/test_integration_redcloth3.rb +0 -31
  50. data/test/test_integration_redcloth4.rb +0 -31
data/History.txt CHANGED
@@ -1,4 +1,13 @@
1
+ === 1.0.0 - 08.02.2009
2
+
3
+ * Оверрайды очищены и уничтожены, перегрузка форматтеров выполняется через наследование и рельсовый хелпер (julik)
4
+ * Протестировано на JRuby 1.1.6 (julik)
5
+ * Основные шестеренки совместимы с Ruby 1.9.1 (julik)
6
+ * BiDi транслит покидает нас. URL давно поддерживают Unicode, если нет - сохраняйте транслитерированный slug отдельно.
7
+ Если кому-то это не нравится - см. Wikipedia (julik)
8
+
1
9
  === 0.2.5 - 08.08.2008
10
+
2
11
  * Поддержка Rails Edge (pre-2.2) для хелперов DateTime. RuTils при overrides_enabled пытается поставить себя выше I18n -- при overrides_enabled I18n не вызывается для datetime хелперов. (Yaroslav Markin)
3
12
  * Частичная поддержка RedCloth 4 (julik)
4
13
  * Фильтр для контроллера чтобы установить верный флаг для экшена, то что происходит в экшене - thread local (julik)
data/Manifest.txt CHANGED
@@ -3,33 +3,40 @@ Manifest.txt
3
3
  README.txt
4
4
  Rakefile.rb
5
5
  TODO.txt
6
+ WHAT_HAS_CHANGED.txt
6
7
  bin/gilensize
7
8
  bin/rutilize
8
9
  init.rb
9
10
  lib/countries/countries.rb
10
11
  lib/datetime/datetime.rb
12
+ lib/gilenson/bluecloth_extra.rb
11
13
  lib/gilenson/gilenson.rb
12
- lib/integration/blue_cloth_override.rb
14
+ lib/gilenson/helper.rb
15
+ lib/gilenson/maruku_extra.rb
16
+ lib/gilenson/rdiscount_extra.rb
17
+ lib/gilenson/redcloth_extra.rb
13
18
  lib/integration/integration.rb
14
19
  lib/integration/rails_date_helper_override.rb
15
20
  lib/integration/rails_pre_filter.rb
16
- lib/integration/red_cloth_four.rb
17
- lib/integration/red_cloth_override.rb
18
- lib/integration/red_cloth_three.rb
19
21
  lib/pluralizer/pluralizer.rb
20
22
  lib/rutils.rb
21
23
  lib/transliteration/bidi.rb
22
24
  lib/transliteration/simple.rb
23
25
  lib/transliteration/transliteration.rb
26
+ lib/version.rb
27
+ test/extras/integration_bluecloth.rb
28
+ test/extras/integration_maruku.rb
29
+ test/extras/integration_rails_filter.rb
30
+ test/extras/integration_rails_gilenson_helpers.rb
31
+ test/extras/integration_rails_helpers.rb
32
+ test/extras/integration_rdiscount.rb
33
+ test/extras/integration_redcloth3.rb
34
+ test/extras/integration_redcloth4.rb
24
35
  test/run_tests.rb
25
- test/t_datetime.rb
26
- test/t_gilenson.rb
27
- test/t_integration.rb
28
- test/t_pluralize.rb
29
- test/t_rutils_base.rb
30
- test/t_transliteration.rb
31
- test/test_integration_bluecloth.rb
32
- test/test_integration_redcloth3.rb
33
- test/test_integration_redcloth4.rb
34
- test/test_rails_filter.rb
35
- test/test_rails_helpers.rb
36
+ test/test_datetime.rb
37
+ test/test_gilenson.rb
38
+ test/test_integration.rb
39
+ test/test_integration_flag.rb
40
+ test/test_pluralize.rb
41
+ test/test_rutils_base.rb
42
+ test/test_transliteration.rb
data/README.txt CHANGED
@@ -4,9 +4,13 @@ RuTils - простой обработчик русского текста на
4
4
  сделать разработку русскоязычных приложений на Ruby (и Rails) максимально простой
5
5
  и приятной (в идеале - столь же простой как и разработку оных на английском).
6
6
 
7
+ == Шеф! все пропало! я обновил RuTils и он работает совершенно по-другому!
8
+
9
+ Раздел также известен под именем "Что поменялось в RuTils 0.3.0". Вам {сюда.}[files/WHAT_HAS_CHANGED_txt.html]
10
+
7
11
  == Чье это
8
12
 
9
- Разработчики RuTils - Julik[http://julik.nl], Mash[http://imfo.ru], {Yaroslav Markin}[http://markin.net/]
13
+ Разработчики RuTils - {Julik}[http://julik.nl], {Mash}[http://imfo.ru], {Yaroslav Markin}[http://markin.net/]
10
14
 
11
15
  Большое спасибо Роману Иванову aka Kukutz и Николаю Яремко aka Kuso Mendokuzee за
12
16
  реализацию большинства алгоритмов на PHP.
@@ -51,32 +55,12 @@ RuTils реализует сумму прописью для целых и др
51
55
 
52
56
  == Транслит
53
57
 
54
- RuTils на данный момент реализует простейший транслит "в одну сторону" и
55
- "взаимно-однозначный транслит" (BiDi-транслит).
56
-
57
- Простейший транслит "в одну сторону".
58
+ RuTils на данный момент реализует простейший транслит "в одну сторону".
59
+ "Взаимно-однозначный транслит" (BiDi-транслит) больше не поддерживается.
58
60
 
59
61
  "Вот такое вот дело".translify => "Vot takoye vot delo"
60
62
  "Несомненный прогресс по сравнению с PHP".dirify => "nesomnennyi-progress-po-sravneniu-s-php"
61
63
 
62
- == BiDi-транслит
63
-
64
- Порт BiDiTranslit[http://pixel-apes.com/translit/article#h256-10] от Pixel Apes.
65
- Реализует транслитерацию "в обе стороны", предоставляя возможность получить
66
- валидный URL из строки, содержащей русские и английские буквы. С некоторыми
67
- потерями (запятых и прочих "слабозначащих" символов) возможно восстановление
68
- исходной строки.
69
-
70
- Два режима работы:
71
-
72
- 1. Уничтожение всех слешей, которые встретятся во входной строке. В этом случае методы вызываются с передачей в них false. Например, <tt>"Web/Скрипты".bidi_translify(false)</tt>
73
- 2. Пропуск слэшей (используется по умолчанию). Например,
74
-
75
- "WebРазработка/Скрипты".bidi_translify => "Web+Razrabotka+/+Skripty"
76
- "+Ustanovka__+mod_perl".bidi_detranslify => "Установка mod_perl"
77
- "WebРазработка/Мимо".bidi_translify(false) => "Web+RazrabotkaMimo"
78
- "+PKHP+/Scripts".bidi_detranslify(false) => "ПХПScripts"
79
-
80
64
  == Обработка русской типографики в HTML
81
65
 
82
66
  Gilenson - порт Typografica[http://pixel-apes.com/typografica] от Pixel Apes.
@@ -125,18 +109,32 @@ Unicode-тексты в среде UNIX пользуясь стандартны
125
109
  Time.local(2005,"dec",31).strftime("%a, %A, %b, %B") => "Сб, Суббота, Дек, Декабрь"
126
110
  Time.local(2005,"dec",31).strftime_norutils("%a, %A, %b, %B") => "Sat, Saturday, Dec, December"
127
111
 
128
- == Интеграция с Rails, RedCloth и BlueCloth
112
+ == Интеграция с RedCloth и BlueCloth
129
113
 
130
114
  RuTils в первую очередь задумывался как максимально "прозрачный" механизм
131
- обработки русского текста в контексте Rails-приложения. В связи с этим RuTils
132
- "вторгается" в работу других Ruby-модулей и изменяет механизм их работы.
115
+ обработки русского текста в контексте Rails-приложения.
116
+
117
+ Если вы используете RuTils в одном приложении со стандартными форматтерами (RedCloth, BlueCloth...) воспользуйтесь
118
+ дополнительными модулями которые выводят отформатированный Гиленсоном результат работы форматтеров
119
+
120
+ Gilenson определяет следующие дополнительные форматтеры (они работают так же как и их базовые классы)
133
121
 
134
- Если вы используете RuTils в одном приложении с RedCloth или BlueCloth, RuTils
135
- автоматически будет обрабатывать типографику во всех текстах, пропускаемых через
136
- них. Имейте в виду, что для корректной работы этой функции RuTils надо загружать
137
- *после* модулей RedCloth и BlueCloth.
122
+ * RuTils::Gilenson::RedClothExtra
123
+ * RuTils::Gilenson::BlueClothExtra
124
+ * RuTils::Gilenson::RDiscountExtra
125
+ * RuTils::Gilenson::MarukuExtra
138
126
 
139
- Помимо этого RuTils заставляет следующие функции Rails говорить по-русски:
127
+ В этих классах Gilenson будет обрабатывать типографику во всех текстах, пропускаемых через
128
+ них. Эти классы при включенном флаге RuTils.overrides автоматически подключаются в хелперы
129
+ +markdown+ и +textilize+.
130
+
131
+ == Интеграция с Rails версии 2.2.2 и выше
132
+
133
+ Используйте гем russian для дат и RuTils как дополнение (для транслита, функций kopeek и так далее)
134
+
135
+ == Интеграция с Rails версий 1.2 - 2.1.1
136
+
137
+ RuTils заставляет следующие функции старых (pre-i18n) версий Rails говорить по-русски:
140
138
 
141
139
  * Меню выбора даты (+date_select+ и +datetime_select+) и связанные с этим хелперы
142
140
  будут выводиться с русскими именами месяцев, и учитывая локализованный порядок дат
@@ -144,11 +142,12 @@ RuTils в первую очередь задумывался как максим
144
142
  * +distance_of_time_in_words+ будет выводить
145
143
  русские описания длительности ("более 2 часов")
146
144
 
145
+ == Управление оверрайдами
146
+
147
147
  Перегрузку всех функций других модулей можно включать и отключать в любое время с
148
148
  помощью метода RuTils::overrides=. Когда перегрузка выключена, все сторонние
149
- библиотеки будут работать в стандартном режиме (например, RedCloth будет
150
- расставлять английские типографские кавычки). Это нужно когда вам нужно
151
- переключиться на английский (или любой другой язык) без перезапуска приложения.
149
+ хелперы будут работать в стандартном режиме (например, даты и время будут выводиться по-русски).
150
+ Это нужно когда вам нужно переключиться на английский (или любой другой язык) без перезапуска приложения.
152
151
 
153
152
  Рекомендуемый способ использования RuTils с Ruby on Rails приложением -- установка RuTils
154
153
  плагином. Для этого скопируйте директорию rutils в папку vendor/plugins вашего
@@ -159,14 +158,23 @@ RuTils в первую очередь задумывался как максим
159
158
 
160
159
  $ rutilize /Sites/my_app1 /Sites/my_app2 /Sites/my_another_app
161
160
 
162
- Вы можете свободно распространять RuTils со своим Rails-приложением при условии
161
+ == Распространения
162
+
163
+ Вы можете свободно распространять RuTils со своим приложением при условии
163
164
  сохранения структуры и файла README.
164
165
 
166
+ == Совместимость
167
+
168
+ * Ruby 1.8.x
169
+ * Ruby 1.9.x (релизные версии начиная с 1.9.1)
170
+ * JRuby 1.1.6
171
+
165
172
  == Требования
166
173
 
167
- * Ruby 1.8.2 или выше, немного прямых рук.
174
+ * Ruby 1.8.2 или выше, немного прямых рук
168
175
  * Rake[http://rake.rubyforge.org],
169
176
 
177
+
170
178
  Rails[http://rubyonrails.org],
171
179
  RedCloth[http://www.whytheluckystiff.net/ruby/redcloth/] и
172
180
  BlueCloth[http://www.deveiate.org/projects/BlueCloth] для выполнения тестов.
@@ -204,16 +212,21 @@ RubyKanjiCode в своем httpd.conf.
204
212
 
205
213
  * Unix line breaks (LF)
206
214
  * Кодировка файлов - строго UTF-8 без BOM (Byte Order Mark)
207
- * Отступы в 2 пробела, без табуляций.
215
+ * Все файлы должны содержать emacs-прагму
216
+ # -*- encoding: utf-8 -*-
217
+ в первой строке
218
+ * Отступы в 2 пробела, без табуляций
219
+ * Только однозначный код для 1.8 и 1.9
220
+ * Без функций которые отсутствуют в 1.8 (в первую очередь encodings)
221
+ * Без функций которые убраны из 1.9
208
222
  * Однострочные блоки с фигурными скобками, многострочные - с +do ... end+
209
223
  * Все другие конвенции нормального написания
210
- Ruby-кода (http://www.rubygarden.org/ruby/ruby?RubyStyleGuide)
224
+ Ruby-кода (http://github.com/chneukirchen/styleguide/tree/master)
211
225
 
212
226
  При сравнении текстовых сегментов, прошедших через хитрые форматтеры пользуйтесь assert_equal_cp
213
227
  - он внятно покажет вам какой символ отличается в двух строках (иначе будете вслепую искать
214
228
  разницу между двумя разными пробелами, например)
215
229
 
216
- Если вы хотите участвовать в разработке RuTils пользуйтесь версией из subversion
217
- trunk.
230
+ Если вы хотите участвовать в разработке RuTils - fork us on GitHub
218
231
 
219
- http://rutils.rubyforge.org/svn/trunk
232
+ git clone git://github.com/julik/rutils.git
data/Rakefile.rb CHANGED
@@ -1,28 +1,20 @@
1
+ # -*- encoding: utf-8 -*-
1
2
  $KCODE = 'u'
2
3
  $:.reject! { |e| e.include? 'TextMate' }
3
4
 
4
- require 'lib/rutils'
5
- require 'rubygems'
6
-
7
-
5
+ require 'lib/version'
8
6
 
9
7
  begin
8
+ require 'rubygems'
10
9
  require 'hoe'
11
10
 
12
11
  # Disable spurious warnings when running tests, ActiveMagic cannot stand -w
13
12
  Hoe::RUBY_FLAGS.replace ENV['RUBY_FLAGS'] || "-I#{%w(lib test).join(File::PATH_SEPARATOR)}" +
14
13
  (Hoe::RUBY_DEBUG ? " #{RUBY_DEBUG}" : '')
15
14
 
16
- # The generic URI syntax mandates that new URI schemes that provide for the
17
- # representation of character data in a URI must, in effect, represent characters from
18
- # the unreserved set without translation, and should convert all other characters to
19
- # bytes according to UTF-8, # and then percent-encode those values. This requirement was
20
- # introduced in January 2005 with the publication of RFC 3986. URI schemes # introduced
21
- # before this date are not affected.
22
-
23
15
  # Hoe minus dependency pollution plus unidocs plus rdoc fix. Kommunizm, perestroika.
24
- class KolkHoe < Hoe
25
- DOCOPTS = %w(--webcvs=http://rutils.rubyforge.org/svn/trunk/%s --charset=utf-8 --promiscuous)
16
+ Class.new(Hoe) do
17
+ DOCOPTS = %w(--webcvs=http://github.com/julik/rutils/tree/master/%s --charset=utf-8 --promiscuous)
26
18
  Rake::RDocTask.class_eval do
27
19
  alias_method :_odefine, :define
28
20
  def define; @options.unshift(*DOCOPTS); _odefine; end
@@ -32,20 +24,17 @@ begin
32
24
  extra_deps.reject! {|e| e[0] == 'hoe' }
33
25
  super
34
26
  end
35
- end
36
-
37
- KolkHoe.new('rutils', RuTils::VERSION) do |p|
27
+ end.new('rutils', RuTils::VERSION) do |p|
38
28
  p.name = "rutils"
39
29
  p.author = ["Julian 'Julik' Tarkhanov", "Danil Ivanov", "Yaroslav Markin"]
40
30
  p.email = ['me@julik.nl', 'yaroslav@markin.net']
41
31
  p.description = 'Simple processing of russian strings'
42
32
  p.summary = 'Simple processing of russian strings'
43
- p.url = "http://rutils.rubyforge.org"
44
- p.test_globs = 'test/t_*.rb'
45
- p.remote_rdoc_dir = ''
46
- p.need_zip = true
47
33
  p.remote_rdoc_dir = ''
34
+ p.need_zip = true # ненвижу
48
35
  end
36
+
37
+ require 'load_multi_rails_rake_tasks'
49
38
 
50
39
  rescue LoadError
51
40
  $stderr.puts "Meta-operations on this package require Hoe and multi_rails"
@@ -58,10 +47,4 @@ rescue LoadError
58
47
  t.pattern = 'test/t_*.rb'
59
48
  t.verbose = true
60
49
  end
61
- end
62
-
63
- begin
64
- require 'load_multi_rails_rake_tasks'
65
- rescue LoadError
66
- $stderr.puts "Proper testing of this package with Rails requires multi_rails"
67
50
  end
data/TODO.txt CHANGED
@@ -2,6 +2,5 @@
2
2
 
3
3
  ==Rails
4
4
 
5
- * i18n was merged into Rails trunk (http://github.com/svenfuchs/i18n/tree/master), (http://github.com/svenfuchs/rails/tree/i18n-merge), нужно
6
- написать i18n файлы для common stuff (datetime) и Rails.
7
-
5
+ ==Вообще
6
+ * Выносим Гиленсона в отдельный гем
@@ -0,0 +1,44 @@
1
+ == Изменения по отношению к RuTils 0.2.x
2
+
3
+ === Никаких оверрайдов
4
+
5
+ К сожалению, переделать все существующие во Вселенной библиотеки невозможно. Мы предоставляем
6
+ унаследованные классы которые реализуют нужную нам функциональность с минимальной хирургией чужих
7
+ модулей. Например, если раньше вы делали так:
8
+
9
+ RuTils.overrides = true
10
+ BlueCloth.new(text_to_markdown_and_gilensize).to_html
11
+
12
+ то теперь нужно делать так
13
+
14
+ RuTils::Gilenson::BlueClothExtra.new(text_to_markdown_and_gilensize).to_html
15
+
16
+ === Почему удален BiDi-транслит?
17
+
18
+ В отличие от DHH авторы RuTils придерживаются стратегии синтактической серной кислоты вместо синтактического уксуса. Основная область
19
+ применения bidi-транслитераций - генерация "как-бы" более удобочитаемых URL. К сожалению, у нее есть ряд свойств которые делают ее
20
+ бессмысленной (кроме как в качестве упражнения по строковым итераторам Ruby). Приводим список аргументов почему вам не нужны
21
+ автоматические транслитерированные URL:
22
+
23
+ * Они будут работать только для набора символов "ASCII + русский". Любая попытка засунуть в ваш URL слово stød закончится печально.
24
+ * Они будут работать только для русского языка, кириллиц много. Транслитерация по определению языкозависима.
25
+ * Вашим пользователям придется непрерывно угадывать, пишется буква "я". "Ja"? "Ya"? "J"? Если вы хоть раз наблюдали иностранца, пытающегося
26
+ выговорить "ОВИРскую" транслитерацию вашей фамилии из загранпаспорта, вы знаете о чем мы говорим.
27
+ * Приличные браузеры не кодируют русский текст в адресной строке если Ваш вебсервер его принял. Если браузер неприличный то он позволяет этот текст ввести.
28
+ Если браузер совсем неприличный, то средство ввода у него - стилус размером с зубочистку, а пользуются им в трамвае. Вводить ваш транслит
29
+ в таких условиях все равно никто не будет, успокойтесь.
30
+
31
+ Приводить список аргументов "почему такой транслит вам нужен" мы не будем дабы никого не травмировать.
32
+
33
+ Если вам таки страшно неймется реализовать транслит в URL, рекомендуем следующий подход:
34
+
35
+ * Для адресуемого обьекта сохраняется поле ++slug++
36
+ * При сохранении в это поле автоматически пишется "дирифицированное" название, но пользователь может его вручную отредактировать
37
+ * Дальнейшая адресация производится без "транслитерации обратно", по полю slug напрямую
38
+
39
+ Дополнительно рекомендуется запретить загрузку файлов с русскими именами (с помощью Javascript и свойства value элемента input).
40
+
41
+ === Рубинов много
42
+
43
+ Это актуально только для тех кто собирается слать патчи. RuTils тестирован и работает под двумя версиями MRI и под JRuby. Это автоматически означает
44
+ что патчи должны тестироваться во всех этих средах.
data/init.rb CHANGED
@@ -1,9 +1,27 @@
1
+ # -*- encoding: utf-8 -*-
1
2
  =begin
2
3
  Этот файл - заглушка для Rails-плагина.
3
4
  Если поместить rutils/ в папку vendor/plugins/ вашего Rails-приложения,
4
5
  RuTils будет автоматически загружен с включенным флагом <tt>RuTils::overrides = true</tt>.
5
6
  В ActionController::Base будет установлен пре-фильтр устанавливающий флаг <tt>overrides.</tt>
6
7
  =end
7
- require File.join(File.dirname(__FILE__), 'lib', 'rutils')
8
+ require File.dirname(__FILE__) + '/lib/rutils' unless defined?(RuTils)
9
+
8
10
  RuTils::overrides = true
9
- require File.dirname(__FILE__) + '/lib/integration/rails_pre_filter'
11
+ require File.dirname(__FILE__) + '/lib/integration/rails_pre_filter'
12
+
13
+ def russan_gem_required?
14
+ require 'action_pack/version'
15
+ ma, mi, ti = ActionPack::VERSION::MAJOR, ActionPack::VERSION::MINOR, ActionPack::VERSION::TINY
16
+ return true if (ma >= 2 && mi >= 2 && ti >= 1)
17
+ false
18
+ end
19
+
20
+ if russan_gem_required?
21
+ STDERR.puts "RuTils: On this version of Rails use the `russian` gem for date helper overrides instead"
22
+ else
23
+ require File.dirname(__FILE__) + "/lib/integration/rails_date_helper_override"
24
+ end
25
+
26
+ # textilize и markdown
27
+ ::ActionController::Base.send(:helper, RuTils::Gilenson::Helper)
@@ -1,3 +1,4 @@
1
+ # -*- encoding: utf-8 -*-
1
2
  $KCODE = 'u'
2
3
  require 'yaml'
3
4
 
@@ -1,3 +1,4 @@
1
+ # -*- encoding: utf-8 -*-
1
2
  module RuTils
2
3
  module DateTime
3
4
 
@@ -0,0 +1,7 @@
1
+ # -*- encoding: utf-8 -*-
2
+ # BlueCloth с поддержкой Gilenson
3
+ class RuTils::Gilenson::BlueClothExtra < BlueCloth
4
+ def to_html(*opts)
5
+ RuTils::Gilenson::Formatter.new(super(*opts)).to_html
6
+ end
7
+ end
@@ -1,3 +1,4 @@
1
+ # -*- encoding: utf-8 -*-
1
2
  module RuTils
2
3
  module Gilenson
3
4
  # Позволяет возвращать класс форматтера при вызове
@@ -5,6 +6,12 @@ module RuTils
5
6
  def self.new(*args) #:nodoc:
6
7
  RuTils::Gilenson::Formatter.new(*args)
7
8
  end
9
+
10
+ autoload :BlueClothExtra, File.dirname(__FILE__) + '/bluecloth_extra'
11
+ autoload :RedClothExtra, File.dirname(__FILE__) + '/redcloth_extra'
12
+ autoload :RDiscountExtra, File.dirname(__FILE__) + '/rdiscount_extra'
13
+ autoload :MarukuExtra, File.dirname(__FILE__) + '/maruku_extra'
14
+ autoload :Helper, File.dirname(__FILE__) + '/helper'
8
15
  end
9
16
  end
10
17
 
@@ -21,8 +28,6 @@ end
21
28
  # * работа только и полностью в UTF-8 (включая entities, применимые в XML)
22
29
  # * поддержка "raw"-вывода (символов вместо entities) - текст выводимый Gilenson можно верстать на бумаге
23
30
  #
24
- # Если вам нужно получать идентичный Typografica вывод, пользуйтесь RuTils::Gilenson::Obsolete
25
- # вместо RuTils::Gilenson::Formatter.
26
31
  #
27
32
  # ==Использование
28
33
  # Быстрее всего - через метод ++gilensize++ для любой строковой переменной
@@ -151,9 +156,8 @@ class RuTils::Gilenson::Formatter
151
156
  :thinsp => "&#8201;", # полукруглая шпация (тонкий пробел)
152
157
  :nob_open => '<span class="nobr">', # открывающий блок без переноса слов
153
158
  :nob_close => '</span>', # закрывающий блок без переноса слов
154
- }
155
-
156
- GLYPHS.freeze
159
+ }.freeze
160
+
157
161
  # Нормальные "типографские" символы в UTF-виде. Браузерами обрабатываются плохонько, поэтому
158
162
  # лучше заменять их на entities.
159
163
  VERBATIM_GLYPHS = {
@@ -181,12 +185,10 @@ class RuTils::Gilenson::Formatter
181
185
  '−' => :minus,
182
186
  ' ' => :thinsp,
183
187
  '″' => :inch,
184
- }
185
- VERBATIM_GLYPHS.freeze #:nodoc:
188
+ }.freeze
186
189
 
187
- # Для маркера мы применяем UTF-BOM чтобы его НЕЛЬЗЯ было перепутать с частью
188
- # любого другого мультибайтного глифа. Thanks to huNter.
189
- REPLACEMENT_MARKER = RuTils::SUBSTITUTION_MARKER.freeze #:nodoc:
190
+ # Метка на которую подменяются вынутые теги
191
+ REPLACEMENT_MARKER = RuTils::SUBSTITUTION_MARKER #:nodoc:
190
192
 
191
193
  # Кто придумал &#147;? Не учите людей плохому...
192
194
  # Привет А.Лебедеву http://www.artlebedev.ru/kovodstvo/62/
@@ -202,8 +204,23 @@ class RuTils::Gilenson::Formatter
202
204
  '150' => :ndash,
203
205
  '151' => :mdash,
204
206
  '153' => :trade,
205
- }
206
- FORBIDDEN_NUMERIC_ENTITIES.freeze #:nodoc:
207
+ }.freeze
208
+
209
+ # All the unicode whitespace
210
+ UNICODE_WHITESPACE = [
211
+ (0x0009..0x000D).to_a, # White_Space # Cc [5] <control-0009>..<control-000D>
212
+ 0x0020, # White_Space # Zs SPACE
213
+ 0x0085, # White_Space # Cc <control-0085>
214
+ 0x00A0, # White_Space # Zs NO-BREAK SPACE
215
+ 0x1680, # White_Space # Zs OGHAM SPACE MARK
216
+ 0x180E, # White_Space # Zs MONGOLIAN VOWEL SEPARATOR
217
+ (0x2000..0x200A).to_a, # White_Space # Zs [11] EN QUAD..HAIR SPACE
218
+ 0x2028, # White_Space # Zl LINE SEPARATOR
219
+ 0x2029, # White_Space # Zp PARAGRAPH SEPARATOR
220
+ 0x202F, # White_Space # Zs NARROW NO-BREAK SPACE
221
+ 0x205F, # White_Space # Zs MEDIUM MATHEMATICAL SPACE
222
+ 0x3000, # White_Space # Zs IDEOGRAPHIC SPACE
223
+ ].flatten.pack("U*").freeze
207
224
 
208
225
  PROTECTED_SETTINGS = [ :raw_output ] #:nodoc:
209
226
 
@@ -225,27 +242,24 @@ class RuTils::Gilenson::Formatter
225
242
  def method_missing(meth, *args) #:nodoc:
226
243
  setting = meth.to_s.gsub(/=$/, '')
227
244
  super(meth, *args) unless @settings.has_key?(setting) #this will pop the exception if we have no such setting
228
-
245
+
229
246
  return (@settings[setting] = args[0])
230
247
  end
231
-
248
+
232
249
  # Обрабатывает text_to_process с сохранением настроек, присвоенных обьекту-форматтеру
233
250
  # Дополнительные аргументы передаются как параметры форматтера и не сохраняются после прогона.
234
251
  def process(text_to_process, *args)
235
252
  @_text = text_to_process
236
253
 
237
- if args.last.is_a?(Hash)
238
- with_configuration(args.last) { self.to_html }
239
- else
240
- self.to_html
241
- end
254
+ args.last.is_a?(Hash) ? with_configuration(args.last) { to_html } : to_html
242
255
  end
243
256
 
244
- # Обрабатывает текст, присвоенный форматтеру при создании и возвращает результат обработки.
245
- def to_html()
257
+ # Обрабатывает текст, присвоенный форматтеру при создании и возвращает результат обработки
258
+ def to_html
246
259
  return '' unless @_text
247
260
 
248
- text = @_text.strip
261
+ # NOTE: strip is Unicode-space aware on 1.9.1, so here we simulate that
262
+ text = @_text.gsub(/[#{UNICODE_WHITESPACE}]\z/, '').gsub(/\A[#{UNICODE_WHITESPACE}]/, '')
249
263
 
250
264
  # -6. Подмухляем таблицу глифов, если нам ее передали
251
265
  glyph_table = glyph.dup
@@ -263,12 +277,12 @@ class RuTils::Gilenson::Formatter
263
277
 
264
278
  # -4. запрет тагов html
265
279
  process_escape_html(text) unless @settings["html"]
266
-
280
+
267
281
  # -3. Никогда (вы слышите?!) не пущать лабуду &#not_correct_number;
268
282
  FORBIDDEN_NUMERIC_ENTITIES.dup.each_pair do | key, rep |
269
283
  text.gsub!(/&##{key};/, self.glyph[rep])
270
284
  end
271
-
285
+
272
286
  # -2. Чистим copy&paste
273
287
  process_copy_paste_clearing(text) if @settings['copypaste']
274
288
 
@@ -489,7 +503,7 @@ class RuTils::Gilenson::Formatter
489
503
  end
490
504
 
491
505
  def process_copy_paste_clearing(text)
492
- VERBATIM_GLYPHS.each {|key,value| text.gsub!(/#{key}/, glyph[value]) }
506
+ VERBATIM_GLYPHS.each {|key,value| text.gsub!(/#{Regexp.escape(key)}/, glyph[value]) }
493
507
  end
494
508
 
495
509
  def process_spacing(text)
@@ -646,11 +660,6 @@ module RuTils::Gilenson::StringFormatting
646
660
  RuTils::Gilenson::Formatter.new(self, args.shift || {}).to_html
647
661
  end
648
662
 
649
- # Форматирует строку с помощью Gilenson::Obsolete. Всe дополнительные опции передаются форматтеру.
650
- def o_gilensize(*args)
651
- opts = args.last.is_a?(Hash) ? args.last : {}
652
- RuTils::Gilenson::Obsolete.new(self, *opts).to_html
653
- end
654
663
  end
655
664
 
656
665
  Object::String.send(:include, RuTils::Gilenson::StringFormatting)