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.
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