153 lines
3.3 KiB
Ruby
153 lines
3.3 KiB
Ruby
# -*- coding: utf-8 -*- #
|
|
# frozen_string_literal: true
|
|
|
|
module Rouge
|
|
module Lexers
|
|
class Jsonnet < RegexLexer
|
|
title 'Jsonnet'
|
|
desc 'An elegant, formally-specified config language for JSON'
|
|
tag 'jsonnet'
|
|
filenames '*.jsonnet', '*.libsonnet'
|
|
mimetypes 'text/x-jsonnet'
|
|
|
|
def self.keywords
|
|
@keywords ||= Set.new %w(
|
|
self super local for in if then else import importstr error
|
|
tailstrict assert
|
|
)
|
|
end
|
|
|
|
def self.declarations
|
|
@declarations ||= Set.new %w(
|
|
function
|
|
)
|
|
end
|
|
|
|
def self.constants
|
|
@constants ||= Set.new %w(
|
|
null true false
|
|
)
|
|
end
|
|
|
|
def self.builtins
|
|
@builtins ||= Set.new %w(
|
|
acos
|
|
asin
|
|
atan
|
|
ceil
|
|
char
|
|
codepoint
|
|
cos
|
|
exp
|
|
exponent
|
|
filter
|
|
floor
|
|
force
|
|
length
|
|
log
|
|
makeArray
|
|
mantissa
|
|
objectFields
|
|
objectHas
|
|
pow
|
|
sin
|
|
sqrt
|
|
tan
|
|
thisFile
|
|
type
|
|
abs
|
|
assertEqual
|
|
escapeStringBash
|
|
escapeStringDollars
|
|
escapeStringJson
|
|
escapeStringPython
|
|
filterMap
|
|
flattenArrays
|
|
foldl
|
|
foldr
|
|
format
|
|
join
|
|
lines
|
|
manifestIni
|
|
manifestPython
|
|
manifestPythonVars
|
|
map
|
|
max
|
|
min
|
|
mod
|
|
range
|
|
set
|
|
setDiff
|
|
setInter
|
|
setMember
|
|
setUnion
|
|
sort
|
|
split
|
|
stringChars
|
|
substr
|
|
toString
|
|
uniq
|
|
)
|
|
end
|
|
|
|
identifier = /[a-zA-Z_][a-zA-Z0-9_]*/
|
|
|
|
state :root do
|
|
rule %r/\s+/, Text
|
|
rule %r(//.*?$), Comment::Single
|
|
rule %r(#.*?$), Comment::Single
|
|
rule %r(/\*.*?\*/)m, Comment::Multiline
|
|
|
|
rule %r/-?(?:0|[1-9]\d*)\.\d+(?:e[+-]\d+)?/i, Num::Float
|
|
rule %r/-?(?:0|[1-9]\d*)(?:e[+-]\d+)?/i, Num::Integer
|
|
|
|
rule %r/[{}:\.,;+\[\]=%\(\)]/, Punctuation
|
|
|
|
rule %r/"/, Str, :string_double
|
|
rule %r/'/, Str, :string_single
|
|
rule %r/\|\|\|/, Str, :string_block
|
|
|
|
rule %r/\$/, Keyword
|
|
|
|
rule identifier do |m|
|
|
if self.class.keywords.include? m[0]
|
|
token Keyword
|
|
elsif self.class.declarations.include? m[0]
|
|
token Keyword::Declaration
|
|
elsif self.class.constants.include? m[0]
|
|
token Keyword::Constant
|
|
elsif self.class.builtins.include? m[0]
|
|
token Name::Builtin
|
|
else
|
|
token Name::Other
|
|
end
|
|
end
|
|
end
|
|
|
|
state :string do
|
|
rule %r/\\([\\\/bfnrt]|(u[0-9a-fA-F]{4}))/, Str::Escape
|
|
end
|
|
|
|
state :string_double do
|
|
mixin :string
|
|
rule %r/\\"/, Str::Escape
|
|
rule %r/"/, Str, :pop!
|
|
rule %r/[^\\"]+/, Str
|
|
end
|
|
|
|
state :string_single do
|
|
mixin :string
|
|
rule %r/\\'/, Str::Escape
|
|
rule %r/'/, Str, :pop!
|
|
rule %r/[^\\']+/, Str
|
|
end
|
|
|
|
state :string_block do
|
|
mixin :string
|
|
rule %r/\|\|\|/, Str, :pop!
|
|
rule %r/.*/, Str
|
|
end
|
|
end
|
|
end
|
|
end
|