module SCSSLint::Utils

Collection of helpers used across a variety of linters.

Constants

COLOR_REGEX

Public Instance Methods

color?(string) click to toggle source

Returns whether the given string is a color literal (keyword or hex code).

@param string [String] @return [true,false]

# File lib/scss_lint/utils.rb, line 10
def color?(string)
  color_keyword?(string) || color_hex?(string)
end
color_hex?(string) click to toggle source

Returns whether the given string is a color hexadecimal code.

@param string [String] @return [true,false]

# File lib/scss_lint/utils.rb, line 18
def color_hex?(string)
  string =~ COLOR_REGEX
end
color_keyword?(string) click to toggle source

Returns whether the given string is a valid color keyword.

@param string [String] @return [true,false]

# File lib/scss_lint/utils.rb, line 26
def color_keyword?(string)
  color_keyword_to_code(string) && string != 'transparent'
end
color_keyword_to_code(string) click to toggle source

Returns the hexadecimal code for the given color keyword.

@param string [String] @return [String] 7-character hexadecimal code (includes `#` prefix)

# File lib/scss_lint/utils.rb, line 34
def color_keyword_to_code(string)
  Sass::Script::Value::Color::COLOR_NAMES[string]
end
else_node?(node) click to toggle source

Returns whether a node is an IfNode corresponding to an @else/@else if statement.

@param node [Sass::Tree::Node] @return [true,false]

# File lib/scss_lint/utils.rb, line 43
def else_node?(node)
  source_from_range(node.source_range).strip.start_with?('@else')
end
extract_string_selectors(selector_array) click to toggle source

Given a selector array which is a list of strings with Sass::Script::Nodes interspersed within them, return an array of strings representing those selectors with the Sass::Script::Nodes removed (i.e., ignoring interpolation). For example:

.selector-one, .selector-#{$var}-two

becomes:

.selector-one, .selector–two

This is useful for lints that wish to ignore interpolation, since interpolation can't be resolved at this step.

# File lib/scss_lint/utils.rb, line 60
def extract_string_selectors(selector_array)
  selector_array.reject { |item| item.is_a? Sass::Script::Node }
                .join
                .split
end
node_ancestor(node, levels) click to toggle source

Return nth-ancestor of a node, where 1 is the parent, 2 is grandparent, etc.

@param node [Sass::Tree::Node, Sass::Script::Tree::Node] @param level [Integer] @return [Sass::Tree::Node, Sass::Script::Tree::Node, nil]

# File lib/scss_lint/utils.rb, line 100
def node_ancestor(node, levels)
  while levels > 0
    node = node.node_parent
    return unless node
    levels -= 1
  end

  node
end
node_siblings(node) click to toggle source
# File lib/scss_lint/utils.rb, line 87
def node_siblings(node)
  return unless node && node.node_parent
  node.node_parent
      .children
      .select { |child| child.is_a?(Sass::Tree::Node) }
end
pluralize(value, word) click to toggle source
# File lib/scss_lint/utils.rb, line 110
def pluralize(value, word)
  value == 1 ? "#{value} #{word}" : "#{value} #{word}s"
end
previous_node(node) click to toggle source
# File lib/scss_lint/utils.rb, line 76
def previous_node(node)
  return unless node && parent = node.node_parent
  index = parent.children.index(node)

  if index == 0
    parent
  else
    parent.children[index - 1]
  end
end
remove_quoted_strings(string) click to toggle source

Takes a string like `hello “world” 'how are' you` and turns it into: `hello you`. This is useful for scanning for keywords in shorthand properties or lists which can contain quoted strings but for which you don't want to inspect quoted strings (e.g. you care about the actual color keyword `red`, not the string “red”).

# File lib/scss_lint/utils.rb, line 72
def remove_quoted_strings(string)
  string.gsub(/"[^"]*"|'[^']*'/, '')
end
same_position?(pos1, pos2) click to toggle source

Sass doesn't define an equality operator for Sass::Source::Position objects, so we define a helper for our own use.

# File lib/scss_lint/utils.rb, line 116
def same_position?(pos1, pos2)
  return unless pos1 && pos2
  pos1.line == pos2.line && pos1.offset == pos2.offset
end