css_parser 1.5.0 → 1.12.0

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.
checksums.yaml CHANGED
@@ -1,7 +1,7 @@
1
1
  ---
2
- SHA1:
3
- metadata.gz: 6f37de2f47134897299b6ff54a77057b97fa0723
4
- data.tar.gz: 4f0a21a5156634d56a97acd198a98af458d05c4d
2
+ SHA256:
3
+ metadata.gz: 7c20c504cf408fbaf9e5579e3011c485c9e1a7cb0eddc421b9bfc83bf91a9b2c
4
+ data.tar.gz: 416f126ad73ba30e3754db0e5af9519c416546fadb33c904a98c1bbf4a594f92
5
5
  SHA512:
6
- metadata.gz: e3e9cf6debd7bf20cf7121aa949a7700ecd1bf5704c9324cf7fb078741f8793423acf7a199b32bc3222e4d60b03f23094184a8b3e00b6a5ae32184e0734ddb09
7
- data.tar.gz: ede24d16d33effc05b2b0d55fb61630f224729430256928685210a3ea75aaf1de7c1ac61aa47e58931b496d04a444f8a00490b80677362c0a86177325ec7d98b
6
+ metadata.gz: c963b193f920250c1f0ee217194720f5865a2a9d7724e7f34b7d8a054fbef78382732d69f22a3a16a320d3f162f14fa0b284fbe9fba9edcbf45d22547594cb07
7
+ data.tar.gz: afc7f111ffc2e4a42c9c6be5f7e3eb2b52239f7057d0e462ff731e45e5af2d9e6ea05aa7fcb62563538c048225cc8e8f9a8c674fa633fa234e432d8e741bd26a
@@ -1,3 +1,5 @@
1
+ # frozen_string_literal: true
2
+
1
3
  module CssParser
2
4
  # Exception class used for any errors encountered while downloading remote files.
3
5
  class RemoteFileError < IOError; end
@@ -14,13 +16,13 @@ module CssParser
14
16
  # [<tt>import</tt>] Follow <tt>@import</tt> rules. Boolean, default is <tt>true</tt>.
15
17
  # [<tt>io_exceptions</tt>] Throw an exception if a link can not be found. Boolean, default is <tt>true</tt>.
16
18
  class Parser
17
- USER_AGENT = "Ruby CSS Parser/#{CssParser::VERSION} (https://github.com/premailer/css_parser)"
19
+ USER_AGENT = "Ruby CSS Parser/#{CssParser::VERSION} (https://github.com/premailer/css_parser)"
18
20
 
19
- STRIP_CSS_COMMENTS_RX = /\/\*.*?\*\//m
20
- STRIP_HTML_COMMENTS_RX = /\<\!\-\-|\-\-\>/m
21
+ STRIP_CSS_COMMENTS_RX = %r{/\*.*?\*/}m.freeze
22
+ STRIP_HTML_COMMENTS_RX = /<!--|-->/m.freeze
21
23
 
22
24
  # Initial parsing
23
- RE_AT_IMPORT_RULE = /\@import\s*(?:url\s*)?(?:\()?(?:\s*)["']?([^'"\s\)]*)["']?\)?([\w\s\,^\]\(\)]*)\)?[;\n]?/
25
+ RE_AT_IMPORT_RULE = /@import\s*(?:url\s*)?(?:\()?(?:\s*)["']?([^'"\s)]*)["']?\)?([\w\s,^\]()]*)\)?[;\n]?/.freeze
24
26
 
25
27
  MAX_REDIRECTS = 3
26
28
 
@@ -34,10 +36,11 @@ module CssParser
34
36
  class << self; attr_reader :folded_declaration_cache; end
35
37
 
36
38
  def initialize(options = {})
37
- @options = {:absolute_paths => false,
38
- :import => true,
39
- :io_exceptions => true,
40
- :capture_offsets => false}.merge(options)
39
+ @options = {absolute_paths: false,
40
+ import: true,
41
+ io_exceptions: true,
42
+ rule_set_exceptions: true,
43
+ capture_offsets: false}.merge(options)
41
44
 
42
45
  # array of RuleSets
43
46
  @rules = []
@@ -69,21 +72,20 @@ module CssParser
69
72
  # Returns an array of declarations.
70
73
  def find_by_selector(selector, media_types = :all)
71
74
  out = []
72
- each_selector(media_types) do |sel, dec, spec|
75
+ each_selector(media_types) do |sel, dec, _spec|
73
76
  out << dec if sel.strip == selector.strip
74
77
  end
75
78
  out
76
79
  end
77
- alias_method :[], :find_by_selector
80
+ alias [] find_by_selector
78
81
 
79
82
  # Finds the rule sets that match the given selectors
80
83
  def find_rule_sets(selectors, media_types = :all)
81
84
  rule_sets = []
82
85
 
83
86
  selectors.each do |selector|
84
- selector.gsub!(/\s+/, ' ')
85
- selector.strip!
86
- each_rule_set(media_types) do |rule_set, media_type|
87
+ selector = selector.gsub(/\s+/, ' ').strip
88
+ each_rule_set(media_types) do |rule_set, _media_type|
87
89
  if !rule_sets.member?(rule_set) && rule_set.selectors.member?(selector)
88
90
  rule_sets << rule_set
89
91
  end
@@ -114,9 +116,9 @@ module CssParser
114
116
  # parser = CssParser::Parser.new
115
117
  # parser.add_block!(css)
116
118
  def add_block!(block, options = {})
117
- options = {:base_uri => nil, :base_dir => nil, :charset => nil, :media_types => :all, :only_media_types => :all}.merge(options)
118
- options[:media_types] = [options[:media_types]].flatten.collect { |mt| CssParser.sanitize_media_query(mt)}
119
- options[:only_media_types] = [options[:only_media_types]].flatten.collect { |mt| CssParser.sanitize_media_query(mt)}
119
+ options = {base_uri: nil, base_dir: nil, charset: nil, media_types: :all, only_media_types: :all}.merge(options)
120
+ options[:media_types] = [options[:media_types]].flatten.collect { |mt| CssParser.sanitize_media_query(mt) }
121
+ options[:only_media_types] = [options[:only_media_types]].flatten.collect { |mt| CssParser.sanitize_media_query(mt) }
120
122
 
121
123
  block = cleanup_block(block, options)
122
124
 
@@ -128,19 +130,19 @@ module CssParser
128
130
  if @options[:import]
129
131
  block.scan(RE_AT_IMPORT_RULE).each do |import_rule|
130
132
  media_types = []
131
- if media_string = import_rule[-1]
132
- media_string.split(/[,]/).each do |t|
133
+ if (media_string = import_rule[-1])
134
+ media_string.split(/,/).each do |t|
133
135
  media_types << CssParser.sanitize_media_query(t) unless t.empty?
134
136
  end
135
137
  else
136
138
  media_types = [:all]
137
139
  end
138
140
 
139
- next unless options[:only_media_types].include?(:all) or media_types.length < 1 or (media_types & options[:only_media_types]).length > 0
141
+ next unless options[:only_media_types].include?(:all) or media_types.empty? or !(media_types & options[:only_media_types]).empty?
140
142
 
141
143
  import_path = import_rule[0].to_s.gsub(/['"]*/, '').strip
142
144
 
143
- import_options = { :media_types => media_types }
145
+ import_options = {media_types: media_types}
144
146
  import_options[:capture_offsets] = true if options[:capture_offsets]
145
147
 
146
148
  if options[:base_uri]
@@ -166,6 +168,8 @@ module CssParser
166
168
  def add_rule!(selectors, declarations, media_types = :all)
167
169
  rule_set = RuleSet.new(selectors, declarations)
168
170
  add_rule_set!(rule_set, media_types)
171
+ rescue ArgumentError => e
172
+ raise e if @options[:rule_set_exceptions]
169
173
  end
170
174
 
171
175
  # Add a CSS rule by setting the +selectors+, +declarations+, +filename+, +offset+ and +media_types+.
@@ -182,20 +186,21 @@ module CssParser
182
186
  #
183
187
  # +media_types+ can be a symbol or an array of symbols.
184
188
  def add_rule_set!(ruleset, media_types = :all)
185
- raise ArgumentError unless ruleset.kind_of?(CssParser::RuleSet)
189
+ raise ArgumentError unless ruleset.is_a?(CssParser::RuleSet)
186
190
 
187
- media_types = [media_types].flatten.collect { |mt| CssParser.sanitize_media_query(mt)}
191
+ media_types = [media_types] unless media_types.is_a?(Array)
192
+ media_types = media_types.flat_map { |mt| CssParser.sanitize_media_query(mt) }
188
193
 
189
- @rules << {:media_types => media_types, :rules => ruleset}
194
+ @rules << {media_types: media_types, rules: ruleset}
190
195
  end
191
196
 
192
197
  # Remove a CssParser RuleSet object.
193
198
  #
194
199
  # +media_types+ can be a symbol or an array of symbols.
195
200
  def remove_rule_set!(ruleset, media_types = :all)
196
- raise ArgumentError unless ruleset.kind_of?(CssParser::RuleSet)
201
+ raise ArgumentError unless ruleset.is_a?(CssParser::RuleSet)
197
202
 
198
- media_types = [media_types].flatten.collect { |mt| CssParser.sanitize_media_query(mt)}
203
+ media_types = [media_types].flatten.collect { |mt| CssParser.sanitize_media_query(mt) }
199
204
 
200
205
  @rules.reject! do |rule|
201
206
  rule[:media_types] == media_types && rule[:rules].to_s == ruleset.to_s
@@ -207,7 +212,7 @@ module CssParser
207
212
  # +media_types+ can be a symbol or an array of symbols.
208
213
  def each_rule_set(media_types = :all) # :yields: rule_set, media_types
209
214
  media_types = [:all] if media_types.nil?
210
- media_types = [media_types].flatten.collect { |mt| CssParser.sanitize_media_query(mt)}
215
+ media_types = [media_types].flatten.collect { |mt| CssParser.sanitize_media_query(mt) }
211
216
 
212
217
  @rules.each do |block|
213
218
  if media_types.include?(:all) or block[:media_types].any? { |mt| media_types.include?(mt) }
@@ -220,7 +225,7 @@ module CssParser
220
225
  def to_h(which_media = :all)
221
226
  out = {}
222
227
  styles_by_media_types = {}
223
- each_selector(which_media) do |selectors, declarations, specificity, media_types|
228
+ each_selector(which_media) do |selectors, declarations, _specificity, media_types|
224
229
  media_types.each do |media_type|
225
230
  styles_by_media_types[media_type] ||= []
226
231
  styles_by_media_types[media_type] << [selectors, declarations]
@@ -242,6 +247,8 @@ module CssParser
242
247
  # +media_types+ can be a symbol or an array of symbols.
243
248
  # See RuleSet#each_selector for +options+.
244
249
  def each_selector(all_media_types = :all, options = {}) # :yields: selectors, declarations, specificity, media_types
250
+ return to_enum(__method__, all_media_types, options) unless block_given?
251
+
245
252
  each_rule_set(all_media_types) do |rule_set, media_types|
246
253
  rule_set.each_selector(options) do |selectors, declarations, specificity|
247
254
  yield selectors, declarations, specificity, media_types
@@ -251,9 +258,10 @@ module CssParser
251
258
 
252
259
  # Output all CSS rules as a single stylesheet.
253
260
  def to_s(which_media = :all)
254
- out = ''
261
+ out = []
255
262
  styles_by_media_types = {}
256
- each_selector(which_media) do |selectors, declarations, specificity, media_types|
263
+
264
+ each_selector(which_media) do |selectors, declarations, _specificity, media_types|
257
265
  media_types.each do |media_type|
258
266
  styles_by_media_types[media_type] ||= []
259
267
  styles_by_media_types[media_type] << [selectors, declarations]
@@ -262,20 +270,21 @@ module CssParser
262
270
 
263
271
  styles_by_media_types.each_pair do |media_type, media_styles|
264
272
  media_block = (media_type != :all)
265
- out += "@media #{media_type} {\n" if media_block
273
+ out << "@media #{media_type} {" if media_block
266
274
 
267
275
  media_styles.each do |media_style|
268
276
  if media_block
269
- out += " #{media_style[0]} {\n #{media_style[1]}\n }\n"
277
+ out.push(" #{media_style[0]} {\n #{media_style[1]}\n }")
270
278
  else
271
- out += "#{media_style[0]} {\n#{media_style[1]}\n}\n"
279
+ out.push("#{media_style[0]} {\n#{media_style[1]}\n}")
272
280
  end
273
281
  end
274
282
 
275
- out += "}\n" if media_block
283
+ out << '}' if media_block
276
284
  end
277
285
 
278
- out
286
+ out << ''
287
+ out.join("\n")
279
288
  end
280
289
 
281
290
  # A hash of { :media_query => rule_sets }
@@ -283,7 +292,7 @@ module CssParser
283
292
  rules_by_media = {}
284
293
  @rules.each do |block|
285
294
  block[:media_types].each do |mt|
286
- unless rules_by_media.has_key?(mt)
295
+ unless rules_by_media.key?(mt)
287
296
  rules_by_media[mt] = []
288
297
  end
289
298
  rules_by_media[mt] << block[:rules]
@@ -295,15 +304,13 @@ module CssParser
295
304
 
296
305
  # Merge declarations with the same selector.
297
306
  def compact! # :nodoc:
298
- compacted = []
299
-
300
- compacted
307
+ []
301
308
  end
302
309
 
303
310
  def parse_block_into_rule_sets!(block, options = {}) # :nodoc:
304
311
  current_media_queries = [:all]
305
312
  if options[:media_types]
306
- current_media_queries = options[:media_types].flatten.collect { |mt| CssParser.sanitize_media_query(mt)}
313
+ current_media_queries = options[:media_types].flatten.collect { |mt| CssParser.sanitize_media_query(mt) }
307
314
  end
308
315
 
309
316
  in_declarations = 0
@@ -314,44 +321,43 @@ module CssParser
314
321
  in_at_media_rule = false
315
322
  in_media_block = false
316
323
 
317
- current_selectors = ''
318
- current_media_query = ''
319
- current_declarations = ''
324
+ current_selectors = String.new
325
+ current_media_query = String.new
326
+ current_declarations = String.new
320
327
 
321
328
  # once we are in a rule, we will use this to store where we started if we are capturing offsets
322
329
  rule_start = nil
323
330
  offset = nil
324
331
 
325
- block.scan(/(([\\]{2,})|([\\]?[{}\s"])|(.[^\s"{}\\]*))/) do |matches|
326
- token = matches[0]
327
-
332
+ block.scan(/\s+|\\{2,}|\\?[{}\s"]|.[^\s"{}\\]*/) do |token|
328
333
  # save the regex offset so that we know where in the file we are
329
334
  offset = Regexp.last_match.offset(0) if options[:capture_offsets]
330
335
 
331
- if token =~ /\A"/ # found un-escaped double quote
336
+ if token.start_with?('"') # found un-escaped double quote
332
337
  in_string = !in_string
333
338
  end
334
339
 
335
340
  if in_declarations > 0
336
341
  # too deep, malformed declaration block
337
342
  if in_declarations > 1
338
- in_declarations -= 1 if token =~ /\}/
343
+ in_declarations -= 1 if token.include?('}')
339
344
  next
340
345
  end
341
346
 
342
- if token =~ /\{/ and not in_string
347
+ if !in_string && token.include?('{')
343
348
  in_declarations += 1
344
349
  next
345
350
  end
346
351
 
347
- current_declarations += token
352
+ current_declarations << token
348
353
 
349
- if token =~ /\}/ and not in_string
350
- current_declarations.gsub!(/\}[\s]*$/, '')
354
+ if !in_string && token.include?('}')
355
+ current_declarations.gsub!(/\}\s*$/, '')
351
356
 
352
357
  in_declarations -= 1
358
+ current_declarations.strip!
353
359
 
354
- unless current_declarations.strip.empty?
360
+ unless current_declarations.empty?
355
361
  if options[:capture_offsets]
356
362
  add_rule_with_offsets!(current_selectors, current_declarations, options[:filename], (rule_start..offset.last), current_media_queries)
357
363
  else
@@ -359,8 +365,8 @@ module CssParser
359
365
  end
360
366
  end
361
367
 
362
- current_selectors = ''
363
- current_declarations = ''
368
+ current_selectors = String.new
369
+ current_declarations = String.new
364
370
 
365
371
  # restart our search for selectors and declarations
366
372
  rule_start = nil if options[:capture_offsets]
@@ -370,56 +376,54 @@ module CssParser
370
376
  in_at_media_rule = true
371
377
  current_media_queries = []
372
378
  elsif in_at_media_rule
373
- if token =~ /\{/
374
- block_depth = block_depth + 1
379
+ if token.include?('{')
380
+ block_depth += 1
375
381
  in_at_media_rule = false
376
382
  in_media_block = true
377
383
  current_media_queries << CssParser.sanitize_media_query(current_media_query)
378
- current_media_query = ''
379
- elsif token =~ /[,]/
384
+ current_media_query = String.new
385
+ elsif token.include?(',')
380
386
  # new media query begins
381
- token.gsub!(/[,]/, ' ')
382
- current_media_query += token.strip + ' '
387
+ token.tr!(',', ' ')
388
+ token.strip!
389
+ current_media_query << token << ' '
383
390
  current_media_queries << CssParser.sanitize_media_query(current_media_query)
384
- current_media_query = ''
391
+ current_media_query = String.new
385
392
  else
386
- current_media_query += token.strip + ' '
393
+ token.strip!
394
+ current_media_query << token << ' '
387
395
  end
388
396
  elsif in_charset or token =~ /@charset/i
389
397
  # iterate until we are out of the charset declaration
390
- in_charset = (token =~ /;/ ? false : true)
398
+ in_charset = !token.include?(';')
399
+ elsif !in_string && token.include?('}')
400
+ block_depth -= 1
401
+
402
+ # reset the current media query scope
403
+ if in_media_block
404
+ current_media_queries = [:all]
405
+ in_media_block = false
406
+ end
407
+ elsif !in_string && token.include?('{')
408
+ current_selectors.strip!
409
+ in_declarations += 1
391
410
  else
392
- if token =~ /\}/ and not in_string
393
- block_depth = block_depth - 1
411
+ # if we are in a selector, add the token to the current selectors
412
+ current_selectors << token
394
413
 
395
- # reset the current media query scope
396
- if in_media_block
397
- current_media_queries = [:all]
398
- in_media_block = false
399
- end
400
- else
401
- if token =~ /\{/ and not in_string
402
- current_selectors.strip!
403
- in_declarations += 1
404
- else
405
- # if we are in a selector, add the token to the current selectors
406
- current_selectors += token
407
-
408
- # mark this as the beginning of the selector unless we have already marked it
409
- rule_start = offset.first if options[:capture_offsets] && rule_start.nil? && token =~ /^[^\s]+$/
410
- end
411
- end
414
+ # mark this as the beginning of the selector unless we have already marked it
415
+ rule_start = offset.first if options[:capture_offsets] && rule_start.nil? && token =~ /^[^\s]+$/
412
416
  end
413
417
  end
414
418
 
415
419
  # check for unclosed braces
416
- if in_declarations > 0
417
- if options[:capture_offsets]
418
- add_rule_with_offsets!(current_selectors, current_declarations, options[:filename], (rule_start..offset.last), current_media_queries)
419
- else
420
- add_rule!(current_selectors, current_declarations, current_media_queries)
421
- end
420
+ return unless in_declarations > 0
421
+
422
+ unless options[:capture_offsets]
423
+ return add_rule!(current_selectors, current_declarations, current_media_queries)
422
424
  end
425
+
426
+ add_rule_with_offsets!(current_selectors, current_declarations, options[:filename], (rule_start..offset.last), current_media_queries)
423
427
  end
424
428
 
425
429
  # Load a remote CSS file.
@@ -432,7 +436,7 @@ module CssParser
432
436
  def load_uri!(uri, options = {}, deprecated = nil)
433
437
  uri = Addressable::URI.parse(uri) unless uri.respond_to? :scheme
434
438
 
435
- opts = {:base_uri => nil, :media_types => :all}
439
+ opts = {base_uri: nil, media_types: :all}
436
440
 
437
441
  if options.is_a? Hash
438
442
  opts.merge!(options)
@@ -452,14 +456,13 @@ module CssParser
452
456
  opts[:filename] = uri.to_s if opts[:capture_offsets]
453
457
 
454
458
  src, = read_remote_file(uri) # skip charset
455
- if src
456
- add_block!(src, opts)
457
- end
459
+
460
+ add_block!(src, opts) if src
458
461
  end
459
462
 
460
463
  # Load a local CSS file.
461
464
  def load_file!(file_name, options = {}, deprecated = nil)
462
- opts = {:base_dir => nil, :media_types => :all}
465
+ opts = {base_dir: nil, media_types: :all}
463
466
 
464
467
  if options.is_a? Hash
465
468
  opts.merge!(options)
@@ -482,7 +485,7 @@ module CssParser
482
485
 
483
486
  # Load a local CSS string.
484
487
  def load_string!(src, options = {}, deprecated = nil)
485
- opts = {:base_dir => nil, :media_types => :all}
488
+ opts = {base_dir: nil, media_types: :all}
486
489
 
487
490
  if options.is_a? Hash
488
491
  opts.merge!(options)
@@ -494,9 +497,8 @@ module CssParser
494
497
  add_block!(src, opts)
495
498
  end
496
499
 
497
-
498
-
499
500
  protected
501
+
500
502
  # Check that a path hasn't been loaded already
501
503
  #
502
504
  # Raises a CircularReferenceError exception if io_exceptions are on,
@@ -505,10 +507,11 @@ module CssParser
505
507
  path = path.to_s
506
508
  if @loaded_uris.include?(path)
507
509
  raise CircularReferenceError, "can't load #{path} more than once" if @options[:io_exceptions]
508
- return false
510
+
511
+ false
509
512
  else
510
513
  @loaded_uris << path
511
- return true
514
+ true
512
515
  end
513
516
  end
514
517
 
@@ -528,7 +531,7 @@ module CssParser
528
531
  # Returns a string.
529
532
  def cleanup_block(block, options = {}) # :nodoc:
530
533
  # Strip CSS comments
531
- utf8_block = block.encode('UTF-8', 'binary', invalid: :replace, undef: :replace, replace: ' ')
534
+ utf8_block = block.encode('UTF-8', 'UTF-8', invalid: :replace, undef: :replace, replace: ' ')
532
535
  utf8_block = ignore_pattern(utf8_block, STRIP_CSS_COMMENTS_RX, options)
533
536
 
534
537
  # Strip HTML comments - they shouldn't really be in here but
@@ -536,7 +539,7 @@ module CssParser
536
539
  utf8_block = ignore_pattern(utf8_block, STRIP_HTML_COMMENTS_RX, options)
537
540
 
538
541
  # Strip lines containing just whitespace
539
- utf8_block.gsub!(/^\s+$/, "") unless options[:capture_offsets]
542
+ utf8_block.gsub!(/^\s+$/, '') unless options[:capture_offsets]
540
543
 
541
544
  utf8_block
542
545
  end
@@ -572,11 +575,8 @@ module CssParser
572
575
  if uri.scheme == 'file'
573
576
  # local file
574
577
  path = uri.path
575
- path.gsub!(/^\//, '') if Gem.win_platform?
576
- fh = open(path, 'rb')
577
- src = fh.read
578
- charset = fh.respond_to?(:charset) ? fh.charset : 'utf-8'
579
- fh.close
578
+ path.gsub!(%r{^/}, '') if Gem.win_platform?
579
+ src = File.read(path, mode: 'rb')
580
580
  else
581
581
  # remote file
582
582
  if uri.scheme == 'https'
@@ -594,21 +594,22 @@ module CssParser
594
594
 
595
595
  if res.code.to_i >= 400
596
596
  @redirect_count = nil
597
- raise RemoteFileError.new(uri.to_s) if @options[:io_exceptions]
597
+ raise RemoteFileError, uri.to_s if @options[:io_exceptions]
598
+
598
599
  return '', nil
599
600
  elsif res.code.to_i >= 300 and res.code.to_i < 400
600
- if res['Location'] != nil
601
+ unless res['Location'].nil?
601
602
  return read_remote_file Addressable::URI.parse(Addressable::URI.escape(res['Location']))
602
603
  end
603
604
  end
604
605
 
605
606
  case res['content-encoding']
606
- when 'gzip'
607
- io = Zlib::GzipReader.new(StringIO.new(res.body))
608
- src = io.read
609
- when 'deflate'
610
- io = Zlib::Inflate.new
611
- src = io.inflate(res.body)
607
+ when 'gzip'
608
+ io = Zlib::GzipReader.new(StringIO.new(res.body))
609
+ src = io.read
610
+ when 'deflate'
611
+ io = Zlib::Inflate.new
612
+ src = io.inflate(res.body)
612
613
  end
613
614
  end
614
615
 
@@ -622,15 +623,17 @@ module CssParser
622
623
  end
623
624
  rescue
624
625
  @redirect_count = nil
625
- raise RemoteFileError.new(uri.to_s)if @options[:io_exceptions]
626
+ raise RemoteFileError, uri.to_s if @options[:io_exceptions]
627
+
626
628
  return nil, nil
627
629
  end
628
630
 
629
631
  @redirect_count = nil
630
- return src, charset
632
+ [src, charset]
631
633
  end
632
634
 
633
635
  private
636
+
634
637
  # Save a folded declaration block to the internal cache.
635
638
  def save_folded_declaration(block_hash, folded_declaration) # :nodoc:
636
639
  @folded_declaration_cache[block_hash] = folded_declaration
@@ -638,7 +641,7 @@ module CssParser
638
641
 
639
642
  # Retrieve a folded declaration block from the internal cache.
640
643
  def get_folded_declaration(block_hash) # :nodoc:
641
- return @folded_declaration_cache[block_hash] ||= nil
644
+ @folded_declaration_cache[block_hash] ||= nil
642
645
  end
643
646
 
644
647
  def reset! # :nodoc:
@@ -652,14 +655,15 @@ module CssParser
652
655
  # passed hash
653
656
  def css_node_to_h(hash, key, val)
654
657
  hash[key.strip] = '' and return hash if val.nil?
658
+
655
659
  lines = val.split(';')
656
660
  nodes = {}
657
661
  lines.each do |line|
658
662
  parts = line.split(':', 2)
659
- if (parts[1] =~ /:/)
663
+ if parts[1] =~ /:/
660
664
  nodes[parts[0]] = css_node_to_h(hash, parts[0], parts[1])
661
665
  else
662
- nodes[parts[0].to_s.strip] =parts[1].to_s.strip
666
+ nodes[parts[0].to_s.strip] = parts[1].to_s.strip
663
667
  end
664
668
  end
665
669
  hash[key.strip] = nodes