rutils 0.2.3 → 0.2.4

Sign up to get free protection for your applications and to get access to all the features.
@@ -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