Skip to content

Instantly share code, notes, and snippets.

@akuklev
Last active June 20, 2023 18:26
Show Gist options
  • Save akuklev/b692e7268b488978bf9d1adbda2ba82b to your computer and use it in GitHub Desktop.
Save akuklev/b692e7268b488978bf9d1adbda2ba82b to your computer and use it in GitHub Desktop.
Как радикально улучшить YAML

Одна из основных фич и одновременно основная проблема YAML'а сводится к тому, что текст можно писать без кавычек, но только до тех пор пока чисто случайно не оказывается, что его можно интерпретировать как что-то другое. Например, без пробелов пишут двубуквенные коды всех стран, кроме Норвегии, потому что NO интерпретируется как булево значение false.

Чтобы радикально улучшить YAML, нужно всё же чётко маркировать текст, но наряду с тяжеловесными ковычками предоставить метод ненавязчивой маркировки. Для этого я предлагаю использовать обратную кавычку. Обратная кавычка перед словом (без отбития пробелом справа) — слово следует читать verbatim. Обратная кавычка с пробелом справа, и прижатая к предыдущему символу слева — verbatim до конца строки. Обратная ковычка с пробелом справа, слева которой пробел или начало строки — многострочный блок текста, заканчивающийся при падении индентации до уровня кавычки.

name:` Mary Smith
age: 28
summary:
` Mary Smith was born
  in Norway in late
  twentieth century
children:
-` Anna Smith
-` Max Null
spoken-languages: [`en, `no, `ru-md]

Аналогичная система, кстати, неплохо смотрится и в языках программирования

print` Hello world!

Примечание: символ новой строки в конце текстовых блоков не считается частью блока, а два последовательных многострочных текстовых блока конкатенируются:

` Пример 1:
  Иногда нам хочется вмещать в файл ограниченной ширины строки,
`  превосходящую эту ширину. Эту задачу мы можем элегантно решить,
`  ставя перед перенесённой строкой обратный апостров, который
`  как-бы съедает предыдущий перенос строки.

  Пример 2:
  ...

Несложно заметить, что это элегантно лишает всякого смысла YAML-овские многострочные блоков | и >.

Sign up for free to join this conversation on GitHub. Already have an account? Sign in to comment