Μορφή NEON
Το NEON είναι μια μορφή δομημένων δεδομένων με δυνατότητα ανάγνωσης από τον άνθρωπο. Στο Nette, χρησιμοποιείται για αρχεία διαμόρφωσης. Χρησιμοποιείται επίσης για δομημένα δεδομένα όπως ρυθμίσεις, μεταφράσεις γλωσσών κ.λπ. Δοκιμάστε το στο sandbox.
NEON σημαίνει Nette Object Notation. Είναι λιγότερο πολύπλοκο και δυσκίνητο από την XML ή το JSON, αλλά παρέχει παρόμοιες δυνατότητες. Μοιάζει πολύ με την YAML. Το κύριο πλεονέκτημα είναι ότι το NEON διαθέτει τις λεγόμενες οντότητες, χάρη στις οποίες η διαμόρφωση των υπηρεσιών DI είναι τόσο σέξι. Και επιτρέπει tabs για εσοχή.
Το NEON έχει κατασκευαστεί από την αρχή για να είναι απλό στη χρήση.
Ενσωμάτωση
- NetBeans (έχει ενσωματωμένη υποστήριξη)
- PhpStorm (πρόσθετο)
- Visual Studio Code (πρόσθετο)
- Sublime Text 3 (πρόσθετο)
- Sublime Text 2 (πρόσθετο)
- VIM (πρόσθετο)
- Emacs (πρόσθετο)
- Prism.js (ενσωματωμένη γλώσσα)
Σύνταξη
Ένα αρχείο γραμμένο σε NEON αποτελείται συνήθως από μια ακολουθία ή χαρτογράφηση.
Χαρτογραφήσεις
Η χαρτογράφηση είναι ένα σύνολο ζευγών κλειδιού-τιμής, στην PHP θα
ονομαζόταν συσχετιστικός πίνακας. Κάθε ζεύγος γράφεται ως
key: value
, ένα κενό μετά το :
είναι απαραίτητο. Η τιμή μπορεί
να είναι οτιδήποτε: συμβολοσειρά, αριθμός, 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
}
Εναλλακτικά, το =
μπορεί να χρησιμοποιηθεί αντί του :
,
τόσο σε σημειογραφία μπλοκ όσο και σε γραμμική σημειογραφία:
{street=742 Evergreen Terrace, city=Springfield, country=USA}
Ακολουθίες
Οι ακολουθίες είναι ευρετηριασμένοι πίνακες στην PHP. Γράφονται ως
γραμμές που αρχίζουν με την παύλα -
ακολουθούμενες από ένα
διάστημα. Και πάλι, η τιμή μπορεί να είναι οτιδήποτε: συμβολοσειρά,
αριθμός, boolean, null, ακολουθία ή άλλη αντιστοίχιση.
- Cat
- Dog
- Goldfish
Στην PHP, η ίδια δομή θα γραφόταν ως εξής:
[ // PHP
'Cat',
'Dog',
'Goldfish',
]
Αυτή η γραφή ονομάζεται γραφή μπλοκ επειδή όλα τα στοιχεία βρίσκονται σε ξεχωριστή γραμμή και έχουν την ίδια εσοχή (καμία σε αυτή την περίπτωση). Ο NEON υποστηρίζει επίσης την αναπαράσταση inline για ακολουθίες, η οποία περικλείεται σε αγκύλες, η εσοχή δεν παίζει κανένα ρόλο και ο διαχωριστής κάθε στοιχείου είναι είτε ένα κόμμα είτε μια νέα γραμμή:
[Cat, Dog, Goldfish]
Αυτό είναι το ίδιο γραμμένο σε πολλές γραμμές (η εσοχή δεν παίζει ρόλο):
[
Cat, Dog
Goldfish
]
Οι παύλες δεν μπορούν να χρησιμοποιηθούν σε παράθεση εντός γραμμής.
Συνδυασμός
Οι τιμές των αντιστοιχίσεων και ακολουθιών μπορούν να είναι άλλες
αντιστοιχίσεις και ακολουθίες. Το επίπεδο εσοχής παίζει σημαντικό
ρόλο. Στο ακόλουθο παράδειγμα, η παύλα που χρησιμοποιείται για να
υποδείξει στοιχεία ακολουθίας έχει μεγαλύτερη εσοχή από το κλειδί
pets
, οπότε τα στοιχεία γίνονται η τιμή της πρώτης γραμμής:
pets:
- Cat
- Dog
cars:
- Volvo
- Skoda
Στην PHP, η ίδια δομή θα γραφόταν ως εξής:
[ // PHP
'pets' => [
'Cat',
'Dog',
],
'cars' => [
'Volvo',
'Skoda',
],
]
Είναι δυνατό να συνδυάσετε την σημειογραφία block και inline:
pets: [Cat, Dog]
cars: [
Volvo,
Skoda,
]
Αυτό δεν λειτουργεί:
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
Οι συμβολοσειρές στο NEON μπορούν να περικλείονται σε απλά ή διπλά εισαγωγικά. Αλλά όπως μπορείτε να δείτε, μπορούν επίσης να είναι χωρίς εισαγωγικά.
- A unquoted string in NEON
- 'A singled-quoted string in NEON'
- "A double-quoted string in NEON"
Εάν η συμβολοσειρά περιέχει χαρακτήρες # " ' , : = - [ ] { } ( )
που
μπορούν να συγχέονται με τη σύνταξη του NEON, πρέπει να περικλείονται σε
εισαγωγικά. Συνιστούμε τη χρήση μονών εισαγωγικών επειδή δεν
χρησιμοποιούν διαφυγή. Εάν πρέπει να περικλείσετε ένα εισαγωγικό σε
μια τέτοια συμβολοσειρά, διπλασιάστε το:
'A single quote '' inside a single-quoted string'
Τα διπλά εισαγωγικά σας επιτρέπουν να χρησιμοποιήσετε ακολουθίες
διαφυγής για να γράψετε ειδικούς χαρακτήρες χρησιμοποιώντας backslashes
\
. All escape sequences as in the JSON format are supported, plus \_
, το οποίο είναι ένα
μη διακεκομμένο διάστημα, δηλαδή \u00A0
.
- "\t \n \r \f \b \" \\ \/ \_"
- "\u00A9"
Υπάρχουν και άλλες περιπτώσεις όπου πρέπει να περικλείετε συμβολοσειρές σε εισαγωγικά:
- αρχίζουν ή τελειώνουν με κενά
- μοιάζουν με αριθμούς, booleans ή null
- Ο NEON θα τα καταλάβαινε ως ημερομηνίες
Συμβολοσειρές πολλών γραμμών
Μια συμβολοσειρά πολλαπλών γραμμών αρχίζει και τελειώνει με τριπλό εισαγωγικό σε ξεχωριστές γραμμές. Η εσοχή της πρώτης γραμμής αγνοείται για όλες τις γραμμές:
'''
first line
second line
third line
'''
Στην PHP θα γράφαμε το ίδιο ως εξής:
"first line\n\tsecond line\nthird line" // PHP
Οι ακολουθίες διαφυγής λειτουργούν μόνο για συμβολοσειρές που περικλείονται σε διπλά εισαγωγικά αντί για απόστροφα:
"""
Copyright \u00A9
"""
Αριθμοί
Ο NEON κατανοεί αριθμούς γραμμένους στη λεγόμενη επιστημονική σημειογραφία, καθώς και αριθμούς σε δυαδικό, οκταδικό και δεκαεξαδικό σύστημα:
- 12 # έναν ακέραιο αριθμό
- 12.3 # μια κινητή μονάδα
- +1.2e-34 # έναν εκθετικό αριθμό
- 0b11010 # δυαδικός αριθμός
- 0o666 # οκταδικός αριθμός
- 0x7A # δεκαεξαδικός αριθμός
Μηδενικά
Το null μπορεί να εκφραστεί στο NEON με τη χρήση του null
ή με τον μη
προσδιορισμό τιμής. Επιτρέπονται επίσης παραλλαγές με κεφαλαίο πρώτο
γράμμα ή όλα τα κεφαλαία γράμματα.
a: null
b:
Booleans
Οι τιμές Boolean εκφράζονται στο 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 # ημερομηνία & ώρα & ζώνη ώρας
Οντότητες
Μια οντότητα είναι μια δομή που μοιάζει με κλήση συνάρτησης:
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]),
])
Εντός των παρενθέσεων, ισχύουν οι κανόνες για τον εν σειρά συμβολισμό που χρησιμοποιούνται για την αντιστοίχιση και τις ακολουθίες, οπότε μπορεί να χωριστεί σε πολλές γραμμές και δεν είναι απαραίτητο να προστεθούν κόμματα:
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
]
Είναι πιο ευανάγνωστα τα bullets;
php:
date.timezone: Europe/Prague
zlib.output_compression: true
database:
driver: mysql
username: root
password: beruska92
users:
- Dave
- Kryten
- Rimmer
Τι γίνεται με τα σχόλια;
# my web application config
php:
date.timezone: Europe/Prague
zlib.output_compression: true # χρήση gzip
database:
driver: mysql
username: root
password: beruska92
users:
- Dave
- Kryten
- Rimmer
Βρήκατε τη σύνταξη NEON!