rutils 0.2.3 → 0.2.4

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.
@@ -1,321 +0,0 @@
1
- module RuTils
2
- module Gilenson
3
- end
4
- end
5
-
6
- # Это - прямой порт Тыпографицы от pixelapes.
7
- # Настройки можно регулировать через методы, т.е.
8
- #
9
- # typ = RuTils::Gilenson::Obsolete.new('Эти "так называемые" великие деятели')
10
- # typ.html = false => "false"
11
- # typ.dash = true => "true"
12
- # typ.to_html => 'Эти «так называемые» великие деятели'
13
- # Ни обновляться ни поддерживаться этот модуль более не будет.
14
- class RuTils::Gilenson::Obsolete
15
- def initialize(text, *args)
16
- @_text = text
17
- @skip_tags = true;
18
- @p_prefix = "<p class=typo>";
19
- @p_postfix = "</p>";
20
- @a_soft = true;
21
- @indent_a = "images/z.gif width=25 height=1 border=0 alt=\'\' align=top />" # <->
22
- @indent_b = "images/z.gif width=50 height=1 border=0 alt=\'\' align=top />" # <-->
23
- @fixed_size = 80 # максимальная ширина
24
- @ignore = /notypo/ # regex, который игнорируется. Этим надо воспользоваться для обработки pre и code
25
-
26
- @de_nobr = true;
27
-
28
- @phonemasks = [[ /([0-9]{4})\-([0-9]{2})\-([0-9]{2}) ([0-9]{2}):([0-9]{2}):([0-9]{2})/,
29
- /([0-9]{4})\-([0-9]{2})\-([0-9]{2})/,
30
- /(\([0-9\+\-]+\)) ?([0-9]{3})\-([0-9]{2})\-([0-9]{2})/,
31
- /(\([0-9\+\-]+\)) ?([0-9]{2})\-([0-9]{2})\-([0-9]{2})/,
32
- /(\([0-9\+\-]+\)) ?([0-9]{3})\-([0-9]{2})/,
33
- /(\([0-9\+\-]+\)) ?([0-9]{2})\-([0-9]{3})/,
34
- /([0-9]{3})\-([0-9]{2})\-([0-9]{2})/,
35
- /([0-9]{2})\-([0-9]{2})\-([0-9]{2})/,
36
- /([0-9]{1})\-([0-9]{2})\-([0-9]{2})/,
37
- /([0-9]{2})\-([0-9]{3})/,
38
- /([0-9]+)\-([0-9]+)/,
39
- ],[
40
- '<nobr>\1&ndash;\2&ndash;\3&nbsp;\4:\5:\6</nobr>',
41
- '<nobr>\1&ndash;\2&ndash;\3</nobr>',
42
- '<nobr>\1&nbsp;\2&ndash;\3&ndash;\4</nobr>',
43
- '<nobr>\1&nbsp;\2&ndash;\3&ndash;\4</nobr>',
44
- '<nobr>\1&nbsp;\2&ndash;\3</nobr>',
45
- '<nobr>\1&nbsp;\2&ndash;\3</nobr>',
46
- '<nobr>\1&ndash;\2&ndash;\3</nobr>',
47
- '<nobr>\1&ndash;\2&ndash;\3</nobr>',
48
- '<nobr>\1&ndash;\2&ndash;\3</nobr>',
49
- '<nobr>\1&ndash;\2</nobr>',
50
- '<nobr>\1&ndash;\2</nobr>'
51
- ]]
52
-
53
- @glueleft = ['рис.', 'табл.', 'см.', 'им.', 'ул.', 'пер.', 'кв.', 'офис', 'оф.', 'г.']
54
- @glueright = ['руб.', 'коп.', 'у.е.', 'мин.']
55
-
56
- @settings = {
57
- "inches" => true, # преобразовывать дюймы в &quot;
58
- "laquo" => true, # кавычки-ёлочки
59
- "farlaquo" => false, # кавычки-ёлочки для фара (знаки "больше-меньше")
60
- "quotes" => true, # кавычки-английские лапки
61
- "dash" => true, # короткое тире (150)
62
- "emdash" => true, # длинное тире двумя минусами (151)
63
- "(c)" => true,
64
- "(r)" => true,
65
- "(tm)" => true,
66
- "(p)" => true,
67
- "+-" => true, # спецсимволы, какие - понятно
68
- "degrees" => true, # знак градуса
69
- "<-->" => true, # отступы $Indent*
70
- "dashglue" => true, "wordglue" => true, # приклеивание предлогов и дефисов
71
- "spacing" => true, # запятые и пробелы, перестановка
72
- "phones" => true, # обработка телефонов
73
- "fixed" => false, # подгон под фиксированную ширину
74
- "html" => false # запрет тагов html
75
- }
76
- # irrelevant - indentation with images
77
- @indent_a = "<!--indent-->"
78
- @indent_b = "<!--indent-->"
79
-
80
- @mark_tag = "\xF0\xF0\xF0\xF0" # Подстановочные маркеры тегов
81
- @mark_ignored = "\201" # Подстановочные маркеры неизменяемых групп
82
- end
83
-
84
-
85
- # Proxy unknown method calls as setting switches. Methods with = will set settings, methods without - fetch them
86
- def method_missing(meth, *args) #:nodoc:
87
- setting = meth.to_s.gsub(/=$/, '')
88
- super(meth, *args) unless @settings.has_key?(setting) #this will pop the exception if we have no such setting
89
-
90
- return @settings[meth.to_s] if setting == meth.to_s
91
- return (@settings[meth.to_s] = args[0])
92
- end
93
-
94
-
95
- def to_html(no_paragraph = false)
96
-
97
- text = @_text
98
-
99
- # -2. игнорируем ещё регексп
100
- ignored = []
101
-
102
-
103
- text.scan(@ignore) do |result|
104
- ignored << result
105
- end
106
-
107
- text.gsub!(@ignore, @mark_ignored) # маркер игнора
108
-
109
- # -1. запрет тагов html
110
- text.gsub!(/&/, '&amp;') if @settings["html"]
111
-
112
-
113
- # 0. Вырезаем таги
114
- # проблема на самом деле в том, на что похожи таги.
115
- # вариант 1, простой (закрывающий таг) </abcz>
116
- # вариант 2, простой (просто таг) <abcz>
117
- # вариант 3, посложней <abcz href="abcz">
118
- # вариант 4, простой (просто таг) <abcz />
119
- # вариант 5, вакка \xA2\xA2...== нафиг нафиг
120
- # самый сложный вариант - это когда в параметре тага встречается вдруг символ ">"
121
- # вот он: <abcz href="abcz>">
122
- # как работает вырезание? введём спецсимвол. Да, да, спецсимвол.
123
- # нам он ещё вопьётся =)
124
- # заменим все таги на спец.символ, запоминая одновременно их в массив.
125
- # и будем верить, что спец.символы в дикой природе не встречаются.
126
-
127
- tags = []
128
- if (@skip_tags)
129
- # re = /<\/?[a-z0-9]+("+ # имя тага
130
- # "\s+("+ # повторяющая конструкция: хотя бы один разделитель и тельце
131
- # "[a-z]+("+ # атрибут из букв, за которым может стоять знак равенства и потом
132
- # "=((\'[^\']*\')|(\"[^\"]*\")|([0-9@\-_a-z:\/?&=\.]+))"+ #
133
- # ")?"+
134
- # ")?"+
135
- # ")*\/?>|\xA2\xA2[^\n]*?==/i;
136
-
137
- # re = /<\/?[a-z0-9]+(\s+([a-z]+(=((\'[^\']*\')|(\"[^\"]*\")|([0-9@\-_a-z:\/?&=\.]+)))?)?)*\/?>|\xA2\xA2[^\n]*?==/ui
138
-
139
- re = /(<\/?[a-z0-9]+(\s+([a-z]+(=((\'[^\']*\')|(\"[^\"]*\")|([0-9@\-_a-z:\/?&=\.]+)))?)?)*\/?>)/ui
140
-
141
- # по-хорошему атрибуты тоже нужно типографить. Или не нужно? бугага...
142
-
143
- tags = text.scan(re).map{|tag| tag[0] }
144
- # match = "&lt;" + match if @settings["html"]
145
- text.gsub!(re, @mark_tag) #маркер тега, мы используем Invalid UTF-sequence для него
146
-
147
- # puts "matched #{tags.size} tags"
148
- end
149
-
150
- # 1. Запятые и пробелы
151
- if @settings["spacing"]
152
- text.gsub!( /(\s*)([,]*)/sui, '\2\1');
153
- text.gsub!( /(\s*)([\.?!]*)(\s*[ЁА-ЯA-Z])/su, '\2\1\3');
154
- end
155
-
156
- # 2. Разбиение на строки длиной не более ХХ символов
157
- # --- для ваки не портировано ---
158
- # --- для ваки не портировано ---
159
-
160
- # 3. Спецсимволы
161
- # 0. дюймы с цифрами
162
- text.gsub!(/\s([0-9]{1,2}([\.,][0-9]{1,2})?)\"/ui, ' \1&quot;') if @settings["inches"]
163
-
164
- # 1. лапки
165
- if (@settings["quotes"])
166
- text.gsub!( /\"\"/ui, "&quot;&quot;")
167
- text.gsub!( /\"\.\"/ui, "&quot;.&quot;")
168
- _text = '""';
169
- while _text != text do
170
- _text = text
171
- text.gsub!( /(^|\s|\201|\xF0\xF0\xF0\xF0|>)\"([0-9A-Za-z\'\!\s\.\?\,\-\&\;\:\_\xF0\xF0\xF0\xF0\201]+(\"|&#148;))/ui, '\1&#147;\2')
172
- #this doesnt work in-place. somehow.
173
- text = text.gsub( /(\&\#147\;([A-Za-z0-9\'\!\s\.\?\,\-\&\;\:\xF0\xF0\xF0\xF0\201\_]*).*[A-Za-z0-9][\xF0\xF0\xF0\xF0\201\?\.\!\,]*)\"/ui, '\1&#148;')
174
- end
175
- end
176
-
177
- # 2. ёлочки
178
- if @settings["laquo"]
179
- text.gsub!( /\"\"/ui, "&quot;&quot;");
180
- text.gsub!( /(^|\s|\201|\xF0\xF0\xF0\xF0|>|\()\"((\201|\xF0\xF0\xF0\xF0)*[~0-9ёЁA-Za-zА-Яа-я\-:\/\.])/ui, "\\1&laquo;\\2");
181
- # nb: wacko only regexp follows:
182
- text.gsub!( /(^|\s|\201|\xF0\xF0\xF0\xF0|>|\()\"((\201|\xF0\xF0\xF0\xF0|\/&nbsp;|\/|\!)*[~0-9ёЁA-Za-zА-Яа-я\-:\/\.])/ui, "\\1&laquo;\\2")
183
- _text = "\"\"";
184
- while (_text != text) do
185
- _text = text;
186
- text.gsub!( /(\&laquo\;([^\"]*)[ёЁA-Za-zА-Яа-я0-9\.\-:\/](\201|\xF0\xF0\xF0\xF0)*)\"/sui, "\\1&raquo;")
187
- # nb: wacko only regexps follows:
188
- text.gsub!( /(\&laquo\;([^\"]*)[ёЁA-Za-zА-Яа-я0-9\.\-:\/](\201|\xF0\xF0\xF0\xF0)*\?(\201|\xF0\xF0\xF0\xF0)*)\"/sui, "\\1&raquo;")
189
- text.gsub!( /(\&laquo\;([^\"]*)[ёЁA-Za-zА-Яа-я0-9\.\-:\/](\201|\xF0\xF0\xF0\xF0|\/|\!)*)\"/sui, "\\1&raquo;")
190
- end
191
- end
192
-
193
-
194
- # 2b. одновременно ёлочки и лапки
195
- if (@settings["quotes"] && (@settings["laquo"] or @settings["farlaquo"]))
196
- text.gsub!(/(\&\#147;\;(([A-Za-z0-9'!\.?,\-&;:]|\s|\xF0\xF0\xF0\xF0|\201)*)&laquo;(.*)&raquo;)&raquo;/ui,"\\1&#148;");
197
- end
198
-
199
-
200
- # 3. тире
201
- if (@settings["dash"])
202
- text.gsub!( /(\s|;)\-(\s)/ui, "\\1&ndash;\\2")
203
- end
204
-
205
-
206
- # 3a. тире длинное
207
- if (@settings["emdash"])
208
- text.gsub!( /(\s|;)\-\-(\s)/ui, "\\1&mdash;\\2")
209
- # 4. (с)
210
- text.gsub!(/\([сСcC]\)((?=\w)|(?=\s[0-9]+))/u, "&copy;") if @settings["(c)"]
211
- # 4a. (r)
212
- text.gsub!( /\(r\)/ui, "<sup>&#174;</sup>") if @settings["(r)"]
213
-
214
- # 4b. (tm)
215
- text.gsub!( /\(tm\)|\(тм\)/ui, "&#153;") if @settings["(tm)"]
216
- # 4c. (p)
217
- text.gsub!( /\(p\)/ui, "&#167;") if @settings["(p)"]
218
- end
219
-
220
-
221
- # 5. +/-
222
- text.gsub!(/[^+]\+\-/ui, "&#177;") if @settings["+-"]
223
-
224
-
225
- # 5a. 12^C
226
- if @settings["degrees"]
227
- text.gsub!( /-([0-9])+\^([FCС])/, "&ndash;\\1&#176;\\2")
228
- text.gsub!( /\+([0-9])+\^([FCС])/, "+\\1&#176;\\2")
229
- text.gsub!( /\^([FCС])/, "&#176;\\1")
230
- end
231
-
232
-
233
- # 6. телефоны
234
- if @settings["phones"]
235
- @phonemasks[0].each_with_index do |v, i|
236
- text.gsub!(v, @phonemasks[1][i])
237
- end
238
- end
239
-
240
-
241
- # 7. Короткие слова и &nbsp;
242
- if (@settings["wordglue"])
243
-
244
- text = " " + text + " ";
245
- _text = " " + text + " ";
246
- until _text == text
247
- _text = text
248
- text.gsub!( /(\s+)([a-zа-яА-Я]{1,2})(\s+)([^\\s$])/ui, '\1\2&nbsp;\4')
249
- text.gsub!( /(\s+)([a-zа-яА-Я]{3})(\s+)([^\\s$])/ui, '\1\2&nbsp;\4')
250
- end
251
-
252
- for i in @glueleft
253
- text.gsub!( /(\s)(#{i})(\s+)/sui, '\1\2&nbsp;')
254
- end
255
-
256
- for i in @glueright
257
- text.gsub!( /(\s)(#{i})(\s+)/sui, '&nbsp;\2\3')
258
- end
259
- end
260
-
261
-
262
-
263
- # 8. Склейка ласт. Тьфу! дефисов.
264
- text.gsub!( /([a-zа-яА-Я0-9]+(\-[a-zа-яА-Я0-9]+)+)/ui, '<nobr>\1</nobr>') if @settings["dashglue"]
265
-
266
-
267
- # 9. Макросы
268
-
269
-
270
-
271
- # 10. Переводы строк
272
- # --- для ваки не портировано ---
273
- # --- для ваки не портировано ---
274
-
275
-
276
- # БЕСКОНЕЧНОСТЬ. Вставляем таги обратно.
277
- # if (@skip_tags)
278
- # text = text.split("\xF0\xF0\xF0\xF0").join
279
- #
280
-
281
- tags.each do |tag|
282
- text.sub!(@mark_tag, tag)
283
- end
284
-
285
- # i = 0
286
- # text.gsub!(@mark_tag) {
287
- # i + 1
288
- # tags[i-1]
289
- # }
290
-
291
- # text = text.split("\xF0\xF0\xF0\xF0")
292
- #puts "reinserted #{i} tags"
293
- #
294
- # end
295
-
296
-
297
- #ext.gsub!("a", '')
298
- # raise "Text still has tag markers!" if text.include?("a")
299
-
300
- # БЕСКОНЕЧНОСТЬ-2. вставляем ещё сигнорированный регексп
301
- #
302
- # if @ignore
303
- # ignored.each { | tag | text.sub!(@mark_ignored, tag) }
304
- # end
305
-
306
- # raise "Text still has ignored markers!" if text.include?("\201")
307
-
308
- # БОНУС: прокручивание ссылок через A(...)
309
- # --- для ваки не портировано ---
310
- # --- для ваки не портировано ---
311
-
312
- # фуф, закончили.
313
- # text.gsub!(/<nobr>/, "<span class=\"nobr\">").gsub(/<\/nobr>/, "</span>") if (@de_nobr)
314
-
315
- # text.gsub!(/<nobr>/, "<span class=\"nobr\">").gsub(/<\/nobr>/, "</span>") if (@de_nobr)
316
-
317
- text.gsub(/(\s)+$/, "").gsub(/^(\s)+/, "")
318
-
319
- end
320
-
321
- end
@@ -1,57 +0,0 @@
1
- $KCODE = 'u'
2
- require 'test/unit'
3
- require File.dirname(__FILE__) + '/../lib/rutils'
4
-
5
- # Тесты Гиленсона - обычный набор тестов к Тыпографице с сайта pixel-apes. Все "наши" тесты Гиленсона идут в другой test case!
6
- class TypograficaComplianceTest < Test::Unit::TestCase
7
-
8
- def test_phones
9
- assert_equal '<nobr>3&ndash;12&ndash;30</nobr>', '3-12-30'.o_gilensize
10
- assert_equal '<nobr>12&ndash;34&ndash;56</nobr>', '12-34-56'.o_gilensize
11
- assert_equal '<nobr>88&ndash;25&ndash;04</nobr>', '88-25-04'.o_gilensize
12
- assert_equal '+7 <nobr>(99284)&nbsp;65&ndash;818</nobr>', '+7 (99284) 65-818'.o_gilensize
13
- assert_equal '<nobr>725&ndash;01&ndash;10</nobr>', '725-01-10'.o_gilensize
14
- end
15
-
16
- def test_address
17
- assert_equal 'табл.&nbsp;2, рис.&nbsp;2.10', 'табл. 2, рис. 2.10'.o_gilensize
18
- assert_equal 'офис&nbsp;415, оф.340, д.5, ул.&nbsp;Народной Воли, пл. Малышева', 'офис 415, оф.340, д.5, ул. Народной Воли, пл. Малышева'.o_gilensize
19
- end
20
-
21
- def test_specials
22
- assert_equal '&copy; 2002, &copy; 2003, &copy; 2004, &copy; 2005 &mdash; тоже без&nbsp;пробелов: &copy;2002, &copy;Кукуц. однако: варианты (а) и&nbsp;(с)', '(с) 2002, (С) 2003, (c) 2004, (C) 2005 -- тоже без пробелов: (с)2002, (c)Кукуц. однако: варианты (а) и (с)'.o_gilensize
23
- assert_equal '+5&#176;С, +7&#176;C, &ndash;5&#176;F', '+5^С, +17^C, -275^F'.o_gilensize
24
- assert_equal 'об&nbsp;этом подробнее &mdash; читай &#167;25', 'об этом подробнее -- читай (p)25'.o_gilensize
25
- assert_equal 'один же&nbsp;минус &ndash; краткое тире', 'один же минус - краткое тире'.o_gilensize
26
- assert_equal 'Sharpdesign&#153;, Microsoft<sup>&#174;</sup>', 'Sharpdesign(tm), Microsoft(r)'.o_gilensize
27
- end
28
-
29
- def test_breaking
30
- assert_equal 'скажи, мне, ведь не&nbsp;даром! Москва, клеймённая пожаром. Французу отдана', 'скажи ,мне, ведь не даром !Москва, клеймённая пожаром .Французу отдана'.o_gilensize
31
- assert_equal 'so&nbsp;be it, my&nbsp;liege. Tiny dwellers roam thru midnight! Hell raised, the&nbsp;Balrog is&nbsp;hiding in&nbsp;your backyard!', 'so be it ,my liege .Tiny dwellers roam thru midnight !Hell raised, the Balrog is hiding in your backyard!'.o_gilensize
32
- assert_equal 'при&nbsp;установке командой строки в&nbsp;?page=help <nobr>бла-бла-бла-бла</nobr>', 'при установке командой строки в ?page=help бла-бла-бла-бла'.o_gilensize
33
- assert_equal 'как&nbsp;интересно будет переноситься со&nbsp;строки на&nbsp;строку <nobr>что-то</nobr> разделённое дефисом, ведь дефис тот&nbsp;тоже ведь из&nbsp;наших. <nobr>Какие-то</nobr> браузеры думают, что&nbsp;следует переносить и&nbsp;его...', 'как интересно будет переноситься со строки на строку что-то разделённое дефисом, ведь дефис тот тоже ведь из наших. Какие-то браузеры думают, что следует переносить и его...'.o_gilensize
34
- end
35
-
36
- def test_quotes
37
- assert_equal 'english &#147;quotes&#148; should be&nbsp;quite like this', 'english "quotes" should be quite like this'.o_gilensize
38
- assert_equal 'русские же&nbsp;&laquo;оформляются&raquo; подобным образом', 'русские же "оформляются" подобным образом'.o_gilensize
39
- assert_equal 'кавычки &laquo;расставлены&raquo; &#147;in a&nbsp;chaotic order&#148;', 'кавычки "расставлены" "in a chaotic order"'.o_gilensize
40
- assert_equal 'диагональ моего монитора &mdash; 17&quot;, а&nbsp;размер пениса &mdash; 1,5&quot;', 'диагональ моего монитора -- 17", а размер пениса -- 1,5"'.o_gilensize
41
- assert_equal 'в&nbsp;толщину, &laquo;вложенные &#147;quotes&#148; вот&nbsp;так&raquo;, &#147;or it&nbsp;&laquo;будет вложено&raquo; elsewhere&#148;', 'в толщину, "вложенные "quotes" вот так", "or it "будет вложено" elsewhere"'.o_gilensize
42
- assert_equal '&#147;complicated &laquo;кавычки&raquo;, &laquo;странные &#147;includements&#148; кавычек&raquo;', '"complicated "кавычки", "странные "includements" кавычек"'.o_gilensize
43
- assert_equal '&#147;double &#147;quotes&#148;', '"double "quotes"'.o_gilensize
44
- assert_equal '&laquo;дважды вложенные &laquo;кавычки&raquo;', '"дважды вложенные "кавычки"'.o_gilensize
45
- assert_equal '&laquo;01/02/03&raquo;, дискеты в&nbsp;5.25&quot;', '"01/02/03", дискеты в 5.25"'.o_gilensize
46
- assert_equal 'после троеточия правая кавычка &mdash; &laquo;Вот...&raquo;', 'после троеточия правая кавычка -- "Вот..."'.o_gilensize
47
- assert_equal 'setlocale(LC_ALL, &#147;ru_RU.UTF8&#148;);', 'setlocale(LC_ALL, "ru_RU.UTF8");'.o_gilensize
48
- assert_equal '&#147;read, write, delete&#148; с&nbsp;флагом &#147;only_mine&#148;', '"read, write, delete" с флагом "only_mine"'.o_gilensize
49
- assert_equal '&laquo;Двоеточие:&raquo;, &laquo;такую умную тему должен писать чувак умеющий скрипты скриптить.&raquo;', '"Двоеточие:", "такую умную тему должен писать чувак умеющий скрипты скриптить."'.o_gilensize
50
- assert_equal '(&laquo;Вики != HTML&raquo; &mdash; &laquo;Вики != HTML&raquo; &mdash; (&laquo;всякая чушь&raquo;))', '("Вики != HTML" -- "Вики != HTML" -- ("всякая чушь"))'.o_gilensize
51
- assert_equal '&laquo;фигня123&raquo;, &#147;fignya123&#148;', '"фигня123", "fignya123"'.o_gilensize
52
- # assert_equal '&laquo;сбалансированные &laquo;кавычки<!--notypo--><!--/notypo--> (четыре в&nbsp;конце) &mdash; связано с&nbsp;синтаксисом ваки', '"сбалансированные "кавычки"""" (четыре в конце) -- связано с синтаксисом ваки'.o_gilensize
53
- assert_equal '&laquo;несбалансированные &laquo;кавычки&quot;&quot;" (три в&nbsp;конце) &mdash; связано с&nbsp;синтаксисом ваки', '"несбалансированные "кавычки""" (три в конце) -- связано с синтаксисом ваки'.o_gilensize
54
- assert_equal '&laquo;разноязыкие quotes&raquo;', '"разноязыкие quotes"'.o_gilensize
55
- assert_equal '&laquo;multilanguage кавычки&raquo;', '"multilanguage кавычки"'.o_gilensize
56
- end
57
- end