jeanny 0.8 → 0.85
Sign up to get free protection for your applications and to get access to all the features.
- data/README +19 -2
- data/lib/jeanny.rb +2 -2
- data/lib/jeanny/engine.rb +97 -10
- data/lib/jeanny/extend.rb +0 -1
- data/lib/jeanny/sugar.rb +4 -3
- metadata +2 -2
data/README
CHANGED
@@ -3,6 +3,23 @@ Jeanny GEM
|
|
3
3
|
|
4
4
|
Usage:
|
5
5
|
|
6
|
+
#!/usr/bin/env ruby
|
7
|
+
|
8
|
+
require 'rubygems'
|
6
9
|
require 'jeanny'
|
7
|
-
|
8
|
-
|
10
|
+
|
11
|
+
include Jeanny::Sugar
|
12
|
+
|
13
|
+
analyze('serp/css/_*.css', :compare_with => 'classes.saved') and save
|
14
|
+
|
15
|
+
group :css, :title => 'replacing in stylesheets' do
|
16
|
+
replace :include => ['serp/css/_*.css', 'serp/block/*/*.css']
|
17
|
+
end
|
18
|
+
|
19
|
+
group :js, :title => 'replacing in scripts' do
|
20
|
+
replace :in => 'serp/js/_serp.js'
|
21
|
+
end
|
22
|
+
|
23
|
+
group :html, :title => 'replacing in template files' do
|
24
|
+
replace :in => 'serp/static/*.html'
|
25
|
+
end
|
data/lib/jeanny.rb
CHANGED
@@ -1,7 +1,7 @@
|
|
1
1
|
|
2
2
|
#
|
3
3
|
# jeanny.rb
|
4
|
-
#
|
4
|
+
# Obfuscation for web applications
|
5
5
|
#
|
6
6
|
# Created by seriously drunken on 2009-09-16.
|
7
7
|
# Copyright 2009 Yandex. All rights reserved.
|
@@ -11,7 +11,7 @@ $:.unshift File.dirname(__FILE__) unless $:.include? File.dirname(__FILE__)
|
|
11
11
|
|
12
12
|
module Jeanny
|
13
13
|
|
14
|
-
JEANNY_VERSION = '0.
|
14
|
+
JEANNY_VERSION = '0.85'
|
15
15
|
|
16
16
|
end
|
17
17
|
|
data/lib/jeanny/engine.rb
CHANGED
@@ -1,5 +1,7 @@
|
|
1
1
|
|
2
2
|
module Jeanny
|
3
|
+
|
4
|
+
require 'strscan'
|
3
5
|
|
4
6
|
# Класс который выполнят всю основную работу.
|
5
7
|
# Парсит и заменяет классы, сохраняет и сравнивает их.
|
@@ -209,25 +211,110 @@ module Jeanny
|
|
209
211
|
class JSCode < Code
|
210
212
|
|
211
213
|
def replace classes
|
212
|
-
|
213
|
-
# Находим все строки и регулярные выражения
|
214
|
-
@code.gsub(/(("|'|\/)((\\\2|.)*?)\2)/m) do |string|
|
215
214
|
|
216
|
-
|
215
|
+
data = []
|
216
|
+
each_string do |value, quote|
|
217
|
+
|
218
|
+
next unless value.length > 4
|
219
|
+
|
220
|
+
value_after = value.dup
|
221
|
+
classes.each do |full_class, short_class|
|
222
|
+
while (pos = value_after =~ /#{full_class}(?=[^a-z0-9\-_]|$)/)
|
223
|
+
value_after[pos, full_class.length] = short_class
|
224
|
+
end
|
225
|
+
end
|
217
226
|
|
218
|
-
|
219
|
-
classes.each do |full_name, short_name|
|
227
|
+
next if value.eql? value_after
|
220
228
|
|
221
|
-
# И заменяем старый класс, на новый
|
222
|
-
string_after = string_after.gsub(full_name, short_name)
|
223
|
-
end
|
224
229
|
|
225
|
-
|
230
|
+
data << [value, value_after]
|
226
231
|
|
227
232
|
end
|
228
233
|
|
234
|
+
data.sort_by { |x| x[0].length }.reverse.each do |x|
|
235
|
+
while (pos = @code =~ /#{Regexp::escape(x[0])}(?=[^a-z0-9\-_]|$)/)
|
236
|
+
@code[pos, x[0].length] = x[1]
|
237
|
+
end
|
238
|
+
end
|
239
|
+
|
240
|
+
@code
|
241
|
+
|
242
|
+
end
|
243
|
+
|
244
|
+
def each_string
|
245
|
+
|
246
|
+
@status = :in_code
|
247
|
+
|
248
|
+
@char, @last_char, @start_char, @value = '', '', '', ''
|
249
|
+
|
250
|
+
scanner = StringScanner.new @code.dup
|
251
|
+
|
252
|
+
until scanner.eos?
|
253
|
+
|
254
|
+
scanner.getch or next
|
255
|
+
@char = scanner.matched
|
256
|
+
|
257
|
+
case @status
|
258
|
+
|
259
|
+
|
260
|
+
when :in_code
|
261
|
+
# Если мы в коде, а текущий символ один из тех что нам надо
|
262
|
+
# значит запоминаем, этот символ и переходим в режим "в строке"
|
263
|
+
if %w(" ').include? @char
|
264
|
+
@start_char = @char
|
265
|
+
@status = :in_string
|
266
|
+
end
|
267
|
+
|
268
|
+
# Если мы в коде, текущий символ слеш, а следующий не звездочка,
|
269
|
+
# значит мы в регулярном выражении
|
270
|
+
if @char.eql? '/' and @last_char =~ /=|\(|:/ and not %w(* /).include? scanner.post_match[0, 1]
|
271
|
+
@start_char = @char
|
272
|
+
@status = :in_regexp
|
273
|
+
end
|
274
|
+
|
275
|
+
# Если мы в коде, текущий символ звездочка, а предыдущий — слеш,
|
276
|
+
# значит это начала комментария. Перехоим в режим "в комментарии"
|
277
|
+
@status = :in_full_comment if @char.eql? '*' and @last_char.eql? '/'
|
278
|
+
|
279
|
+
@status = :in_line_comment if @char.eql? '/' and @last_char.eql? '/'
|
280
|
+
|
281
|
+
when :in_string, :in_regexp
|
282
|
+
# Если мы в строке (или регулярке), текущий символ такой же как и начальный,
|
283
|
+
# а предыдущий не экранирует его, значит строка законченна.
|
284
|
+
# Переходим в режим "в коде"
|
285
|
+
# if @char.eql? @start_char and scanner.pre_match !~ /[^\\]\\$/
|
286
|
+
if @char.eql? @start_char and not @last_char.eql? '\\'
|
287
|
+
if block_given?
|
288
|
+
# yield "#{@start_char}#{@value}#{@start_char}", @value
|
289
|
+
# yield @value
|
290
|
+
yield @value, @start_char
|
291
|
+
end
|
292
|
+
|
293
|
+
@status, @start_char, @value = :in_code, '', ''
|
294
|
+
# Иначе, прибавляем текущий символ к уже полученной строке
|
295
|
+
else
|
296
|
+
@value = @value + @char
|
297
|
+
end
|
298
|
+
|
299
|
+
when :in_full_comment
|
300
|
+
# Если мы в комментарии, текущий символ слеш, а предыдущий
|
301
|
+
# звездочка, значит комментарий закончился, переходим в режим "в коде"
|
302
|
+
@status = :in_code if @char.eql? '/' and @last_char.eql? '*'
|
303
|
+
|
304
|
+
when :in_line_comment
|
305
|
+
@status = :in_code if @char.eql? "\n"
|
306
|
+
|
307
|
+
end
|
308
|
+
|
309
|
+
@last_char = @char unless @char.nil? or @char =~ /\s/
|
310
|
+
|
311
|
+
end
|
229
312
|
end
|
230
313
|
|
314
|
+
private
|
315
|
+
|
316
|
+
attr_accessor :status, :char, :last_char, :start_char, :value
|
317
|
+
|
231
318
|
end
|
232
319
|
|
233
320
|
class CSSCode < Code
|
data/lib/jeanny/extend.rb
CHANGED
@@ -174,6 +174,5 @@ end
|
|
174
174
|
module Jeanny
|
175
175
|
|
176
176
|
%w(FileNotFound CompareFileFormatError ClassesNotFound).each { |error| eval "class Jeanny#{error} < RuntimeError; end" }
|
177
|
-
# %w(CompareFileNotFound SaveError).each { |error| eval "class Jeanny#{error} < SystemCallError; end" }
|
178
177
|
|
179
178
|
end
|
data/lib/jeanny/sugar.rb
CHANGED
@@ -151,19 +151,20 @@ module Jeanny
|
|
151
151
|
break if exclude
|
152
152
|
end
|
153
153
|
|
154
|
-
# next if exclude
|
155
154
|
if exclude
|
156
155
|
puts file.yellow
|
157
156
|
next
|
158
157
|
end
|
159
158
|
|
160
159
|
begin
|
160
|
+
|
161
|
+
puts file.green
|
162
|
+
|
161
163
|
data = File.open_file file
|
162
164
|
data = @engine.replace data, type
|
163
|
-
|
165
|
+
|
164
166
|
File.save_file file, data
|
165
167
|
|
166
|
-
puts file.green
|
167
168
|
rescue Exception => e
|
168
169
|
puts e.message + "\n#{$@}"
|
169
170
|
exit 1
|
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.85"
|
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-
|
12
|
+
date: 2009-09-30 00:00:00 +03:00
|
13
13
|
default_executable:
|
14
14
|
dependencies: []
|
15
15
|
|