Формат NEON

NEON — это человекочитаемый формат структурированных данных. В Nette он используется для конфигурационных файлов. Он также используется для структурированных данных, таких как настройки, языковые переводы и т. д. Попробуйте его.

NEON — это аббревиатура от Nette Object Notation. Он менее сложен и громоздок, чем XML или JSON, но предоставляет схожие функции. Он очень похож на YAML. Главное преимущество заключается в том, что NEON имеет так называемые сущности, благодаря которым конфигурация DI-сервисов тоже сексуальна. И позволяет использовать табуляцию для отступов.

NEON построен с нуля так, чтобы быть простым в использовании.

Интеграция

Синтаксис

Файл, написанный в NEON, обычно представляет собой массив или отображение.

Отображение

Отображение — это набор пар ключ-значение, в PHP это называется ассоциативным массивом. Каждая пара записывается как key: value, пробел после : обязателен. Значением может быть что угодно: строка, число, булево значение, null, последовательность или другое отображение.

street: 742 Evergreen Terrace
city: Springfield
country: USA

В PHP та же структура была бы записана так:

[ // PHP
	'street' => '742 Evergreen Terrace',
	'city' => 'Springfield',
	'country' => 'USA',
]

Эта запись называется блочной, потому что все элементы находятся на отдельной строке и имеют одинаковый отступ (в данном случае никакого). NEON также поддерживает инлайн-представление отображений, которое заключено в скобки, отступ не играет роли, а разделителем отдельных элементов является либо запятая, либо новая строка:

{street: 742 Evergreen Terrace, city: Springfield, country: USA}

То же самое, записанное на нескольких строках (отступ не имеет значения):

{
	street: 742 Evergreen Terrace
		city: Springfield, country: USA
}

Вместо : можно альтернативно использовать =, как в блочной, так и в инлайн-записи:

{street=742 Evergreen Terrace, city=Springfield, country=USA}

Последовательность

Последовательности в PHP — это индексированные массивы. Они записываются как строки, начинающиеся с дефиса -, за которым следует пробел. Значением опять же может быть что угодно: строка, число, булево значение, null, последовательность или другое отображение.

- Cat
- Dog
- Goldfish

В PHP та же структура была бы записана так:

[ // PHP
	'Cat',
	'Dog',
	'Goldfish',
]

Эта запись называется блочной, потому что все элементы находятся на отдельной строке и имеют одинаковый отступ (в данном случае никакого). NEON также поддерживает инлайн-представление последовательности, которое заключено в скобки, отступ не играет роли, а разделителем отдельных элементов является либо запятая, либо новая строка:

[Cat, Dog, Goldfish]

То же самое, записанное на нескольких строках (отступ не имеет значения):

[
	Cat, Dog
		Goldfish
]

В инлайн-представлении нельзя использовать отступы с дефисами.

Комбинации

Значениями отображений и последовательностей могут быть другие отображения и последовательности. Главную роль играет уровень отступа. В следующем примере дефис, используемый для обозначения элементов последовательности, имеет больший отступ, чем ключ pets, поэтому элементы становятся значением первой строки:

pets:
   - Cat
   - Dog
cars:
   - Volvo
   - Skoda

В PHP та же структура была бы записана так:

[ // PHP
	'pets' => [
		'Cat',
		'Dog',
	],
	'cars' => [
		'Volvo',
		'Skoda',
	],
]

Можно комбинировать блочную и инлайн-запись:

pets: [Cat, Dog]
cars: [
	Volvo,
	Skoda,
]

Внутри инлайн-записи уже нельзя использовать блочную запись, это не работает:

item: [
	pets:
	 - Cat     # ЭТО НЕВОЗМОЖНО!!!
	 - Dog
]

В предыдущем случае мы записали отображение, элементами которого были последовательности, теперь попробуем наоборот и создадим последовательность, содержащую отображения:

-
	name: John
	age: 35
-
	name: Peter
	age: 28

Не обязательно, чтобы дефисы были на отдельных строках, их можно разместить и таким образом:

- name: John
  age: 35
- name: Peter
  age: 28

Вам решать, выравнивать ли ключи в столбец с помощью пробелов или использовать табуляцию.

Поскольку в PHP для отображений и последовательностей используется одна и та же структура, то есть массив, их можно объединить. Отступ на этот раз одинаковый:

- Cat
street: 742 Evergreen Terrace
- Goldfish

В PHP та же структура была бы записана так:

[ // PHP
	'Cat',
	'street' => '742 Evergreen Terrace',
	'Goldfish',
]

Строки

Строки в NEON можно заключать в одинарные или двойные кавычки. Но, как вы видите, они могут быть и без кавычек.

- Строка в NEON без кавычек
- 'Строка в NEON в одинарных кавычках'
- "Строка в NEON в двойных кавычках"

Если строка содержит символы # " ' , : = - [ ] { } ( ), которые можно спутать с синтаксисом NEON, ее необходимо заключить в кавычки. Рекомендуется использовать одинарные кавычки, так как в них не используется экранирование. Если вам нужно записать кавычку в такой строке, удвойте ее:

'Кавычка '' внутри строки в одинарных кавычках'

Двойные кавычки позволяют использовать escape-последовательности для записи специальных символов с помощью обратных слешей \. Поддерживаются все escape-последовательности, как в формате JSON, а также \_, что является неразрывным пробелом, то есть \u00A0.

- "\t \n \r \f \b \" \\ \/ \_"
- "\u00A9"

Существуют и другие случаи, когда необходимо заключать строки в кавычки:

  • они начинаются или заканчиваются пробелами
  • они выглядят как числа, булевы значения или null
  • NEON воспринял бы их как дату

Многострочные строки

Многострочная строка начинается и заканчивается тройными кавычками на отдельных строках. Отступ первой строки игнорируется, и это касается всех строк:

'''
	первая строка
		вторая строка
	третья строка
	'''

В PHP мы бы написали то же самое так:

"первая строка\n\tвторая строка\nтретья строка" // PHP

Escape-последовательности работают только для строк, заключенных в двойные кавычки вместо апострофов:

"""
	Copyright \u00A9
"""

Числа

NEON понимает числа, записанные в так называемой научной нотации, а также числа в двоичной, восьмеричной и шестнадцатеричной системах счисления:

- 12         # целое число
- 12.3       # float
- +1.2e-34   # экспоненциальное число

- 0b11010    # двоичное число
- 0o666      # восьмеричное число
- 0x7A       # шестнадцатеричное число

Nulls

Null в NEON можно выразить с помощью null или не указывая значение. Разрешены также варианты с большой первой или всеми большими буквами.

a: null
b:

Логические значения

Логические значения в NEON выражаются с помощью true / false или yes / no. Разрешены также варианты с большой первой или всеми большими буквами.

[true, TRUE, True, false, yes, no]

Дата

NEON использует для выражения дат следующие форматы и автоматически преобразует их в объекты DateTimeImmutable:

- 2016-06-03                  # дата
- 2016-06-03 19:00:00         # дата и время
- 2016-06-03 19:00:00.1234    # дата и микровремя
- 2016-06-03 19:00:00 +0200   # дата и время и зона
- 2016-06-03 19:00:00 +02:00  # дата и время и зона

Сущности

Сущность — это структура, напоминающая вызов функции:

Column(type: int, nulls: yes)

В PHP она парсится как объект Nette\Neon\Entity:

// PHP
new Nette\Neon\Entity('Column', ['type' => 'int', 'nulls' => true])

Сущности также могут быть объединены в цепочку:

Column(type: int, nulls: yes) Field(id: 1)

Что в PHP парсится следующим образом:

// PHP
new Nette\Neon\Entity(Nette\Neon\Neon::Chain, [
	new Nette\Neon\Entity('Column', ['type' => 'int', 'nulls' => true]),
	new Nette\Neon\Entity('Field', ['id' => 1]),
])

Внутри скобок действуют правила для инлайн-записи, используемой для отображений и последовательностей, то есть она может быть многострочной, и тогда не нужно указывать запятые:

Column(
	type: int
	nulls: yes
)

Комментарии

Комментарии начинаются с символа #, и все последующие символы справа игнорируются:

# эта строка будет проигнорирована интерпретатором
street: 742 Evergreen Terrace
city: Springfield  # это тоже игнорируется
country: USA

Neon против JSON

JSON является подмножеством NEON. Поэтому любой JSON можно распарсить как NEON:

{
"php": {
	"date.timezone": "Europe\/Prague",
	"zlib.output_compression": true
},
"database": {
	"driver": "mysql",
	"username": "root",
	"password": "beruska92"
},
"users": [
	"Dave", "Kryten", "Rimmer"
]
}

Что, если мы уберем кавычки?

{
php: {
	date.timezone: Europe/Prague,
	zlib.output_compression: true
},
database: {
	driver: mysql,
	username: root,
	password: beruska92
},
users: [
	Dave, Kryten, Rimmer
]
}

А фигурные скобки и запятые?

php:
	date.timezone: Europe/Prague
	zlib.output_compression: true

database:
	driver: mysql
	username: root
	password: beruska92

users: [
	Dave, Kryten, Rimmer
]

Не лучше ли читаются списки с дефисами?

php:
	date.timezone: Europe/Prague
	zlib.output_compression: true

database:
	driver: mysql
	username: root
	password: beruska92

users:
	- Dave
	- Kryten
	- Rimmer

Добавим комментарии?

# конфигурация моего веб-приложения

php:
	date.timezone: Europe/Prague
	zlib.output_compression: true  # использовать gzip

database:
	driver: mysql
	username: root
	password: beruska92

users:
	- Dave
	- Kryten
	- Rimmer

Ура, теперь вы знаете синтаксис NEON!

версия: 3.4