Formatul NEON

NEON este un format de date structurate lizibile de către om. În Nette, acesta este utilizat pentru fișierele de configurare. De asemenea, este utilizat pentru date structurate, cum ar fi setările, traducerile de limbă etc. Încercați-l în sandbox.

NEON este acronimul de la Nette Object Notation. Este mai puțin complexă și mai neîndemânatică decât XML sau JSON, dar oferă capacități similare. Este foarte asemănătoare cu YAML. Principalul avantaj este că NEON are așa-numitele entități, datorită cărora configurarea serviciilor DI este atât de sexy. Și permite tabulări pentru indentare.

NEON este construit de la zero pentru a fi simplu de utilizat.

Integrare

Sintaxa

Un fișier scris în NEON constă, de obicei, într-o secvență sau o cartografiere.

Mapări

Mapping-ul este un set de perechi cheie-valoare, în PHP s-ar numi un array asociativ. Fiecare pereche se scrie ca key: value, fiind necesar un spațiu după :. Valoarea poate fi orice: șir de caractere, număr, boolean, null, secvență sau altă mapare.

street: 742 Evergreen Terrace
city: Springfield
country: USA

În PHP, aceeași structură ar fi scrisă ca:

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

Această notație se numește notație de bloc, deoarece toate elementele se află pe o linie separată și au aceeași indentare (niciuna în acest caz). NEON acceptă, de asemenea, reprezentarea în linie pentru cartografiere, care este închisă între paranteze, indentarea nu joacă niciun rol, iar separatorul fiecărui element este fie o virgulă, fie o linie nouă:

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

Acesta este același lucru scris pe mai multe linii (indentarea nu are importanță):

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

Alternativ, se poate folosi = în loc de : , atât în notație bloc, cât și în notație inline:

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

Secvențe

Secvențele sunt array-uri indexate în PHP. Acestea sunt scrise ca linii care încep cu cratima - urmată de un spațiu. Din nou, valoarea poate fi orice: șir de caractere, număr, boolean, null, secvență sau altă cartografiere.

- Cat
- Dog
- Goldfish

În PHP, aceeași structură ar fi scrisă astfel:

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

Această notație se numește notație de bloc, deoarece toate elementele se află pe o linie separată și au aceeași indentare (niciuna în acest caz). NEON acceptă, de asemenea, reprezentarea în linie pentru secvențe, care este cuprinsă între paranteze, indentarea nu joacă niciun rol, iar separatorul fiecărui element este fie o virgulă, fie o linie nouă:

[Cat, Dog, Goldfish]

Este vorba de același lucru scris pe mai multe linii (indentarea nu are importanță):

[
	Cat, Dog
		Goldfish
]

Nu se pot folosi cratime într-o reprezentare în linie.

Combinație

Valorile maparelor și secvențelor pot fi alte mape și secvențe. Nivelul de indentare joacă un rol important. În exemplul următor, cratima utilizată pentru a indica elementele secvenței are o indentare mai mare decât tasta pets, astfel încât elementele devin valoarea primului rând:

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

În PHP, aceeași structură ar fi scrisă astfel::

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

Este posibil să se combine notarea în bloc și în linie:

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

Notarea în bloc nu mai poate fi utilizată în interiorul unei notații inline, deoarece nu funcționează:

item: [
	pets:
	 - Cat     # ACEST LUCRU NU ESTE POSIBIL!!!
	 - Dog
]

În cazul anterior, am scris o hartă ale cărei elemente erau secvențe. Acum, să încercăm invers și să creăm o secvență care să conțină mapare:

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

Nu este necesar ca punctele să fie pe linii separate; ele 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 o tabulație.

Deoarece PHP utilizează aceeași structură pentru cartografiere și secvențe, adică array-uri, ambele pot fi îmbinate. Indentarea este aceeași de această dată:

- Cat
street: 742 Evergreen Terrace
- Goldfish

În PHP, aceeași structură ar fi scrisă ca:

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

Șiruri de caractere

Șirurile de caractere în NEON pot fi incluse în ghilimele simple sau duble. Dar, după cum puteți vedea, ele pot fi și fără ghilimele.

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

În cazul în care șirul conține caractere # " ' , : = - [ ] { } ( ) care pot fi confundate cu sintaxa NEON, acesta trebuie să fie inclus în ghilimele. Vă recomandăm să folosiți ghilimele simple, deoarece acestea nu utilizează scăpări. Dacă trebuie să includeți un ghilimele într-un astfel de șir, dublați-l:

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

Ghilimelele duble vă permit să folosiți secvențe de evadare pentru a scrie caractere speciale folosind backslash-uri \. All escape sequences as in the JSON format are supported, plus \_, care este un spațiu fără întrerupere, adică \u00A0.

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

Există și alte cazuri în care este necesar să închideți șirurile de caractere în ghilimele:

  • acestea încep sau se termină cu spații
  • seamănă cu numere, booleeni sau nul
  • NEON le va înțelege ca fiind date

Șiruri de caractere cu mai multe linii

Un șir de caractere multiliniar începe și se termină cu un ghilimele triplu pe linii separate. Indentarea primei linii este ignorată pentru toate liniile:

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

În PHP, am scrie același lucru ca:

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

Secvențele de scăpare funcționează numai pentru șirurile de caractere încadrate în ghilimele duble în loc de apostrofuri:

"""
	Copyright \u00A9
"""

Numere

NEON înțelege numerele scrise în așa-numita notație științifică, precum și numerele în binar, octal și hexazecimal:

- 12         # un număr întreg
- 12.3       # un float
- +1.2e-34   # un număr exponențial

- 0b11010    # număr binar
- 0o666      # număr octal
- 0x7A       # număr hexa

Nuli

Null poate fi exprimat în NEON prin utilizarea null sau prin nespecificarea unei valori. De asemenea, sunt permise variantele cu majusculă sau cu toate literele majuscule.

a: null
b:

Booleeni

Valorile booleene sunt exprimate în NEON folosind true / false sau yes / no. Sunt permise, de asemenea, variante cu majusculă sau cu toate literele majuscule.

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

Date

NEON utilizează următoarele formate pentru a exprima datele și le convertește automat în obiecte DateTimeImmutable:

- 2016-06-03                  # data
- 2016-06-03 19:00:00         # data și ora
- 2016-06-03 19:00:00.1234    # data și microora
- 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

O entitate este o structură care seamănă cu un apel de funcție:

Column(type: int, nulls: yes)

În PHP, aceasta este analizată ca un obiect Nette\Neon\Entity:

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

Entitățile pot fi, de asemenea, înlănțuite:

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

Care este analizat în PHP după cum urmează:

// 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 de notație în linie utilizate pentru cartografiere și secvențe, astfel încât poate fi împărțită în mai multe linii și nu este necesar să se adauge virgule:

Column(
	type: int
	nulls: yes
)

Comentarii

Comentariile încep cu #, iar toate caracterele care urmează în dreapta sunt ignorate:

# această linie va fi ignorată de către interpretor
street: 742 Evergreen Terrace
city: Springfield  # și aceasta este ignorată
country: USA

NEON față de JSON

JSON este un subset al NEON. Prin urmare, fiecare JSON poate fi analizat 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 putea omite ghilimelele?

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

Ce zici de paranteze și virgule?

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

database:
	driver: mysql
	username: root
	password: beruska92

users: [
	Dave, Kryten, Rimmer
]

Punctele sunt mai lizibile?

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

database:
	driver: mysql
	username: root
	password: beruska92

users:
	- Dave
	- Kryten
	- Rimmer

Dar comentariile?

# configurația aplicației mele web

php:
	date.timezone: Europe/Prague
	zlib.output_compression: true  # folosiți gzip

database:
	driver: mysql
	username: root
	password: beruska92

users:
	- Dave
	- Kryten
	- Rimmer

Ați găsit sintaxa NEON!

versiune: 3.4