Das NEON-Format
NEON ist ein menschenlesbares strukturiertes Datenformat. In Nette wird es für Konfigurationsdateien verwendet. Es wird auch für strukturierte Daten wie Einstellungen, Sprachübersetzungen usw. verwendet. Probieren Sie es aus.
NEON ist die Abkürzung für Nette Object Notation. Es ist weniger komplex und sperrig als XML oder JSON, bietet aber ähnliche Funktionen. Es ist YAML sehr ähnlich. Der Hauptvorteil ist, dass NEON sogenannte Entitäten hat, dank derer die Konfiguration von DI-Diensten auch sexy ist. Und es erlaubt die Einrückung mit Tabulatoren.
NEON wurde von Grund auf so konzipiert, dass es einfach zu verwenden ist.
Integration
- NetBeans (hat eingebaute Unterstützung)
- PhpStorm (Plugin)
- Visual Studio Code (Nette Latte + Neon) oder Nette for VS Code)
- Sublime Text 3 (Plugin)
- Sublime Text 2 (Plugin)
- VIM (Plugin)
- Emacs (Plugin)
- Prism.js (integrierte Sprache)
Syntax
Eine in NEON geschriebene Datei stellt normalerweise ein Array oder eine Zuordnung dar.
Zuordnung (Mapping)
Eine Zuordnung ist eine Menge von Schlüssel-Wert-Paaren, in PHP würde man sagen assoziatives Array. Jedes Paar wird als
key: value
geschrieben, ein Leerzeichen nach :
ist erforderlich. Der Wert kann alles sein: Zeichenkette,
Zahl, Boolean, Null, Sequenz oder eine andere Zuordnung.
street: 742 Evergreen Terrace
city: Springfield
country: USA
In PHP würde dieselbe Struktur wie folgt geschrieben werden:
[ // PHP
'street' => '742 Evergreen Terrace',
'city' => 'Springfield',
'country' => 'USA',
]
Diese Schreibweise wird als Block-Schreibweise bezeichnet, da alle Elemente auf einer separaten Zeile stehen und dieselbe
Einrückung haben (in diesem Fall keine). NEON unterstützt auch eine Inline-Darstellung für Zuordnungen, die in Klammern
{}
eingeschlossen ist, die Einrückung spielt keine Rolle und das Trennzeichen für einzelne Elemente ist entweder
ein Komma oder ein Zeilenumbruch:
{street: 742 Evergreen Terrace, city: Springfield, country: USA}
Dasselbe auf mehrere Zeilen verteilt (Einrückung spielt keine Rolle):
{
street: 742 Evergreen Terrace
city: Springfield, country: USA
}
Anstelle von :
kann alternativ =
verwendet werden, sowohl in der Block- als auch in der
Inline-Schreibweise:
{street=742 Evergreen Terrace, city=Springfield, country=USA}
Sequenz
Sequenzen sind in PHP indizierte Arrays. Sie werden als Zeilen geschrieben, die mit einem Bindestrich -
gefolgt
von einem Leerzeichen beginnen. Der Wert kann wiederum alles sein: Zeichenkette, Zahl, Boolean, Null, Sequenz oder eine andere
Zuordnung.
- Cat
- Dog
- Goldfish
In PHP würde dieselbe Struktur wie folgt geschrieben werden:
[ // PHP
'Cat',
'Dog',
'Goldfish',
]
Diese Schreibweise wird als Block-Schreibweise bezeichnet, da alle Elemente auf einer separaten Zeile stehen und dieselbe
Einrückung haben (in diesem Fall keine). NEON unterstützt auch eine Inline-Darstellung für Sequenzen, die in Klammern
[]
eingeschlossen ist, die Einrückung spielt keine Rolle und das Trennzeichen für einzelne Elemente ist entweder
ein Komma oder ein Zeilenumbruch:
[Cat, Dog, Goldfish]
Dasselbe auf mehrere Zeilen verteilt (Einrückung spielt keine Rolle):
[
Cat, Dog
Goldfish
]
In der Inline-Darstellung können keine einrückenden Aufzählungszeichen (-
) verwendet werden.
Kombinationen
Die Werte von Zuordnungen und Sequenzen können andere Zuordnungen und Sequenzen sein. Die Einrückungsebene spielt die
Hauptrolle. Im folgenden Beispiel hat der Bindestrich, der zur Kennzeichnung von Sequenzelementen verwendet wird, eine größere
Einrückung als der Schlüssel pets
, sodass die Elemente zum Wert der ersten Zeile werden:
pets:
- Cat
- Dog
cars:
- Volvo
- Skoda
In PHP würde dieselbe Struktur wie folgt geschrieben werden:
[ // PHP
'pets' => [
'Cat',
'Dog',
],
'cars' => [
'Volvo',
'Skoda',
],
]
Es ist möglich, Block- und Inline-Schreibweisen zu kombinieren:
pets: [Cat, Dog]
cars: [
Volvo,
Skoda,
]
Innerhalb der Inline-Schreibweise kann keine Block-Schreibweise mehr verwendet werden, dies funktioniert nicht:
item: [
pets:
- Cat # DAS IST NICHT MÖGLICH!!!
- Dog
]
Im vorherigen Fall haben wir eine Zuordnung geschrieben, deren Elemente Sequenzen waren, jetzt versuchen wir es umgekehrt und erstellen eine Sequenz, die Zuordnungen enthält:
-
name: John
age: 35
-
name: Peter
age: 28
Es ist nicht notwendig, dass die Aufzählungszeichen auf separaten Zeilen stehen, sie können auch wie folgt platziert werden:
- name: John
age: 35
- name: Peter
age: 28
Es liegt an Ihnen, ob Sie die Schlüssel mit Leerzeichen in eine Spalte ausrichten oder einen Tabulator verwenden.
Da in PHP für Zuordnungen und Sequenzen dieselbe Struktur verwendet wird, nämlich Arrays, können beide zusammengeführt werden. Die Einrückung ist diesmal dieselbe:
- Cat
street: 742 Evergreen Terrace
- Goldfish
In PHP würde dieselbe Struktur wie folgt geschrieben werden:
[ // PHP
'Cat',
'street' => '742 Evergreen Terrace',
'Goldfish',
]
Zeichenketten
Zeichenketten in NEON können in einfache oder doppelte Anführungszeichen eingeschlossen werden. Aber wie Sie sehen, können sie auch ohne Anführungszeichen sein.
- Zeichenkette in NEON ohne Anführungszeichen
- 'Zeichenkette in NEON in einfachen Anführungszeichen'
- "Zeichenkette in NEON in doppelten Anführungszeichen"
Wenn die Zeichenkette Zeichen wie # " ' , : = - [ ] { } ( )
enthält, die mit der NEON-Syntax verwechselt werden
könnten, muss sie in Anführungszeichen eingeschlossen werden. Wir empfehlen die Verwendung einfacher Anführungszeichen
('...'
), da darin kein Escaping verwendet wird. Wenn Sie in einer solchen Zeichenkette ein einfaches
Anführungszeichen schreiben müssen, verdoppeln Sie es (''
):
'Anführungszeichen '' innerhalb einer Zeichenkette in einfachen Anführungszeichen'
Doppelte Anführungszeichen ("..."
) ermöglichen die Verwendung von Escape-Sequenzen zur Darstellung von
Sonderzeichen mit Backslashes \
. Alle Escape-Sequenzen wie im JSON-Format werden unterstützt, zusätzlich
\_
, was ein geschütztes Leerzeichen ist, also \u00A0
.
- "\t \n \r \f \b \" \\ \/ \_"
- "\u00A9"
Es gibt weitere Fälle, in denen Zeichenketten in Anführungszeichen eingeschlossen werden müssen:
- sie beginnen oder enden mit Leerzeichen
- sie sehen aus wie Zahlen, Booleans oder null
- NEON würde sie als Datum verstehen
Mehrzeilige Zeichenketten
Eine mehrzeilige Zeichenkette beginnt und endet mit dreifachen Anführungszeichen ('''
oder """
) auf
separaten Zeilen. Die Einrückung der ersten Zeile (nach den öffnenden Anführungszeichen) bestimmt die Basiseinrückung, die von
allen folgenden Zeilen entfernt wird:
'''
erste Zeile
zweite Zeile
dritte Zeile
'''
In PHP würde dies als folgende Zeichenkette interpretiert:
"Erste Zeile\n\tZweite Zeile mit Einrückung\nDritte Zeile" // PHP
Escape-Sequenzen funktionieren nur bei Zeichenketten, die in doppelten Anführungszeichen statt Apostrophen eingeschlossen sind:
"""
Copyright \u00A9
"""
Zahlen
NEON versteht Zahlen, die in sogenannter wissenschaftlicher Notation geschrieben sind, sowie Zahlen im Binär-, Oktal- und Hexadezimalsystem:
- 12 # ganze Zahl
- 12.3 # float
- +1.2e-34 # Exponentialzahl
- 0b11010 # Binärzahl
- 0o666 # Oktalzahl
- 0x7A # Hexadezimalzahl
Nulls
Null kann in NEON mit null
ausgedrückt werden oder durch Weglassen des Werts nach dem Doppelpunkt. Varianten mit
großem Anfangsbuchstaben (Null
) oder komplett in Großbuchstaben (NULL
) sind ebenfalls erlaubt.
a: null
b:
Booleans
Logische Werte werden in NEON mit true
/ false
oder yes
/ no
ausgedrückt.
Varianten mit großem Anfangsbuchstaben oder komplett in Großbuchstaben sind ebenfalls erlaubt.
[true, TRUE, True, false, yes, no]
Datum
NEON verwendet die folgenden Formate zur Darstellung von Daten und konvertiert sie automatisch in
DateTimeImmutable
-Objekte:
- 2016-06-03 # Datum
- 2016-06-03 19:00:00 # Datum & Zeit
- 2016-06-03 19:00:00.1234 # Datum & Mikrozeit
- 2016-06-03 19:00:00 +0200 # Datum & Zeit & Zeitzone
- 2016-06-03 19:00:00 +02:00 # Datum & Zeit & Zeitzone
Entitäten
Eine Entität ist eine Struktur, die einem Funktionsaufruf ähnelt:
Column(type: int, nulls: yes)
In PHP wird dies als Objekt Nette\Neon\Entity geparst:
// PHP
new Nette\Neon\Entity('Column', ['type' => 'int', 'nulls' => true])
Entitäten können auch verkettet werden:
Column(type: int, nulls: yes) Field(id: 1)
Was in PHP auf diese Weise geparst wird:
// 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]),
])
Innerhalb der Klammern gelten die Regeln für die Inline-Schreibweise, die bei Zuordnungen und Sequenzen verwendet wird, d. h., sie kann auch mehrzeilig sein, und dann müssen keine Kommas angegeben werden:
Column(
type: int
nulls: yes
)
Kommentare
Kommentare beginnen mit dem Zeichen #
, und alle folgenden Zeichen rechts davon werden ignoriert:
# diese Zeile wird vom Interpreter ignoriert
street: 742 Evergreen Terrace
city: Springfield # dies wird ebenfalls ignoriert
country: USA
Neon versus JSON
JSON ist eine Teilmenge von NEON. Jedes JSON kann daher als NEON geparst werden:
{
"php": {
"date.timezone": "Europe\/Prague",
"zlib.output_compression": true
},
"database": {
"driver": "mysql",
"username": "root",
"password": "beruska92"
},
"users": [
"Dave", "Kryten", "Rimmer"
]
}
Was wäre, wenn wir die Anführungszeichen weglassen würden?
{
php: {
date.timezone: Europe/Prague,
zlib.output_compression: true
},
database: {
driver: mysql,
username: root,
password: beruska92
},
users: [
Dave, Kryten, Rimmer
]
}
Und die geschweiften Klammern und Kommas?
php:
date.timezone: Europe/Prague
zlib.output_compression: true
database:
driver: mysql
username: root
password: beruska92
users: [
Dave, Kryten, Rimmer
]
Sind Listen mit Aufzählungszeichen nicht besser lesbar?
php:
date.timezone: Europe/Prague
zlib.output_compression: true
database:
driver: mysql
username: root
password: beruska92
users:
- Dave
- Kryten
- Rimmer
Fügen wir Kommentare hinzu?
# meine Webanwendungskonfiguration
php:
date.timezone: Europe/Prague
zlib.output_compression: true # gzip verwenden
database:
driver: mysql
username: root
password: beruska92
users:
- Dave
- Kryten
- Rimmer
Hurra, jetzt kennen Sie die Syntax von NEON!