Module: Rouge::Lexers::SassCommon

Includes:
Token::Tokens
Included in:
Sass, Scss
Defined in:
lib/rouge/lexers/sass/common.rb

Overview

shared states with SCSS TODO: make this less nasty to do

Constant Summary collapse

INCLUDED_PROC =
proc do
  id = /[\w-]+/

  state :content_common do
    rule /@for\b/, Keyword, :for
    rule /@(debug|warn|if|while)/, Keyword, :value
    rule /(@mixin)(\s+)(#{id})/ do
      group Keyword; group Text; group Name::Function
      push :value
    end

    rule /@extend\b/, Keyword, :selector

    rule /(@include)(\s+)(#{id})/ do
      group Keyword; group Text; group Name::Decorator
      push :value
    end

    rule /@#{id}/, Keyword, :selector

    # $variable: assignment
    rule /([$]#{id})([ \t]*)(:)/ do
      group Name::Variable; group Text; group Punctuation
      push :value
    end
  end

  state :value do
    mixin :end_section
    rule /[ \t]+/, Text
    rule /[$]#{id}/, Name::Variable
    rule /url[(]/, Str::Other, :string_url
    rule /#{id}(?=\s*[(])/, Name::Function
    rule /%#{id}/, Name::Decorator

    # named literals
    rule /(true|false)\b/, Name::Builtin::Pseudo
    rule /(and|or|not)\b/, Operator::Word

    # colors and numbers
    rule /#[a-z0-9]{1,6}/i, Num::Hex
    rule /-?\d+(%|[a-z]+)?/, Num
    rule /-?\d*\.\d+(%|[a-z]+)?/, Num::Integer

    mixin :has_strings
    mixin :has_interp

    rule /[~^*!&%<>\|[email protected]:,.\/?-]+/, Operator
    rule /[\[\]()]+/, Punctuation
    rule %r(/[*]), Comment::Multiline, :inline_comment
    rule %r(//[^\n]*), Comment::Single

    # identifiers
    rule(id) do |m|
      if CSS.builtins.include? m[0]
        token Name::Builtin
      elsif CSS.constants.include? m[0]
        token Name::Constant
      else
        token Name
      end
    end
  end

  state :has_interp do
    rule /[#][{]/, Str::Interpol, :interpolation
  end

  state :has_strings do
    rule /"/, Str::Double, :dq
    rule /'/, Str::Single, :sq
  end

  state :interpolation do
    rule /}/, Str::Interpol, :pop!
    mixin :value
  end

  state :selector do
    mixin :end_section

    mixin :has_strings
    mixin :has_interp
    rule /[ \t]+/, Text
    rule /:/, Name::Decorator, :pseudo_class
    rule /[.]/, Name::Class, :class
    rule /#/, Name::Namespace, :id
    rule /%/, Name::Variable, :placeholder
    rule id, Name::Tag
    rule /&/, Keyword
    rule /[~^*!&\[\]()<>\|[email protected]:;,.\/?-]/, Operator
  end

  state :dq do
    rule /"/, Str::Double, :pop!
    mixin :has_interp
    rule /(\\.|#(?![{])|[^\n"#])+/, Str::Double
  end

  state :sq do
    rule /'/, Str::Single, :pop!
    mixin :has_interp
    rule /(\\.|#(?![{])|[^\n'#])+/, Str::Single
  end

  state :string_url do
    rule /[)]/, Str::Other, :pop!
    rule /(\\.|#(?![{])|[^\n)#])+/, Str::Other
    mixin :has_interp
  end

  state :selector_piece do
    mixin :has_interp
    rule(//) { pop! }
  end

  state :pseudo_class do
    rule id, Name::Decorator
    mixin :selector_piece
  end

  state :class do
    rule id, Name::Class
    mixin :selector_piece
  end

  state :id do
    rule id, Name::Namespace
    mixin :selector_piece
  end

  state :placeholder do
    rule id, Name::Variable
    mixin :selector_piece
  end

  state :for do
    rule /(from|to|through)/, Operator::Word
    mixin :value
  end

  state :attr_common do
    mixin :has_interp
    rule id do |m|
      if CSS.attributes.include? m[0]
        token Name::Label
      else
        token Name::Attribute
      end
    end
  end

  state :attribute do
    mixin :attr_common

    rule /([ \t]*)(:)/ do
      group Text; group Punctuation
      push :value
    end
  end

  state :inline_comment do
    rule /(\\#|#(?=[^\n{])|\*(?=[^\n\/])|[^\n#*])+/, Comment::Multiline
    mixin :has_interp
    rule %r([*]/), Comment::Multiline, :pop!
  end
end

Constants included from Token::Tokens

Token::Tokens::Num, Token::Tokens::Str

Class Method Summary collapse

Methods included from Token::Tokens

token

Class Method Details

.included(klass) ⇒ Object


8
9
10
# File 'lib/rouge/lexers/sass/common.rb', line 8

def self.included(klass)
  klass.class_eval(&INCLUDED_PROC)
end