183 lines
4.4 KiB
Ruby
183 lines
4.4 KiB
Ruby
# -*- coding: utf-8 -*- #
|
|
# frozen_string_literal: true
|
|
|
|
module Rouge
|
|
module Lexers
|
|
# shared states with SCSS
|
|
class SassCommon < RegexLexer
|
|
id = /[\w-]+/
|
|
|
|
state :content_common do
|
|
rule %r/@for\b/, Keyword, :for
|
|
rule %r/@(debug|warn|if|each|while|else|return|media)/, Keyword, :value
|
|
|
|
rule %r/(@mixin)(\s+)(#{id})/ do
|
|
groups Keyword, Text, Name::Function
|
|
push :value
|
|
end
|
|
|
|
rule %r/(@function)(\s+)(#{id})/ do
|
|
groups Keyword, Text, Name::Function
|
|
push :value
|
|
end
|
|
|
|
rule %r/@extend\b/, Keyword, :selector
|
|
|
|
rule %r/(@include)(\s+)(#{id})/ do
|
|
groups Keyword, Text, Name::Decorator
|
|
push :value
|
|
end
|
|
|
|
rule %r/@#{id}/, Keyword, :selector
|
|
rule %r/&/, Keyword, :selector
|
|
|
|
# $variable: assignment
|
|
rule %r/([$]#{id})([ \t]*)(:)/ do
|
|
groups Name::Variable, Text, Punctuation
|
|
push :value
|
|
end
|
|
end
|
|
|
|
state :value do
|
|
mixin :end_section
|
|
rule %r/[ \t]+/, Text
|
|
rule %r/[$]#{id}/, Name::Variable
|
|
rule %r/url[(]/, Str::Other, :string_url
|
|
rule %r/#{id}(?=\s*[(])/, Name::Function
|
|
rule %r/%#{id}/, Name::Decorator
|
|
|
|
# named literals
|
|
rule %r/(true|false)\b/, Name::Builtin::Pseudo
|
|
rule %r/(and|or|not)\b/, Operator::Word
|
|
|
|
# colors and numbers
|
|
rule %r/#[a-z0-9]{1,6}/i, Num::Hex
|
|
rule %r/-?\d+(%|[a-z]+)?/, Num
|
|
rule %r/-?\d*\.\d+(%|[a-z]+)?/, Num::Integer
|
|
|
|
mixin :has_strings
|
|
mixin :has_interp
|
|
|
|
rule %r/[~^*!&%<>\|+=@:,.\/?-]+/, Operator
|
|
rule %r/[\[\]()]+/, 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 %r/[#][{]/, Str::Interpol, :interpolation
|
|
end
|
|
|
|
state :has_strings do
|
|
rule %r/"/, Str::Double, :dq
|
|
rule %r/'/, Str::Single, :sq
|
|
end
|
|
|
|
state :interpolation do
|
|
rule %r/}/, Str::Interpol, :pop!
|
|
mixin :value
|
|
end
|
|
|
|
state :selector do
|
|
mixin :end_section
|
|
|
|
mixin :has_strings
|
|
mixin :has_interp
|
|
rule %r/[ \t]+/, Text
|
|
rule %r/:/, Name::Decorator, :pseudo_class
|
|
rule %r/[.]/, Name::Class, :class
|
|
rule %r/#/, Name::Namespace, :id
|
|
rule %r/%/, Name::Variable, :placeholder
|
|
rule id, Name::Tag
|
|
rule %r/&/, Keyword
|
|
rule %r/[~^*!&\[\]()<>\|+=@:;,.\/?-]/, Operator
|
|
end
|
|
|
|
state :dq do
|
|
rule %r/"/, Str::Double, :pop!
|
|
mixin :has_interp
|
|
rule %r/(\\.|#(?![{])|[^\n"#])+/, Str::Double
|
|
end
|
|
|
|
state :sq do
|
|
rule %r/'/, Str::Single, :pop!
|
|
mixin :has_interp
|
|
rule %r/(\\.|#(?![{])|[^\n'#])+/, Str::Single
|
|
end
|
|
|
|
state :string_url do
|
|
rule %r/[)]/, Str::Other, :pop!
|
|
rule %r/(\\.|#(?![{])|[^\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 %r/(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 %r/([ \t]*)(:)/ do
|
|
groups Text, Punctuation
|
|
push :value
|
|
end
|
|
end
|
|
|
|
state :inline_comment do
|
|
rule %r/(\\#|#(?=[^\n{])|\*(?=[^\n\/])|[^\n#*])+/, Comment::Multiline
|
|
mixin :has_interp
|
|
rule %r([*]/), Comment::Multiline, :pop!
|
|
end
|
|
end
|
|
end
|
|
end
|