Sha256: a2c061adc7eb1a87207fd74f4d389d8647f293d03c8fd9666c9f704b72e1d822

Contents?: true

Size: 1.22 KB

Versions: 13

Compression:

Stored size: 1.22 KB

Contents

module SCSSLint
  # Checks that selector sequences are split over multiple lines by comma.
  class Linter::SingleLinePerSelector < Linter
    include LinterRegistry

    def visit_rule(node)
      add_lint(node, MESSAGE) if invalid_comma_placement?(node)
      yield # Continue linting children
    end

  private

    MESSAGE = 'Each selector in a comma sequence should be on its own line'

    # A comma is invalid if it starts the line or is not the end of the line
    def invalid_comma_placement?(node)
      normalize_spacing(condense_to_string(node.rule)) =~ /\n,|,[^\n]/
    end

    # Since RuleNode.rule returns an array containing both String and
    # Sass::Script::Nodes, we need to condense it into a single string that we
    # can run a regex against.
    def condense_to_string(sequence_list)
      sequence_list.select { |item| item.is_a?(String) }
                   .inject('') { |combined, item| combined + item }
    end

    # Removes extra spacing between lines in a comma-separated sequence due to
    # comments being removed in the parse phase. This makes it easy to check if
    # a comma is where belongs.
    def normalize_spacing(string_sequence)
      string_sequence.gsub(/,[^\S\n]*\n\s*/, ",\n")
    end
  end
end

Version data entries

13 entries across 13 versions & 1 rubygems

Version Path
scss-lint-0.23.0 lib/scss_lint/linter/single_line_per_selector.rb
scss-lint-0.22.0 lib/scss_lint/linter/single_line_per_selector.rb
scss-lint-0.21.0 lib/scss_lint/linter/single_line_per_selector.rb
scss-lint-0.20.3 lib/scss_lint/linter/single_line_per_selector.rb
scss-lint-0.20.2 lib/scss_lint/linter/single_line_per_selector.rb
scss-lint-0.20.1 lib/scss_lint/linter/single_line_per_selector.rb
scss-lint-0.20.0 lib/scss_lint/linter/single_line_per_selector.rb
scss-lint-0.19.0 lib/scss_lint/linter/single_line_per_selector.rb
scss-lint-0.18.0 lib/scss_lint/linter/single_line_per_selector.rb
scss-lint-0.17.3 lib/scss_lint/linter/single_line_per_selector.rb
scss-lint-0.17.2 lib/scss_lint/linter/single_line_per_selector.rb
scss-lint-0.17.1 lib/scss_lint/linter/single_line_per_selector.rb
scss-lint-0.17.0 lib/scss_lint/linter/single_line_per_selector.rb