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
|