Μορφή NEON

Το NEON είναι μια μορφή δομημένων δεδομένων με δυνατότητα ανάγνωσης από τον άνθρωπο. Στο Nette, χρησιμοποιείται για αρχεία διαμόρφωσης. Χρησιμοποιείται επίσης για δομημένα δεδομένα όπως ρυθμίσεις, μεταφράσεις γλωσσών κ.λπ. Δοκιμάστε το στο sandbox.

NEON σημαίνει Nette Object Notation. Είναι λιγότερο πολύπλοκο και δυσκίνητο από την XML ή το JSON, αλλά παρέχει παρόμοιες δυνατότητες. Μοιάζει πολύ με την YAML. Το κύριο πλεονέκτημα είναι ότι το NEON διαθέτει τις λεγόμενες οντότητες, χάρη στις οποίες η διαμόρφωση των υπηρεσιών DI είναι τόσο σέξι. Και επιτρέπει tabs για εσοχή.

Το NEON έχει κατασκευαστεί από την αρχή για να είναι απλό στη χρήση.

Ενσωμάτωση

Σύνταξη

Ένα αρχείο γραμμένο σε 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!

έκδοση: 3.4