Формат NEON
NEON – це структурований формат даних, що читається людиною. У Nette він використовується для файлів конфігурації. Він також використовується для структурованих даних, таких як налаштування, мовні переклади тощо. Спробуйте його в пісочниці.
NEON розшифровується як Nette Object Notation. Він менш складний і незграбний, ніж XML або JSON, але надає подібні можливості. Вона дуже схожа на YAML. Основна перевага – NEON має так звані сутності, завдяки яким конфігурація сервісів ІР є такою сексуальною. І дозволяє використовувати табуляцію для відступів.
NEON створений з нуля, щоб бути простим у використанні.
Інтеграція
- NetBeans (має вбудовану підтримку)
- PhpStorm (плагін)
- Visual Studio Code (плагін)
- Sublime Text 3 (плагін)
- Sublime Text 2 (плагін)
- VIM (плагін)
- Emacs (плагін)
- Prism.js (інтегрована мова)
Синтаксис
Файл, написаний на 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 # ціле число
- 12.3 # число з плаваючою комою
- +1.2e-34 # експоненціальне число
- 0b11010 # двійкове число
- 0o666 # вісімкове число
- 0x7A # шістнадцяткове число
Нулі
Нуль може бути виражений у 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
)
Коментарі
Коментарі починаються з #
і всі наступні символи праворуч
ігноруються:
# цей рядок буде проігноровано перекладачем
вулиця: 742 Вічнозелена тераса
місто: Спрінгфілд # цей рядок також ігнорується
країна: США
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!