rutils 0.2.5 → 1.0.0
Sign up to get free protection for your applications and to get access to all the features.
- data/History.txt +9 -0
- data/Manifest.txt +22 -15
- data/README.txt +54 -41
- data/Rakefile.rb +9 -26
- data/TODO.txt +2 -3
- data/WHAT_HAS_CHANGED.txt +44 -0
- data/init.rb +20 -2
- data/lib/countries/countries.rb +1 -0
- data/lib/datetime/datetime.rb +1 -0
- data/lib/gilenson/bluecloth_extra.rb +7 -0
- data/lib/gilenson/gilenson.rb +39 -30
- data/lib/gilenson/helper.rb +34 -0
- data/lib/gilenson/maruku_extra.rb +19 -0
- data/lib/gilenson/rdiscount_extra.rb +7 -0
- data/lib/gilenson/redcloth_extra.rb +42 -0
- data/lib/integration/integration.rb +1 -11
- data/lib/integration/rails_date_helper_override.rb +103 -105
- data/lib/integration/rails_pre_filter.rb +1 -0
- data/lib/pluralizer/pluralizer.rb +14 -13
- data/lib/rutils.rb +15 -25
- data/lib/transliteration/bidi.rb +15 -72
- data/lib/transliteration/simple.rb +1 -0
- data/lib/transliteration/transliteration.rb +11 -9
- data/lib/version.rb +5 -0
- data/test/extras/integration_bluecloth.rb +13 -0
- data/test/extras/integration_maruku.rb +15 -0
- data/test/{test_rails_filter.rb → extras/integration_rails_filter.rb} +3 -1
- data/test/extras/integration_rails_gilenson_helpers.rb +80 -0
- data/test/{test_rails_helpers.rb → extras/integration_rails_helpers.rb} +15 -3
- data/test/extras/integration_rdiscount.rb +15 -0
- data/test/extras/integration_redcloth3.rb +18 -0
- data/test/extras/integration_redcloth4.rb +19 -0
- data/test/run_tests.rb +2 -2
- data/test/{t_datetime.rb → test_datetime.rb} +1 -2
- data/test/{t_gilenson.rb → test_gilenson.rb} +15 -6
- data/test/test_integration.rb +22 -0
- data/test/test_integration_flag.rb +18 -0
- data/test/{t_pluralize.rb → test_pluralize.rb} +3 -2
- data/test/{t_rutils_base.rb → test_rutils_base.rb} +1 -0
- data/test/test_transliteration.rb +53 -0
- metadata +35 -26
- data/lib/integration/blue_cloth_override.rb +0 -12
- data/lib/integration/red_cloth_four.rb +0 -24
- data/lib/integration/red_cloth_override.rb +0 -7
- data/lib/integration/red_cloth_three.rb +0 -25
- data/test/t_integration.rb +0 -46
- data/test/t_transliteration.rb +0 -109
- data/test/test_integration_bluecloth.rb +0 -17
- data/test/test_integration_redcloth3.rb +0 -31
- 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/
|
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/
|
26
|
-
test/
|
27
|
-
test/
|
28
|
-
test/
|
29
|
-
test/
|
30
|
-
test/
|
31
|
-
test/
|
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
|
-
"
|
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
|
-
== Интеграция с
|
112
|
+
== Интеграция с RedCloth и BlueCloth
|
129
113
|
|
130
114
|
RuTils в первую очередь задумывался как максимально "прозрачный" механизм
|
131
|
-
обработки русского текста в контексте Rails-приложения.
|
132
|
-
|
115
|
+
обработки русского текста в контексте Rails-приложения.
|
116
|
+
|
117
|
+
Если вы используете RuTils в одном приложении со стандартными форматтерами (RedCloth, BlueCloth...) воспользуйтесь
|
118
|
+
дополнительными модулями которые выводят отформатированный Гиленсоном результат работы форматтеров
|
119
|
+
|
120
|
+
Gilenson определяет следующие дополнительные форматтеры (они работают так же как и их базовые классы)
|
133
121
|
|
134
|
-
|
135
|
-
|
136
|
-
|
137
|
-
|
122
|
+
* RuTils::Gilenson::RedClothExtra
|
123
|
+
* RuTils::Gilenson::BlueClothExtra
|
124
|
+
* RuTils::Gilenson::RDiscountExtra
|
125
|
+
* RuTils::Gilenson::MarukuExtra
|
138
126
|
|
139
|
-
|
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
|
-
|
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
|
-
|
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
|
-
*
|
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://
|
224
|
+
Ruby-кода (http://github.com/chneukirchen/styleguide/tree/master)
|
211
225
|
|
212
226
|
При сравнении текстовых сегментов, прошедших через хитрые форматтеры пользуйтесь assert_equal_cp
|
213
227
|
- он внятно покажет вам какой символ отличается в двух строках (иначе будете вслепую искать
|
214
228
|
разницу между двумя разными пробелами, например)
|
215
229
|
|
216
|
-
Если вы хотите участвовать в разработке RuTils
|
217
|
-
trunk.
|
230
|
+
Если вы хотите участвовать в разработке RuTils - fork us on GitHub
|
218
231
|
|
219
|
-
|
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/
|
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
|
-
|
25
|
-
DOCOPTS = %w(--webcvs=http://
|
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
@@ -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.
|
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)
|
data/lib/countries/countries.rb
CHANGED
data/lib/datetime/datetime.rb
CHANGED
data/lib/gilenson/gilenson.rb
CHANGED
@@ -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 => " ", # полукруглая шпация (тонкий пробел)
|
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
|
-
#
|
188
|
-
|
189
|
-
REPLACEMENT_MARKER = RuTils::SUBSTITUTION_MARKER.freeze #:nodoc:
|
190
|
+
# Метка на которую подменяются вынутые теги
|
191
|
+
REPLACEMENT_MARKER = RuTils::SUBSTITUTION_MARKER #:nodoc:
|
190
192
|
|
191
193
|
# Кто придумал “? Не учите людей плохому...
|
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
|
-
|
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
|
-
|
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
|
-
|
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)
|