Μορφή NEON
Το NEON είναι μια ευανάγνωστη μορφή δομημένων δεδομένων. Στο Nette χρησιμοποιείται για αρχεία διαμόρφωσης. Χρησιμοποιείται επίσης για δομημένα δεδομένα, όπως ρυθμίσεις, γλωσσικές μεταφράσεις κ.λπ. Δοκιμάστε το.
Το NEON είναι ακρωνύμιο του Nette Object Notation. Είναι λιγότερο περίπλοκο και αδέξιο από το XML ή το JSON, αλλά παρέχει παρόμοιες λειτουργίες. Είναι πολύ παρόμοιο με το YAML. Το κύριο πλεονέκτημα είναι ότι το NEON διαθέτει τις λεγόμενες entities, χάρη στις οποίες η διαμόρφωση των υπηρεσιών DI είναι επίσης σέξι. Και επιτρέπει την εσοχή με tabs.
Το NEON είναι χτισμένο από την αρχή ώστε να είναι εύκολο στη χρήση.
Ενσωμάτωση
- NetBeans (έχει ενσωματωμένη υποστήριξη)
- PhpStorm (plugin)
- Visual Studio Code (Nette Latte + Neon) ή Nette for VS Code)
- Sublime Text 3 (plugin)
- Sublime Text 2 (plugin)
- VIM (plugin)
- Emacs (plugin)
- Prism.js (integrated language)
Σύνταξη
Ένα αρχείο γραμμένο σε NEON αντιπροσωπεύει συνήθως έναν πίνακα ή μια αντιστοίχιση.
Αντιστοίχιση
Η αντιστοίχιση είναι ένα σύνολο ζευγών κλειδιού-τιμής, στην PHP θα
λέγαμε ένας συσχετιστικός πίνακας. Κάθε ζεύγος γράφεται ως
key: value
, το κενό μετά το :
είναι απαραίτητο. Η τιμή μπορεί να
είναι οτιδήποτε: string, αριθμός, boolean, null, ακολουθία ή άλλη αντιστοίχιση.
street: 742 Evergreen Terrace
city: Springfield
country: USA
Στην PHP, η ίδια δομή θα γραφόταν ως:
[ // PHP
'street' => '742 Evergreen Terrace',
'city' => 'Springfield',
'country' => 'USA',
]
Αυτή η γραφή ονομάζεται μπλοκ, επειδή όλα τα στοιχεία βρίσκονται σε ξεχωριστή γραμμή και έχουν την ίδια εσοχή (σε αυτή την περίπτωση, καμία). Το NEON υποστηρίζει επίσης την inline αναπαράσταση αντιστοιχίσεων, η οποία περικλείεται σε αγκύλες, η εσοχή δεν παίζει κανένα ρόλο και ο διαχωριστής των μεμονωμένων στοιχείων είναι είτε το κόμμα είτε η νέα γραμμή:
{street: 742 Evergreen Terrace, city: Springfield, country: USA}
Το ίδιο γραμμένο σε πολλές γραμμές (η εσοχή δεν έχει σημασία):
{
street: 742 Evergreen Terrace
city: Springfield, country: USA
}
Αντί για :
, μπορείτε εναλλακτικά να χρησιμοποιήσετε το
=
τόσο στη γραφή μπλοκ όσο και στην inline γραφή:
{street=742 Evergreen Terrace, city=Springfield, country=USA}
Ακολουθίες
Οι ακολουθίες είναι στην PHP πίνακες με δείκτες. Γράφονται ως γραμμές
που ξεκινούν με παύλα -
ακολουθούμενη από κενό. Η τιμή μπορεί
πάλι να είναι οτιδήποτε: string, αριθμός, boolean, null, ακολουθία ή άλλη
αντιστοίχιση.
- Cat
- Dog
- Goldfish
Στην PHP, η ίδια δομή θα γραφόταν ως:
[ // PHP
'Cat',
'Dog',
'Goldfish',
]
Αυτή η γραφή ονομάζεται μπλοκ, επειδή όλα τα στοιχεία βρίσκονται σε ξεχωριστή γραμμή και έχουν την ίδια εσοχή (σε αυτή την περίπτωση, καμία). Το NEON υποστηρίζει επίσης την inline αναπαράσταση ακολουθιών, η οποία περικλείεται σε αγκύλες, η εσοχή δεν παίζει κανένα ρόλο και ο διαχωριστής των μεμονωμένων στοιχείων είναι είτε το κόμμα είτε η νέα γραμμή:
[Cat, Dog, Goldfish]
Το ίδιο γραμμένο σε πολλές γραμμές (η εσοχή δεν έχει σημασία):
[
Cat, Dog
Goldfish
]
Στην inline αναπαράσταση δεν μπορούν να χρησιμοποιηθούν εσοχές με παύλες.
Συνδυασμοί
Οι τιμές των αντιστοιχίσεων και των ακολουθιών μπορούν να είναι
άλλες αντιστοιχίσεις και ακολουθίες. Ο κύριος ρόλος παίζεται από το
επίπεδο εσοχής. Στο παρακάτω παράδειγμα, η παύλα που χρησιμοποιείται
για τη σήμανση των στοιχείων της ακολουθίας έχει μεγαλύτερη εσοχή από
το κλειδί pets
, οπότε τα στοιχεία γίνονται η τιμή της πρώτης
γραμμής:
pets:
- Cat
- Dog
cars:
- Volvo
- Skoda
Στην PHP, η ίδια δομή θα γραφόταν ως:
[ // PHP
'pets' => [
'Cat',
'Dog',
],
'cars' => [
'Volvo',
'Skoda',
],
]
Μπορείτε να συνδυάσετε τη γραφή μπλοκ και την inline γραφή:
pets: [Cat, Dog]
cars: [
Volvo,
Skoda,
]
Μέσα στην inline γραφή δεν μπορείτε πλέον να χρησιμοποιήσετε τη γραφή μπλοκ, αυτό δεν λειτουργεί:
item: [
pets:
- Cat # ΑΥΤΟ ΔΕΝ ΕΙΝΑΙ ΔΥΝΑΤΟ!!!
- Dog
]
Στην προηγούμενη περίπτωση, γράψαμε μια αντιστοίχιση της οποίας τα στοιχεία ήταν ακολουθίες, τώρα θα προσπαθήσουμε το αντίστροφο και θα δημιουργήσουμε μια ακολουθία που περιέχει αντιστοιχίσεις:
-
name: John
age: 35
-
name: Peter
age: 28
Δεν είναι απαραίτητο οι παύλες να βρίσκονται σε ξεχωριστές γραμμές, μπορούν να τοποθετηθούν και με αυτόν τον τρόπο:
- name: John
age: 35
- name: Peter
age: 28
Εξαρτάται από εσάς αν θα ευθυγραμμίσετε τα κλειδιά σε μια στήλη χρησιμοποιώντας κενά ή θα χρησιμοποιήσετε ένα tab.
Επειδή στην PHP χρησιμοποιείται η ίδια δομή τόσο για τις αντιστοιχίσεις όσο και για τις ακολουθίες, δηλαδή οι πίνακες, και τα δύο μπορούν να συγχωνευθούν. Η εσοχή είναι αυτή τη φορά η ίδια:
- Cat
street: 742 Evergreen Terrace
- Goldfish
Στην PHP, η ίδια δομή θα γραφόταν ως:
[ // PHP
'Cat',
'street' => '742 Evergreen Terrace',
'Goldfish',
]
Strings
Τα strings στο NEON μπορούν να περικλείονται σε απλά ή διπλά εισαγωγικά. Αλλά όπως βλέπετε, μπορούν να είναι και χωρίς εισαγωγικά.
- String σε NEON χωρίς εισαγωγικά
- 'String σε NEON σε απλά εισαγωγικά'
- "String σε NEON σε διπλά εισαγωγικά"
Αν ένα string περιέχει τους χαρακτήρες # " ' , : = - [ ] { } ( )
, οι οποίοι
μπορούν να συγχέονται με τη σύνταξη NEON, πρέπει να περικλείεται σε
εισαγωγικά. Συνιστούμε τη χρήση απλών εισαγωγικών, επειδή δεν
χρησιμοποιούν διαφυγή. Αν χρειαστεί να γράψετε ένα εισαγωγικό σε ένα
τέτοιο string, διπλασιάστε το:
'Εισαγωγικό '' μέσα σε string σε απλά εισαγωγικά'
Τα διπλά εισαγωγικά επιτρέπουν τη χρήση ακολουθιών διαφυγής για τη
γραφή ειδικών χαρακτήρων χρησιμοποιώντας ανάποδες καθέτους \
.
Υποστηρίζονται όλες οι ακολουθίες διαφυγής όπως στη μορφή JSON και
επιπλέον το \_
, το οποίο είναι ένα αδιάσπαστο κενό, δηλαδή
\u00A0
.
- "\t \n \r \f \b \" \\ \/ \_"
- "\u00A9"
Υπάρχουν και άλλες περιπτώσεις όπου είναι απαραίτητο να περικλείονται τα strings σε εισαγωγικά:
- αρχίζουν ή τελειώνουν με κενά
- μοιάζουν με αριθμούς, booleans ή null
- το NEON θα τα καταλάβαινε ως date
Πολυγραμμικά strings
Ένα πολυγραμμικό string αρχίζει και τελειώνει με τριπλά εισαγωγικά σε ξεχωριστές γραμμές. Η εσοχή της πρώτης γραμμής αγνοείται και αυτό ισχύει για όλες τις γραμμές:
'''
πρώτη γραμμή
δεύτερη γραμμή
τρίτη γραμμή
'''
Στην PHP θα γράφαμε το ίδιο ως:
"πρώτη γραμμή\n\tdεύτερη γραμμή\nτρίτη γραμμή" // PHP
Οι ακολουθίες διαφυγής λειτουργούν μόνο για strings που περικλείονται σε διπλά εισαγωγικά αντί για αποστρόφους:
"""
Copyright \u00A9
"""
Αριθμοί
Το NEON κατανοεί αριθμούς γραμμένους στη λεγόμενη επιστημονική σημειογραφία καθώς και αριθμούς σε δυαδικό, οκταδικό και δεκαεξαδικό σύστημα:
- 12 # ακέραιος
- 12.3 # float
- +1.2e-34 # εκθετικός αριθμός
- 0b11010 # δυαδικός αριθμός
- 0o666 # οκταδικός αριθμός
- 0x7A # δεκαεξαδικός αριθμός
Nulls
Το Null μπορεί να εκφραστεί στο NEON χρησιμοποιώντας null
ή
παραλείποντας την τιμή. Επιτρέπονται επίσης παραλλαγές με κεφαλαίο
πρώτο γράμμα ή όλα τα γράμματα κεφαλαία.
a: null
b:
Booleans
Οι λογικές τιμές εκφράζονται στο NEON χρησιμοποιώντας true
/
false
ή yes
/ no
. Επιτρέπονται επίσης παραλλαγές με
κεφαλαίο πρώτο γράμμα ή όλα τα γράμματα κεφαλαία.
[true, TRUE, True, false, yes, no]
Ημερομηνία
Το NEON χρησιμοποιεί τις ακόλουθες μορφές για την έκφραση ημερομηνιών
και τις μετατρέπει αυτόματα σε αντικείμενα DateTimeImmutable
:
- 2016-06-03 # ημερομηνία
- 2016-06-03 19:00:00 # ημερομηνία & ώρα
- 2016-06-03 19:00:00.1234 # ημερομηνία & μικροχρόνος
- 2016-06-03 19:00:00 +0200 # ημερομηνία & ώρα & ζώνη
- 2016-06-03 19:00:00 +02:00 # ημερομηνία & ώρα & ζώνη
Entities
Μια οντότητα είναι μια δομή που μοιάζει με κλήση συνάρτησης:
Column(type: int, nulls: yes)
Στην PHP, αναλύεται ως αντικείμενο Nette\Neon\Entity:
// PHP
new Nette\Neon\Entity('Column', ['type' => 'int', 'nulls' => true])
Οι οντότητες μπορούν επίσης να συνδεθούν σε αλυσίδα:
Column(type: int, nulls: yes) Field(id: 1)
Το οποίο αναλύεται στην PHP με αυτόν τον τρόπο:
// 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]),
])
Μέσα στις παρενθέσεις ισχύουν οι κανόνες για την inline γραφή που χρησιμοποιείται για αντιστοιχίσεις και ακολουθίες, δηλαδή μπορεί να είναι και πολυγραμμική και τότε δεν είναι απαραίτητο να αναφέρονται κόμματα:
Column(
type: int
nulls: yes
)
Σχόλια
Τα σχόλια ξεκινούν με τον χαρακτήρα #
και όλοι οι επόμενοι
χαρακτήρες στα δεξιά αγνοούνται:
# αυτή η γραμμή θα αγνοηθεί από τον διερμηνέα
street: 742 Evergreen Terrace
city: Springfield # αυτό αγνοείται επίσης
country: USA
Neon έναντι JSON
Το JSON είναι υποσύνολο του NEON. Κάθε JSON μπορεί επομένως να αναλυθεί ως NEON:
{
"php": {
"date.timezone": "Europe\/Prague",
"zlib.output_compression": true
},
"database": {
"driver": "mysql",
"username": "root",
"password": "beruska92"
},
"users": [
"Dave", "Kryten", "Rimmer"
]
}
Τι θα γινόταν αν παραλείπαμε τα εισαγωγικά;
{
php: {
date.timezone: Europe/Prague,
zlib.output_compression: true
},
database: {
driver: mysql,
username: root,
password: beruska92
},
users: [
Dave, Kryten, Rimmer
]
}
Και τις αγκύλες και τα κόμματα;
php:
date.timezone: Europe/Prague
zlib.output_compression: true
database:
driver: mysql
username: root
password: beruska92
users: [
Dave, Kryten, Rimmer
]
Δεν είναι οι λίστες με παύλες πιο ευανάγνωστες;
php:
date.timezone: Europe/Prague
zlib.output_compression: true
database:
driver: mysql
username: root
password: beruska92
users:
- Dave
- Kryten
- Rimmer
Να προσθέσουμε σχόλια;
# η διαμόρφωση της διαδικτυακής μου εφαρμογής
php:
date.timezone: Europe/Prague
zlib.output_compression: true # χρήση gzip
database:
driver: mysql
username: root
password: beruska92
users:
- Dave
- Kryten
- Rimmer
Ουρά, τώρα γνωρίζετε τη σύνταξη του NEON!