|
""" |
|
pygments.lexers.json5 |
|
~~~~~~~~~~~~~~~~~~~~~ |
|
|
|
Lexer for Json5 file format. |
|
|
|
:copyright: Copyright 2006-2025 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, Punctuation, \ |
|
String, Whitespace |
|
|
|
__all__ = ['Json5Lexer'] |
|
|
|
|
|
def string_rules(quote_mark): |
|
return [ |
|
(rf"[^{quote_mark}\\]+", String), |
|
(r"\\.", String.Escape), |
|
(r"\\", Punctuation), |
|
(quote_mark, String, '#pop'), |
|
] |
|
|
|
|
|
def quoted_field_name(quote_mark): |
|
return [ |
|
(rf'([^{quote_mark}\\]|\\.)*{quote_mark}', |
|
Name.Variable, ('#pop', 'object_value')) |
|
] |
|
|
|
|
|
class Json5Lexer(RegexLexer): |
|
"""Lexer for JSON5 data structures.""" |
|
|
|
name = 'JSON5' |
|
aliases = ['json5'] |
|
filenames = ['*.json5'] |
|
url = "https://json5.org" |
|
version_added = '2.19' |
|
tokens = { |
|
'_comments': [ |
|
(r'(//|#).*\n', Comment.Single), |
|
(r'/\*\*([^/]|/(?!\*))*\*/', String.Doc), |
|
(r'/\*([^/]|/(?!\*))*\*/', Comment), |
|
], |
|
'root': [ |
|
include('_comments'), |
|
(r"'", String, 'singlestring'), |
|
(r'"', String, 'doublestring'), |
|
(r'[+-]?0[xX][0-9a-fA-F]+', Number.Hex), |
|
(r'[+-.]?[0-9]+[.]?[0-9]?([eE][-]?[0-9]+)?', Number.Float), |
|
(r'\{', Punctuation, 'object'), |
|
(r'\[', Punctuation, 'array'), |
|
(words(['false', 'Infinity', '+Infinity', '-Infinity', 'NaN', |
|
'null', 'true',], suffix=r'\b'), Keyword), |
|
(r'\s+', Whitespace), |
|
(r':', Punctuation), |
|
], |
|
'singlestring': string_rules("'"), |
|
'doublestring': string_rules('"'), |
|
'array': [ |
|
(r',', Punctuation), |
|
(r'\]', Punctuation, '#pop'), |
|
include('root'), |
|
], |
|
'object': [ |
|
(r'\s+', Whitespace), |
|
(r'\}', Punctuation, '#pop'), |
|
(r'\b([^:]+)', Name.Variable, 'object_value'), |
|
(r'"', Name.Variable, 'double_field_name'), |
|
(r"'", Name.Variable, 'single_field_name'), |
|
include('_comments'), |
|
], |
|
'double_field_name': quoted_field_name('"'), |
|
'single_field_name': quoted_field_name("'"), |
|
'object_value': [ |
|
(r',', Punctuation, '#pop'), |
|
(r'\}', Punctuation, '#pop:2'), |
|
include('root'), |
|
], |
|
} |
|
|