Class: Rouge::Lexers::Sass

Inherits:
RegexLexer show all
Includes:
Indentation
Defined in:
lib/rouge/lexers/sass.rb

Constant Summary collapse

COMMON =

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

proc do
  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[(]/, 'Literal.String.Other', :string_url
    rule /#{id}(?=\s*[(])/, 'Name.Function'
    rule /%#{id}/, 'Name.Decorator'

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

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

    mixin :has_strings
    mixin :has_interp

    rule /[~^*!&%<>\|+=@:,.\/?-]+/, '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 /[#][{]/, 'Literal.String.Interpol', :interpolation
  end

  state :has_strings do
    rule /"/, 'Literal.String.Double', :dq
    rule /'/, 'Literal.String.Single', :sq
  end

  state :interpolation do
    rule /}/, 'Literal.String.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 /[~^*!&\[\]()<>\|+=@:;,.\/?-]/, 'Operator'
  end

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

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

  state :string_url do
    rule /[)]/, 'Literal.String.Other', :pop!
    rule /(\\.|#(?![{])|[^\n)#])+/, 'Literal.String.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 inherited from RegexLexer

RegexLexer::MAX_NULL_SCANS

Method Summary

Methods included from Indentation

#indentation, #reset!, #starts_block

Methods inherited from RegexLexer

#delegate, get_state, #get_state, #group, #in_state?, #pop!, #push, #reset!, #reset_stack, #run_callback, #run_rule, #stack, start, start_procs, #state, state, #state?, states, #step, #stream_tokens, #token

Methods inherited from Rouge::Lexer

aliases, all, analyze_text, assert_utf8!, #debug, default_options, demo, demo_file, desc, filenames, find, find_fancy, guess, guess_by_filename, guess_by_mimetype, guess_by_source, #initialize, lex, #lex, mimetypes, #option, #options, register, #reset!, #stream_tokens, tag, #tag

Constructor Details

This class inherits a constructor from Rouge::Lexer