rf-web/vendor/bundle/gems/rouge-3.12.0/lib/rouge/lexers/elm.rb
2019-10-21 10:18:17 +02:00

91 lines
2.6 KiB
Ruby

# -*- coding: utf-8 -*- #
# frozen_string_literal: true
module Rouge
module Lexers
class Elm < RegexLexer
title "Elm"
desc "The Elm programming language (http://elm-lang.org/)"
tag 'elm'
filenames '*.elm'
mimetypes 'text/x-elm'
# Keywords are logically grouped by lines
keywords = %w(
module exposing port
import as
type alias
if then else
case of
let in
)
state :root do
# Whitespaces
rule %r/\s+/m, Text
# Single line comments
rule %r/--.*/, Comment::Single
# Multiline comments
rule %r/{-/, Comment::Multiline, :multiline_comment
# Keywords
rule %r/\b(#{keywords.join('|')})\b/, Keyword
# Variable or a function
rule %r/[a-z]\w*/, Name
# Underscore is a name for a variable, when it won't be used later
rule %r/_/, Name
# Type
rule %r/[A-Z]\w*/, Keyword::Type
# Two symbol operators: -> :: // .. && || ++ |> <| << >> == /= <= >=
rule %r/(->|::|\/\/|\.\.|&&|\|\||\+\+|\|>|<\||>>|<<|==|\/=|<=|>=)/, Operator
# One symbol operators: + - / * % = < > ^ | !
rule %r/[+-\/*%=<>^\|!]/, Operator
# Lambda operator
rule %r/\\/, Operator
# Not standard Elm operators, but these symbols can be used for custom inflix operators. We need to highlight them as operators as well.
rule %r/[@\#$&~?]/, Operator
# Single, double quotes, and triple double quotes
rule %r/"""/, Str, :multiline_string
rule %r/'(\\.|.)'/, Str::Char
rule %r/"/, Str, :double_quote
# Numbers
rule %r/0x[\da-f]+/i, Num::Hex
rule %r/\d+e[+-]?\d+/i, Num::Float
rule %r/\d+\.\d+(e[+-]?\d+)?/i, Num::Float
rule %r/\d+/, Num::Integer
# Punctuation: [ ] ( ) , ; ` { } :
rule %r/[\[\](),;`{}:]/, Punctuation
end
# Multiline and nested commenting
state :multiline_comment do
rule %r/-}/, Comment::Multiline, :pop!
rule %r/{-/, Comment::Multiline, :multiline_comment
rule %r/[^-{}]+/, Comment::Multiline
rule %r/[-{}]/, Comment::Multiline
end
# Double quotes
state :double_quote do
rule %r/[^\\"]+/, Str::Double
rule %r/\\"/, Str::Escape
rule %r/"/, Str::Double, :pop!
end
# Multiple line string with tripple double quotes, e.g. """ multi """
state :multiline_string do
rule %r/\s*"""/, Str, :pop!
rule %r/.*/, Str
rule %r/\s*/, Str
end
end
end
end