jeanny 0.85 → 0.86
Sign up to get free protection for your applications and to get access to all the features.
- data/README +11 -1
- data/lib/jeanny/engine.rb +90 -6
- data/lib/jeanny/sugar.rb +2 -0
- metadata +2 -2
data/README
CHANGED
@@ -22,4 +22,14 @@ Usage:
|
|
22
22
|
|
23
23
|
group :html, :title => 'replacing in template files' do
|
24
24
|
replace :in => 'serp/static/*.html'
|
25
|
-
end
|
25
|
+
end
|
26
|
+
|
27
|
+
|
28
|
+
===О чём речь?===
|
29
|
+
Jeanny — библиотека для обфускации имен css классов. Следует учесть, что это именно библиотека, а не отдельная тулза, т.е. jeanny сама по себе ничего не делает.
|
30
|
+
Чтобы заставить её работать, необходимо написать скрипт в котором будет указано, что и где она (jeanny) должна делать.
|
31
|
+
|
32
|
+
Библиотека написана на Ruby, следовательно на "машине" должен быть установлен его интерпретатор. На MacOS X все установлено по-умолчанию.
|
33
|
+
В unix-like операционных системах тоже можно легко установить Ruby (TODO: написать как устанавливать). Для Windows существует One-click installer.
|
34
|
+
|
35
|
+
===Установка===
|
data/lib/jeanny/engine.rb
CHANGED
@@ -64,12 +64,13 @@ module Jeanny
|
|
64
64
|
# Метод для замены классов
|
65
65
|
def replace data, type
|
66
66
|
|
67
|
-
fail "Тип блока не понятный" unless [:js, :css, :html, :plain].include? type
|
67
|
+
fail "Тип блока не понятный" unless [:js, :css, :html, :tt2, :plain].include? type
|
68
68
|
fail "nil Ololo" if data.nil?
|
69
69
|
|
70
70
|
code = case type
|
71
71
|
when :js then JSCode
|
72
72
|
when :css then CSSCode
|
73
|
+
when :tt2 then TT2Template
|
73
74
|
when :html then HTMLCode
|
74
75
|
when :plain then PlainCode
|
75
76
|
end
|
@@ -377,8 +378,8 @@ module Jeanny
|
|
377
378
|
end
|
378
379
|
|
379
380
|
# Находим аттрибуты с именем "class"
|
380
|
-
#
|
381
|
-
#
|
381
|
+
# TODO: Надо находить не просто "class=blablabl", а искать
|
382
|
+
# именно теги с аттрибутом "class"
|
382
383
|
@code.gsub!(/class\s*=\s*('|")(.*?)\1/) do |match|
|
383
384
|
|
384
385
|
# берем то что в кавычках и разбиваем по пробелам
|
@@ -406,17 +407,100 @@ module Jeanny
|
|
406
407
|
"class=\"#{match.join(' ')}\""
|
407
408
|
else
|
408
409
|
''
|
409
|
-
# puts match
|
410
|
-
# match
|
411
410
|
end
|
412
411
|
|
413
412
|
end
|
414
413
|
|
415
414
|
# Находим тэги с аттрибутами в которых может быть js
|
416
|
-
@code.gsub(/<[^>]*?(onload|onunload|onclick|ondblclick|onmousedown|onmouseup|onmouseover|onmousemove|onmouseout|onfocus|onblur|onkeypress|onkeydown|onkeyup|onsubmit|onreset|onselect|onchange)\s*=\s*("|')((\\\2|.)*?)\2[^>]*?>/mi) do |tag|
|
415
|
+
@code.gsub!(/<[^>]*?(onload|onunload|onclick|ondblclick|onmousedown|onmouseup|onmouseover|onmousemove|onmouseout|onfocus|onblur|onkeypress|onkeydown|onkeyup|onsubmit|onreset|onselect|onchange)\s*=\s*("|')((\\\2|.)*?)\2[^>]*?>/mi) do |tag|
|
417
416
|
tag.gsub($3, JSCode.new($3.gsub(/\\-/ , '-')).replace(classes))
|
418
417
|
end
|
419
418
|
|
419
|
+
@code
|
420
|
+
|
421
|
+
end
|
422
|
+
|
423
|
+
end
|
424
|
+
|
425
|
+
class TT2Template < HTMLCode
|
426
|
+
|
427
|
+
def replace classes
|
428
|
+
|
429
|
+
tags = []
|
430
|
+
@code.gsub! /\[%(.*?)%\]/ do |tag|
|
431
|
+
tags << tag
|
432
|
+
|
433
|
+
" __tt2-tag__#{tags.length}__ "
|
434
|
+
end
|
435
|
+
|
436
|
+
super classes
|
437
|
+
|
438
|
+
tags.map! do |tag|
|
439
|
+
each_string :in => tag do |string|
|
440
|
+
string_after = string.dup
|
441
|
+
classes.each do |full_class, short_class|
|
442
|
+
while (pos = string_after =~ /#{full_class}(?=[^a-z0-9\-_\.]|$)/)
|
443
|
+
string_after[pos, full_class.length] = short_class
|
444
|
+
end
|
445
|
+
end
|
446
|
+
tag.gsub! string, string_after
|
447
|
+
end
|
448
|
+
tag
|
449
|
+
end
|
450
|
+
|
451
|
+
tags.each_with_index do |tag, index|
|
452
|
+
@code.gsub!(/ __tt2-tag__#{index + 1}__ /, tag)
|
453
|
+
end
|
454
|
+
|
455
|
+
@code
|
456
|
+
|
457
|
+
end
|
458
|
+
|
459
|
+
private
|
460
|
+
|
461
|
+
def each_string args = { }
|
462
|
+
|
463
|
+
char = ''
|
464
|
+
last_char = ''
|
465
|
+
start_char = ''
|
466
|
+
|
467
|
+
value = ''
|
468
|
+
status = :in_code
|
469
|
+
scanner = StringScanner.new args[:in] || ''
|
470
|
+
|
471
|
+
until scanner.eos?
|
472
|
+
|
473
|
+
scanner.getch or next
|
474
|
+
char = scanner.matched
|
475
|
+
|
476
|
+
case status
|
477
|
+
|
478
|
+
when :in_code
|
479
|
+
# Если мы в коде, а текущий символ один из тех что нам надо
|
480
|
+
# значит запоминаем, этот символ и переходим в режим "в строке"
|
481
|
+
if %w(" ').include? char
|
482
|
+
start_char = char
|
483
|
+
status = :in_string
|
484
|
+
end
|
485
|
+
|
486
|
+
when :in_string
|
487
|
+
# Если мы в строке, текущий символ такой же как и начальный,
|
488
|
+
# а предыдущий не экранирует его, значит строка законченна.
|
489
|
+
# Переходим в режим "в коде"
|
490
|
+
if char.eql? start_char and not last_char.eql? '\\'
|
491
|
+
yield value if block_given?
|
492
|
+
status, start_char, value = :in_code, '', ''
|
493
|
+
# Иначе, прибавляем текущий символ к уже полученной строке
|
494
|
+
else
|
495
|
+
value = value + char
|
496
|
+
end
|
497
|
+
|
498
|
+
end
|
499
|
+
|
500
|
+
last_char = char unless char.nil? or char =~ /\s/
|
501
|
+
|
502
|
+
end
|
503
|
+
|
420
504
|
end
|
421
505
|
|
422
506
|
end
|
data/lib/jeanny/sugar.rb
CHANGED
metadata
CHANGED
@@ -1,7 +1,7 @@
|
|
1
1
|
--- !ruby/object:Gem::Specification
|
2
2
|
name: jeanny
|
3
3
|
version: !ruby/object:Gem::Version
|
4
|
-
version: "0.
|
4
|
+
version: "0.86"
|
5
5
|
platform: ruby
|
6
6
|
authors:
|
7
7
|
- gfranco
|
@@ -9,7 +9,7 @@ autorequire:
|
|
9
9
|
bindir: bin
|
10
10
|
cert_chain: []
|
11
11
|
|
12
|
-
date: 2009-
|
12
|
+
date: 2009-10-05 00:00:00 +03:00
|
13
13
|
default_executable:
|
14
14
|
dependencies: []
|
15
15
|
|