Format NEON
NEON jest formatem danych strukturalnych czytelnym dla człowieka. W Nette jest on wykorzystywany do plików konfiguracyjnych. Jest również używany do danych strukturalnych, takich jak ustawienia, tłumaczenia językowe itp. Spróbuj.
NEON to skrót od Nette Object Notation. Jest ona mniej złożona i nieporęczna niż XML czy JSON, ale zapewnia podobne możliwości. Jest bardzo podobny do YAML. Główną zaletą jest to, że NEON ma tak zwane encje, dzięki którym konfiguracja usług DI jest tak seksowna. I pozwala na tabulatory dla wcięć.
NEON jest zbudowany od podstaw tak, aby był łatwy w użyciu.
Integracja
- NetBeans (ma wbudowane wsparcie)
- PhpStorm (plugin)
- Visual Studio Code (plugin)
- Sublime Text 3 (plugin)
- Sublime Text 2 (plugin)
- VIM (plugin)
- Emacs (plugin)
- Prism.js (język zintegrowany)
Składnia
Plik napisany w NEONie zwykle reprezentuje tablicę lub odwzorowanie.
Mapowanie
Mapowanie to zestaw par klucz-wartość, w PHP byłoby to nazywane tablicą asocjacyjną. Każda para zapisana jest jako
key: value
, wymagana jest spacja po :
. Wartość może być czymkolwiek: ciągiem, liczbą, booleanem,
null, ciągiem lub dowolnym innym odwzorowaniem.
street: 742 Evergreen Terrace
city: Springfield
country: USA
W PHP ta sama struktura zostałaby zapisana jako:
[ // PHP
'street' => '742 Evergreen Terrace',
'city' => 'Springfield',
'country' => 'USA',
]
Notacja ta jest określana jako notacja blokowa, ponieważ wszystkie elementy znajdują się w osobnej linii i mają takie samo wcięcie (w tym przypadku brak). NEON obsługuje również reprezentację inline mapowania, która jest zamknięta w nawiasach, wcięcie nie odgrywa żadnej roli, a separatorem dla każdego elementu jest przecinek lub nowa linia:
{street: 742 Evergreen Terrace, city: Springfield, country: USA}
To samo wpisane w wielu liniach (wcięcie nie ma znaczenia):
{
street: 742 Evergreen Terrace
city: Springfield, country: USA
}
Alternatywnie, =
może być używany zamiast :
zarówno w notacji blokowej jak i inline:
{street=742 Evergreen Terrace, city=Springfield, country=USA}
Sekwencja
Sekwencje są w PHP tablicami indeksowanymi. Są one zapisane jako linie zaczynające się od myślnika -
, po
którym następuje spacja. Ponownie, wartość może być czymkolwiek: ciągiem, liczbą, booleanem, null, ciągiem lub dowolnym
innym odwzorowaniem.
- Cat
- Dog
- Goldfish
W PHP ta sama struktura zostałaby zapisana jako:
[ // PHP
'Cat',
'Dog',
'Goldfish',
]
Notacja ta jest określana jako notacja blokowa, ponieważ wszystkie elementy znajdują się w osobnej linii i mają takie samo wcięcie (w tym przypadku brak). NEON obsługuje również reprezentację inline sekwencji, która jest zamknięta w nawiasach, wcięcie nie odgrywa żadnej roli, a separatorem dla każdego elementu jest przecinek lub nowa linia:
[Cat, Dog, Goldfish]
To samo wpisane w wielu liniach (wcięcie nie ma znaczenia):
[
Cat, Dog
Goldfish
]
Nie można używać wcięcia w reprezentacji inline.
Kombinacja
Wartości mapowania i sekwencji mogą być innymi mapowaniami i sekwencjami. Dużą rolę odgrywa poziom wcięcia. W
poniższym przykładzie myślnik użyty do wskazania wpisów sekwencji ma większe wcięcie niż klawisz pets
, więc
wpisy te stają się wartościami pierwszego wiersza:
pets:
- Cat
- Dog
cars:
- Volvo
- Skoda
W PHP ta sama struktura zostałaby zapisana jako:
[ // PHP
'pets' => [
'Cat',
'Dog',
],
'cars' => [
'Volvo',
'Skoda',
],
]
Notacja blokowa i inline mogą być łączone:
pets: [Cat, Dog]
cars: [
Volvo,
Skoda,
]
Nie można już używać notacji blokowej wewnątrz notacji inline, to nie działa:
item: [
pets:
- Cat # TOHLE NELZE!!!
- Dog
]
W poprzednim przypadku napisaliśmy mapowanie, którego elementami były sekwencje. Teraz spróbujmy zrobić to na odwrót i stworzyć sekwencję zawierającą mapowania:
-
name: John
age: 35
-
name: Peter
age: 28
Nie jest konieczne, aby wypunktowania znajdowały się w osobnych wierszach; można je również umieścić w ten sposób:
- name: John
age: 35
- name: Peter
age: 28
Od Ciebie zależy, czy wyrównasz klawisze w kolumnie za pomocą spacji czy tabulatora.
Ponieważ PHP używa tej samej struktury dla mapowania i sekwencji, czyli tablic, można je połączyć. Tym razem wcięcie jest takie samo:
- Cat
street: 742 Evergreen Terrace
- Goldfish
W PHP ta sama struktura zostałaby zapisana jako:
[ // PHP
'Cat',
'street' => '742 Evergreen Terrace',
'Goldfish',
]
Struny
Łańcuchy NEON mogą być ujęte w pojedyncze lub podwójne cudzysłowy. Ale jak widać, mogą być też nienotowane.
- Řetězec v NEON bez uvozovek
- 'Řetězec v NEON v jednoduchých uvozovkách'
- "Řetězec v NEON ve dvojitých uvozovkách"
Jeśli ciąg zawiera znaki # " ' , : = - [ ] { } ( )
który może być mylony ze składnią NEON, musi być
zamknięty w cudzysłowie. Zaleca się używanie pojedynczych cytatów, ponieważ nie używają one ucieczki. Jeśli w takim
ciągu trzeba zawrzeć cudzysłów, należy go podwoić:
'Uvozovka '' uvnitř řetezce v jednoduchých uvozovkách'
Podwójne cudzysłowy pozwalają na używanie sekwencji ucieczki do pisania znaków specjalnych za pomocą backslashes
\
. Podporovány jsou všechny escape sekvence jako u formátu JSON a navíc \_
, czyli niepodzielonej
spacji, czyli \u00A0
.
- "\t \n \r \f \b \" \\ \/ \_"
- "\u00A9"
Istnieją inne przypadki, w których musisz zamknąć ciągi w cudzysłowach:
- zaczynające się lub kończące spacjami
- wyglądają jak liczby, booleans, lub null
- NEON zinterpretowałby je jako datę
Ciągi wieloliniowe
Łańcuch wieloliniowy zaczyna się i kończy potrójnym cytatem w oddzielnych liniach. Wcięcie pierwszej linii jest ignorowane we wszystkich liniach:
'''
první řádek
druhý řádek
třetí řádek
'''
W PHP napisalibyśmy to samo jako:
"první řádek\n\tdruhý řádek\ntřetí řádek" // PHP
Sekwencje ucieczki działają tylko dla łańcuchów ujętych w podwójne cudzysłowy zamiast apostrofów:
"""
Copyright \u00A9
"""
Numery
NEON rozumie liczby zapisane w notacji naukowej, a także liczby w notacji binarnej, ósemkowej i szesnastkowej:
- 12 # liczba całkowita
- 12.3 # float
- +1.2e-34 # liczba wykładnicza
- 0b11010 # liczba binarna
- 0o666 # liczba oktalna
- 0x7A # liczba heksadecymalna
Nulle
Null może być wyrażony w NEON za pomocą null
lub poprzez nieokreślenie wartości. Dozwolone są również
warianty z wielką literą lub pierwszą literą.
a: null
b:
Booleans
Wyrażenia logiczne są wyrażane w NEON za pomocą true
/ false
lub yes
/
no
. Dozwolone są również warianty z dużymi lub wszystkimi literami.
[true, TRUE, True, false, yes, no]
Data
NEON używa następujących formatów do wyrażania danych i automatycznie konwertuje je na obiekty
DateTimeImmutable
:
- 2016-06-03 # data
- 2016-06-03 19:00:00 # data i czas
- 2016-06-03 19:00:00.1234 # data i czas
- 2016-06-03 19:00:00 +0200 # data & czas & strefa
- 2016-06-03 19:00:00 +02:00 # data & czas & strefa
Podmioty
Encja to struktura przypominająca wywołanie funkcji:
Column(type: int, nulls: yes)
W PHP jest on zapisany jako obiekt Nette\Neon\Entity:
// PHP
new Nette\Neon\Entity('Column', ['type' => 'int', 'nulls' => true])
Podmioty mogą być również łączone w łańcuchy:
Column(type: int, nulls: yes) Field(id: 1)
Który w PHP jest parsowany w ten sposób:
// 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]),
])
Wewnątrz nawiasów obowiązują zasady notacji inline stosowane dla mapek i sekwencji, a więc może być ona wielowierszowa i wtedy nie ma potrzeby dołączania przecinków:
Column(
type: int
nulls: yes
)
Uwagi
Komentarze zaczynają się od #
i wszystkie kolejne znaki po prawej stronie są ignorowane:
# ta linia będzie ignorowana przez tłumacza
ulica: 742 Evergreen Terrace
miasto: Springfield # to też jest ignorowane
kraj: USA
Neon kontra JSON
JSON jest podzbiorem NEON. Dlatego każdy JSON może być parsowany jako NEON:
{
"php": {
"date.timezone": "Europe\/Prague",
"zlib.output_compression": true
},
"database": {
"driver": "mysql",
"username": "root",
"password": "beruska92"
},
"users": [
"Dave", "Kryten", "Rimmer"
]
}
A co jeśli pominiemy cudzysłów?
{
php: {
date.timezone: Europe/Prague,
zlib.output_compression: true
},
database: {
driver: mysql,
username: root,
password: beruska92
},
users: [
Dave, Kryten, Rimmer
]
}
A nawiasy złożone i przecinki?
php:
date.timezone: Europe/Prague
zlib.output_compression: true
database:
driver: mysql
username: root
password: beruska92
users: [
Dave, Kryten, Rimmer
]
Czy listy wypunktowane nie są łatwiejsze do czytania?
php:
date.timezone: Europe/Prague
zlib.output_compression: true
database:
driver: mysql
username: root
password: beruska92
users:
- Dave
- Kryten
- Rimmer
Czy mamy dodawać komentarze?
# 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
Hura, teraz znasz składnię NEON!