jeanny 0.85 → 0.86
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/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
|
|