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

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