This commit is contained in:
@@ -0,0 +1,122 @@
|
||||
# frozen_string_literal: true
|
||||
|
||||
module Rouge
|
||||
module Lexers
|
||||
class Prometheus < RegexLexer
|
||||
desc 'prometheus'
|
||||
tag 'prometheus'
|
||||
aliases 'prometheus'
|
||||
filenames '*.prometheus'
|
||||
|
||||
mimetypes 'text/x-prometheus', 'application/x-prometheus'
|
||||
|
||||
def self.functions
|
||||
@functions ||= Set.new %w(
|
||||
abs absent ceil changes clamp_max clamp_min count_scalar day_of_month
|
||||
day_of_week days_in_month delta deriv drop_common_labels exp floor
|
||||
histogram_quantile holt_winters hour idelta increase irate label_replace
|
||||
ln log2 log10 month predict_linear rate resets round scalar sort
|
||||
sort_desc sqrt time vector year avg_over_time min_over_time
|
||||
max_over_time sum_over_time count_over_time quantile_over_time
|
||||
stddev_over_time stdvar_over_time
|
||||
)
|
||||
end
|
||||
|
||||
state :root do
|
||||
mixin :strings
|
||||
mixin :whitespace
|
||||
|
||||
rule %r/-?\d+\.\d+/, Num::Float
|
||||
rule %r/-?\d+[smhdwy]?/, Num::Integer
|
||||
|
||||
mixin :operators
|
||||
|
||||
rule %r/(ignoring|on)(\()/ do
|
||||
groups Keyword::Pseudo, Punctuation
|
||||
push :label_list
|
||||
end
|
||||
rule %r/(group_left|group_right)(\()/ do
|
||||
groups Keyword::Type, Punctuation
|
||||
end
|
||||
rule %r/(bool|offset)\b/, Keyword
|
||||
rule %r/(without|by)\b/, Keyword, :label_list
|
||||
rule %r/[\w:]+/ do |m|
|
||||
if self.class.functions.include?(m[0])
|
||||
token Name::Builtin
|
||||
else
|
||||
token Name
|
||||
end
|
||||
end
|
||||
|
||||
mixin :metrics
|
||||
end
|
||||
|
||||
state :metrics do
|
||||
rule %r/[a-zA-Z0-9_-]+/, Name
|
||||
|
||||
rule %r/[\(\)\]:.,]/, Punctuation
|
||||
rule %r/\{/, Punctuation, :filters
|
||||
rule %r/\[/, Punctuation
|
||||
end
|
||||
|
||||
state :strings do
|
||||
rule %r/"/, Str::Double, :double_string_escaped
|
||||
rule %r/'/, Str::Single, :single_string_escaped
|
||||
rule %r/`.*`/, Str::Backtick
|
||||
end
|
||||
|
||||
[
|
||||
[:double, Str::Double, '"'],
|
||||
[:single, Str::Single, "'"]
|
||||
].each do |name, tok, fin|
|
||||
state :"#{name}_string_escaped" do
|
||||
rule %r/\\[\\abfnrtv#{fin}]/, Str::Escape
|
||||
rule %r/[^\\#{fin}]+/m, tok
|
||||
rule %r/#{fin}/, tok, :pop!
|
||||
end
|
||||
end
|
||||
|
||||
state :filters do
|
||||
mixin :inline_whitespace
|
||||
rule %r/,/, Punctuation
|
||||
mixin :labels
|
||||
mixin :filter_matching_operators
|
||||
mixin :strings
|
||||
rule %r/}/, Punctuation, :pop!
|
||||
end
|
||||
|
||||
state :label_list do
|
||||
rule %r/\(/, Punctuation
|
||||
rule %r/[a-zA-Z0-9_:-]+/, Name::Attribute
|
||||
rule %r/,/, Punctuation
|
||||
mixin :whitespace
|
||||
rule %r/\)/, Punctuation, :pop!
|
||||
end
|
||||
|
||||
state :labels do
|
||||
rule %r/[a-zA-Z0-9_:-]+/, Name::Attribute
|
||||
end
|
||||
|
||||
state :operators do
|
||||
rule %r([+\-\*/%\^]), Operator # Arithmetic
|
||||
rule %r(=|==|!=|<|>|<=|>=), Operator # Comparison
|
||||
rule %r/and|or|unless/, Operator # Logical/Set
|
||||
rule %r/(sum|min|max|avg|stddev|stdvar|count|count_values|bottomk|topk)\b/, Name::Function
|
||||
end
|
||||
|
||||
state :filter_matching_operators do
|
||||
rule %r/!(=|~)|=~?/, Operator
|
||||
end
|
||||
|
||||
state :inline_whitespace do
|
||||
rule %r/[ \t\r]+/, Text
|
||||
end
|
||||
|
||||
state :whitespace do
|
||||
mixin :inline_whitespace
|
||||
rule %r/\n\s*/m, Text
|
||||
rule %r/#.*?$/, Comment
|
||||
end
|
||||
end
|
||||
end
|
||||
end
|
||||
Reference in New Issue
Block a user