Formatul NEON
NEON este un format de date structurate lizibil pentru om. În Nette, este utilizat pentru fișierele de configurare. De asemenea, este utilizat pentru date structurate, cum ar fi setări, traduceri lingvistice etc. Încercați-l.
NEON este acronimul pentru Nette Object Notation. Este mai puțin complex și greoi decât XML sau JSON, dar oferă funcționalități similare. Este foarte asemănător cu YAML. Principalul avantaj este că NEON are așa-numitele entități, datorită cărora configurarea serviciilor DI este la fel de sexy. Și permite indentarea cu tabulatori.
NEON este construit de la zero pentru a fi ușor de utilizat.
Integrare
- NetBeans (are suport încorporat)
- PhpStorm (plugin)
- Visual Studio Code (Nette Latte + Neon) sau Nette for VS Code)
- Sublime Text 3 (plugin)
- Sublime Text 2 (plugin)
- VIM (plugin)
- Emacs (plugin)
- Prism.js (limbaj integrat)
Sintaxă
Un fișier scris în NEON reprezintă de obicei un array sau o mapare.
Mapare
Maparea este un set de perechi cheie-valoare, în PHP s-ar spune un array asociativ. Fiecare pereche este scrisă ca
key: value
, spațiul după :
este necesar. Valoarea poate fi orice: șir, număr, boolean, null,
secvență sau altă mapare.
street: 742 Evergreen Terrace
city: Springfield
country: USA
În PHP, aceeași structură s-ar scrie ca:
[ // PHP
'street' => '742 Evergreen Terrace',
'city' => 'Springfield',
'country' => 'USA',
]
Această scriere se numește bloc, deoarece toate elementele sunt pe linii separate și au aceeași indentare (în acest caz, niciuna). NEON suportă și reprezentarea inline a mapării, care este închisă între paranteze, indentarea nu joacă niciun rol, iar separatorul elementelor individuale este fie virgula, fie o linie nouă:
{street: 742 Evergreen Terrace, city: Springfield, country: USA}
Același lucru scris pe mai multe linii (indentarea nu contează):
{
street: 742 Evergreen Terrace
city: Springfield, country: USA
}
În loc de :
se poate folosi alternativ =
atât în scrierea bloc, cât și în cea inline:
{street=742 Evergreen Terrace, city=Springfield, country=USA}
Secvențe
Secvențele sunt în PHP array-uri indexate. Se scriu ca linii care încep cu cratimă -
urmată de un spațiu.
Valoarea poate fi din nou orice: șir, număr, boolean, null, secvență sau altă mapare.
- Pisică
- Câine
- Peștișor auriu
În PHP, aceeași structură s-ar scrie ca:
[ // PHP
'Pisică',
'Câine',
'Peștișor auriu',
]
Această scriere se numește bloc, deoarece toate elementele sunt pe linii separate și au aceeași indentare (în acest caz, niciuna). NEON suportă și reprezentarea inline a secvenței, care este închisă între paranteze drepte, indentarea nu joacă niciun rol, iar separatorul elementelor individuale este fie virgula, fie o linie nouă:
[Pisică, Câine, Peștișor auriu]
Același lucru scris pe mai multe linii (indentarea nu contează):
[
Pisică, Câine
Peștișor auriu
]
În reprezentarea inline nu se pot folosi cratimele de indentare.
Combinații
Valorile mapărilor și secvențelor pot fi alte mapări și secvențe. Rolul principal îl joacă nivelul de indentare. În
exemplul următor, cratima folosită pentru a marca elementele secvenței are o indentare mai mare decât cheia
pets
, astfel încât elementele devin valoarea primei linii:
pets:
- Pisică
- Câine
cars:
- Volvo
- Skoda
În PHP, aceeași structură s-ar scrie ca:
[ // PHP
'pets' => [
'Pisică',
'Câine',
],
'cars' => [
'Volvo',
'Skoda',
],
]
Se poate combina scrierea bloc și inline:
pets: [Pisică, Câine]
cars: [
Volvo,
Skoda,
]
În interiorul scrierii inline nu se mai poate folosi scrierea bloc, acest lucru nu funcționează:
item: [
pets:
- Pisică # ACEST LUCRU NU ESTE POSIBIL!!!
- Câine
]
În cazul anterior am scris o mapare ale cărei elemente erau secvențe, acum vom încerca invers și vom crea o secvență care conține mapări:
-
name: John
age: 35
-
name: Peter
age: 28
Nu este necesar ca cratimele să fie pe linii separate, pot fi plasate și în acest mod:
- name: John
age: 35
- name: Peter
age: 28
Depinde de dvs. dacă aliniați cheile într-o coloană folosind spații sau folosiți un tabulator.
Deoarece în PHP se folosește aceeași structură atât pentru mapări, cât și pentru secvențe, adică array-ul, ambele pot fi combinate. Indentarea este de data aceasta aceeași:
- Pisică
street: 742 Evergreen Terrace
- Peștișor auriu
În PHP, aceeași structură s-ar scrie ca:
[ // PHP
'Pisică',
'street' => '742 Evergreen Terrace',
'Peștișor auriu',
]
Șiruri
Șirurile în NEON pot fi închise între ghilimele simple sau duble. Dar, după cum vedeți, pot fi și fără ghilimele.
- Șir în NEON fără ghilimele
- 'Șir în NEON între ghilimele simple'
- "Șir în NEON între ghilimele duble"
Dacă șirul conține caracterele # " ' , : = - [ ] { } ( )
, care pot fi confundate cu sintaxa NEON, trebuie
închis între ghilimele. Recomandăm utilizarea ghilimelelor simple, deoarece în ele nu se folosește escaparea. Dacă aveți
nevoie să scrieți o ghilimea într-un astfel de șir, dublați-o:
'Ghilimea '' în interiorul unui șir între ghilimele simple'
Ghilimelele duble permit utilizarea secvențelor de escape pentru scrierea caracterelor speciale folosind backslash-uri
\
. Sunt suportate toate secvențele de escape ca în formatul JSON și, în plus, \_
, care este un
spațiu nedivizibil, adică \u00A0
.
- "\t \n \r \f \b \" \\ \/ \_"
- "\u00A9"
Există și alte cazuri în care este necesar să închideți șirurile între ghilimele:
- încep sau se termină cu spații
- arată ca numere, booleeni sau null
- NEON le-ar înțelege ca dată
Șiruri pe mai multe linii
Un șir pe mai multe linii începe și se termină cu trei ghilimele pe linii separate. Indentarea primei linii este ignorată pentru toate liniile:
'''
prima linie
a doua linie
a treia linie
'''
În PHP am scrie același lucru ca:
"prima linie\n\ta doua linie\na treia linie" // PHP
Secvențele de escape funcționează doar pentru șirurile închise între ghilimele duble în loc de apostrofuri:
"""
Copyright \u00A9
"""
Numere
NEON înțelege numerele scrise în așa-numita notație științifică și, de asemenea, numerele în sistem binar, octal și hexazecimal:
- 12 # număr întreg
- 12.3 # float
- +1.2e-34 # număr exponențial
- 0b11010 # număr binar
- 0o666 # număr octal
- 0x7A # număr hexa
Nulls
Null poate fi exprimat în NEON folosind null
sau prin neindicarea valorii. Sunt permise și variantele cu prima
literă mare sau cu toate literele mari.
a: null
b:
Booleans
Valorile logice sunt exprimate în NEON folosind true
/ false
sau yes
/ no
.
Sunt permise și variantele cu prima literă mare sau cu toate literele mari.
[true, TRUE, True, false, yes, no]
Dată
NEON folosește următoarele formate pentru a exprima datele și le convertește automat în obiecte
DateTimeImmutable
:
- 2016-06-03 # dată
- 2016-06-03 19:00:00 # dată & oră
- 2016-06-03 19:00:00.1234 # dată & microtimp
- 2016-06-03 19:00:00 +0200 # dată & oră & fus orar
- 2016-06-03 19:00:00 +02:00 # dată & oră & fus orar
Entități
Entitatea este o structură care seamănă cu un apel de funcție:
Column(type: int, nulls: yes)
În PHP se parsează ca obiect Nette\Neon\Entity:
// PHP
new Nette\Neon\Entity('Column', ['type' => 'int', 'nulls' => true])
Entitățile se pot și înlănțui:
Column(type: int, nulls: yes) Field(id: 1)
Ceea ce în PHP se parsează în acest mod:
// 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]),
])
În interiorul parantezelor se aplică regulile pentru scrierea inline folosită la mapări și secvențe, adică poate fi și pe mai multe linii și atunci nu este necesar să se specifice virgule:
Column(
type: int
nulls: yes
)
Comentarii
Comentariile încep cu caracterul #
și toate caracterele următoare la dreapta sunt ignorate:
# această linie va fi ignorată de interpretor
street: 742 Evergreen Terrace
city: Springfield # și aceasta este ignorată
country: USA
Neon versus JSON
JSON este un subset al NEON. Fiecare JSON poate fi, prin urmare, parsat ca NEON:
{
"php": {
"date.timezone": "Europe\/Prague",
"zlib.output_compression": true
},
"database": {
"driver": "mysql",
"username": "root",
"password": "beruska92"
},
"users": [
"Dave", "Kryten", "Rimmer"
]
}
Ce s-ar întâmpla dacă am omite ghilimelele?
{
php: {
date.timezone: Europe/Prague,
zlib.output_compression: true
},
database: {
driver: mysql,
username: root,
password: beruska92
},
users: [
Dave, Kryten, Rimmer
]
}
Și acoladele și virgulele?
php:
date.timezone: Europe/Prague
zlib.output_compression: true
database:
driver: mysql
username: root
password: beruska92
users: [
Dave, Kryten, Rimmer
]
Nu sunt listele cu cratime mai lizibile?
php:
date.timezone: Europe/Prague
zlib.output_compression: true
database:
driver: mysql
username: root
password: beruska92
users:
- Dave
- Kryten
- Rimmer
Adăugăm comentarii?
# configurația aplicației mele web
php:
date.timezone: Europe/Prague
zlib.output_compression: true # folosește gzip
database:
driver: mysql
username: root
password: beruska92
users:
- Dave
- Kryten
- Rimmer
Ura, acum cunoașteți sintaxa NEON!