123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168 |
- """
- pygments.lexers.jsonnet
- ~~~~~~~~~~~~~~~~~~~~~~~
- Lexer for Jsonnet data templating language.
- :copyright: Copyright 2006-2023 by the Pygments team, see AUTHORS.
- :license: BSD, see LICENSE for details.
- """
- from pygments.lexer import include, RegexLexer, words
- from pygments.token import Comment, Keyword, Name, Number, Operator, \
- Punctuation, String, Text, Whitespace
- __all__ = ['JsonnetLexer']
- jsonnet_token = r'[^\W\d]\w*'
- jsonnet_function_token = jsonnet_token + r'(?=\()'
- def string_rules(quote_mark):
- return [
- (r"[^{}\\]".format(quote_mark), String),
- (r"\\.", String.Escape),
- (quote_mark, String, '#pop'),
- ]
- def quoted_field_name(quote_mark):
- return [
- (r'([^{quote}\\]|\\.)*{quote}'.format(quote=quote_mark),
- Name.Variable, 'field_separator')
- ]
- class JsonnetLexer(RegexLexer):
- """Lexer for Jsonnet source code."""
- name = 'Jsonnet'
- aliases = ['jsonnet']
- filenames = ['*.jsonnet', '*.libsonnet']
- url = "https://jsonnet.org"
- tokens = {
- # Not used by itself
- '_comments': [
- (r'(//|#).*\n', Comment.Single),
- (r'/\*\*([^/]|/(?!\*))*\*/', String.Doc),
- (r'/\*([^/]|/(?!\*))*\*/', Comment),
- ],
- 'root': [
- include('_comments'),
- (r"@'.*'", String),
- (r'@".*"', String),
- (r"'", String, 'singlestring'),
- (r'"', String, 'doublestring'),
- (r'\|\|\|(.|\n)*\|\|\|', String),
- # Jsonnet has no integers, only an IEEE754 64-bit float
- (r'[+-]?[0-9]+(.[0-9])?', Number.Float),
- # Omit : despite spec because it appears to be used as a field
- # separator
- (r'[!$~+\-&|^=<>*/%]', Operator),
- (r'\{', Punctuation, 'object'),
- (r'\[', Punctuation, 'array'),
- (r'local\b', Keyword, ('local_name')),
- (r'assert\b', Keyword, 'assert'),
- (words([
- 'assert', 'else', 'error', 'false', 'for', 'if', 'import',
- 'importstr', 'in', 'null', 'tailstrict', 'then', 'self',
- 'super', 'true',
- ], suffix=r'\b'), Keyword),
- (r'\s+', Whitespace),
- (r'function(?=\()', Keyword, 'function_params'),
- (r'std\.' + jsonnet_function_token, Name.Builtin, 'function_args'),
- (jsonnet_function_token, Name.Function, 'function_args'),
- (jsonnet_token, Name.Variable),
- (r'[\.()]', Punctuation),
- ],
- 'singlestring': string_rules("'"),
- 'doublestring': string_rules('"'),
- 'array': [
- (r',', Punctuation),
- (r'\]', Punctuation, '#pop'),
- include('root'),
- ],
- 'local_name': [
- (jsonnet_function_token, Name.Function, 'function_params'),
- (jsonnet_token, Name.Variable),
- (r'\s+', Whitespace),
- ('(?==)', Whitespace, ('#pop', 'local_value')),
- ],
- 'local_value': [
- (r'=', Operator),
- (r';', Punctuation, '#pop'),
- include('root'),
- ],
- 'assert': [
- (r':', Punctuation),
- (r';', Punctuation, '#pop'),
- include('root'),
- ],
- 'function_params': [
- (jsonnet_token, Name.Variable),
- (r'\(', Punctuation),
- (r'\)', Punctuation, '#pop'),
- (r',', Punctuation),
- (r'\s+', Whitespace),
- (r'=', Operator, 'function_param_default'),
- ],
- 'function_args': [
- (r'\(', Punctuation),
- (r'\)', Punctuation, '#pop'),
- (r',', Punctuation),
- (r'\s+', Whitespace),
- include('root'),
- ],
- 'object': [
- (r'\s+', Whitespace),
- (r'local\b', Keyword, 'object_local_name'),
- (r'assert\b', Keyword, 'object_assert'),
- (r'\[', Operator, 'field_name_expr'),
- (fr'(?={jsonnet_token})', Text, 'field_name'),
- (r'\}', Punctuation, '#pop'),
- (r'"', Name.Variable, 'double_field_name'),
- (r"'", Name.Variable, 'single_field_name'),
- include('_comments'),
- ],
- 'field_name': [
- (jsonnet_function_token, Name.Function,
- ('field_separator', 'function_params')
- ),
- (jsonnet_token, Name.Variable, 'field_separator'),
- ],
- 'double_field_name': quoted_field_name('"'),
- 'single_field_name': quoted_field_name("'"),
- 'field_name_expr': [
- (r'\]', Operator, 'field_separator'),
- include('root'),
- ],
- 'function_param_default': [
- (r'(?=[,\)])', Whitespace, '#pop'),
- include('root'),
- ],
- 'field_separator': [
- (r'\s+', Whitespace),
- (r'\+?::?:?', Punctuation, ('#pop', '#pop', 'field_value')),
- include('_comments'),
- ],
- 'field_value': [
- (r',', Punctuation, '#pop'),
- (r'\}', Punctuation, '#pop:2'),
- include('root'),
- ],
- 'object_assert': [
- (r':', Punctuation),
- (r',', Punctuation, '#pop'),
- include('root'),
- ],
- 'object_local_name': [
- (jsonnet_token, Name.Variable, ('#pop', 'object_local_value')),
- (r'\s+', Whitespace),
- ],
- 'object_local_value': [
- (r'=', Operator),
- (r',', Punctuation, '#pop'),
- (r'\}', Punctuation, '#pop:2'),
- include('root'),
- ],
- }
|