Files
vector/.venv-test/lib/python3.12/site-packages/pygments/lexers/graphql.py
T
Sadmin f20080305d feat: ж/д слой + cant_swim в скоринг + профили вне модели
Определение специфических рекомендаций (матрица профилей §8):

1. Ж/д слой (закрыт мёртвый railway ×2.5 у РАС):
   - /api/v1/water/{case_id} отдаёт railway=rail как LineString
     (без service/industrial/military веток), кэш общий v2;
   - railway_warning «перекрыть/проверить немедленно» по профилям;
   - SearchMap: Polyline слой ж/д (тёмно-красный), счётчики 💧/🚂.

2. cant_swim → профиль не_умеет_плавать (water ×3.0, без изменения
   радиуса, critical_warning «обследовать водоёмы НЕМЕДЛЕННО»):
   - раньше чекбокс влиял только на текст, в скоринге был пробел;
   - derive в analyze._derive_profiles — работает и для closed_cases.

3. unmodeled_profiles: ДЦП/слабое зрение/слух — честная пометка
   «вне поведенческой модели» с пояснением (vector_tasks B12:
   профили без аналога не выдавать за учтённые); блок на фронте
   в карточке здоровья.

Площадь воды: сферический эксцесс, проверен на квадрате 53° (744017 м²
vs 743272 точного). Тесты: 202 passed (новый test_cant_swim_profile).
2026-09-09 13:12:55 +03:00

177 lines
5.5 KiB
Python

"""
pygments.lexers.graphql
~~~~~~~~~~~~~~~~~~~~~~~
Lexer for GraphQL, an open-source data query and manipulation
language for APIs.
More information:
https://graphql.org/
:copyright: Copyright 2006-present 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
"""
name = "GraphQL"
aliases = ["graphql"]
filenames = ["*.graphql"]
url = "https://graphql.org"
version_added = '2.16'
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")),
],
}