NEON formátum
A NEON egy ember által olvasható strukturált adatformátum. A Nette-ben konfigurációs fájlokra használják. Strukturált adatok, például beállítások, nyelvi fordítások stb. tárolására is használják. Próbálja ki a homokozóban.
A NEON a Nette Object Notation rövidítése. Kevésbé bonyolult és nehézkes, mint az XML vagy a JSON, de hasonló képességekkel rendelkezik. Nagyon hasonlít a YAML-hez. A fő előnye, hogy a NEON rendelkezik úgynevezett entitásokkal, amelyeknek köszönhetően a DI szolgáltatások konfigurálása olyan szexi. És lehetővé teszi a tabulátorokat a behúzáshoz.
A NEON az alapoktól kezdve úgy lett felépítve, hogy egyszerűen használható legyen.
Integráció
- NetBeans (beépített támogatással rendelkezik)
- PhpStorm (plugin)
- Visual Studio Code (plugin)
- Sublime Text 3 (plugin)
- Sublime Text 2 (plugin)
- VIM (plugin)
- Emacs (plugin)
- Prism.js (integrált nyelv)
Szintaxis
Egy NEON-ban írt fájl általában egy szekvenciából vagy leképezésből áll.
Leképezések
A leképezés kulcs-érték párok halmaza, PHP-ben asszociatív tömbnek neveznénk. Minden pár a key: value
formában íródik, a :
után szóköz szükséges. Az érték bármi lehet: string, szám, boolean, null, szekvencia
vagy más leképezés.
street: 742 Evergreen Terrace
city: Springfield
country: USA
PHP-ben ugyanez a struktúra a következőképpen lenne leírva:
[ // PHP
'street' => '742 Evergreen Terrace',
'city' => 'Springfield',
'country' => 'USA',
]
Ezt a jelölést blokkjelölésnek nevezzük, mivel minden elem külön sorban van, és ugyanolyan behúzással rendelkezik (ebben az esetben nincs). A NEON támogatja az inline ábrázolást is a leképezéshez, amely zárójelekbe van zárva, a behúzás nem játszik szerepet, és az egyes elemek elválasztója vagy egy vessző vagy egy újsor:
{street: 742 Evergreen Terrace, city: Springfield, country: USA}
Ez több sorba írva ugyanaz (a behúzás nem számít):
{
street: 742 Evergreen Terrace
city: Springfield, country: USA
}
Alternatívaként a =
is használható a :
, mind blokkos, mind soron belüli jelölésben:
{street=742 Evergreen Terrace, city=Springfield, country=USA}
Sequences
A szekvenciák indexelt tömbök a PHP-ban. A szekvenciák a -
kötőjellel kezdődő sorok, majd egy szóköz
követi őket. Az érték itt is bármi lehet: karakterlánc, szám, boolean, null, szekvencia vagy más leképezés.
- Cat
- Dog
- Goldfish
PHP-ben ugyanez a struktúra a következőképpen lenne leírva:
[ // PHP
'Cat',
'Dog',
'Goldfish',
]
Ezt a jelölést blokkjelölésnek nevezzük, mivel minden elem külön sorban van, és ugyanolyan behúzással rendelkezik (ebben az esetben nincs). A NEON támogatja a sorozatok inline ábrázolását is, amely zárójelekbe van zárva, a behúzás nem játszik szerepet, és az egyes elemek elválasztója vagy egy vessző vagy egy újsor:
[Cat, Dog, Goldfish]
Ez több sorba írva ugyanaz (a behúzás nem számít):
[
Cat, Dog
Goldfish
]
Kötőjelek nem használhatók soron belüli ábrázolásban.
Kombináció
A leképezések és szekvenciák értékei lehetnek más leképezések és szekvenciák. A behúzás szintje nagy szerepet
játszik. A következő példában a szekvenciaelemek jelölésére használt kötőjel nagyobb behúzással rendelkezik, mint a
pets
kulcs, így az elemek az első sor értékévé válnak:
pets:
- Cat
- Dog
cars:
- Volvo
- Skoda
PHP-ben ugyanezt a struktúrát így írnánk le:
[ // PHP
'pets' => [
'Cat',
'Dog',
],
'cars' => [
'Volvo',
'Skoda',
],
]
Lehetőség van a blokk és az inline jelölés kombinálására:
pets: [Cat, Dog]
cars: [
Volvo,
Skoda,
]
Ez már nem működik, a blokk jelölés nem használható inline jelölésen belül:
item: [
pets:
- Cat # THIS IS NOT POSSIBLE!!!
- Dog
]
Az előző esetben egy olyan leképezést írtunk, amelynek elemei szekvenciák voltak. Most próbáljuk meg fordítva, és hozzunk létre egy leképezéseket tartalmazó szekvenciát:
-
name: John
age: 35
-
name: Peter
age: 28
Nem szükséges, hogy a felsoroláspontok külön sorokban legyenek; így is elhelyezhetjük őket:
- name: John
age: 35
- name: Peter
age: 28
Öntől függ, hogy a kulcsokat szóközökkel vagy tabulátorral igazítja-e egy oszlopba.
Mivel a PHP ugyanazt a struktúrát használja a leképezéshez és a szekvenciákhoz, azaz a tömböket, mindkettő összevonható. A behúzás ezúttal is ugyanaz:
- Cat
street: 742 Evergreen Terrace
- Goldfish
PHP-ben ugyanazt a struktúrát így írnánk:
[ // PHP
'Cat',
'street' => '742 Evergreen Terrace',
'Goldfish',
]
Strings
A karakterláncok a NEON-ban szimpla vagy dupla idézőjelek közé zárhatók. De mint láthatjuk, idézőjelek nélkül is lehetnek.
- A unquoted string in NEON
- 'A singled-quoted string in NEON'
- "A double-quoted string in NEON"
Ha a karakterlánc karaktereket tartalmaz # " ' , : = - [ ] { } ( )
amelyek összetéveszthetők a NEON
szintaxissal, akkor idézőjelek közé kell zárni. Javasoljuk az egyszeres idézőjelek használatát, mivel ezek nem
használnak eszkábálást. Ha ilyen karakterláncba idézőjelet kell zárni, akkor duplázza meg azt:
'A single quote '' inside a single-quoted string'
A kettős idézőjelek lehetővé teszik, hogy escape szekvenciákat használjon speciális karakterek írásához, a
backslashes \
. All escape sequences as in the JSON format are supported, plus \_
, ami egy nem szaggatott
szóköz, azaz \u00A0
.
- "\t \n \r \f \b \" \\ \/ \_"
- "\u00A9"
Vannak más esetek is, amikor karakterláncokat kell idézőjelekbe zárni:
- szóközzel kezdődnek vagy végződnek
- számoknak, booléknak vagy nullának tűnnek
- A NEON dátumként értelmezné őket
Többsoros karakterláncok
A többsoros karakterlánc háromszoros idézőjellel kezdődik és végződik külön sorokban. Az első sor behúzását az összes sor esetében figyelmen kívül hagyjuk:
'''
first line
second line
third line
'''
PHP-ben ugyanezt így írnánk:
"first line\n\tsecond line\nthird line" // PHP
A szekvenciák csak aposztrófok helyett dupla idézőjelekbe zárt karakterláncok esetében működnek:
"""
Copyright \u00A9
"""
Számok
A NEON megérti az úgynevezett tudományos jelöléssel írt számokat, valamint a bináris, oktális és hexadecimális számokat is:
- 12 # egész szám
- 12.3 # egy lebegő
- +1.2e-34 # exponenciális szám
- 0b11010 # bináris szám
- 0o666 # oktális szám
- 0x7A # hexa szám
Nullák
A null a NEON-ban a null
használatával vagy érték meg nem adásával fejezhető ki. A nagy kezdőbetűvel
vagy csupa nagybetűvel írt változatok is megengedettek.
a: null
b:
Booleans
A Boolean értékeket a NEON-ban a true
/ false
vagy a yes
/ no
segítségével fejezzük ki. A nagy kezdőbetűvel vagy csupa nagybetűvel írt változatok is megengedettek.
[true, TRUE, True, false, yes, no]
Dátumok
A NEON a következő formátumokat használja az adatok kifejezésére, és automatikusan átalakítja őket
DateTimeImmutable
objektumokká:
- 2016-06-03 # dátum
- 2016-06-03 19:00:00 # dátum és idő
- 2016-06-03 19:00:00.1234 # dátum és mikroidő
- 2016-06-03 19:00:00 +0200 # dátum & idő & időzóna
- 2016-06-03 19:00:00 +02:00 # dátum & idő & időzóna
Entitások
Az entitás olyan struktúra, amely hasonlít egy függvényhívásra:
Column(type: int, nulls: yes)
A PHP-ben objektumként elemzik Nette\Neon\Entity:
// PHP
new Nette\Neon\Entity('Column', ['type' => 'int', 'nulls' => true])
Az entitások láncolhatók is:
Column(type: int, nulls: yes) Field(id: 1)
Amit a PHP a következőképpen elemez:
// 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]),
])
A zárójeleken belül a leképezéshez és a szekvenciákhoz használt inline jelölés szabályai érvényesek, így több sorra osztható, és nem szükséges vesszőt tenni:
Column(
type: int
nulls: yes
)
Megjegyzések
A megjegyzések #
-gal kezdődnek, és a jobb oldalt következő karaktereket figyelmen kívül hagyjuk:
# ezt a sort az értelmező figyelmen kívül hagyja.
utca: 742 Evergreen Terrace
város: # ezt is figyelmen kívül hagyja
ország: USA
NEON Versus JSON
A JSON a NEON egy részhalmaza. Ezért minden JSON elemezhető NEON-ként:
{
"php": {
"date.timezone": "Europe\/Prague",
"zlib.output_compression": true
},
"database": {
"driver": "mysql",
"username": "root",
"password": "beruska92"
},
"users": [
"Dave", "Kryten", "Rimmer"
]
}
Mi lenne, ha elhagyhatnánk az idézőjeleket?
{
php: {
date.timezone: Europe/Prague,
zlib.output_compression: true
},
database: {
driver: mysql,
username: root,
password: beruska92
},
users: [
Dave, Kryten, Rimmer
]
}
Mit szólnánk a zárójelekhez és a vesszőkhöz?
php:
date.timezone: Europe/Prague
zlib.output_compression: true
database:
driver: mysql
username: root
password: beruska92
users: [
Dave, Kryten, Rimmer
]
A felsorolásjelek olvashatóbbak?
php:
date.timezone: Europe/Prague
zlib.output_compression: true
database:
driver: mysql
username: root
password: beruska92
users:
- Dave
- Kryten
- Rimmer
Mi a helyzet a megjegyzésekkel?
# 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
Megtaláltad a NEON szintaxist!