module SCSSLint::SelectorVisitor
Provides functionality for conveniently visiting a Selector sequence.
Public Instance Methods
visit_selector(node)
click to toggle source
# File lib/scss_lint/selector_visitor.rb, line 4 def visit_selector(node) visit_selector_node(node) end
Private Instance Methods
selector_node_name(node)
click to toggle source
The class name of a node, in snake_case form, e.g. `Sass::Selector::SimpleSequence` -> `simple_sequence`.
The name is memoized as a class variable on the node itself.
# File lib/scss_lint/selector_visitor.rb, line 29 def selector_node_name(node) if node.class.class_variable_defined?(:@@snake_case_name) return node.class.class_variable_get(:@@snake_case_name) end rindex = node.class.name.rindex('::') name = node.class.name[(rindex + 2)..-1] name.gsub!(/([A-Z]+)([A-Z][a-z])/, '\1_\2') name.gsub!(/([a-z\d])([A-Z])/, '\1_\2') name.downcase! node.class.class_variable_set(:@@snake_case_name, name) end
visit_members(sequence)
click to toggle source
# File lib/scss_lint/selector_visitor.rb, line 17 def visit_members(sequence) sequence.members .reject { |member| member.is_a?(String) } # Skip newlines in multi-line comma seqs .each do |member| visit_selector(member) end end
visit_selector_node(node)
click to toggle source
# File lib/scss_lint/selector_visitor.rb, line 10 def visit_selector_node(node) method = "visit_#{selector_node_name(node)}" send(method, node) if respond_to?(method, true) visit_members(node) if node.is_a?(Sass::Selector::AbstractSequence) end