72 lines
2.1 KiB
Ruby
72 lines
2.1 KiB
Ruby
|
# -*- coding: utf-8 -*- #
|
||
|
# frozen_string_literal: true
|
||
|
|
||
|
module Rouge
|
||
|
module Lexers
|
||
|
class Protobuf < RegexLexer
|
||
|
title 'Protobuf'
|
||
|
desc 'Google\'s language-neutral, platform-neutral, extensible mechanism for serializing structured data'
|
||
|
tag 'protobuf'
|
||
|
aliases 'proto'
|
||
|
filenames '*.proto'
|
||
|
mimetypes 'text/x-proto'
|
||
|
|
||
|
kw = /\b(ctype|default|extensions|import|max|oneof|option|optional|packed|repeated|required|returns|rpc|to)\b/
|
||
|
datatype = /\b(bool|bytes|double|fixed32|fixed64|float|int32|int64|sfixed32|sfixed64|sint32|sint64|string|uint32|uint64)\b/
|
||
|
|
||
|
state :root do
|
||
|
rule %r/[\s]+/, Text
|
||
|
rule %r/[,;{}\[\]()]/, Punctuation
|
||
|
rule %r/\/(\\\n)?\/(\n|(.|\n)*?[^\\]\n)/, Comment::Single
|
||
|
rule %r/\/(\\\n)?\*(.|\n)*?\*(\\\n)?\//, Comment::Multiline
|
||
|
rule kw, Keyword
|
||
|
rule datatype, Keyword::Type
|
||
|
rule %r/true|false/, Keyword::Constant
|
||
|
rule %r/(package)(\s+)/ do
|
||
|
groups Keyword::Namespace, Text
|
||
|
push :package
|
||
|
end
|
||
|
|
||
|
rule %r/(message|extend)(\s+)/ do
|
||
|
groups Keyword::Declaration, Text
|
||
|
push :message
|
||
|
end
|
||
|
|
||
|
rule %r/(enum|group|service)(\s+)/ do
|
||
|
groups Keyword::Declaration, Text
|
||
|
push :type
|
||
|
end
|
||
|
|
||
|
rule %r/".*?"/, Str
|
||
|
rule %r/'.*?'/, Str
|
||
|
rule %r/(\d+\.\d*|\.\d+|\d+)[eE][+-]?\d+[LlUu]*/, Num::Float
|
||
|
rule %r/(\d+\.\d*|\.\d+|\d+[fF])[fF]?/, Num::Float
|
||
|
rule %r/(\-?(inf|nan))\b/, Num::Float
|
||
|
rule %r/0x[0-9a-fA-F]+[LlUu]*/, Num::Hex
|
||
|
rule %r/0[0-7]+[LlUu]*/, Num::Oct
|
||
|
rule %r/\d+[LlUu]*/, Num::Integer
|
||
|
rule %r/[+-=]/, Operator
|
||
|
rule %r/([a-zA-Z_][\w.]*)([ \t]*)(=)/ do
|
||
|
groups Name::Attribute, Text, Operator
|
||
|
end
|
||
|
rule %r/[a-zA-Z_][\w.]*/, Name
|
||
|
end
|
||
|
|
||
|
state :package do
|
||
|
rule %r/[a-zA-Z_]\w*/, Name::Namespace, :pop!
|
||
|
rule(//) { pop! }
|
||
|
end
|
||
|
|
||
|
state :message do
|
||
|
rule %r/[a-zA-Z_]\w*/, Name::Class, :pop!
|
||
|
rule(//) { pop! }
|
||
|
end
|
||
|
|
||
|
state :type do
|
||
|
rule %r/[a-zA-Z_]\w*/, Name, :pop!
|
||
|
rule(//) { pop! }
|
||
|
end
|
||
|
end
|
||
|
end
|
||
|
end
|