scss-lint 0.10.0 → 0.10.1

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
2
  SHA1:
3
- metadata.gz: c4c60cb7b446fd21b69324b554345c0d2fbb63af
4
- data.tar.gz: c12498e673473f6305b6216fa0151ef755121b5a
3
+ metadata.gz: 69f5645967ac2ed4c054af95508d25ffb88328f7
4
+ data.tar.gz: b8d83cdd575da8e42307dedfdeb32d2bb264a210
5
5
  SHA512:
6
- metadata.gz: ba86ab4dc998719d5f11e26cb6d842c3bf9aec9535f3742a93fd8cbb975b4ff300f0aaefc8f127b99ab9ff642b5ee15a4aa0320c82b003805ba3edca5cb84408
7
- data.tar.gz: b1e5c3b72ab4300347138727dc13963fefbde3be4c9adb88c9bc8c3791c43a695f070268b2ca20f4b9a921a662aec822df1983587bc50341e6c22eecba700bd7
6
+ metadata.gz: 4cd037b4f7b02d0b011e2fc0db246cdfafa8f69a78dc2ad49e66d81df3e470f07731b4d23c115fc700426fc2c5f4dd41578be8b937a8449e4a977ef308944a40
7
+ data.tar.gz: dffa479078fac884d6ead1759882a9d23b1f1212618418b89a78b9fce1b2e0cf061817a26f9b523ae246bb7bb16a6b2ec7da52107b1487cc560822f38e2ac778
@@ -17,10 +17,12 @@ module Sass::Script
17
17
  class Color
18
18
  attr_accessor :original
19
19
 
20
- def self.from_string(string)
21
- rgb = string.scan(/^#(..?)(..?)(..?)$/).
22
- first.
23
- map { |hex| hex.ljust(2, hex).to_i(16) }
20
+ def self.from_string(string, rgb = nil)
21
+ unless rgb
22
+ rgb = string.scan(/^#(..?)(..?)(..?)$/).
23
+ first.
24
+ map { |hex| hex.ljust(2, hex).to_i(16) }
25
+ end
24
26
 
25
27
  color = Color.new(rgb, false)
26
28
  color.original = string
@@ -45,4 +47,18 @@ module Sass::Script
45
47
  [:color, Color.from_string(color_string)]
46
48
  end
47
49
  end
50
+
51
+ class Parser
52
+ # We redefine the ident parser to specially handle color keywords.
53
+ def ident
54
+ return funcall unless @lexer.peek && @lexer.peek.type == :ident
55
+ return if @stop_at && @stop_at.include?(@lexer.peek.value)
56
+
57
+ name = @lexer.next
58
+ if color = Color::COLOR_NAMES[name.value.downcase]
59
+ return node(Color.from_string(name.value, color))
60
+ end
61
+ node(Sass::Script::String.new(name.value, :identifier))
62
+ end
63
+ end
48
64
  end
@@ -2,18 +2,43 @@ module SCSSLint
2
2
  class Linter::ColorKeyword < Linter
3
3
  include LinterRegistry
4
4
 
5
- def visit_script_string(node)
6
- add_lint(node) if color_keyword?(node.value)
5
+ def visit_script_color(node)
6
+ add_color_lint(node, node.original) if color_keyword?(node.original)
7
7
  end
8
8
 
9
- def description
10
- 'Colors should be specified as hexadecimal values, not names'
9
+ def visit_script_string(node)
10
+ return unless node.type == :identifier
11
+
12
+ remove_quoted_strings(node.value).scan(/[a-z]+/i) do |word|
13
+ add_color_lint(node, word) if color_keyword?(word)
14
+ end
11
15
  end
12
16
 
13
17
  private
14
18
 
19
+ def add_color_lint(node, original)
20
+ hex_form = Sass::Script::Color.new(color_rgb(original)).inspect
21
+ add_lint(node,
22
+ "Color `#{original}` should be written in hexadecimal form " <<
23
+ "as `#{shortest_hex_form(hex_form)}`")
24
+ end
25
+
15
26
  def color_keyword?(string)
16
- !!Sass::Script::Color::COLOR_NAMES[string]
27
+ !!color_rgb(string)
28
+ end
29
+
30
+ def color_rgb(string)
31
+ Sass::Script::Color::COLOR_NAMES[string]
32
+ end
33
+
34
+ # Takes a string like `hello "world" 'how are' you` and turns it into:
35
+ # `hello you`.
36
+ # This is useful for scanning for keywords in shorthand properties or lists
37
+ # which can contain quoted strings but for which you don't want to inspect
38
+ # quoted strings (e.g. you care about the actual color keyword `red`, not
39
+ # the string "red").
40
+ def remove_quoted_strings(string)
41
+ string.gsub(/"[^"]*"|'[^']*'/, '')
17
42
  end
18
43
  end
19
44
  end
@@ -2,21 +2,19 @@ module SCSSLint
2
2
  class Linter::HexFormat < Linter
3
3
  include LinterRegistry
4
4
 
5
- def visit_prop(node)
6
- if node.value.is_a?(Sass::Script::String) &&
7
- node.value.type == :identifier
5
+ def visit_script_color(node)
6
+ return unless node.original && node.original.match(HEX_REGEX)
8
7
 
9
- node.value.value.scan(HEX_REGEX) do |match|
10
- add_hex_lint(node, match.first) unless valid_hex_format?(match.first)
11
- end
8
+ unless valid_hex_format?(node.original[HEX_REGEX, 1])
9
+ add_hex_lint(node, node.original)
12
10
  end
13
-
14
- yield # Continue visiting children
15
11
  end
16
12
 
17
- def visit_script_color(node)
18
- unless valid_hex_format?(node.original[HEX_REGEX, 1])
19
- add_hex_lint(node, node.original)
13
+ def visit_script_string(node)
14
+ return unless node.type == :identifier
15
+
16
+ node.value.scan(HEX_REGEX) do |match|
17
+ add_hex_lint(node, match.first) unless valid_hex_format?(match.first)
20
18
  end
21
19
  end
22
20
 
@@ -25,22 +23,11 @@ module SCSSLint
25
23
  HEX_REGEX = /(#\h{3,6})/
26
24
 
27
25
  def add_hex_lint(node, hex)
28
- add_lint(node, "Color `#{hex}` should be written as `#{shortest_form(hex)}`")
26
+ add_lint(node, "Color `#{hex}` should be written as `#{shortest_hex_form(hex)}`")
29
27
  end
30
28
 
31
29
  def valid_hex_format?(hex)
32
- hex == shortest_form(hex)
33
- end
34
-
35
- def shortest_form(hex)
36
- (can_be_condensed?(hex) ? (hex[0..1] + hex[3] + hex[5]) : hex).downcase
37
- end
38
-
39
- def can_be_condensed?(hex)
40
- hex.length == 7 &&
41
- hex[1] == hex[2] &&
42
- hex[3] == hex[4] &&
43
- hex[5] == hex[6]
30
+ hex == shortest_hex_form(hex)
44
31
  end
45
32
  end
46
33
  end
@@ -23,6 +23,17 @@ module SCSSLint
23
23
  node.name =~ /#{INVALID_NAME_CHARS}/
24
24
  end
25
25
 
26
+ def shortest_hex_form(hex)
27
+ (can_be_condensed?(hex) ? (hex[0..1] + hex[3] + hex[5]) : hex).downcase
28
+ end
29
+
30
+ def can_be_condensed?(hex)
31
+ hex.length == 7 &&
32
+ hex[1] == hex[2] &&
33
+ hex[3] == hex[4] &&
34
+ hex[5] == hex[6]
35
+ end
36
+
26
37
  private
27
38
 
28
39
  INVALID_NAME_CHARS = '[_A-Z]'
@@ -1,3 +1,3 @@
1
1
  module SCSSLint
2
- VERSION = '0.10.0'
2
+ VERSION = '0.10.1'
3
3
  end
metadata CHANGED
@@ -1,7 +1,7 @@
1
1
  --- !ruby/object:Gem::Specification
2
2
  name: scss-lint
3
3
  version: !ruby/object:Gem::Version
4
- version: 0.10.0
4
+ version: 0.10.1
5
5
  platform: ruby
6
6
  authors:
7
7
  - Causes Engineering