Формат NEON
NEON е формат за структурирани данни, който може да се чете от човек. В Nette той се използва за конфигурационни файлове. Той се използва и за структурирани данни, като настройки, езикови преводи и др. Изпробвайте го в пясъчника.
NEON е съкращение от Nette Object Notation. Тя не е толкова сложна и елементарна, колкото XML или JSON, но предоставя подобни възможности. Много е подобен на YAML. Основното предимство е, че NEON разполага с т.нар. същности, благодарение на които конфигурирането на DI услугите е толкова секси. И позволява табулации за отстъпление.
NEON е проектиран от самото начало, за да бъде лесен за използване.
Интеграция
- NetBeans (има вградена поддръжка)
- PhpStorm (приставка)
- Visual Studio Code (приставка)
- Sublime Text 3 (приставка)
- Sublime Text 2 (приставка)
- VIM (приставка)
- Emacs (приставка)
- Prism.js (интегриран език)
Синтаксис
Файлът, написан в NEON, обикновено се състои от последователност или съпоставяне.
Сравнения
Съпоставянето е набор от двойки ключ-стойност, който в PHP се нарича
асоциативен масив. Всяка двойка се записва като key: value
, като
интервалът след :
е задължителен. Стойността може да бъде
всякаква: низ, число, булева, нула, последователност или друго
съпоставяне.
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. Те се записват като
низове, започващи с дефис -
, последван от интервал. Стойността
може да бъде всякаква: низ, число, булева, нула, последователност или
друго съпоставяне.
- 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'
Двойните кавички ви позволяват да използвате escape последователности
за записване на специални символи с помощта на обратни наклонени черти
\
. 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 Evergreen Terrace
град: Спрингфийлд # този текст също се игнорира
държава: САЩ
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!