sass 3.3.0.alpha.256 → 3.3.0.alpha.353

Sign up to get free protection for your applications and to get access to all the features.
Files changed (93) hide show
  1. data/REVISION +1 -1
  2. data/Rakefile +21 -1
  3. data/VERSION +1 -1
  4. data/VERSION_DATE +1 -1
  5. data/lib/sass.rb +6 -3
  6. data/lib/sass/cache_stores/base.rb +1 -1
  7. data/lib/sass/cache_stores/chain.rb +2 -1
  8. data/lib/sass/cache_stores/filesystem.rb +2 -6
  9. data/lib/sass/cache_stores/memory.rb +1 -1
  10. data/lib/sass/cache_stores/null.rb +2 -2
  11. data/lib/sass/callbacks.rb +1 -0
  12. data/lib/sass/css.rb +6 -6
  13. data/lib/sass/engine.rb +60 -34
  14. data/lib/sass/environment.rb +3 -1
  15. data/lib/sass/error.rb +5 -5
  16. data/lib/sass/exec.rb +52 -25
  17. data/lib/sass/features.rb +0 -2
  18. data/lib/sass/importers/deprecated_path.rb +1 -1
  19. data/lib/sass/importers/filesystem.rb +8 -6
  20. data/lib/sass/logger/base.rb +3 -3
  21. data/lib/sass/logger/log_level.rb +4 -6
  22. data/lib/sass/media.rb +2 -2
  23. data/lib/sass/plugin.rb +4 -2
  24. data/lib/sass/plugin/compiler.rb +28 -15
  25. data/lib/sass/plugin/configuration.rb +15 -7
  26. data/lib/sass/plugin/merb.rb +1 -1
  27. data/lib/sass/plugin/staleness_checker.rb +24 -8
  28. data/lib/sass/repl.rb +3 -3
  29. data/lib/sass/script.rb +2 -1
  30. data/lib/sass/script/css_lexer.rb +8 -3
  31. data/lib/sass/script/css_parser.rb +6 -2
  32. data/lib/sass/script/functions.rb +164 -109
  33. data/lib/sass/script/lexer.rb +30 -20
  34. data/lib/sass/script/parser.rb +66 -37
  35. data/lib/sass/script/tree/funcall.rb +23 -14
  36. data/lib/sass/script/tree/interpolation.rb +5 -1
  37. data/lib/sass/script/tree/list_literal.rb +5 -4
  38. data/lib/sass/script/tree/map_literal.rb +1 -1
  39. data/lib/sass/script/tree/node.rb +2 -2
  40. data/lib/sass/script/tree/operation.rb +2 -1
  41. data/lib/sass/script/tree/selector.rb +3 -2
  42. data/lib/sass/script/tree/string_interpolation.rb +2 -1
  43. data/lib/sass/script/tree/variable.rb +4 -3
  44. data/lib/sass/script/value/base.rb +12 -14
  45. data/lib/sass/script/value/color.rb +35 -16
  46. data/lib/sass/script/value/helpers.rb +146 -0
  47. data/lib/sass/script/value/list.rb +24 -5
  48. data/lib/sass/script/value/map.rb +1 -1
  49. data/lib/sass/script/value/null.rb +13 -3
  50. data/lib/sass/script/value/number.rb +44 -35
  51. data/lib/sass/script/value/string.rb +2 -2
  52. data/lib/sass/scss/css_parser.rb +2 -1
  53. data/lib/sass/scss/parser.rb +143 -93
  54. data/lib/sass/scss/rx.rb +4 -4
  55. data/lib/sass/scss/script_lexer.rb +1 -0
  56. data/lib/sass/scss/script_parser.rb +1 -0
  57. data/lib/sass/scss/static_parser.rb +5 -5
  58. data/lib/sass/selector.rb +5 -2
  59. data/lib/sass/selector/abstract_sequence.rb +1 -1
  60. data/lib/sass/selector/comma_sequence.rb +16 -14
  61. data/lib/sass/selector/sequence.rb +38 -24
  62. data/lib/sass/selector/simple.rb +4 -4
  63. data/lib/sass/selector/simple_sequence.rb +21 -11
  64. data/lib/sass/source/map.rb +7 -2
  65. data/lib/sass/source/range.rb +1 -1
  66. data/lib/sass/supports.rb +3 -3
  67. data/lib/sass/tree/debug_node.rb +1 -1
  68. data/lib/sass/tree/function_node.rb +2 -1
  69. data/lib/sass/tree/if_node.rb +1 -1
  70. data/lib/sass/tree/import_node.rb +3 -4
  71. data/lib/sass/tree/prop_node.rb +4 -2
  72. data/lib/sass/tree/rule_node.rb +5 -2
  73. data/lib/sass/tree/visitors/base.rb +6 -6
  74. data/lib/sass/tree/visitors/check_nesting.rb +12 -9
  75. data/lib/sass/tree/visitors/convert.rb +34 -28
  76. data/lib/sass/tree/visitors/cssize.rb +4 -3
  77. data/lib/sass/tree/visitors/deep_copy.rb +1 -0
  78. data/lib/sass/tree/visitors/perform.rb +31 -16
  79. data/lib/sass/tree/visitors/to_css.rb +34 -16
  80. data/lib/sass/util.rb +88 -37
  81. data/lib/sass/util/multibyte_string_scanner.rb +2 -0
  82. data/lib/sass/util/ordered_hash.rb +20 -18
  83. data/lib/sass/util/subset_map.rb +3 -2
  84. data/lib/sass/util/test.rb +0 -1
  85. data/lib/sass/version.rb +9 -5
  86. data/test/rubocop_extensions.rb +70 -0
  87. data/test/sass/functions_test.rb +20 -1
  88. data/test/sass/importer_test.rb +2 -1
  89. data/test/sass/script_test.rb +4 -0
  90. data/test/sass/source_map_test.rb +1 -1
  91. data/test/sass/util_test.rb +49 -0
  92. data/test/sass/value_helpers_test.rb +181 -0
  93. metadata +13 -9
data/REVISION CHANGED
@@ -1 +1 @@
1
- 9fcd76973ba3ac7df7f5cc595ae0283a0c16f28a
1
+ da2d3e225bd2eb195eef404a6dc5ae48e51b1fdc
data/Rakefile CHANGED
@@ -19,6 +19,26 @@ Rake::TestTask.new do |t|
19
19
  t.verbose = true
20
20
  end
21
21
 
22
+ # ----- Code Style Enforcement -----
23
+
24
+ if RUBY_VERSION !~ /^(1\.8|2\.1)/ && (ENV.has_key?("RUBOCOP") && ENV["RUBOCOP"] == "true" || !ENV.has_key?("RUBOCOP"))
25
+ require 'rubocop/rake_task'
26
+ require "#{File.dirname(__FILE__)}/test/rubocop_extensions.rb"
27
+ Rubocop::RakeTask.new do |t|
28
+ t.patterns = FileList["lib/**/*"]
29
+ end
30
+ else
31
+ task :rubocop do
32
+ puts "Skipping rubocop style check."
33
+ if !ENV.has_key?("RUBOCOP")
34
+ puts "Passing this check is required in order for your patch to be accepted."
35
+ puts "Use ruby 1.9 or greater and then run the style check with: rake rubocop"
36
+ end
37
+ end
38
+ end
39
+
40
+ task :test => :rubocop
41
+
22
42
  # ----- Packaging -----
23
43
 
24
44
  # Don't use Rake::GemPackageTast because we want prerequisites to run
@@ -191,7 +211,7 @@ begin
191
211
  task :undocumented do
192
212
  opts = ENV["YARD_OPTS"] || ""
193
213
  ENV["YARD_OPTS"] = opts.dup + <<OPTS
194
- --list --query "
214
+ --list --tag comment --hide-tag comment --query "
195
215
  object.docstring.blank? &&
196
216
  !(object.type == :method && object.is_alias?)"
197
217
  OPTS
data/VERSION CHANGED
@@ -1 +1 @@
1
- 3.3.0.alpha.256
1
+ 3.3.0.alpha.353
@@ -1 +1 @@
1
- 25 September 2013 20:25:47 GMT
1
+ 04 October 2013 22:23:30 GMT
@@ -35,8 +35,11 @@ module Sass
35
35
  # Sass.load_paths << File.dirname(__FILE__ + '/sass')
36
36
  # @return [Array<String, Pathname, Sass::Importers::Base>]
37
37
  def self.load_paths
38
- @load_paths ||= ENV['SASS_PATH'] ?
39
- ENV['SASS_PATH'].split(Sass::Util.windows? ? ';' : ':') : []
38
+ @load_paths ||= if ENV['SASS_PATH']
39
+ ENV['SASS_PATH'].split(Sass::Util.windows? ? ';' : ':')
40
+ else
41
+ []
42
+ end
40
43
  end
41
44
 
42
45
  # Compile a Sass or SCSS string to CSS.
@@ -82,7 +85,7 @@ module Sass
82
85
  result = Sass::Engine.for_file(filename, options).render
83
86
  if css_filename
84
87
  options[:css_filename] ||= css_filename
85
- open(css_filename,"w") {|css_file| css_file.write(result)}
88
+ open(css_filename, "w") {|css_file| css_file.write(result)}
86
89
  nil
87
90
  else
88
91
  result
@@ -27,7 +27,7 @@ module Sass
27
27
 
28
28
  # Retrieved cached contents.
29
29
  # Must be implemented by all subclasses.
30
- #
30
+ #
31
31
  # Note: if the key exists but the sha or version have changed,
32
32
  # then the key may be deleted by the cache store, if it wants to do so.
33
33
  #
@@ -22,7 +22,8 @@ module Sass
22
22
  # @see Base#retrieve
23
23
  def retrieve(key, sha)
24
24
  @caches.each_with_index do |c, i|
25
- next unless obj = c.retrieve(key, sha)
25
+ obj = c.retrieve(key, sha)
26
+ next unless obj
26
27
  @caches[0...i].each {|prev| prev.store(key, sha, obj)}
27
28
  return obj
28
29
  end
@@ -30,19 +30,15 @@ module Sass
30
30
 
31
31
  # @see Base#\_store
32
32
  def _store(key, version, sha, contents)
33
- # return unless File.writable?(File.dirname(@cache_location))
34
- # return if File.exists?(@cache_location) && !File.writable?(@cache_location)
35
33
  compiled_filename = path_to(key)
36
- # return if File.exists?(File.dirname(compiled_filename)) && !File.writable?(File.dirname(compiled_filename))
37
- # return if File.exists?(compiled_filename) && !File.writable?(compiled_filename)
38
34
  FileUtils.mkdir_p(File.dirname(compiled_filename))
39
- File.open(compiled_filename, "wb") do |f|
35
+ Sass::Util.atomic_create_and_write_file(compiled_filename) do |f|
40
36
  f.puts(version)
41
37
  f.puts(sha)
42
38
  f.write(contents)
43
39
  end
44
40
  rescue Errno::EACCES
45
- #pass
41
+ # pass
46
42
  end
47
43
 
48
44
  private
@@ -37,7 +37,7 @@ module Sass
37
37
  def store(key, sha, obj)
38
38
  @contents[key] = {:sha => sha, :obj => obj}
39
39
  end
40
-
40
+
41
41
  # Destructively clear the cache.
42
42
  def reset!
43
43
  @contents = {}
@@ -12,11 +12,11 @@ module Sass
12
12
  def _retrieve(key, version, sha)
13
13
  nil
14
14
  end
15
-
15
+
16
16
  def _store(key, version, sha, contents)
17
17
  @keys[key] = true
18
18
  end
19
-
19
+
20
20
  def was_set?(key)
21
21
  @keys[key]
22
22
  end
@@ -30,6 +30,7 @@ module Sass
30
30
  def self.extended(base)
31
31
  base.send(:include, InstanceMethods)
32
32
  end
33
+
33
34
  protected
34
35
 
35
36
  module InstanceMethods
@@ -169,11 +169,11 @@ module Sass
169
169
  current_rule.parsed_rules = make_seq(first)
170
170
  end
171
171
 
172
- unless rest.empty?
172
+ if rest.empty?
173
+ current_rule.children += child.children
174
+ else
173
175
  child.parsed_rules = make_seq(*rest)
174
176
  current_rule << child
175
- else
176
- current_rule.children += child.children
177
177
  end
178
178
 
179
179
  current_rule
@@ -220,12 +220,12 @@ module Sass
220
220
  current_rule.parsed_rules = make_sseq(last_simple_subject, *firsts)
221
221
  end
222
222
 
223
- unless rest.empty?
223
+ if rest.empty?
224
+ current_rule.children += child.children
225
+ else
224
226
  rest.unshift Sass::Selector::Parent.new
225
227
  child.parsed_rules = make_sseq(sseq.subject?, *rest)
226
228
  current_rule << child
227
- else
228
- current_rule.children += child.children
229
229
  end
230
230
 
231
231
  current_rule
@@ -196,9 +196,11 @@ module Sass
196
196
  # Remove any deprecated importers if the location is imported explicitly
197
197
  options[:load_paths].reject! do |importer|
198
198
  importer.is_a?(Sass::Importers::DeprecatedPath) &&
199
- options[:load_paths].find {|other_importer| other_importer.is_a?(Sass::Importers::Filesystem) &&
200
- other_importer != importer &&
201
- other_importer.root == importer.root}
199
+ options[:load_paths].find do |other_importer|
200
+ other_importer.is_a?(Sass::Importers::Filesystem) &&
201
+ other_importer != importer &&
202
+ other_importer.root == importer.root
203
+ end
202
204
  end
203
205
 
204
206
  # Backwards compatibility
@@ -259,7 +261,7 @@ module Sass
259
261
  # See {file:SASS_REFERENCE.md#sass_options the Sass options documentation}.
260
262
  # @see {Sass::Engine.for_file}
261
263
  # @see {Sass::Plugin}
262
- def initialize(template, options={})
264
+ def initialize(template, options = {})
263
265
  @options = self.class.normalize_options(options)
264
266
  @template = template
265
267
  end
@@ -300,9 +302,11 @@ module Sass
300
302
  # @return [Sass::Tree::Node] The root of the parse tree.
301
303
  # @raise [Sass::SyntaxError] if there's an error in the document
302
304
  def to_tree
303
- @tree ||= @options[:quiet] ?
304
- Sass::Util.silence_sass_warnings {_to_tree} :
305
- _to_tree
305
+ @tree ||= if @options[:quiet]
306
+ Sass::Util.silence_sass_warnings {_to_tree}
307
+ else
308
+ _to_tree
309
+ end
306
310
  end
307
311
 
308
312
  # Returns the original encoding of the document,
@@ -331,7 +335,8 @@ module Sass
331
335
  #
332
336
  # @private
333
337
  def _dependencies(seen, engines)
334
- return if seen.include?(key = [@options[:filename], @options[:importer]])
338
+ key = [@options[:filename], @options[:importer]]
339
+ return if seen.include?(key)
335
340
  seen << key
336
341
  engines << self
337
342
  to_tree.grep(Tree::ImportNode) do |n|
@@ -387,7 +392,7 @@ ERR
387
392
  key = sassc_key
388
393
  sha = Digest::SHA1.hexdigest(@template)
389
394
 
390
- if root = @options[:cache_store].retrieve(key, sha)
395
+ if (root = @options[:cache_store].retrieve(key, sha))
391
396
  root.options = @options
392
397
  return root
393
398
  end
@@ -486,7 +491,10 @@ END
486
491
  lines
487
492
  end
488
493
 
494
+ # @comment
495
+ # rubocop:disable ParameterLists
489
496
  def try_comment(line, last, tab_str, comment_tab_str, index)
497
+ # rubocop:enable ParameterLists
490
498
  return unless last && last.comment?
491
499
  # Nested comment stuff must be at least one whitespace char deeper
492
500
  # than the normal indentation
@@ -511,7 +519,8 @@ MSG
511
519
  nodes = []
512
520
  while (line = arr[i]) && line.tabs >= base
513
521
  if line.tabs > base
514
- raise SyntaxError.new("The line was indented #{line.tabs - base} levels deeper than the previous line.",
522
+ raise SyntaxError.new(
523
+ "The line was indented #{line.tabs - base} levels deeper than the previous line.",
515
524
  :line => line.index) if line.tabs > base + 1
516
525
 
517
526
  nodes.last.children, i = tree(arr, i)
@@ -617,7 +626,7 @@ WARNING
617
626
  :line => @line) if name.nil? || value.nil?
618
627
 
619
628
  value_start_offset = name_end_offset = name_start_offset + name.length
620
- if !value.empty?
629
+ unless value.empty?
621
630
  # +1 and -1 both compensate for the leading ':', which is part of line.text
622
631
  value_start_offset = name_start_offset + line.text.index(value, name.length + 1) - 1
623
632
  end
@@ -659,7 +668,7 @@ WARNING
659
668
  @options[:filename], @options[:importer],
660
669
  @line, to_parser_offset(offset))
661
670
 
662
- unless res = parser.parse_interp_ident
671
+ unless (res = parser.parse_interp_ident)
663
672
  parsed = parse_interp(line.text, line.offset)
664
673
  return Tree::RuleNode.new(parsed, full_line_range(line))
665
674
  end
@@ -672,13 +681,13 @@ WARNING
672
681
  res.unshift(hack_char) if hack_char
673
682
 
674
683
  # Handle comments after a property name but before the colon.
675
- if comment = scanner.scan(Sass::SCSS::RX::COMMENT)
684
+ if (comment = scanner.scan(Sass::SCSS::RX::COMMENT))
676
685
  res << comment
677
686
  offset += comment.length
678
687
  end
679
688
 
680
689
  name = line.text[0...scanner.pos]
681
- if scanned = scanner.scan(/\s*:(?:\s+|$)/) # test for a property
690
+ if (scanned = scanner.scan(/\s*:(?:\s+|$)/)) # test for a property
682
691
  offset += scanned.length
683
692
  property = parse_property(name, res, scanner.rest, :new, line, offset)
684
693
  property.name_source_range = ident_range
@@ -686,9 +695,8 @@ WARNING
686
695
  else
687
696
  res.pop if comment
688
697
 
689
- if trailing = (scanner.scan(/\s*#{Sass::SCSS::RX::COMMENT}/) ||
690
- scanner.scan(/\s*#{Sass::SCSS::RX::SINGLE_LINE_COMMENT}/))
691
- offset += trailing.length # skip over comment for rule processing
698
+ if (trailing = (scanner.scan(/\s*#{Sass::SCSS::RX::COMMENT}/) ||
699
+ scanner.scan(/\s*#{Sass::SCSS::RX::SINGLE_LINE_COMMENT}/)))
692
700
  trailing.strip!
693
701
  end
694
702
  interp_parsed = parse_interp(scanner.rest)
@@ -702,7 +710,10 @@ WARNING
702
710
  end
703
711
  end
704
712
 
713
+ # @comment
714
+ # rubocop:disable ParameterLists
705
715
  def parse_property(name, parsed_name, value, prop, line, start_offset)
716
+ # rubocop:enable ParameterLists
706
717
  if value.strip.empty?
707
718
  expr = Sass::Script::Tree::Literal.new(Sass::Script::Value::String.new(""))
708
719
  end_offset = start_offset
@@ -755,7 +766,13 @@ WARNING
755
766
  str = str.gsub(/^#{line.comment_tab_str}/m, '')[2..-1] # get rid of // or /*
756
767
  format_comment_text(str, silent)
757
768
  end
758
- type = if silent then :silent elsif loud then :loud else :normal end
769
+ type = if silent
770
+ :silent
771
+ elsif loud
772
+ :loud
773
+ else
774
+ :normal
775
+ end
759
776
  Tree::CommentNode.new(value, type)
760
777
  else
761
778
  Tree::RuleNode.new(parse_interp(line.text), full_line_range(line))
@@ -766,6 +783,8 @@ WARNING
766
783
  :each, :while, :if, :else, :extend, :import, :media, :charset, :content,
767
784
  :at_root]
768
785
 
786
+ # @comment
787
+ # rubocop:disable MethodLength
769
788
  def parse_directive(parent, line, root)
770
789
  directive, whitespace, value = line.text[1..-1].split(/(\s+)/, 2)
771
790
  offset = directive.size + whitespace.size + 1 if whitespace
@@ -781,7 +800,7 @@ WARNING
781
800
  return Tree::SupportsNode.new(directive, parser.parse_supports_condition)
782
801
  end
783
802
 
784
- return Tree::DirectiveNode.new(
803
+ Tree::DirectiveNode.new(
785
804
  value.nil? ? ["@#{directive}"] : ["@#{directive} "] + parse_interp(value, offset))
786
805
  end
787
806
 
@@ -817,6 +836,8 @@ WARNING
817
836
  )
818
837
  Tree::ExtendNode.new(interp_parsed, optional, selector_range)
819
838
  end
839
+ # @comment
840
+ # rubocop:enable MethodLength
820
841
 
821
842
  def parse_warn_directive(parent, line, root, value, offset)
822
843
  raise SyntaxError.new("Invalid warn directive '@warn': expected expression.") unless value
@@ -835,7 +856,7 @@ WARNING
835
856
  end
836
857
 
837
858
  def parse_charset_directive(parent, line, root, value, offset)
838
- name = value && value[/\A(["'])(.*)\1\Z/, 2] #"
859
+ name = value && value[/\A(["'])(.*)\1\Z/, 2] # "
839
860
  raise SyntaxError.new("Invalid charset directive '@charset': expected string.") unless name
840
861
  raise SyntaxError.new("Illegal nesting: Nothing may be nested beneath charset directives.",
841
862
  :line => @line + 1) unless line.children.empty?
@@ -861,10 +882,6 @@ WARNING
861
882
  return at_root_node unless value
862
883
 
863
884
  parsed = parse_interp(value, offset)
864
- selector_range = Sass::Source::Range.new(
865
- Sass::Source::Position.new(@line, to_parser_offset(offset)),
866
- Sass::Source::Position.new(@line, to_parser_offset(line.offset) + line.text.length),
867
- @options[:filename], @options[:importer])
868
885
  rule_node = Tree::RuleNode.new(parsed, full_line_range(line))
869
886
 
870
887
  # The caller expects to automatically add children to the returned node
@@ -878,7 +895,8 @@ WARNING
878
895
  end
879
896
 
880
897
  def parse_for_directive(parent, line, root, value, offset)
881
- var, from_expr, to_name, to_expr = value.scan(/^([^\s]+)\s+from\s+(.+)\s+(to|through)\s+(.+)$/).first
898
+ var, from_expr, to_name, to_expr =
899
+ value.scan(/^([^\s]+)\s+from\s+(.+)\s+(to|through)\s+(.+)$/).first
882
900
 
883
901
  if var.nil? # scan failed, try to figure out why for error message
884
902
  if value !~ /^[^\s]+/
@@ -945,8 +963,9 @@ WARNING
945
963
  values = []
946
964
 
947
965
  loop do
948
- unless node = parse_import_arg(scanner, offset + scanner.pos)
949
- raise SyntaxError.new("Invalid @import: expected file to import, was #{scanner.rest.inspect}",
966
+ unless (node = parse_import_arg(scanner, offset + scanner.pos))
967
+ raise SyntaxError.new(
968
+ "Invalid @import: expected file to import, was #{scanner.rest.inspect}",
950
969
  :line => @line)
951
970
  end
952
971
  values << node
@@ -958,9 +977,11 @@ WARNING
958
977
  :line => @line)
959
978
  end
960
979
 
961
- return values
980
+ values
962
981
  end
963
982
 
983
+ # @comment
984
+ # rubocop:disable MethodLength
964
985
  def parse_import_arg(scanner, offset)
965
986
  return if scanner.eos?
966
987
 
@@ -971,7 +992,7 @@ WARNING
971
992
  media_parser = Sass::SCSS::Parser.new(scanner,
972
993
  @options[:filename], @options[:importer],
973
994
  @line, str.source_range.end_pos.offset)
974
- if media = media_parser.parse_media_query_list
995
+ if (media = media_parser.parse_media_query_list)
975
996
  end_pos = Sass::Source::Position.new(@line, media_parser.offset + 1)
976
997
  node = Tree::CssImportNode.new(str, media.to_a)
977
998
  else
@@ -985,7 +1006,7 @@ WARNING
985
1006
  return node
986
1007
  end
987
1008
 
988
- unless str = scanner.scan(Sass::SCSS::RX::STRING)
1009
+ unless (str = scanner.scan(Sass::SCSS::RX::STRING))
989
1010
  scanned = scanner.scan(/[^,;]+/)
990
1011
  node = Tree::ImportNode.new(scanned)
991
1012
  start_parser_offset = to_parser_offset(offset)
@@ -1010,7 +1031,7 @@ WARNING
1010
1031
  Sass::Source::Position.new(@line, to_parser_offset(start_offset)),
1011
1032
  Sass::Source::Position.new(@line, media_parser.offset),
1012
1033
  @options[:filename], @options[:importer])
1013
- elsif val =~ /^(https?:)?\/\//
1034
+ elsif val =~ %r{^(https?:)?//}
1014
1035
  node = Tree::CssImportNode.new("url(#{val})")
1015
1036
  node.source_range = Sass::Source::Range.new(
1016
1037
  Sass::Source::Position.new(@line, to_parser_offset(start_offset)),
@@ -1025,6 +1046,8 @@ WARNING
1025
1046
  end
1026
1047
  node
1027
1048
  end
1049
+ # @comment
1050
+ # rubocop:enable MethodLength
1028
1051
 
1029
1052
  def parse_mixin_directive(parent, line, root, value, offset)
1030
1053
  parse_mixin_definition(line)
@@ -1044,7 +1067,10 @@ WARNING
1044
1067
  CONTENT_RE = /^@content\s*(.+)?$/
1045
1068
  def parse_content_directive(parent, line, root, value, offset)
1046
1069
  trailing = line.text.scan(CONTENT_RE).first.first
1047
- raise SyntaxError.new("Invalid content directive. Trailing characters found: \"#{trailing}\".") unless trailing.nil?
1070
+ unless trailing.nil?
1071
+ raise SyntaxError.new(
1072
+ "Invalid content directive. Trailing characters found: \"#{trailing}\".")
1073
+ end
1048
1074
  raise SyntaxError.new("Illegal nesting: Nothing may be nested beneath @content directives.",
1049
1075
  :line => line.index + 1) unless line.children.empty?
1050
1076
  Tree::ContentNode.new
@@ -1092,7 +1118,7 @@ WARNING
1092
1118
  end
1093
1119
 
1094
1120
  return silent ? "//" : "/* */" if content.empty?
1095
- content.last.gsub!(%r{ ?\*/ *$}, '')
1121
+ content.last.gsub!(/ ?\*\/ *$/, '')
1096
1122
  content.map! {|l| l.gsub!(/^\*( ?)/, '\1') || (l.empty? ? "" : " ") + l}
1097
1123
  content.first.gsub!(/^ /, '') unless removed_first
1098
1124
  if silent
@@ -1128,7 +1154,7 @@ WARNING
1128
1154
  rest = Sass::Shared.handle_interpolation text do |scan|
1129
1155
  escapes = scan[2].size
1130
1156
  res << scan.matched[0...-2 - escapes]
1131
- if escapes % 2 == 1
1157
+ if escapes.odd?
1132
1158
  res << "\\" * (escapes - 1) << '#{'
1133
1159
  else
1134
1160
  res << "\\" * [0, escapes - 1].max