css_parser 1.3.4 → 1.3.5

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/lib/css_parser.rb CHANGED
@@ -1,7 +1,6 @@
1
1
  require 'addressable/uri'
2
2
  require 'uri'
3
3
  require 'net/https'
4
- require 'open-uri'
5
4
  require 'digest/md5'
6
5
  require 'zlib'
7
6
  require 'stringio'
@@ -24,7 +24,7 @@ module CssParser
24
24
 
25
25
  # Array of CSS files that have been loaded.
26
26
  attr_reader :loaded_uris
27
-
27
+
28
28
  #--
29
29
  # Class variable? see http://www.oreillynet.com/ruby/blog/2007/01/nubygems_dont_use_class_variab_1.html
30
30
  #++
@@ -38,10 +38,10 @@ module CssParser
38
38
 
39
39
  # array of RuleSets
40
40
  @rules = []
41
-
42
-
41
+
42
+
43
43
  @loaded_uris = []
44
-
44
+
45
45
  # unprocessed blocks of CSS
46
46
  @blocks = []
47
47
  reset!
@@ -77,7 +77,7 @@ module CssParser
77
77
  rule_sets = []
78
78
 
79
79
  selectors.each do |selector|
80
- each_rule_set(media_types) do |rule_set|
80
+ each_rule_set(media_types) do |rule_set, media_type|
81
81
  if !rule_sets.member?(rule_set) && rule_set.selectors.member?(selector)
82
82
  rule_sets << rule_set
83
83
  end
@@ -117,7 +117,7 @@ module CssParser
117
117
  if options[:base_uri] and @options[:absolute_paths]
118
118
  block = CssParser.convert_uris(block, options[:base_uri])
119
119
  end
120
-
120
+
121
121
  # Load @imported CSS
122
122
  block.scan(RE_AT_IMPORT_RULE).each do |import_rule|
123
123
  media_types = []
@@ -128,22 +128,22 @@ module CssParser
128
128
  else
129
129
  media_types = [:all]
130
130
  end
131
-
131
+
132
132
  next unless options[:only_media_types].include?(:all) or media_types.length < 1 or (media_types & options[:only_media_types]).length > 0
133
133
 
134
134
  import_path = import_rule[0].to_s.gsub(/['"]*/, '').strip
135
-
135
+
136
136
  if options[:base_uri]
137
137
  import_uri = Addressable::URI.parse(options[:base_uri].to_s) + Addressable::URI.parse(import_path)
138
138
  load_uri!(import_uri, options[:base_uri], media_types)
139
139
  elsif options[:base_dir]
140
140
  load_file!(import_path, options[:base_dir], media_types)
141
- end
141
+ end
142
142
  end
143
143
 
144
144
  # Remove @import declarations
145
145
  block.gsub!(RE_AT_IMPORT_RULE, '')
146
-
146
+
147
147
  parse_block_into_rule_sets!(block, options)
148
148
  end
149
149
 
@@ -169,13 +169,13 @@ module CssParser
169
169
  # Iterate through RuleSet objects.
170
170
  #
171
171
  # +media_types+ can be a symbol or an array of symbols.
172
- def each_rule_set(media_types = :all) # :yields: rule_set
172
+ def each_rule_set(media_types = :all) # :yields: rule_set, media_types
173
173
  media_types = [:all] if media_types.nil?
174
174
  media_types = [media_types].flatten.collect { |mt| CssParser.sanitize_media_query(mt)}
175
175
 
176
176
  @rules.each do |block|
177
177
  if media_types.include?(:all) or block[:media_types].any? { |mt| media_types.include?(mt) }
178
- yield block[:rules]
178
+ yield(block[:rules], block[:media_types])
179
179
  end
180
180
  end
181
181
  end
@@ -184,10 +184,10 @@ module CssParser
184
184
  #
185
185
  # +media_types+ can be a symbol or an array of symbols.
186
186
  # See RuleSet#each_selector for +options+.
187
- def each_selector(media_types = :all, options = {}) # :yields: selectors, declarations, specificity
188
- each_rule_set(media_types) do |rule_set|
187
+ def each_selector(media_types = :all, options = {}) # :yields: selectors, declarations, specificity, media_types
188
+ each_rule_set(media_types) do |rule_set, media_types|
189
189
  rule_set.each_selector(options) do |selectors, declarations, specificity|
190
- yield selectors, declarations, specificity
190
+ yield selectors, declarations, specificity, media_types
191
191
  end
192
192
  end
193
193
  end
@@ -195,12 +195,32 @@ module CssParser
195
195
  # Output all CSS rules as a single stylesheet.
196
196
  def to_s(media_types = :all)
197
197
  out = ''
198
- each_selector(media_types) do |selectors, declarations, specificity|
199
- out << "#{selectors} {\n#{declarations}\n}\n"
198
+ styles_by_media_types = {}
199
+ each_selector(media_types) do |selectors, declarations, specificity, media_types|
200
+ media_types.each do |media_type|
201
+ styles_by_media_types[media_type] ||= []
202
+ styles_by_media_types[media_type] << [selectors, declarations]
203
+ end
204
+ end
205
+
206
+ styles_by_media_types.each_pair do |media_type, media_styles|
207
+ media_block = (media_type != :all)
208
+ out += "@media #{media_type} {\n" if media_block
209
+
210
+ media_styles.each do |media_style|
211
+ if media_block
212
+ out += " #{media_style[0]} {\n #{media_style[1]}\n }\n"
213
+ else
214
+ out += "#{media_style[0]} {\n#{media_style[1]}\n}\n"
215
+ end
216
+ end
217
+
218
+ out += "}\n" if media_block
200
219
  end
220
+
201
221
  out
202
222
  end
203
-
223
+
204
224
  # A hash of { :media_query => rule_sets }
205
225
  def rules_by_media_query
206
226
  rules_by_media = {}
@@ -212,7 +232,7 @@ module CssParser
212
232
  rules_by_media[mt] << block[:rules]
213
233
  end
214
234
  end
215
-
235
+
216
236
  rules_by_media
217
237
  end
218
238
 
@@ -246,7 +266,7 @@ module CssParser
246
266
 
247
267
  if token =~ /\A"/ # found un-escaped double quote
248
268
  in_string = !in_string
249
- end
269
+ end
250
270
 
251
271
  if in_declarations > 0
252
272
  # too deep, malformed declaration block
@@ -254,17 +274,17 @@ module CssParser
254
274
  in_declarations -= 1 if token =~ /\}/
255
275
  next
256
276
  end
257
-
277
+
258
278
  if token =~ /\{/
259
279
  in_declarations += 1
260
280
  next
261
281
  end
262
-
282
+
263
283
  current_declarations += token
264
284
 
265
285
  if token =~ /\}/ and not in_string
266
286
  current_declarations.gsub!(/\}[\s]*$/, '')
267
-
287
+
268
288
  in_declarations -= 1
269
289
 
270
290
  unless current_declarations.strip.empty?
@@ -318,7 +338,7 @@ module CssParser
318
338
  end
319
339
  end
320
340
 
321
- # check for unclosed braces
341
+ # check for unclosed braces
322
342
  if in_declarations > 0
323
343
  add_rule!(current_selectors, current_declarations, current_media_queries)
324
344
  end
@@ -343,7 +363,7 @@ module CssParser
343
363
  opts[:base_uri] = options if options.is_a? String
344
364
  opts[:media_types] = deprecated if deprecated
345
365
  end
346
-
366
+
347
367
  if uri.scheme == 'file' or uri.scheme.nil?
348
368
  uri.path = File.expand_path(uri.path)
349
369
  uri.scheme = 'file'
@@ -356,7 +376,7 @@ module CssParser
356
376
  add_block!(src, opts)
357
377
  end
358
378
  end
359
-
379
+
360
380
  # Load a local CSS file.
361
381
  def load_file!(file_name, base_dir = nil, media_types = :all)
362
382
  file_name = File.expand_path(file_name, base_dir)
@@ -368,18 +388,18 @@ module CssParser
368
388
 
369
389
  add_block!(src, {:media_types => media_types, :base_dir => base_dir})
370
390
  end
371
-
391
+
372
392
  # Load a local CSS string.
373
393
  def load_string!(src, base_dir = nil, media_types = :all)
374
394
  add_block!(src, {:media_types => media_types, :base_dir => base_dir})
375
395
  end
376
-
377
-
396
+
397
+
378
398
 
379
399
  protected
380
400
  # Check that a path hasn't been loaded already
381
401
  #
382
- # Raises a CircularReferenceError exception if io_exceptions are on,
402
+ # Raises a CircularReferenceError exception if io_exceptions are on,
383
403
  # otherwise returns true/false.
384
404
  def circular_reference_check(path)
385
405
  path = path.to_s
@@ -391,7 +411,7 @@ module CssParser
391
411
  return true
392
412
  end
393
413
  end
394
-
414
+
395
415
  # Strip comments and clean up blank lines from a block of CSS.
396
416
  #
397
417
  # Returns a string.
@@ -399,7 +419,7 @@ module CssParser
399
419
  # Strip CSS comments
400
420
  block.gsub!(STRIP_CSS_COMMENTS_RX, '')
401
421
 
402
- # Strip HTML comments - they shouldn't really be in here but
422
+ # Strip HTML comments - they shouldn't really be in here but
403
423
  # some people are just crazy...
404
424
  block.gsub!(STRIP_HTML_COMMENTS_RX, '')
405
425
 
@@ -416,12 +436,12 @@ module CssParser
416
436
  # TODO: add option to fail silently or throw and exception on a 404
417
437
  #++
418
438
  def read_remote_file(uri) # :nodoc:
419
- return nil, nil unless circular_reference_check(uri.to_s)
439
+ return nil, nil unless circular_reference_check(uri.to_s)
420
440
 
421
441
  src = '', charset = nil
422
442
 
423
443
  begin
424
- uri = Addressable::URI.parse(uri.to_s)
444
+ uri = Addressable::URI.parse(uri.to_s)
425
445
 
426
446
  if uri.scheme == 'file'
427
447
  # local file
@@ -433,13 +453,13 @@ module CssParser
433
453
  if uri.scheme == 'https'
434
454
  uri.port = 443 unless uri.port
435
455
  http = Net::HTTP.new(uri.host, uri.port)
436
- http.use_ssl = true
456
+ http.use_ssl = true
437
457
  http.verify_mode = OpenSSL::SSL::VERIFY_NONE
438
458
  else
439
459
  http = Net::HTTP.new(uri.host, uri.port)
440
460
  end
441
461
 
442
- res = http.get(uri.path, {'User-Agent' => USER_AGENT, 'Accept-Encoding' => 'gzip'})
462
+ res = http.get(uri.request_uri, {'User-Agent' => USER_AGENT, 'Accept-Encoding' => 'gzip'})
443
463
  src = res.body
444
464
  charset = fh.respond_to?(:charset) ? fh.charset : 'utf-8'
445
465
 
@@ -471,7 +491,7 @@ module CssParser
471
491
  return nil, nil
472
492
  end
473
493
 
474
- return src, charset
494
+ return src, charset
475
495
  end
476
496
 
477
497
  private
@@ -366,8 +366,9 @@ module CssParser
366
366
  'border-style' => 'border-%s-style',
367
367
  'border-width' => 'border-%s-width'}.each do |property, expanded|
368
368
 
369
- foldable = @declarations.select do |dim, val|
370
- dim == expanded % 'top' or dim == expanded % 'right' or dim == expanded % 'bottom' or dim == expanded % 'left'
369
+ top, right, bottom, left = ['top', 'right', 'bottom', 'left'].map { |side| expanded % side }
370
+ foldable = @declarations.select do |dim, val|
371
+ dim == top or dim == right or dim == bottom or dim == left
371
372
  end
372
373
  # All four dimensions must be present
373
374
  if foldable.length == 4
@@ -1,3 +1,3 @@
1
1
  module CssParser
2
- VERSION = "1.3.4"
2
+ VERSION = "1.3.5"
3
3
  end
metadata CHANGED
@@ -1,7 +1,7 @@
1
1
  --- !ruby/object:Gem::Specification
2
2
  name: css_parser
3
3
  version: !ruby/object:Gem::Version
4
- version: 1.3.4
4
+ version: 1.3.5
5
5
  prerelease:
6
6
  platform: ruby
7
7
  authors:
@@ -9,7 +9,7 @@ authors:
9
9
  autorequire:
10
10
  bindir: bin
11
11
  cert_chain: []
12
- date: 2013-03-13 00:00:00.000000000 Z
12
+ date: 2013-08-24 00:00:00.000000000 Z
13
13
  dependencies:
14
14
  - !ruby/object:Gem::Dependency
15
15
  name: addressable
@@ -53,7 +53,7 @@ required_ruby_version: !ruby/object:Gem::Requirement
53
53
  version: '0'
54
54
  segments:
55
55
  - 0
56
- hash: -4252446732262852289
56
+ hash: 4192577183181421877
57
57
  required_rubygems_version: !ruby/object:Gem::Requirement
58
58
  none: false
59
59
  requirements:
@@ -62,7 +62,7 @@ required_rubygems_version: !ruby/object:Gem::Requirement
62
62
  version: '0'
63
63
  segments:
64
64
  - 0
65
- hash: -4252446732262852289
65
+ hash: 4192577183181421877
66
66
  requirements: []
67
67
  rubyforge_project:
68
68
  rubygems_version: 1.8.25