You can not select more than 25 topics Topics must start with a letter or number, can include dashes ('-') and can be up to 35 characters long.
bazarr/libs/pygments/lexers/graphql.py

178 lines
5.5 KiB

"""
pygments.lexers.graphql
~~~~~~~~~~~~~~~~~~~~~~~
Lexer for GraphQL, an open-source data query and manipulation
language for APIs.
More information:
https://graphql.org/
:copyright: Copyright 2006-2023 by the Pygments team, see AUTHORS.
:license: BSD, see LICENSE for details.
"""
from pygments.lexer import RegexLexer, words, include, bygroups, default
from pygments.token import (Comment, Keyword, Name, Number, Punctuation, String,
Whitespace)
__all__ = ["GraphQLLexer"]
OPERATION_TYPES = ("query", "mutation", "subscription")
BUILTIN_TYPES = ("Int", "Float", "String", "Boolean", "ID")
BOOLEAN_VALUES = ("true", "false", "null")
KEYWORDS = (
"type",
"schema",
"extend",
"enum",
"scalar",
"implements",
"interface",
"union",
"input",
"directive",
"QUERY",
"MUTATION",
"SUBSCRIPTION",
"FIELD",
"FRAGMENT_DEFINITION",
"FRAGMENT_SPREAD",
"INLINE_FRAGMENT",
"SCHEMA",
"SCALAR",
"OBJECT",
"FIELD_DEFINITION",
"ARGUMENT_DEFINITION",
"INTERFACE",
"UNION",
"ENUM",
"ENUM_VALUE",
"INPUT_OBJECT",
"INPUT_FIELD_DEFINITION",
)
class GraphQLLexer(RegexLexer):
"""
Lexer for GraphQL syntax
.. versionadded:: 2.16
"""
name = "GraphQL"
aliases = ["graphql"]
filenames = ["*.graphql"]
url = "https://graphql.org"
tokens = {
"ignored_tokens": [
(r"\s+", Whitespace), # Whitespaces
(r"#.*$", Comment),
(",", Punctuation), # Insignificant commas
],
"value": [
include("ignored_tokens"),
(r"-?\d+(?![.eE])", Number.Integer, "#pop"),
(
r"-?\d+(\.\d+)?([eE][+-]?\d+)?",
Number.Float,
"#pop",
),
(r'"', String, ("#pop", "string")),
(words(BOOLEAN_VALUES, suffix=r"\b"), Name.Builtin, "#pop"),
(r"\$[a-zA-Z_]\w*", Name.Variable, "#pop"),
(r"[a-zA-Z_]\w*", Name.Constant, "#pop"),
(r"\[", Punctuation, ("#pop", "list_value")),
(r"\{", Punctuation, ("#pop", "object_value")),
],
"list_value": [
include("ignored_tokens"),
("]", Punctuation, "#pop"),
default("value"),
],
"object_value": [
include("ignored_tokens"),
(r"[a-zA-Z_]\w*", Name),
(r":", Punctuation, "value"),
(r"\}", Punctuation, "#pop"),
],
"string": [
(r'\\(["\\/bfnrt]|u[a-fA-F0-9]{4})', String.Escape),
(r'[^\\"\n]+', String), # all other characters
(r'"', String, "#pop"),
],
"root": [
include("ignored_tokens"),
(words(OPERATION_TYPES, suffix=r"\b"), Keyword, "operation"),
(words(KEYWORDS, suffix=r"\b"), Keyword),
(r"\{", Punctuation, "selection_set"),
(r"fragment\b", Keyword, "fragment_definition"),
],
"operation": [
include("ignored_tokens"),
(r"[a-zA-Z_]\w*", Name.Function),
(r"\(", Punctuation, "variable_definition"),
(r"\{", Punctuation, ("#pop", "selection_set")),
],
"variable_definition": [
include("ignored_tokens"),
(r"\$[a-zA-Z_]\w*", Name.Variable),
(r"[\]!]", Punctuation),
(r":", Punctuation, "type"),
(r"=", Punctuation, "value"),
(r"\)", Punctuation, "#pop"),
],
"type": [
include("ignored_tokens"),
(r"\[", Punctuation),
(words(BUILTIN_TYPES, suffix=r"\b"), Name.Builtin, "#pop"),
(r"[a-zA-Z_]\w*", Name.Class, "#pop"),
],
"selection_set": [
include("ignored_tokens"),
(r"([a-zA-Z_]\w*)(\s*)(:)", bygroups(Name.Label, Whitespace, Punctuation)),
(r"[a-zA-Z_]\w*", Name), # Field
(
r"(\.\.\.)(\s+)(on)\b",
bygroups(Punctuation, Whitespace, Keyword),
"inline_fragment",
),
(r"\.\.\.", Punctuation, "fragment_spread"),
(r"\(", Punctuation, "arguments"),
(r"@[a-zA-Z_]\w*", Name.Decorator, "directive"),
(r"\{", Punctuation, "selection_set"),
(r"\}", Punctuation, "#pop"),
],
"directive": [
include("ignored_tokens"),
(r"\(", Punctuation, ("#pop", "arguments")),
],
"arguments": [
include("ignored_tokens"),
(r"[a-zA-Z_]\w*", Name),
(r":", Punctuation, "value"),
(r"\)", Punctuation, "#pop"),
],
# Fragments
"fragment_definition": [
include("ignored_tokens"),
(r"[\]!]", Punctuation), # For NamedType
(r"on\b", Keyword, "type"),
(r"[a-zA-Z_]\w*", Name.Function),
(r"@[a-zA-Z_]\w*", Name.Decorator, "directive"),
(r"\{", Punctuation, ("#pop", "selection_set")),
],
"fragment_spread": [
include("ignored_tokens"),
(r"@[a-zA-Z_]\w*", Name.Decorator, "directive"),
(r"[a-zA-Z_]\w*", Name, "#pop"), # Fragment name
],
"inline_fragment": [
include("ignored_tokens"),
(r"[a-zA-Z_]\w*", Name.Class), # Type condition
(r"@[a-zA-Z_]\w*", Name.Decorator, "directive"),
(r"\{", Punctuation, ("#pop", "selection_set")),
],
}