rutils 0.1.9 → 0.2.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.
data/CHANGELOG CHANGED
@@ -1,3 +1,7 @@
1
+ Версия 0.2.0 - 02.04.2007
2
+ * Фикс squeeze в dirify (Сергей Барабаш)
3
+ * Формат даты по умолчанию - %F (Сергей Барабаш)
4
+
1
5
  Версия 0.1.9 - 17.02.2007
2
6
  * Gilenson integration - не съедаем пробелы между тегами при прогоне текста через Textile
3
7
 
@@ -66,17 +66,17 @@ class Time
66
66
  end
67
67
 
68
68
  class Date
69
-
69
+
70
70
  # Inside rails we have date formatting
71
71
  if self.instance_methods.include?('strftime')
72
72
  alias_method :strftime_norutils, :strftime
73
- def strftime(fmt=nil)
73
+ def strftime(fmt='%F')
74
74
  RuTils::DateTime::ru_strftime(fmt, self) if RuTils::overrides_enabled?
75
75
  strftime_norutils(fmt)
76
76
  end
77
77
 
78
78
  else
79
- def strftime(fmt=nil)
79
+ def strftime(fmt='%F')
80
80
  RuTils::DateTime::ru_strftime(fmt, self) if RuTils::overrides_enabled?
81
81
  self.to_time.strftime(fmt)
82
82
  end
data/lib/rutils.rb CHANGED
@@ -5,8 +5,8 @@ module RuTils
5
5
  # Папка, куда установлен модуль RuTils. Нужно чтобы автоматически копировать RuTils в другие приложения.
6
6
  INSTALLATION_DIRECTORY = File.expand_path(File.dirname(__FILE__) + '/../') #:nodoc:
7
7
  MAJOR = 0
8
- MINOR = 1
9
- TINY = 9
8
+ MINOR = 2
9
+ TINY = 0
10
10
 
11
11
  # Версия RuTils
12
12
  VERSION = [MAJOR, MINOR ,TINY].join('.') #:nodoc:
@@ -69,6 +69,6 @@ module RuTils::Transliteration::Simple
69
69
  st.gsub!(/\W/, ' ') #replace non-chars
70
70
  st.gsub!(/(_)$/, '') #trailing underscores
71
71
  st.gsub!(/^(_)/, '') #leading unders
72
- st.strip.translify.gsub(/(\s)/,'-').downcase.squeeze
72
+ st.strip.translify.gsub(/(\s)/,'-').downcase.squeeze('-')
73
73
  end
74
74
  end
@@ -3,6 +3,7 @@ require 'test/unit'
3
3
  require 'rubygems'
4
4
 
5
5
  begin
6
+ require 'action_controller' unless defined?(ActionController)
6
7
  require 'action_view' unless defined?(ActionView)
7
8
  rescue LoadError
8
9
  $skip_rails = true
@@ -6,7 +6,7 @@ require File.dirname(__FILE__) + '/../lib/rutils'
6
6
  class TranslitTest < Test::Unit::TestCase
7
7
 
8
8
  def setup
9
- @string = "Это кусок строки русских букв v peremshku s latinizey i амперсандом (pozor!) & something"
9
+ @string = "Это кусок строки русских букв v peremeshku s latinizey i амперсандом (pozor!) & something"
10
10
  end
11
11
 
12
12
  def test_translify
@@ -16,7 +16,7 @@ class TranslitTest < Test::Unit::TestCase
16
16
  assert_equal "sh", 'ш'.translify
17
17
  assert_equal "SH", 'Ш'.translify
18
18
  assert_equal "ts", 'ц'.translify
19
- assert_equal "Eto kusok stroki russkih bukv v peremshku s latinizey i ampersandom (pozor!) & something", @string.translify
19
+ assert_equal "Eto kusok stroki russkih bukv v peremeshku s latinizey i ampersandom (pozor!) & something", @string.translify
20
20
  assert_equal "Это просто некий текст".translify, "Eto prosto nekiy tekst"
21
21
 
22
22
  assert_equal "NEVEROYATNOE UPUSCHENIE", 'НЕВЕРОЯТНОЕ УПУЩЕНИЕ'.translify
@@ -36,8 +36,10 @@ class TranslitTest < Test::Unit::TestCase
36
36
  # end
37
37
 
38
38
  def test_dirify
39
- assert_equal "eto-kusok-stroki-ruskih-bukv-v-peremshku-s-latinizey-i-ampersandom-pozor-and-something", @string.dirify
40
- assert_equal "esche-ruskiy-tekst", "Еще РусСКий теКст".dirify
39
+ assert_equal "eto-kusok-stroki-russkih-bukv-v-peremeshku-s-latinizey-i-ampersandom-pozor-and-something", @string.dirify
40
+ assert_equal "esche-russkiy-tekst", "Еще РусСКий теКст".dirify
41
+ # dirify не должен съедать парные буквы
42
+ assert_equal "kooperator-poobedal-offlayn", "кооператор пообедал оффлайн".dirify
41
43
  end
42
44
  end
43
45
 
metadata CHANGED
@@ -1,10 +1,10 @@
1
1
  --- !ruby/object:Gem::Specification
2
- rubygems_version: 0.8.11
2
+ rubygems_version: 0.9.2
3
3
  specification_version: 1
4
4
  name: rutils
5
5
  version: !ruby/object:Gem::Version
6
- version: 0.1.9
7
- date: 2007-02-17 00:00:00 +01:00
6
+ version: 0.2.0
7
+ date: 2007-04-03 00:00:00 +02:00
8
8
  summary: Simple processing of russian strings
9
9
  require_paths:
10
10
  - lib
@@ -25,6 +25,7 @@ required_ruby_version: !ruby/object:Gem::Version::Requirement
25
25
  platform: ruby
26
26
  signing_key:
27
27
  cert_chain:
28
+ post_install_message:
28
29
  authors:
29
30
  - Julian "Julik" Tarkhanov
30
31
  files:
@@ -32,7 +33,6 @@ files:
32
33
  - bin/rutilize
33
34
  - test/run_tests.rb
34
35
  - test/t_datetime.rb
35
- - test/t_gilenson.rb
36
36
  - test/t_integration.rb
37
37
  - test/t_pluralize.rb
38
38
  - test/t_rutils_base.rb
@@ -47,7 +47,6 @@ files:
47
47
  - lib/transliteration
48
48
  - lib/countries/countries.rb
49
49
  - lib/datetime/datetime.rb
50
- - lib/gilenson/gilenson.rb
51
50
  - lib/gilenson/gilenson_port.rb
52
51
  - lib/integration/blue_cloth_override.rb
53
52
  - lib/integration/integration.rb
@@ -1,617 +0,0 @@
1
- module RuTils
2
- module Gilenson
3
- # Позволяет возвращать класс форматтера при вызове
4
- # RuTils::Gilenson.new
5
- def self.new(*args) #:nodoc:
6
- RuTils::Gilenson::Formatter.new(*args)
7
- end
8
-
9
- # Загружаем "старый" Гиленсон если он будет нужен
10
- def self.const_missing(const) #:nodoc:
11
- super(const) unless const == :Obsolete
12
- require File.dirname(__FILE__) + '/gilenson_port'
13
- return RuTils::Gilenson::Obsolete
14
- end
15
- end
16
- end
17
-
18
- # ==Что такое Gilenson
19
- # Обработчик типографских символов в HTML согласно общепринятым правилам.
20
- # Посвящается П.Г.Гиленсону[http://www.rudtp.ru/lib.php?book=172], благодаря которому русские правила тех.
21
- # редактуры еще как минимум 20 лет останутся столь-же бессмысленно старомодными и строгими.
22
- #
23
- # Gilenson расставит в тексте "умные" правильные кавычки (русские - для кириллицы, английские - для латиницы),
24
- # заменит "хитрые" пунктуационные символы на entities и отформатирует знаки типа (c), (tm), телефоны и адреса.
25
- #
26
- # Gilenson базируется на коде Typografica[http://pixel-apes.com/typografica] от PixelApes,
27
- # который был приведен к положенному в Ruby стандарту. Основные отличия Gilenson от Typografica на PHP:
28
- # * работа только и полностью в UTF-8 (включая entities, применимые в XML)
29
- # * поддержка "raw"-вывода (символов вместо entities) - текст выводимый GIlenson можно верстать на бумаге
30
- #
31
- # Если вам нужно получать идентичный Typografica вывод, пользуйтесь RuTils::Gilenson::Obsolete
32
- # вместо RuTils::Gilenson::Formatter.
33
- #
34
- # ==Использование
35
- # Быстрее всего - через метод ++gilensize++ для любой строковой переменной
36
- # %{ И вот они таки "приехали"}.gilensize => 'И&#160;вот они&#160;таки &#171;приехали&#187;'
37
- # Все дополнительные настройки в таком случае передаются форматтеру
38
- # %{ И вот они таки "приехали"}.gilensize(:laquo=>false) => 'И&#160;вот они&#160;таки "приехали"'
39
- #
40
- # Если форматтер надо настроить более тонко, можно использовать его и так:
41
- # typ = RuTils::Gilenson.new('Эти "так называемые" великие деятели')
42
- # typ.to_html => 'Эти &#171;так называемые&#187; великие деятели'
43
- #
44
- # или как фильтр
45
- # formatter = RuTils::Gilenson.new
46
- # formatter.configure(:dash=>true)
47
- # for string in strings
48
- # puts formatter.process(string)
49
- # end
50
- #
51
- # ==Настройки
52
- # Настройки регулируются через методы
53
- # formatter.dashglue = true
54
- # или ассоциированным хешем
55
- # formatter.configure!(:dash=>true, :quotes=>false)
56
- #
57
- # Хеш также можно передавать как последний аргумент методам process и to_html,
58
- # в таком случае настройки будут применены только при этом вызове
59
- #
60
- # beautified = formatter.process(my_text, :dash=>true)
61
- #
62
- # В параметры можно подставить также ключ :all чтобы временно включить или выключить все фильтры
63
- #
64
- # beautified = formatter.process(my_text, :all=>true)
65
- #
66
- # Помимо этого можно пользоваться каждым фильтром по отдельности используя метод +apply+
67
- #
68
- # Можно менять глифы, которые форматтер использует для подстановок. К примеру,
69
- # formatter.glyph[:nbsp] = '&nbsp;'
70
- # заставит форматтер расставлять "традиционные" неразрывные пробелы. Именно это - большая глупость,
71
- # но другие глифы заменить может быть нужно.
72
- #
73
- # ==Настройки форматтера
74
- # "inches" - преобразовывать дюймы в знак дюйма;
75
- # "laquo" - кавычки-ёлочки
76
- # "quotes" - кавычки-английские лапки
77
- # "dash" - проставлять короткое тире (150)
78
- # "emdash" - длинное тире двумя минусами (151)
79
- # "initials" - проставлять тонкие шпации в инициалах
80
- # "copypaste" - замена непечатных и "специальных" юникодных символов на entities
81
- # "(c)" - обрабатывать знак копирайта
82
- # "(r)", "(tm)", "(p)", "+-" - спецсимволы, какие - понятно
83
- # "degrees" - знак градуса
84
- # "dashglue", "wordglue" - приклеивание предлогов и дефисов
85
- # "spacing" - запятые и пробелы, перестановка
86
- # "phones" - обработка телефонов
87
- # "html" - при false - запрет использования тагов html
88
- # "de_nobr" - при true все <nobr/> заменяются на <span class="nobr"/>
89
- # "raw_output" - (по умолчанию false) - при true вместо entities выводятся UTF-символы
90
- # "skip_attr" - (по умолчанию false) - при true не отрабатывать типографику в атрибутах тегов (title, alt)
91
- # "skip_code" - (по умолчанию true) - при true не отрабатывать типографику внутри <code/>, <tt/>, CDATA
92
-
93
- class RuTils::Gilenson::Formatter
94
- attr_accessor :glyph
95
-
96
- SETTINGS = {
97
- "inches" => true, # преобразовывать дюймы в знак дюйма;
98
- "laquo" => true, # кавычки-ёлочки
99
- "quotes" => true, # кавычки-английские лапки
100
- "dash" => true, # короткое тире (150)
101
- "emdash" => true, # длинное тире двумя минусами (151)
102
- "initials" => true, # тонкие шпации в инициалах
103
- "copypaste" => false, # замена непечатных и "специальных" юникодных символов на entities
104
- "(c)" => true, # обрабатывать знак копирайта
105
- "(r)" => true,
106
- "(tm)" => true,
107
- "(p)" => true,
108
- "+-" => true, # спецсимволы, какие - понятно
109
- "degrees" => true, # знак градуса
110
- "dashglue" => true, "wordglue" => true, # приклеивание предлогов и дефисов
111
- "spacing" => true, # запятые и пробелы, перестановка
112
- "phones" => true, # обработка телефонов
113
- "html" => true, # разрешение использования тагов html
114
- "de_nobr" => false, # при true все <nobr/> заменяются на <span class="nobr"/>
115
- "raw_output" => false, # выводить UTF-8 вместо entities
116
- "skip_attr" => false, # при true не отрабатывать типографику в атрибутах тегов
117
- "skip_code" => true, # при true не отрабатывать типографику внутри <code/>, <tt/>, CDATA
118
- } #:nodoc:
119
-
120
- # Глифы, использующиеся в подстановках по-умолчанию
121
- GLYPHS = {
122
- :quot => "&#34;", # quotation mark
123
- :amp => "&#38;", # ampersand
124
- :apos => "&#39;", # apos
125
- :gt => "&#62;", # greater-than sign
126
- :lt => "&#60;", # less-than sign
127
- :nbsp => "&#160;", # non-breaking space
128
- :sect => "&#167;", # section sign
129
- :copy => "&#169;", # copyright sign
130
- :laquo => "&#171;", # left-pointing double angle quotation mark = left pointing guillemet
131
- :reg => "&#174;", # registered sign = registered trade mark sign
132
- :deg => "&#176;", # degree sign
133
- :plusmn => "&#177;", # plus-minus sign = plus-or-minus sign
134
- :para => "&#182;", # pilcrow sign = paragraph sign
135
- :middot => "&#183;", # middle dot = Georgian comma = Greek middle dot
136
- :raquo => "&#187;", # right-pointing double angle quotation mark = right pointing guillemet
137
- :ndash => "&#8211;", # en dash
138
- :mdash => "&#8212;", # em dash
139
- :lsquo => "&#8216;", # left single quotation mark
140
- :rsquo => "&#8217;", # right single quotation mark
141
- :ldquo => "&#8220;", # left double quotation mark
142
- :rdquo => "&#8221;", # right double quotation mark
143
- :bdquo => "&#8222;", # double low-9 quotation mark
144
- :bull => "&#8226;", # bullet = black small circle
145
- :hellip => "&#8230;", # horizontal ellipsis = three dot leader
146
- :numero => "&#8470;", # numero
147
- :trade => "&#8482;", # trade mark sign
148
- :minus => "&#8722;", # minus sign
149
- :inch => "&#8243;", # inch/second sign (u0x2033) (не путать с кавычками!)
150
- :thinsp => "&#8201;", # полукруглая шпация (тонкий пробел)
151
- :nob_open => '<nobr>', # открывающий блок без переноса слов
152
- :nob_close => '</nobr>', # открывающий блок без переноса слов
153
- } #:nodoc:
154
-
155
- # Нормальные "типографские" символы в UTF-виде. Браузерами обрабатываются плохонько, поэтому
156
- # лучше заменять их на entities.
157
- VERBATIM_GLYPHS = {
158
- ' ' => :nbsp,# alt+0160 (NBSP here)
159
- '«' => :laquo,
160
- '»' => :raquo,
161
- '§' => :sect,
162
- '©' => :copy,
163
- '®' => :reg,
164
- '°' => :deg,
165
- '±' => :plusmn,
166
- '¶' => :para,
167
- '·' => :middot,
168
- '–' => :ndash,
169
- '—' => :mdash,
170
- '‘' => :lsquo,
171
- '’' => :rsquo,
172
- '“' => :ldquo,
173
- '”' => :rdquo,
174
- '„' => :bdquo,
175
- '•' => :bull,
176
- '…' => :hellip,
177
- '№' => :numero,
178
- '™' => :trade,
179
- '−' => :minus,
180
- ' ' => :thinsp,
181
- '″' => :inch,
182
- } #:nodoc:
183
-
184
- # Для маркера мы применяем invalid UTF-sequence чтобы его НЕЛЬЗЯ было перепутать с частью
185
- # любого другого мультибайтного глифа. Thanks to huNter.
186
- REPLACEMENT_MARKER = RuTils::SUBSTITUTION_MARKER #:nodoc:
187
-
188
- # Кто придумал &#147;? Не учите людей плохому...
189
- # Привет А.Лебедеву http://www.artlebedev.ru/kovodstvo/62/
190
- # Используем символы, потом берем по символам из glyphs форматтера.
191
- # Молодец mash!
192
- FORBIDDEN_NUMERIC_ENTITIES = {
193
- '132' => :bdquo,
194
- '133' => :hellip,
195
- '146' => :apos,
196
- '147' => :ldquo,
197
- '148' => :rdquo,
198
- '149' => :bull,
199
- '150' => :ndash,
200
- '151' => :mdash,
201
- '153' => :trade,
202
- } #:nodoc:
203
-
204
- PROTECTED_SETTINGS = [ :raw_output ] #:nodoc:
205
-
206
- def initialize(*args)
207
- @_text = args[0].is_a?(String) ? args[0] : ''
208
- setup_default_settings!
209
- accept_configuration_arguments!(args.last) if args.last.is_a?(Hash)
210
- end
211
-
212
- # Настраивает форматтер ассоциированным хешем
213
- # formatter.configure!(:dash=>true, :wordglue=>false)
214
- def configure!(*config)
215
- accept_configuration_arguments!(config.last) if config.last.is_a?(Hash)
216
- end
217
-
218
- alias :configure :configure! #Дружественный API
219
-
220
- # Неизвестные методы - настройки. С = - установка ключа, без - получение значения
221
- def method_missing(meth, *args) #:nodoc:
222
- setting = meth.to_s.gsub(/=$/, '')
223
- super(meth, *args) unless @settings.has_key?(setting) #this will pop the exception if we have no such setting
224
-
225
- return (@settings[setting] = args[0])
226
- end
227
-
228
- # Обрабатывает text_to_process с сохранением настроек, присвоенных обьекту-форматтеру
229
- # Дополнительные аргументы передаются как параметры форматтера и не сохраняются после прогона.
230
- def process(text_to_process, *args)
231
- @_text = text_to_process
232
- if args.last.is_a?(Hash)
233
- with_configuration(args.last) { self.to_html }
234
- else
235
- self.to_html
236
- end
237
- end
238
-
239
- # Обрабатывает текст, присвоенный форматтеру при создании и возвращает результат обработки.
240
- def to_html()
241
- return '' unless @_text
242
-
243
- text = @_text.strip
244
-
245
- # -4. запрет тагов html
246
- process_escape_html(text) unless @settings["html"]
247
-
248
- # -3. Никогда (вы слышите?!) не пущать лабуду &#not_correct_number;
249
- FORBIDDEN_NUMERIC_ENTITIES.dup.each_pair do | key, rep |
250
- text.gsub!(/&##{key};/, glyph[rep])
251
- end
252
-
253
- # -2. Чистим copy&paste
254
- process_copy_paste_clearing(text) if @settings['copypaste']
255
-
256
- # -1. Замена &entity_name; на входе ('&nbsp;' => '&#160;' и т.д.)
257
- process_html_entities(text)
258
-
259
- # 0. Вырезаем таги
260
- tags = lift_ignored_elements(text) if @skip_tags
261
-
262
- # 1. Запятые и пробелы
263
- process_spacing(text) if @settings["spacing"]
264
-
265
- # 3. Спецсимволы
266
- # 0. дюймы с цифрами
267
- # заменено на инчи
268
- process_inches(text) if @settings["inches"]
269
-
270
- # 1. лапки
271
- process_quotes(text) if @settings["quotes"]
272
-
273
- # 2. ёлочки
274
- process_laquo(text) if @settings["laquo"]
275
-
276
- # 2b. одновременно ёлочки и лапки
277
- process_compound_quotes(text) if (@settings["quotes"] && @settings["laquo"])
278
-
279
- # 3. тире
280
- process_dash(text) if @settings["dash"]
281
-
282
- # 3a. тире длинное
283
- process_emdash(text) if @settings["emdash"]
284
-
285
- # 5. +/-
286
- process_plusmin(text) if @settings["+-"]
287
-
288
- # 5a. 12^C
289
- process_degrees(text) if @settings["degrees"]
290
-
291
- # 6. телефоны
292
- process_phones(text) if @settings["phones"]
293
-
294
- # 7. Короткие слова и &nbsp;
295
- process_wordglue(text) if @settings["wordglue"]
296
-
297
- # 8. Склейка ласт. Тьфу! дефисов.
298
- process_dashglue(text) if @settings["dashglue"]
299
-
300
- # 8a. Инициалы
301
- process_initials(text) if @settings['initials']
302
-
303
- # 8b. Троеточия
304
- process_ellipsises(text) if @settings["wordglue"]
305
-
306
- # БЕСКОНЕЧНОСТЬ. Вставляем таги обратно.
307
- reinsert_fragments(text, tags) if @skip_tags
308
-
309
- # фуф, закончили.
310
- process_span_instead_of_nobr(text) if @settings["de_nobr"]
311
-
312
- # заменяем entities на истинные символы
313
- process_raw_output(text) if @settings["raw_output"]
314
-
315
- text.strip
316
- end
317
-
318
-
319
- # Применяет отдельный фильтр к text и возвращает результат. Например:
320
- # formatter.apply(:wordglue, "Вот так") => "Вот&#160;так"
321
- # Удобно применять когда вам нужно задействовать отдельный фильтр Гиленсона, но не нужна остальная механика
322
- # Последний аргумент определяет, нужно ли при применении фильтра сохранить в неприкосновенности таги и другие
323
- # игнорируемые фрагменты текста (по умолчанию они сохраняются).
324
- def apply(filter, text, lift_ignored_elements = true)
325
- copy = text.dup
326
- unless lift_ignored_elements
327
- self.send("process_#{filter}".to_sym, copy)
328
- else
329
- lifting_fragments(copy) { self.send("process_#{filter}".to_sym, copy) }
330
- end
331
- copy
332
- end
333
-
334
- private
335
-
336
- def setup_default_settings!
337
- @skip_tags = true;
338
- @ignore = /notypo/ # regex, который игнорируется. Этим надо воспользоваться для обработки pre и code
339
-
340
- @glueleft = ['рис.', 'табл.', 'см.', 'им.', 'ул.', 'пер.', 'кв.', 'офис', 'оф.', 'г.']
341
- @glueright = ['руб.', 'коп.', 'у.е.', 'мин.']
342
-
343
- # Установки можно менять в каждом экземпляре
344
- @settings = SETTINGS.dup
345
-
346
- @mark_tag = REPLACEMENT_MARKER
347
- # Глифы можено подменять в экземпляре форматтера поэтому копируем их из константы
348
- @glyph = GLYPHS.dup
349
-
350
- @phonemasks = [[ /([0-9]{4})\-([0-9]{2})\-([0-9]{2}) ([0-9]{2}):([0-9]{2}):([0-9]{2})/,
351
- /([0-9]{4})\-([0-9]{2})\-([0-9]{2})/,
352
- /(\([0-9\+\-]+\)) ?([0-9]{3})\-([0-9]{2})\-([0-9]{2})/,
353
- /(\([0-9\+\-]+\)) ?([0-9]{2})\-([0-9]{2})\-([0-9]{2})/,
354
- /(\([0-9\+\-]+\)) ?([0-9]{3})\-([0-9]{2})/,
355
- /(\([0-9\+\-]+\)) ?([0-9]{2})\-([0-9]{3})/,
356
- /([0-9]{3})\-([0-9]{2})\-([0-9]{2})/,
357
- /([0-9]{2})\-([0-9]{2})\-([0-9]{2})/,
358
- /([0-9]{1})\-([0-9]{2})\-([0-9]{2})/,
359
- /([0-9]{2})\-([0-9]{3})/,
360
- /([0-9]+)\-([0-9]+)/,
361
- ],[
362
- ':nob_open\1:ndash\2:ndash\3:nbsp\4:\5:\6:nob_close',
363
- ':nob_open\1:ndash\2:ndash\3:nob_close',
364
- ':nob_open\1:nbsp\2:ndash\3:ndash\4:nob_close',
365
- ':nob_open\1:nbsp\2:ndash\3:ndash\4:nob_close',
366
- ':nob_open\1:nbsp\2:ndash\3:nob_close',
367
- ':nob_open\1:nbsp\2:ndash\3:nob_close',
368
- ':nob_open\1:ndash\2:ndash\3:nob_close',
369
- ':nob_open\1:ndash\2:ndash\3:nob_close',
370
- ':nob_open\1:ndash\2:ndash\3:nob_close',
371
- ':nob_open\1:ndash\2:nob_close',
372
- ':nob_open\1:ndash\2:nob_close'
373
- ]]
374
- end
375
-
376
- # Позволяет получить процедуру, при вызове возвращающую значение глифа
377
- def lookup(glyph_to_lookup)
378
- return Proc.new { self.glyph[glyph_to_lookup] }
379
- end
380
-
381
- # Подставляет "символы" (двоеточие + имя глифа) на нужное значение глифа заданное в данном форматтере
382
- def substitute_glyphs_in_string(str)
383
- re = str.dup
384
- @glyph.each_pair do | key, subst |
385
- re.gsub!(":#{key.to_s}", subst)
386
- end
387
- re
388
- end
389
-
390
- # Выполняет блок, временно включая настройки переданные в +hash+
391
- def with_configuration(hash, &block)
392
- old_settings, old_glyphs = @settings.dup, @glyph.dup
393
- accept_configuration_arguments!(hash)
394
- txt = yield
395
- @settings, @glyph = old_settings, old_glyphs
396
-
397
- return txt
398
- end
399
-
400
- def accept_configuration_arguments!(args_hash)
401
-
402
- # Специальный случай - :all=>true|false
403
- if args_hash.has_key?(:all)
404
- if args_hash[:all]
405
- @settings.each_pair {|k, v| @settings[k] = true unless PROTECTED_SETTINGS.include?(k.to_sym)}
406
- else
407
- @settings.each_pair {|k, v| @settings[k] = false unless PROTECTED_SETTINGS.include?(k.to_sym)}
408
- end
409
- else
410
-
411
- # Кинуть ошибку если настройка нам неизвестна
412
- unknown_settings = args_hash.keys.collect{|k|k.to_s} - @settings.keys.collect { |k| k.to_s }
413
- raise RuTils::Gilenson::UnknownSetting, unknown_settings if unknown_settings.any?
414
-
415
- args_hash.each_pair do | key, value |
416
- @settings[key.to_s] = (value ? true : false)
417
- end
418
- end
419
- end
420
-
421
- # Вынимает игнорируемые фрагменты и заменяет их маркером, выполняет переданный блок и вставляет вынутое на место
422
- def lifting_fragments(text, &block)
423
- lifted = lift_ignored_elements(text)
424
- yield
425
- reinsert_fragments(text, lifted)
426
- end
427
-
428
- #Вынимает фрагменты из текста и возвращает массив с фрагментами
429
- def lift_ignored_elements(text)
430
- # re = /<\/?[a-z0-9]+("+ # имя тага
431
- # "\s+("+ # повторяющая конструкция: хотя бы один разделитель и тельце
432
- # "[a-z]+("+ # атрибут из букв, за которым может стоять знак равенства и потом
433
- # "=((\'[^\']*\')|(\"[^\"]*\")|([0-9@\-_a-z:\/?&=\.]+))"+ #
434
- # ")?"+
435
- # ")?"+
436
- # ")*\/?>|\xA2\xA2[^\n]*?==/i;
437
-
438
- re_skipcode = '((<(code|tt)[ >](.*?)<\/(code|tt)>)|(<!\[CDATA\[(.*?)\]\]>))|' if @settings['skip_code']
439
- re = /(#{re_skipcode}<\/?[a-z0-9]+(\s+([a-z]+(=((\'[^\']*\')|(\"[^\"]*\")|([0-9@\-_a-z:\/?&=\.]+)))?)?)*\/?>)/uim
440
- tags = text.scan(re).map{ |tag| tag[0] } # первая группа!
441
- text.gsub!(re, @mark_tag) #маркер тега, мы используем Invalid UTF-sequence для него
442
- return tags
443
- end
444
-
445
- def reinsert_fragments(text, fragments)
446
- fragments.each do |fragment|
447
- fragment.gsub!(/ (href|src|data)=((?:(\')([^\']*)(\'))|(?:(\")([^\"]*)(\")))/uim) do
448
- " #{$1}=" + $2.gsub(/&(?!(#0*38)|(amp);)/, self.glyph[:amp])
449
- end # unless @settings['raw_output'] -- делать это надо всегда (mash)
450
-
451
- unless @settings['skip_attr']
452
- fragment.gsub!(/ (title|alt)=((?:(\')([^\']*)(\'))|(?:(\")([^\"]*)(\")))/uim) do
453
- " #{$1}=#{$3}" + self.process($4.to_s) + "#{$5}#{$6}" + self.process($7.to_s) + "#{$8}"
454
- end
455
- end
456
- text.sub!(@mark_tag, fragment)
457
- end
458
- end
459
-
460
- ### Имплементации фильтров
461
- def process_html_entities(text)
462
- self.glyph.each { |key, value| text.gsub!(/&#{key};/, value)}
463
- end
464
-
465
- def process_initials(text)
466
- initials = /([А-Я])[\.]{1,2}[\s]*?([А-Я])[\.]*[\s]*?([А-Я])([а-я])/u
467
- replacement = substitute_glyphs_in_string('\1.\2.:thinsp\3\4')
468
- text.gsub!(initials, replacement)
469
- end
470
-
471
- def process_copy_paste_clearing(text)
472
- VERBATIM_GLYPHS.each {|key,value| text.gsub!(/#{key}/, glyph[value]) }
473
- end
474
-
475
- def process_spacing(text)
476
- text.gsub!( /(\s*)([,]*)/sui, '\2\1');
477
- text.gsub!( /(\s*)([\.?!]*)(\s*[ЁА-ЯA-Z])/su, '\2\1\3');
478
- end
479
-
480
- def process_dashglue(text)
481
- text.gsub!( /([a-zа-яА-Я0-9]+(\-[a-zа-яА-Я0-9]+)+)/ui, glyph[:nob_open]+'\1'+glyph[:nob_close])
482
- end
483
-
484
- def process_escape_html(text)
485
- text.gsub!(/&/, self.glyph[:amp])
486
- text.gsub!(/</, self.glyph[:lt])
487
- text.gsub!(/>/, self.glyph[:gt])
488
- end
489
-
490
- def process_span_instead_of_nobr(text)
491
- text.gsub!(/<nobr>/, '<span class="nobr">')
492
- text.gsub!(/<\/nobr>/, '</span>')
493
- end
494
-
495
- def process_dash(text)
496
- text.gsub!( /(\s|;)\-(\s)/ui, '\1'+self.glyph[:ndash]+'\2')
497
- end
498
-
499
- def process_emdash(text)
500
- text.gsub!( /(\s|;)\-\-(\s)/ui, '\1'+self.glyph[:mdash]+'\2')
501
- # 4. (с)
502
- text.gsub!(/\([сСcC]\)((?=\w)|(?=\s[0-9]+))/u, self.glyph[:copy]) if @settings["(c)"]
503
- # 4a. (r)
504
- text.gsub!( /\(r\)/ui, '<sup>'+self.glyph[:reg]+'</sup>') if @settings["(r)"]
505
-
506
- # 4b. (tm)
507
- text.gsub!( /\(tm\)|\(тм\)/ui, self.glyph[:trade]) if @settings["(tm)"]
508
- # 4c. (p)
509
- text.gsub!( /\(p\)/ui, self.glyph[:sect]) if @settings["(p)"]
510
- end
511
-
512
- def process_ellipsises(text)
513
- text.gsub!( '...', self.glyph[:hellip])
514
- end
515
-
516
- def process_laquo(text)
517
- text.gsub!( /\"\"/ui, self.glyph[:quot]*2);
518
- text.gsub!( /(^|\s|#{@mark_tag}|>|\()\"((#{@mark_tag})*[~0-9ёЁA-Za-zА-Яа-я\-:\/\.])/ui, '\1'+self.glyph[:laquo]+'\2');
519
- _text = '""';
520
- until _text == text do
521
- _text = text;
522
- text.gsub!( /(#{self.glyph[:laquo]}([^\"]*)[ёЁA-Za-zА-Яа-я0-9\.\-:\/\?\!](#{@mark_tag})*)\"/sui,
523
- '\1'+self.glyph[:raquo])
524
- end
525
- end
526
-
527
- def process_quotes(text)
528
- text.gsub!( /\"\"/ui, self.glyph[:quot]*2)
529
- text.gsub!( /\"\.\"/ui, self.glyph[:quot]+"."+self.glyph[:quot])
530
- _text = '""';
531
- until _text == text do
532
- _text = text.dup
533
- text.gsub!( /(^|\s|#{@mark_tag}|>)\"([0-9A-Za-z\'\!\s\.\?\,\-\&\;\:\_\#{@mark_tag}]+(\"|#{self.glyph[:rdquo]}))/ui, '\1'+self.glyph[:ldquo]+'\2')
534
- #this doesnt work in-place. somehow.
535
- text.gsub!( /(#{self.glyph[:ldquo]}([A-Za-z0-9\'\!\s\.\?\,\-\&\;\:\#{@mark_tag}\_]*).*[A-Za-z0-9][\#{@mark_tag}\?\.\!\,]*)\"/ui, '\1'+self.glyph[:rdquo])
536
- end
537
- end
538
-
539
- def process_compound_quotes(text)
540
- text.gsub!(/(#{self.glyph[:ldquo]}(([A-Za-z0-9'!\.?,\-&;:]|\s|#{@mark_tag})*)#{self.glyph[:laquo]}(.*)#{self.glyph[:raquo]})#{self.glyph[:raquo]}/ui,'\1'+self.glyph[:rdquo]);
541
- end
542
-
543
- def process_degrees(text)
544
- text.gsub!( /-([0-9])+\^([FCС])/, self.glyph[:ndash]+'\1'+self.glyph[:deg]+'\2') #deg
545
- text.gsub!( /\+([0-9])+\^([FCС])/, '+\1'+self.glyph[:deg]+'\2')
546
- text.gsub!( /\^([FCС])/, self.glyph[:deg]+'\1')
547
- end
548
-
549
- def process_wordglue(text)
550
- text.replace(" " + text + " ")
551
- _text = " " + text + " "
552
-
553
- until _text == text
554
- _text = text
555
- text.gsub!( /(\s+)([a-zа-яА-Я]{1,2})(\s+)([^\\s$])/ui, '\1\2'+self.glyph[:nbsp]+'\4')
556
- text.gsub!( /(\s+)([a-zа-яА-Я]{3})(\s+)([^\\s$])/ui, '\1\2'+self.glyph[:nbsp]+'\4')
557
- end
558
-
559
- text.gsub!(/(\s+)([a-zа-яА-Я]{1,2}[\)\]\!\?,\.;]{0,3}\s$)/ui, self.glyph[:nbsp]+'\2')
560
-
561
- @glueleft.each { | i | text.gsub!( /(\s)(#{i})(\s+)/sui, '\1\2' + self.glyph[:nbsp]) }
562
-
563
- @glueright.each { | i | text.gsub!( /(\s)(#{i})(\s+)/sui, self.glyph[:nbsp]+'\2\3') }
564
-
565
- text.strip!
566
- end
567
-
568
- def process_phones(text)
569
- @phonemasks[0].each_with_index do |pattern, i|
570
- replacement = substitute_glyphs_in_string(@phonemasks[1][i])
571
- text.gsub!(pattern, replacement)
572
- end
573
- end
574
-
575
- def process_inches(text)
576
- text.gsub!(/\s([0-9]{1,2}([\.,][0-9]{1,2})?)\"/ui, ' \1'+self.glyph[:inch])
577
- end
578
-
579
- def process_plusmin(text)
580
- text.gsub!(/[^+]\+\-/ui, self.glyph[:plusmn])
581
- end
582
-
583
- # Подменяет все юникодные entities в тексте на истинные UTF-8-символы
584
- def process_raw_output(text)
585
- # Все глифы
586
- @glyph.values.each do | entity |
587
- next unless entity =~ /^&#(\d+);/
588
- text.gsub!(/#{entity}/, entity_to_raw_utf8(entity))
589
- end
590
- end
591
-
592
- # Конвертирует юникодные entities в UTF-8-codepoints
593
- def entity_to_raw_utf8(entity)
594
- entity =~ /^&#(\d+);/
595
- $1 ? [$1.to_i].pack("U") : entity
596
- end
597
- end #end Gilenson
598
-
599
- # Выбрасывается если форматтеру задается неизвестная настройка
600
- class RuTils::Gilenson::UnknownSetting < RuntimeError
601
- end
602
-
603
- module RuTils::Gilenson::StringFormatting
604
- # Форматирует строку с помощью Gilenson::Formatter. Все дополнительные опции передаются форматтеру.
605
- def gilensize(*args)
606
- opts = args.last.is_a?(Hash) ? args.last : {}
607
- RuTils::Gilenson::Formatter.new(self, *opts).to_html
608
- end
609
-
610
- # Форматирует строку с помощью Gilenson::Obsolete. Всe дополнительные опции передаются форматтеру.
611
- def o_gilensize(*args)
612
- opts = args.last.is_a?(Hash) ? args.last : {}
613
- RuTils::Gilenson::Obsolete.new(self, *opts).to_html
614
- end
615
- end
616
-
617
- Object::String.send(:include, RuTils::Gilenson::StringFormatting)
data/test/t_gilenson.rb DELETED
@@ -1,324 +0,0 @@
1
- $KCODE = 'u'
2
- require 'test/unit'
3
- require File.dirname(__FILE__) + '/../lib/rutils'
4
-
5
-
6
- # Cюда идут наши тесты типографа. Мы содержим их отдельно поскольку набор тестов Типографицы нами не контролируется.
7
- # Когда у рутилей появятся собственные баги под каждый баг следует завести тест
8
- class GilensonOwnTest < Test::Unit::TestCase
9
-
10
- def setup
11
- @gilenson = RuTils::Gilenson::Formatter.new
12
- end
13
-
14
- def test_tag_lift
15
- assert_equal "Вот&#160;такие<tag some='foo>' /> <tagmore></tagmore> дела", "Вот такие<tag some='foo>' /> <tagmore></tagmore> дела".gilensize
16
- end
17
-
18
- def test_byte_pass
19
- assert_equal '<p>Теперь добираться до офиса Студии автортранспортом стало удобнее. ' +
20
- 'Для этого мы разместили в разделе <a href="#">«Контакт»</a> окно вебкамеры, ' +
21
- 'которая непрерывно транслирует дорожную обстановку на Садовом кольце по адресу Земляной Вал, 23. <br>' +
22
- 'Удачной дороги! </p>',
23
- '<p>Теперь добираться до офиса Студии автортранспортом стало удобнее. ' +
24
- 'Для этого мы разместили в разделе <a href="#">«Контакт»</a> окно вебкамеры, ' +
25
- 'которая непрерывно транслирует дорожную обстановку на Садовом кольце по адресу Земляной Вал, 23. <br>' +
26
- 'Удачной дороги! </p>'.gilensize
27
- end
28
-
29
- def test_phones
30
- assert_equal '<nobr>3&#8211;12&#8211;30</nobr>', '3-12-30'.gilensize
31
- assert_equal '<nobr>12&#8211;34&#8211;56</nobr>', '12-34-56'.gilensize
32
- assert_equal '<nobr>88&#8211;25&#8211;04</nobr>', '88-25-04'.gilensize
33
- assert_equal '+7 <nobr>(99284)&#160;65&#8211;818</nobr>', '+7 (99284) 65-818'.gilensize
34
- assert_equal '<nobr>725&#8211;01&#8211;10</nobr>', '725-01-10'.gilensize
35
- end
36
-
37
- def test_address
38
- assert_equal 'табл.&#160;2, рис.&#160;2.10', 'табл. 2, рис. 2.10'.gilensize
39
- assert_equal 'офис&#160;415, оф.340, д.5, ул.&#160;Народной Воли, пл. Малышева', 'офис 415, оф.340, д.5, ул. Народной Воли, пл. Малышева'.gilensize
40
- end
41
-
42
- def test_html_entities_replace
43
- assert_equal '&#34; &#38; &#39; &#62; &#60; &#160; &#167; &#169; &#171; &#174; &#176; &#177; &#183; &#187; &#8211; &#8212; &#8216; &#8217; &#8220; &#8221; &#8222; &#8226; &#8230; &#8482; &#8722;', '&quot; &amp; &apos; &gt; &lt; &nbsp; &sect; &copy; &laquo; &reg; &deg; &plusmn; &middot; &raquo; &ndash; &mdash; &lsquo; &rsquo; &ldquo; &rdquo; &bdquo; &bull; &hellip; &trade; &minus;'.gilensize
44
- end
45
-
46
- def test_ugly_entities_replace1 # not_correct_number
47
- assert_equal '&#8222; &#8230; &#39; &#8220; &#8221; &#8226; &#8211; &#8212; &#8482;', '&#132; &#133; &#146; &#147; &#148; &#149; &#150; &#151; &#153;'.gilensize
48
- end
49
-
50
- def test_specials
51
- assert_equal '&#169; 2002, &#169; 2003, &#169; 2004, &#169; 2005 &#8212; тоже без&#160;пробелов: &#169;2002, &#169;Кукуц. однако: варианты (а) и&#160;(с)', '(с) 2002, (С) 2003, (c) 2004, (C) 2005 -- тоже без пробелов: (с)2002, (c)Кукуц. однако: варианты (а) и (с)'.gilensize
52
- assert_equal '+5&#176;С, +7&#176;C, &#8211;5&#176;F', '+5^С, +17^C, -275^F'.gilensize
53
- assert_equal 'об&#160;этом подробнее &#8212; читай &#167;25', 'об этом подробнее -- читай (p)25'.gilensize
54
- assert_equal 'один же&#160;минус &#8211; краткое тире', 'один же минус - краткое тире'.gilensize
55
- assert_equal 'Sharpdesign&#8482;, Microsoft<sup>&#174;</sup>', 'Sharpdesign(tm), Microsoft(r)'.gilensize
56
- end
57
-
58
- def test_breaking
59
- assert_equal 'скажи, мне, ведь не&#160;даром! Москва, клеймённая пожаром. Французу отдана', 'скажи ,мне, ведь не даром !Москва, клеймённая пожаром .Французу отдана'.gilensize
60
- assert_equal 'so&#160;be it, my&#160;liege. Tiny dwellers roam thru midnight! Hell raised, the&#160;Balrog is&#160;hiding in&#160;your backyard!', 'so be it ,my liege .Tiny dwellers roam thru midnight !Hell raised, the Balrog is hiding in your backyard!'.gilensize
61
- assert_equal 'при&#160;установке командой строки в&#160;?page=help <nobr>бла-бла-бла-бла</nobr>', 'при установке командой строки в ?page=help бла-бла-бла-бла'.gilensize
62
- assert_equal 'как&#160;интересно будет переноситься со&#160;строки на&#160;строку <nobr>что-то</nobr> разделённое дефисом, ведь дефис тот&#160;тоже ведь из&#160;наших. <nobr>Какие-то</nobr> браузеры думают, что&#160;следует переносить и&#160;его&#8230;', 'как интересно будет переноситься со строки на строку что-то разделённое дефисом, ведь дефис тот тоже ведь из наших. Какие-то браузеры думают, что следует переносить и его...'.gilensize
63
- end
64
-
65
- def test_quotes
66
- assert_equal 'english &#8220;quotes&#8221; should be&#160;quite like this', 'english "quotes" should be quite like this'.gilensize
67
- assert_equal 'русские же&#160;&#171;оформляются&#187; подобным образом', 'русские же "оформляются" подобным образом'.gilensize
68
- assert_equal 'кавычки &#171;расставлены&#187; &#8220;in a&#160;chaotic order&#8221;', 'кавычки "расставлены" "in a chaotic order"'.gilensize
69
- assert_equal 'диагональ моего монитора &#8212; 17&#8243;, а&#160;размер пениса &#8212; 1,5&#8243;', 'диагональ моего монитора -- 17", а размер пениса -- 1,5"'.gilensize
70
- assert_equal 'в&#160;толщину, &#171;вложенные &#8220;quotes&#8221; вот&#160;так&#187;, &#8220;or it&#160;&#171;будет вложено&#187; elsewhere&#8221;', 'в толщину, "вложенные "quotes" вот так", "or it "будет вложено" elsewhere"'.gilensize
71
- assert_equal '&#8220;complicated &#171;кавычки&#187;, &#171;странные &#8220;includements&#8221; кавычек&#187;', '"complicated "кавычки", "странные "includements" кавычек"'.gilensize
72
- assert_equal '&#8220;double &#8220;quotes&#8221;', '"double "quotes"'.gilensize
73
- assert_equal '&#171;дважды вложенные &#171;кавычки&#187;', '"дважды вложенные "кавычки"'.gilensize
74
- assert_equal '&#171;01/02/03&#187;, дискеты в&#160;5.25&#8243;', '"01/02/03", дискеты в 5.25"'.gilensize
75
- assert_equal 'после троеточия правая кавычка &#8212; &#171;Вот&#8230;&#187;', 'после троеточия правая кавычка -- "Вот..."'.gilensize
76
- assert_equal 'setlocale(LC_ALL, &#8220;ru_RU.UTF8&#8221;);', 'setlocale(LC_ALL, "ru_RU.UTF8");'.gilensize
77
- assert_equal '&#8220;read, write, delete&#8221; с&#160;флагом &#8220;only_mine&#8221;', '"read, write, delete" с флагом "only_mine"'.gilensize
78
- assert_equal '&#171;Двоеточие:&#187;, &#171;такую умную тему должен писать чувак умеющий скрипты скриптить.&#187;', '"Двоеточие:", "такую умную тему должен писать чувак умеющий скрипты скриптить."'.gilensize
79
- assert_equal '(&#171;Вики != HTML&#187; &#8212; &#171;Вики != HTML&#187; &#8212; (&#171;всякая чушь&#187;))', '("Вики != HTML" -- "Вики != HTML" -- ("всякая чушь"))'.gilensize
80
- assert_equal '&#171;фигня123&#187;, &#8220;fignya123&#8221;', '"фигня123", "fignya123"'.gilensize
81
- # assert_equal '&#171;сбалансированные &#171;кавычки<!--notypo--><!--/notypo--> (четыре в&#160;конце) &#8212; связано с&#160;синтаксисом ваки', '"сбалансированные "кавычки"""" (четыре в конце) -- связано с синтаксисом ваки'.gilensize
82
- assert_equal '&#171;несбалансированные &#171;кавычки&#34;&#34;" (три в&#160;конце) &#8212; связано с&#160;синтаксисом ваки', '"несбалансированные "кавычки""" (три в конце) -- связано с синтаксисом ваки'.gilensize
83
- assert_equal '&#171;разноязыкие quotes&#187;', '"разноязыкие quotes"'.gilensize
84
- assert_equal '&#171;multilanguage кавычки&#187;', '"multilanguage кавычки"'.gilensize
85
- end
86
-
87
- def test_additional_quote_cases
88
- assert_equal "&#171;И это&#160;называется языком?&#187;, &#8212; таков был&#160;его вопрос",
89
- %q{ "И это называется языком?", -- таков был его вопрос }.gilensize
90
-
91
- assert_equal "&#171;Он &#8212; сволочь!&#187;, сказал&#160;я",
92
- %q{ "Он -- сволочь!", сказал я }.gilensize
93
- end
94
-
95
- def test_initials
96
- assert_equal 'Это&#160;нам сказал П.И.&#8201;Петров', 'Это нам сказал П. И. Петров'.gilensize
97
-
98
- assert_equal "А&#160;Ефимов&#8230;",
99
- @gilenson.process("А Ефимов...")
100
-
101
- assert_equal "Обратился за&#160;ПО. К&#160;негодяям.",
102
- @gilenson.process("Обратился за ПО. К негодяям.")
103
-
104
- assert_equal "ГО&#160;Самарской обл.",
105
- @gilenson.process("ГО Самарской обл.")
106
-
107
- assert_equal "ГОР&#160;Самарской обл.",
108
- @gilenson.process("ГОР Самарской обл.")
109
-
110
- assert_equal "КОШМАР Самарской обл.",
111
- @gilenson.process("КОШМАР Самарской обл.")
112
-
113
- assert_equal "УФПС Самарской обл.",
114
- @gilenson.process("УФПС Самарской обл.")
115
-
116
- end
117
-
118
- def test_nbsp_last_letters
119
- assert_equal "сказал&#160;я", "сказал я".gilensize
120
- assert_equal "сказал&#160;я!", "сказал я!".gilensize
121
- assert_equal "сказал&#160;я?", "сказал я?".gilensize
122
- assert_equal "сказал&#160;я&#8230;", "сказал я...".gilensize
123
- assert_equal "сказал&#160;он&#8230;", "сказал он...".gilensize
124
- assert_equal "сказали&#160;мы?..", "сказали мы?..".gilensize
125
- assert_equal "сказали&#160;мы?!", "сказали мы?!".gilensize
126
- assert_equal "сказали мы?!!!", "сказали мы?!!!".gilensize
127
- assert_equal "сказали нам", "сказали нам".gilensize
128
- assert_equal "(сказали&#160;им)", "(сказали им)".gilensize
129
- end
130
-
131
- def test_marker_bypass
132
- assert_equal "<p><nobr>МИЭЛЬ-Недвижимость</nobr></p>", "<p>МИЭЛЬ-Недвижимость</p>".gilensize
133
- end
134
-
135
- def test_skip_code
136
- @gilenson.configure!(:all => true, :skip_code => true)
137
-
138
- assert_equal "<code>Скип -- скип!</code>",
139
- @gilenson.process("<code>Скип -- скип!</code>")
140
-
141
- assert_equal '<code attr="test -- attr">Скип -- скип!</code>',
142
- @gilenson.process('<code attr="test -- attr">Скип -- скип!</code>')
143
-
144
- assert_equal "<tt>Скип -- скип!</tt> test &#8212; test <tt attr='test -- attr'>Скип -- скип!</tt>",
145
- @gilenson.process("<tt>Скип -- скип!</tt> test -- test <tt attr='test -- attr'>Скип -- скип!</tt>")
146
-
147
- assert_equal "<tt>Скип -- скип!</tt><tt>Скип -- скип!</tt> &#8212; <code attr='test -- attr'>Скип -- скип!</code>",
148
- @gilenson.process("<tt>Скип -- скип!</tt><tt>Скип -- скип!</tt> -- <code attr='test -- attr'>Скип -- скип!</code>")
149
-
150
- assert_equal "<ttt>Скип &#8212; скип!</tt>",
151
- @gilenson.process("<ttt>Скип -- скип!</tt>")
152
-
153
- assert_equal "<tt>Скип &#8212; скип!</ttt>",
154
- @gilenson.process("<tt>Скип -- скип!</ttt>")
155
-
156
- assert_equal "Ах, &#8212; <code>var x = j // -- тест</code>",
157
- @gilenson.process("Ах, -- <code>var x = j // -- тест</code>")
158
-
159
- assert_equal "<![CDATA[ CDATA -- ]]> &#8212; CDATA",
160
- @gilenson.process("<![CDATA[ CDATA -- ]]> -- CDATA")
161
-
162
- assert_equal "<![CDATA[ CDATA -- >] -- CDATA ]]> &#8212; <![CDATA[ CDATA ]> -- CDATA ]]>",
163
- @gilenson.process("<![CDATA[ CDATA -- >] -- CDATA ]]> -- <![CDATA[ CDATA ]> -- CDATA ]]>")
164
-
165
- assert_equal "<![CDATA[ CDATA -- >] -- CDATA ]]> &#8212; <![CDATA[ CDATA ]> -- CDATA ]]> &#8212; CDATA ]]>",
166
- @gilenson.process("<![CDATA[ CDATA -- >] -- CDATA ]]> -- <![CDATA[ CDATA ]> -- CDATA ]]> -- CDATA ]]>")
167
-
168
- @gilenson.configure!(:skip_code => false)
169
-
170
- assert_equal "Ах, &#8212; <code>var x&#160;= j&#160;// &#8212; тест</code>",
171
- @gilenson.process("Ах, -- <code>var x = j // -- тест</code>")
172
- end
173
-
174
- def test_skip_attr
175
- @gilenson.configure!(:skip_attr => true)
176
-
177
- assert_equal "<a href='#' attr='смотри -- смотри' title='test -- me' alt=\"смотри -- смотри\">just &#8212; test</a>",
178
- @gilenson.process("<a href='#' attr='смотри -- смотри' title='test -- me' alt=\"смотри -- смотри\">just -- test</a>")
179
-
180
- assert_equal 'мы&#160;напишем title="test &#8212; me" и&#160;alt=\'test &#8212; me\', вот',
181
- @gilenson.process('мы напишем title="test -- me" и alt=\'test -- me\', вот')
182
-
183
- @gilenson.configure!(:skip_attr => false)
184
-
185
- assert_equal "<a href='#' attr='смотри -- смотри' title='test &#8212;&#160;me' alt=\"смотри &#8212; смотри\">just &#8212; test</a>",
186
- @gilenson.process("<a href='#' attr='смотри -- смотри' title='test -- me' alt=\"смотри -- смотри\">just -- test</a>")
187
-
188
- assert_equal 'мы&#160;напишем title="test &#8212; me" и&#160;alt=\'test &#8212; me\', вот',
189
- @gilenson.process('мы напишем title="test -- me" и alt=\'test -- me\', вот')
190
- end
191
-
192
- def test_escape_html
193
- assert_equal "Используйте &#38; вместо &#38;amp;",
194
- @gilenson.process("Используйте &#38; вместо &#38;amp;")
195
-
196
- @gilenson.configure!(:html => false)
197
-
198
- assert_equal "&#38;#38; &#8212; &#38;amp; &#60;code/&#62; &#60;some_tag&#62;таги не&#160;пройдут!&#60;/some_tag&#62;. Ну&#160;и?..",
199
- @gilenson.process("&#38; -- &amp; <code/> <some_tag>таги не пройдут!</some_tag>. Ну и?..")
200
-
201
- assert_equal "Используйте &#38;#38; вместо &#38;amp;",
202
- @gilenson.process("Используйте &#38; вместо &amp;")
203
-
204
- end
205
-
206
- def test_ampersand_in_urls
207
-
208
- @gilenson.configure!(:html=>false)
209
-
210
- assert_equal "&#60;a href='test?test5=5&#38;#38;test6=6'&#62;test&#38;#38;&#60;/a&#62;",
211
- @gilenson.process("<a href='test?test5=5&#38;test6=6'>test&#38;</a>")
212
-
213
- @gilenson.configure!(:html=>true)
214
-
215
- assert_equal "<a href='test?test7=7&#38;test8=8'>test&#38;</a>",
216
- @gilenson.process("<a href='test?test7=7&#38;test8=8'>test&#38;</a>")
217
-
218
- assert_equal "<a href='test?test9=9&#038;test10=10'>test&#038;</a>",
219
- @gilenson.process("<a href='test?test9=9&#038;test10=10'>test&#038;</a>")
220
-
221
- assert_equal "<a href='test?test11=11&#38;test12=12'>test&</a>",
222
- @gilenson.process("<a href='test?test11=11&test12=12'>test&</a>")
223
-
224
- assert_equal "<a href='test?test12=12&#38;'>test</a>",
225
- @gilenson.process("<a href='test?test12=12&amp;'>test</a>")
226
-
227
- assert_equal "<a href='test?x=1&#38;y=2' title='&#38;-amp, &#8230;-hellip'>test</a>",
228
- @gilenson.process("<a href='test?x=1&y=2' title='&#38;-amp, &#8230;-hellip'>test</a>")
229
-
230
- assert_equal "<a href='test?x=3&#38;#039;y=4'>test</a>",
231
- @gilenson.process("<a href='test?x=3&#039;y=4'>test</a>")
232
-
233
-
234
- @gilenson.glyph[:amp] = '&amp;'
235
-
236
- assert_equal "<a href='test?test11=11&amp;test12=12'>test&</a>",
237
- @gilenson.process("<a href='test?test11=11&test12=12'>test&</a>")
238
-
239
- assert_equal "<a href='test?test13=13&amp;test14=14'>test&</a>",
240
- @gilenson.process("<a href='test?test13=13&amp;test14=14'>test&</a>")
241
-
242
- assert_equal "<a href='test?test15=15&amp;amppp;test16=16'>test&</a>",
243
- @gilenson.process("<a href='test?test15=15&amppp;test16=16'>test&</a>")
244
-
245
- end
246
- end
247
-
248
-
249
- class GilensonConfigurationTest < Test::Unit::TestCase
250
- def setup
251
- @gilenson = RuTils::Gilenson::Formatter.new
252
- end
253
-
254
- def test_settings_as_tail_arguments
255
-
256
- assert_equal "Ну&#160;и куда вот&#160;&#8212; да&#160;туда!",
257
- @gilenson.process("Ну и куда вот -- да туда!")
258
-
259
- assert_equal "Ну и куда вот &#8212; да туда!",
260
- @gilenson.process("Ну и куда вот -- да туда!", :dash => false, :dashglue => false, :wordglue => false)
261
-
262
- assert_equal "Ну&#160;и куда вот&#160;&#8212; да&#160;туда!",
263
- @gilenson.process("Ну и куда вот -- да туда!")
264
-
265
- @gilenson.configure!(:dash => false, :dashglue => false, :wordglue => false)
266
-
267
- assert_equal "Ну и куда вот &#8212; да туда!",
268
- @gilenson.process("Ну и куда вот -- да туда!")
269
-
270
- @gilenson.configure!(:all => true)
271
-
272
- assert_equal "Ну&#160;и куда вот&#160;&#8212; да&#160;туда!",
273
- @gilenson.process("Ну и куда вот -- да туда!")
274
-
275
- @gilenson.configure!(:all => false)
276
-
277
- assert_equal "Ну и куда вот -- да туда!",
278
- @gilenson.process("Ну и куда вот -- да туда!")
279
- end
280
-
281
- def test_glyph_override
282
- assert_equal 'скажи, мне, ведь не&#160;даром! Москва, клеймённая пожаром. Французу отдана',
283
- @gilenson.process('скажи ,мне, ведь не даром !Москва, клеймённая пожаром .Французу отдана')
284
-
285
- @gilenson.glyph[:nbsp] = '&nbsp;'
286
- assert_equal 'скажи, мне, ведь не&nbsp;даром! Москва, клеймённая пожаром. Французу отдана',
287
- @gilenson.process('скажи ,мне, ведь не даром !Москва, клеймённая пожаром .Французу отдана')
288
- end
289
-
290
- def test_ugly_entities_replace2 # copy&paste
291
- @gilenson.configure!(:copypaste => true)
292
- assert_equal '&#160; &#171; &#187; &#167; &#169; &#174; &#176; &#177; &#182; &#183; &#8211; &#8212; &#8216; &#8217; &#8220; &#8221; &#8222; &#8226; &#8230; &#8470; &#8482; &#8722; &#8201; &#8243;', @gilenson.process('  « » § © ® ° ± ¶ · – — ‘ ’ “ ” „ • … № ™ −   ″')
293
- end
294
-
295
- def test_raise_on_unknown_setting
296
- assert_raise(RuTils::Gilenson::UnknownSetting) { @gilenson.configure!(:bararara => true) }
297
- end
298
-
299
- def test_raw_utf8_output
300
- @gilenson.configure!(:raw_output=>true)
301
- assert_equal '&#38442; Это просто «кавычки»',
302
- @gilenson.process('&#38442; Это просто "кавычки"')
303
- end
304
-
305
- def test_configure_alternate_names
306
- assert @gilenson.configure(:raw_output=>true)
307
- assert @gilenson.configure!(:raw_output=>true)
308
- end
309
-
310
- end
311
-
312
- # class TypograficaTrakoEntries < Test::Unit::TestCase
313
- # def test_cpp
314
- # assert_equal "C++-API", "C++-API".gilensize
315
- # end
316
- #
317
- # def test_symmetricity # http://pixel-apes.com/typografica/trako/12
318
- # assert_equal "&#171;Справка&#160;09&#187;", '"Справка 09"'.gilensize
319
- # end
320
- #
321
- # def test_paths # http://pixel-apes.com/typografica/trako/13
322
- # assert_equal '&#171;c:\www\sites\&#187;', '"c:\www\sites\"'.gilensize
323
- # end
324
- # end