jeanny 0.85 → 0.86

Sign up to get free protection for your applications and to get access to all the features.
Files changed (4) hide show
  1. data/README +11 -1
  2. data/lib/jeanny/engine.rb +90 -6
  3. data/lib/jeanny/sugar.rb +2 -0
  4. 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
- # TODO: Надо находить не просто "class=blablabl", а искать
381
- # именно теги с аттрибутом "class"
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
@@ -175,6 +175,8 @@ module Jeanny
175
175
 
176
176
  end
177
177
 
178
+
179
+
178
180
  def replace args = { }
179
181
 
180
182
  fail "We can`t replace here..." unless @canbe[:replace]
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.85"
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-09-30 00:00:00 +03:00
12
+ date: 2009-10-05 00:00:00 +03:00
13
13
  default_executable:
14
14
  dependencies: []
15
15