Инструмент форматирования YAML
Что такое YAML?
YAML Formatter делает YAML-файлы более читаемыми за счет единых отступов, переносов строк и видимой структуры. YAML часто используют для CI-конфигураций, Kubernetes manifests, Docker Compose, static-site generators, локализации, OpenAPI-файлов и настроек приложений. В отличие от JSON, YAML сильно зависит от отступов, маркеров списков, двоеточий, кавычек, anchors и многострочных строк; маленькая ошибка форматирования может создать другую структуру. Инструмент помогает читать, чистить и находить очевидные синтаксические проблемы, но не заменяет schema validation и проверки конкретного инструмента. Для Kubernetes, GitHub Actions, Ansible или production-конфигов результат нужно тестировать в целевой системе. Для production-данных или кодовой базы результат все равно нужно проверить parser, тестами или правилами проекта.
Инструкция по использованию
Как пользоваться
- Вставьте или введите YAML-данные в левое поле ввода
- Выберите размер отступа, соответствующий стилю вашего проекта
- Нажмите «Форматировать» для оформления, «Минимизировать» для сжатия или «Проверить» для проверки синтаксиса
- Просматривайте результаты справа
- Нажмите «Копировать», чтобы скопировать в буфер обмена
Описание параметров
Горячие клавиши
- Ctrl + EnterФорматировать
- Ctrl + Shift + CКопировать результат
Советы по YAML
- YAML чувствителен к отступам, поэтому проверяйте вложенные списки и словари после форматирования, прежде чем использовать результат в CI, Kubernetes или файлах развёртывания.
- По возможности проверяйте результат по схеме целевого инструмента; синтаксически корректный YAML всё равно может быть невалидным для GitHub Actions, Docker Compose или OpenAPI.
Применение
Технический принцип
Форматирование YAML опирается на спецификацию YAML 1.2.2 (пересмотрена в октябре 2021), которая формально определяет JSON как строгое подмножество YAML — любой корректный документ JSON разбирается как YAML. Разбор проходит в три слоя: презентационный слой сканирует кодовые точки Unicode и разрешает экранирование символов; слой сериализации строит граф узлов из скаляров, последовательностей и отображений; нативный слой применяет YAML Core Schema для приведения скаляров к разрешённым типам `!!str`, `!!int`, `!!float`, `!!bool`, `!!null`, `!!seq`, `!!map`. Распространённые библиотеки времени выполнения включают js-yaml и более новый пакет `yaml` на Node, PyYAML и ruamel.yaml на Python, SnakeYAML на JVM. Браузерные форматировщики обычно разбирают в простой JS-объект через `load`/`dump` js-yaml и выполняют обратное преобразование. Отступы — это несущий примитив: допускается только ASCII-пробел (U+0020) — спецификация явно запрещает символы табуляции (U+0009) для отступов в §6.1, поэтому вставка из редактора кода с автоконвертацией — самая частая причина ошибок разбора. Блочный стиль определяет вложенность исключительно по позиции столбца, поэтому дочерние узлы должны иметь отступ больше родительского минимум на один пробел (два по соглашению). Потоковый стиль заимствует синтаксисис JSON — `[1, 2, 3]` и `{a: 1, b: 2}` — и может вкладываться в блочный стиль для однострочных записей. Блочные скаляры используют индикаторное сворачивание: `|` (literal) сохраняет переносы строк точно, `>` (folded) сворачивает одиночные переносы строк в пробелы и сохраняет пустые строки как разделители абзацев, а индикаторы обрезки `-` (убрать завершающие переносы) и `+` (сохранить все завершающие переносы) добавляются после индикатора (`|-`, `>+`). Правила кавычек различаются: скаляры в одинарных кавычках трактуют `\` буквально и используют `''` для вставки кавычки; скаляры в двойных кавычках признают C-style экранирование (`\n`, `\t`, `\uXXXX`). Форматировщики обычно нормализуют к одному блочному стилю и переиздают якоря и алиасы. Якорь `&name` помечает узел; алиас `*name` ссылается на него; ключ слияния `<<: *name` (наследие YAML 1.1, всё ещё поддерживаемое большинством парсеров) извлекает ключи из другого отображения в текущее. Мультидокументные потоки разделяются маркерами начала `---` и необязательными маркерами конца `...` — шаблон, используемый Kubernetes для передачи нескольких ресурсов в одном манифесте. Две известные проблемы заслуживают безопасного переиздания: проблема Норвегии — неэкранированный скаляр `no` интерпретируется как `false` по схеме YAML 1.1 (и код страны становится булевым значением) — и CVE-2017-18342, когда `yaml.load` в PyYAML десериализовал произвольные объекты Python, исправленный переходом на `safe_load`. Обе причины, по которым форматировщик должен осторожно обращаться с разрешением скаляров и никогда не выполнять тегированные конструкторы. Разбор выполняется за O(n) от длины входных данных; комментарии отбрасываются большинством библиотек на основе AST, поскольку они не являются частью информационной модели YAML.
- Спецификация: YAML 1.2.2 (окт. 2021). JSON — строгое подмножество YAML 1.2, поэтому любой корректный документ JSON разбирается как YAML; распространённые библиотеки: js-yaml, пакет `yaml`, PyYAML, ruamel.yaml, SnakeYAML.
- Отступы должны быть ASCII-пробелом (U+0020); символы табуляции (U+0009) запрещены для отступов §6.1 — самая частая причина ошибок `mapping values are not allowed here`.
- Блочный и потоковый стиль: блочный использует вложенность по позиции столбца (2 или 4 пробела по соглашению); потоковый использует JSON-подобные `[1, 2, 3]` и `{a: 1}`. Оба допускают вложение.
- Блочные скаляры: `|` literal сохраняет переносы строк, `>` folded сворачивает одиночные переносы строк в пробелы; индикаторы обрезки `-` (убрать) и `+` (сохранить) добавляются к индикатору, напр. `|-`, `>+`.
- Якоря `&name` помечают узлы, алиасы `*name` ссылаются на них, а ключ слияния `<<: *name` извлекает ключи из другого отображения (наследие YAML 1.1, поддерживается большинством парсеров).
- Мультидокументные потоки разделяются маркерами `---` (начало) и необязательным `...` (конец) — шаблон, который Kubernetes использует для передачи нескольких ресурсов в одном манифесте.
- Подводные камни: проблема Норвегии (неэкранированные `no`/`yes`/`on`/`off` разбираются как булевы значения по схеме YAML 1.1; YAML 1.2 Core Schema исправляет большинство случаев) и CVE-2017-18342 (произвольное выполнение кода через `yaml.load` в PyYAML; используйте `safe_load`).
Примеры
Исправление непоследовательных отступов в файле конфигурации
Вход (некорректный):
server:
port: 8080
host: localhost
debug: true
Отформатировано (2 пробела):
server:
port: 8080
host: localhost
debug: trueВложенный список сервисов в docker-compose.yml
version: '3.8'
services:
web:
image: nginx:1.25
ports:
- "80:80"
- "443:443"
depends_on:
- api
api:
image: node:20
environment:
NODE_ENV: productionМанифест Kubernetes Deployment
apiVersion: apps/v1
kind: Deployment
metadata:
name: web-app
labels:
app: web
spec:
replicas: 3
selector:
matchLabels:
app: web
template:
spec:
containers:
- name: web
image: nginx:1.25Преобразование YAML в JSON для конвейера jq
Вход YAML:
user:
id: 42
name: alice
roles:
- admin
- editor
Выход JSON:
{
"user": {
"id": 42,
"name": "alice",
"roles": ["admin", "editor"]
}
}Обнаружение пропущенного пробела после двоеточия
Вход:
name:alice
age: 30
Ошибка в строке 1: пропущен пробел после двоеточия
Исправлено:
name: alice
age: 30Часто задаваемые вопросы
Что включает форматирование YAML?
Нормализацию отступов (обычно 2 пробела), единый стиль кавычек, выравнивание маркеров списков и переразметку длинных inline-коллекций в блочный стиль. Большинство YAML-файлов в реальности правят вручную, и они обрастают непоследовательным стилем; форматтер всё это выравнивает.
Преобразуется ли flow-стиль в блочный?
Многие сборки позволяют выбрать между flow-стилем (JSON-подобным {key: value, key2: value2}) и блочным (многострочным с отступами). Блочный удобнее для ручного редактирования; flow компактнее. Обратное преобразование между ними сохраняет данные, но меняет внешний вид.
Почему он меняет мои кавычки?
YAML допускает строки без кавычек, в одинарных и двойных кавычках с тонкими отличиями. Yes/no, true/false, on/off без кавычек интерпретируются как булевы значения; числа без кавычек — это числа, а в кавычках — строки. Форматтер может добавить кавычки, чтобы значения, которые иначе истолковались бы неверно, оставались однозначными.
Сохраняются ли комментарии?
Большинство сборок сохраняют YAML-комментарии (#), но их позиция относительно узлов AST может слегка сместиться. Комментарии над ключами обычно остаются над ними; комментарии в конце той же строки остаются прикреплёнными. После форматирования перепроверьте, осталось ли расположение комментариев осмысленным.
Загружается ли YAML на сервер?
Нет. Парсинг и форматирование выполняются в вашем браузере через js-yaml или аналогичную библиотеку. Вставленный YAML никуда не передаётся.
Почему обратное преобразование меняет якоря и алиасы?
Синтаксис YAML с & (anchor) и * (alias) позволяет описать значение один раз и переиспользовать его. Некоторые форматтеры по умолчанию разворачивают алиасы inline, теряя дедупликацию. Если ваш инструментарий зависит от якорей, ищите опцию их сохранения.
Что если в моём YAML отступы из табуляций?
YAML запрещает табуляцию для отступов — должны быть пробелы. Форматтер обычно либо превращает табуляции в пробелы, либо отказывается парсить — в зависимости от настроек. Если получаете ошибку парсинга, замените табуляции на пробелы перед вставкой.