Формат 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     # THIS IS NOT POSSIBLE!!!
	 - 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 могут быть заключены в одинарные или двойные кавычки. Но, как вы видите, они могут быть и без кавычек.

- A unquoted string in NEON
- 'A singled-quoted string in NEON'
- "A double-quoted string in NEON"

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

'A single quote '' inside a single-quoted string'

Двойные кавычки позволяют использовать экранирующие последовательности для записи специальных символов, используя обратные косые черты \. All escape sequences as in the JSON format are supported, plus \_, которые представляют собой неразрывный пробел, т.е. \u00A0.

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

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

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

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

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

'''
	first line
		second line
	third line
	'''

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

"first line\n\tsecond line\nthird line" // PHP

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

"""
	Copyright \u00A9
"""

Числа

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

- 12         # an integer
- 12.3       # a float
- +1.2e-34   # an exponential number

- 0b11010    # binary number
- 0o666      # octal number
- 0x7A       # hexa number

Нули

Нуль может быть выражен в NEON с помощью null или без указания значения. Также допускаются варианты с заглавной первой или всеми прописными буквами.

a: null
b:

Булевы

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

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

Даты

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

- 2016-06-03                  # date
- 2016-06-03 19:00:00         # date & time
- 2016-06-03 19:00:00.1234    # date & microtime
- 2016-06-03 19:00:00 +0200   # date & time & timezone
- 2016-06-03 19:00:00 +02:00  # date & time & timezone

Сущности

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

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
)

Комментарии

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

# this line will be ignored by the interpreter
street: 742 Evergreen Terrace
city: Springfield  # this is ignored too
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

Как насчет комментариев?

# my web application config

php:
	date.timezone: Europe/Prague
	zlib.output_compression: true  # use gzip

database:
	driver: mysql
	username: root
	password: beruska92

users:
	- Dave
	- Kryten
	- Rimmer

Вы нашли синтаксис NEON!

версия: 3.4