Formato NEON
NEON è un formato di dati strutturati leggibile dall'uomo. In Nette viene utilizzato per i file di configurazione. Viene utilizzato anche per dati strutturati come impostazioni, traduzioni linguistiche, ecc. Provatelo.
NEON è l'acronimo di Nette Object Notation. È meno complesso e goffo di XML o JSON, ma fornisce funzionalità simili. È molto simile a YAML. Il vantaggio principale è che NEON ha le cosiddette entità, grazie alle quali la configurazione dei servizi DI è così sexy. E consente l'indentazione con tabulazioni.
NEON è costruito da zero per essere facile da usare.
Integrazione
- NetBeans (ha supporto integrato)
- PhpStorm (plugin)
- Visual Studio Code (Nette Latte + Neon) o Nette for VS Code)
- Sublime Text 3 (plugin)
- Sublime Text 2 (plugin)
- VIM (plugin)
- Emacs (plugin)
- Prism.js (linguaggio integrato)
Sintassi
Un file scritto in NEON di solito rappresenta un array o una mappa.
Mapping
Un mapping è un insieme di coppie chiave-valore, in PHP si direbbe array associativo. Ogni coppia è scritta come
key: value
, lo spazio dopo :
è necessario. Il valore può essere qualsiasi cosa: stringa, numero,
booleano, null, sequenza o un altro mapping.
street: 742 Evergreen Terrace
city: Springfield
country: USA
In PHP, la stessa struttura sarebbe scritta come:
[ // PHP
'street' => '742 Evergreen Terrace',
'city' => 'Springfield',
'country' => 'USA',
]
Questa notazione è detta a blocchi, perché tutti gli elementi sono su righe separate e hanno la stessa indentazione (in questo caso nessuna). NEON supporta anche una rappresentazione inline dei mapping, che è racchiusa tra parentesi graffe, l'indentazione non gioca alcun ruolo e il separatore tra i singoli elementi è una virgola o un ritorno a capo:
{street: 742 Evergreen Terrace, city: Springfield, country: USA}
Lo stesso scritto su più righe (l'indentazione non ha importanza):
{
street: 742 Evergreen Terrace
city: Springfield, country: USA
}
In alternativa a :
si può usare =
sia nella notazione a blocchi che in quella inline:
{street=742 Evergreen Terrace, city=Springfield, country=USA}
Sequenze
Le sequenze sono array indicizzati in PHP. Sono scritte come righe che iniziano con un trattino -
seguito da uno
spazio. Il valore può essere di nuovo qualsiasi cosa: stringa, numero, booleano, null, sequenza o un altro mapping.
- Cat
- Dog
- Goldfish
In PHP, la stessa struttura sarebbe scritta come:
[ // PHP
'Cat',
'Dog',
'Goldfish',
]
Questa notazione è detta a blocchi, perché tutti gli elementi sono su righe separate e hanno la stessa indentazione (in questo caso nessuna). NEON supporta anche una rappresentazione inline delle sequenze, che è racchiusa tra parentesi quadre, l'indentazione non gioca alcun ruolo e il separatore tra i singoli elementi è una virgola o un ritorno a capo:
[Cat, Dog, Goldfish]
Lo stesso scritto su più righe (l'indentazione non ha importanza):
[
Cat, Dog
Goldfish
]
Nella rappresentazione inline non è possibile utilizzare trattini indentati.
Combinazioni
I valori dei mapping e delle sequenze possono essere altri mapping e sequenze. Il ruolo principale è giocato dal livello di
indentazione. Nell'esempio seguente, il trattino utilizzato per indicare gli elementi della sequenza ha un'indentazione maggiore
rispetto alla chiave pets
, quindi gli elementi diventano il valore della prima riga:
pets:
- Cat
- Dog
cars:
- Volvo
- Skoda
In PHP, la stessa struttura sarebbe scritta come:
[ // PHP
'pets' => [
'Cat',
'Dog',
],
'cars' => [
'Volvo',
'Skoda',
],
]
È possibile combinare la notazione a blocchi e inline:
pets: [Cat, Dog]
cars: [
Volvo,
Skoda,
]
All'interno della notazione inline non è più possibile utilizzare la notazione a blocchi, questo non funziona:
item: [
pets:
- Cat # QUESTO NON È POSSIBILE!!!
- Dog
]
Nel caso precedente abbiamo scritto un mapping i cui elementi erano sequenze, ora proviamo il contrario e creiamo una sequenza contenente mapping:
-
name: John
age: 35
-
name: Peter
age: 28
Non è necessario che i trattini siano su righe separate, possono essere posizionati anche in questo modo:
- name: John
age: 35
- name: Peter
age: 28
Sta a voi decidere se allineare le chiavi in colonne usando spazi o usare una tabulazione.
Poiché in PHP si usa la stessa struttura sia per i mapping che per le sequenze, cioè gli array, è possibile unire entrambi. L'indentazione questa volta è la stessa:
- Cat
street: 742 Evergreen Terrace
- Goldfish
In PHP, la stessa struttura sarebbe scritta come:
[ // PHP
'Cat',
'street' => '742 Evergreen Terrace',
'Goldfish',
]
Stringhe
Le stringhe in NEON possono essere racchiuse tra virgolette singole o doppie. Ma come potete vedere, possono anche essere senza virgolette.
- Stringa in NEON senza virgolette
- 'Stringa in NEON tra virgolette singole'
- "Stringa in NEON tra virgolette doppie"
Se una stringa contiene i caratteri # " ' , : = - [ ] { } ( )
, che possono essere confusi con la sintassi NEON,
è necessario racchiuderla tra virgolette. Si consiglia di utilizzare le virgolette singole, perché in esse non viene utilizzato
l'escaping. Se è necessario scrivere una virgoletta in una tale stringa, raddoppiatela:
'Virgoletta '' all\'interno di una stringa tra virgolette singole'
Le virgolette doppie consentono di utilizzare sequenze di escape per scrivere caratteri speciali usando le barre rovesciate
\
. Sono supportate tutte le sequenze di escape come nel formato JSON e inoltre \_
, che è uno spazio
indivisibile, cioè \u00A0
.
- "\t \n \r \f \b \" \\ \/ \_"
- "\u00A9"
Ci sono altri casi in cui è necessario racchiudere le stringhe tra virgolette:
- iniziano o terminano con spazi
- sembrano numeri, booleani o null
- NEON li interpreterebbe come data
Stringhe multiriga
Una stringa multiriga inizia e finisce con tre virgolette su righe separate. L'indentazione della prima riga viene ignorata per tutte le righe:
'''
prima riga
seconda riga
terza riga
'''
In PHP scriveremmo lo stesso come:
"prima riga\n\tseconda riga\nterza riga" // PHP
Le sequenze di escape funzionano solo per le stringhe racchiuse tra virgolette doppie invece che apostrofi:
"""
Copyright \u00A9
"""
Numeri
NEON comprende i numeri scritti nella cosiddetta notazione scientifica e anche i numeri in base binaria, ottale ed esadecimale:
- 12 # intero
- 12.3 # float
- +1.2e-34 # numero esponenziale
- 0b11010 # numero binario
- 0o666 # numero ottale
- 0x7A # numero esadecimale
Nulls
Null può essere espresso in NEON usando null
o non specificando un valore. Sono consentite anche varianti con la
prima lettera maiuscola o tutte le lettere maiuscole.
a: null
b:
Booleans
I valori logici sono espressi in NEON usando true
/ false
o yes
/ no
. Sono
consentite anche varianti con la prima lettera maiuscola o tutte le lettere maiuscole.
[true, TRUE, True, false, yes, no]
Data
NEON utilizza i seguenti formati per esprimere le date e li converte automaticamente in oggetti
DateTimeImmutable
:
- 2016-06-03 # data
- 2016-06-03 19:00:00 # data & ora
- 2016-06-03 19:00:00.1234 # data & microtempo
- 2016-06-03 19:00:00 +0200 # data & ora & zona
- 2016-06-03 19:00:00 +02:00 # data & ora & zona
Entità
Un'entità è una struttura che assomiglia a una chiamata di funzione:
Column(type: int, nulls: yes)
In PHP viene analizzata come un oggetto Nette\Neon\Entity:
// PHP
new Nette\Neon\Entity('Column', ['type' => 'int', 'nulls' => true])
Le entità possono anche essere concatenate:
Column(type: int, nulls: yes) Field(id: 1)
Il che viene analizzato in PHP in questo modo:
// 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]),
])
All'interno delle parentesi valgono le regole per la notazione inline utilizzata per mapping e sequenze, quindi può essere anche multiriga e in tal caso non è necessario specificare le virgole:
Column(
type: int
nulls: yes
)
Commenti
I commenti iniziano con il carattere #
e tutti i caratteri successivi a destra vengono ignorati:
# this line will be ignored by the interpreter
street: 742 Evergreen Terrace
city: Springfield # this is ignored too
country: USA
Neon versus JSON
JSON è un sottoinsieme di NEON. Ogni JSON può quindi essere analizzato come NEON:
{
"php": {
"date.timezone": "Europe\/Prague",
"zlib.output_compression": true
},
"database": {
"driver": "mysql",
"username": "root",
"password": "beruska92"
},
"users": [
"Dave", "Kryten", "Rimmer"
]
}
E se omettessimo le virgolette?
{
php: {
date.timezone: Europe/Prague,
zlib.output_compression: true
},
database: {
driver: mysql,
username: root,
password: beruska92
},
users: [
Dave, Kryten, Rimmer
]
}
E le parentesi graffe e le virgole?
php:
date.timezone: Europe/Prague
zlib.output_compression: true
database:
driver: mysql
username: root
password: beruska92
users: [
Dave, Kryten, Rimmer
]
Le liste con i trattini non sono più leggibili?
php:
date.timezone: Europe/Prague
zlib.output_compression: true
database:
driver: mysql
username: root
password: beruska92
users:
- Dave
- Kryten
- Rimmer
Aggiungiamo i commenti?
# 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
Evvai, ora conoscete la sintassi di NEON!