class SCSSLint::Linter::BangFormat

Checks spacing of ! declarations, like !important and !default

Constants

STOPPING_CHARACTERS

Public Instance Methods

visit_prop(node) click to toggle source
# File lib/scss_lint/linter/bang_format.rb, line 8
def visit_prop(node)
  return unless source_from_range(node.source_range).include?('!')
  return unless check_spacing(node)

  before_qualifier = config['space_before_bang'] ? '' : 'not '
  after_qualifier = config['space_after_bang'] ? '' : 'not '

  add_lint(node, "! should #{before_qualifier}be preceeded by a space, " \
                 "and should #{after_qualifier}be followed by a space")
end

Private Instance Methods

check_spacing(node) click to toggle source
# File lib/scss_lint/linter/bang_format.rb, line 43
def check_spacing(node)
  range = node.value_source_range
  offset = find_bang_offset(range)

  return if character_at(range.end_pos, offset) != '!'

  is_before_wrong?(range, offset) || is_after_wrong?(range, offset)
end
find_bang_offset(range) click to toggle source

Start from the back and move towards the front so that any !important or !default !‘s will be found before quotation marks. Then we can stop at quotation marks to protect against linting !’s within strings (e.g. ‘content`)

# File lib/scss_lint/linter/bang_format.rb, line 25
def find_bang_offset(range)
  offset = 0
  offset -= 1 until STOPPING_CHARACTERS.include?(character_at(range.end_pos, offset))
  offset
end
is_after_wrong?(range, offset) click to toggle source
# File lib/scss_lint/linter/bang_format.rb, line 37
def is_after_wrong?(range, offset)
  after_expected = config['space_after_bang'] ? / / : /[^ ]/
  after_actual = character_at(range.end_pos, offset + 1)
  (after_actual =~ after_expected).nil?
end
is_before_wrong?(range, offset) click to toggle source
# File lib/scss_lint/linter/bang_format.rb, line 31
def is_before_wrong?(range, offset)
  before_expected = config['space_before_bang'] ? / / : /[^ ]/
  before_actual = character_at(range.end_pos, offset - 1)
  (before_actual =~ before_expected).nil?
end