lib/rouge/lexers/sass.rb in rouge-0.3.0 vs lib/rouge/lexers/sass.rb in rouge-0.3.1

- old
+ new

@@ -1,5 +1,7 @@ +require 'rouge/lexers/sass/common' + module Rouge module Lexers class Sass < RegexLexer include Indentation @@ -63,177 +65,9 @@ state :end_section do rule(/\n/) { token 'Text'; reset_stack } end - # shared states with SCSS - # TODO: make this less nasty to do - COMMON = 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 - - class_eval(&COMMON) + instance_eval(&SASS_COMMON) end end end