Format NEON

NEON est un format de données structuré lisible par l'homme. Dans Nette, il est utilisé pour les fichiers de configuration. Il est également utilisé pour les données structurées telles que les paramètres, les traductions linguistiques, etc. Essayez-le dans le bac à sable.

NEON signifie Nette Object Notation. Cette notation est moins complexe et moins gracieuse que XML ou JSON, mais elle offre des possibilités similaires. Il est très similaire à YAML. Le principal avantage est que NEON possède ce que l'on appelle des entités, grâce auxquelles la configuration des services DI est si sexy. Il autorise également les tabulations pour l'indentation.

NEON a été conçu dès le départ pour être simple à utiliser.

Intégration

Syntaxe

Un fichier écrit en NEON se compose généralement d'une séquence ou d'un mappage.

Mappages

Le mappage est un ensemble de paires clé-valeur, en PHP on l'appellerait un tableau associatif. Chaque paire est écrite comme key: value, un espace après : est nécessaire. La valeur peut être n'importe quoi : chaîne de caractères, nombre, booléen, null, séquence, ou tout autre mappage.

street: 742 Evergreen Terrace
city: Springfield
country: USA

En PHP, la même structure serait écrite comme suit :

[ // PHP
	'street' => '742 Evergreen Terrace',
	'city' => 'Springfield',
	'country' => 'USA',
]

Cette notation est appelée notation en bloc car tous les éléments sont sur une ligne séparée et ont la même indentation (aucune dans ce cas). NEON prend également en charge la représentation en ligne pour la cartographie, qui est placée entre parenthèses, l'indentation ne joue aucun rôle, et le séparateur de chaque élément est soit une virgule, soit un saut de ligne :

{street: 742 Evergreen Terrace, city: Springfield, country: USA}

Il s'agit de la même chose écrite sur plusieurs lignes (l'indentation ne joue aucun rôle) :

{
	street: 742 Evergreen Terrace
		city: Springfield, country: USA
}

Alternativement, = peut être utilisé à la place de : dans la notation en bloc et en ligne :

{street=742 Evergreen Terrace, city=Springfield, country=USA}

Séquences

Les séquences sont des tableaux indexés en PHP. Elles sont écrites comme des lignes commençant par le trait d'union - suivi d'un espace. Encore une fois, la valeur peut être n'importe quoi : chaîne de caractères, nombre, booléen, null, séquence, ou autre correspondance.

- Cat
- Dog
- Goldfish

En PHP, la même structure serait écrite comme suit :

[ // PHP
	'Cat',
	'Dog',
	'Goldfish',
]

Cette notation est appelée notation en bloc car tous les éléments sont sur une ligne séparée et ont la même indentation (aucune dans ce cas). NEON prend également en charge la représentation en ligne des séquences, qui sont placées entre parenthèses, l'indentation ne joue aucun rôle, et le séparateur de chaque élément est soit une virgule, soit un saut de ligne :

[Cat, Dog, Goldfish]

Il s'agit de la même chose écrite sur plusieurs lignes (l'indentation ne joue aucun rôle) :

[
	Cat, Dog
		Goldfish
]

Les traits d'union ne peuvent pas être utilisés dans une représentation en ligne.

Combinaison

Les valeurs des mappings et des séquences peuvent être d'autres mappings et séquences. Le niveau d'indentation joue un rôle important. Dans l'exemple suivant, le trait d'union utilisé pour indiquer les éléments de la séquence a une indentation supérieure à celle de la touche pets, de sorte que les éléments deviennent la valeur de la première ligne :

pets:
   - Cat
   - Dog
cars:
   - Volvo
   - Skoda

En PHP, la même structure s'écrirait comme suit :

[ // PHP
	'pets' => [
		'Cat',
		'Dog',
	],
	'cars' => [
		'Volvo',
		'Skoda',
	],
]

Il est possible de combiner la notation en bloc et en ligne :

pets: [Cat, Dog]
cars: [
	Volvo,
	Skoda,
]

La notation en bloc ne peut plus être utilisée à l'intérieur d'une notation en ligne, cela ne fonctionne pas :

item: [
	pets:
	 - Cat     # THIS IS NOT POSSIBLE!!!
	 - Dog
]

Dans le cas précédent, nous avons écrit un mapping dont les éléments étaient des séquences. Essayons maintenant l'inverse et créons une séquence contenant des mappings :

-
	name: John
	age: 35
-
	name: Peter
	age: 28

Il n'est pas nécessaire que les puces soient sur des lignes séparées ; elles peuvent également être placées de cette manière :

- name: John
  age: 35
- name: Peter
  age: 28

Il vous appartient d'aligner les clés dans une colonne en utilisant des espaces ou une tabulation.

Parce que PHP utilise la même structure pour le mapping et les séquences, c'est-à-dire les tableaux, les deux peuvent être fusionnés. L'indentation est la même cette fois :

- Cat
street: 742 Evergreen Terrace
- Goldfish

En PHP, la même structure s'écrirait comme suit :

[ // PHP
	'Cat',
	'street' => '742 Evergreen Terrace',
	'Goldfish',
]

Chaînes de caractères

Les chaînes de caractères dans NEON peuvent être entourées de guillemets simples ou doubles. Mais comme vous pouvez le voir, elles peuvent aussi être sans guillemets.

- A unquoted string in NEON
- 'A singled-quoted string in NEON'
- "A double-quoted string in NEON"

Si la chaîne contient des caractères # " ' , : = - [ ] { } ( ) qui peuvent être confondus avec la syntaxe NEON, elle doit être placée entre guillemets. Nous vous recommandons d'utiliser des guillemets simples car ils n'utilisent pas d'échappement. Si vous devez placer un guillemet dans une telle chaîne, doublez-le :

'A single quote '' inside a single-quoted string'

Les guillemets doubles vous permettent d'utiliser des séquences d'échappement pour écrire des caractères spéciaux à l'aide de barres obliques inversées \. All escape sequences as in the JSON format are supported, plus \_, qui est un espace insécable, c'est-à-dire \u00A0.

- "\t \n \r \f \b \" \\ \/ \_"
- "\u00A9"

Il existe d'autres cas où vous devez mettre des chaînes de caractères entre guillemets :

  • elles commencent ou se terminent par des espaces
  • ressemblent à des nombres, des booléens ou des nullités
  • NEON les comprendrait comme des dates

Chaînes de caractères multilignes

Une chaîne de caractères multiligne commence et se termine par un guillemet triple sur des lignes séparées. L'indentation de la première ligne est ignorée pour toutes les lignes :

'''
	first line
		second line
	third line
	'''

En PHP, nous écririons la même chose que :

"first line\n\tsecond line\nthird line" // PHP

Les séquences d'échappement ne fonctionnent que pour les chaînes de caractères entourées de guillemets doubles au lieu d'apostrophes :

"""
	Copyright \u00A9
"""

Chiffres

NEON comprend les nombres écrits en notation dite scientifique ainsi que les nombres en binaire, octal et hexadécimal :

- 12 # un nombre entier
- 12.3 # un flottant
- +1.2e-34 # un nombre exponentiel

- 0b11010 # nombre binaire
- 0o666 # nombre octal
- 0x7A # nombre hexa

Nulls

Les nuls peuvent être exprimés dans NEON en utilisant null ou en ne spécifiant pas de valeur. Les variantes avec une première majuscule ou toutes les lettres majuscules sont également autorisées.

a: null
b:

Booléens

Les valeurs booléennes sont exprimées dans NEON en utilisant true / false ou yes / no. Les variantes avec une première majuscule ou toutes les lettres majuscules sont également autorisées.

[true, TRUE, True, false, yes, no]

Dates

NEON utilise les formats suivants pour exprimer les données et les convertit automatiquement en objets DateTimeImmutable:

- 2016-06-03 # date
- 2016-06-03 19:00:00 # date et heure
- 2016-06-03 19:00:00.1234 # date & microtime
- 2016-06-03 19:00:00 +0200 # date & heure & fuseau horaire
- 2016-06-03 19:00:00 +02:00 # date & heure & fuseau horaire

Entités

Une entité est une structure qui ressemble à un appel de fonction :

Column(type: int, nulls: yes)

En PHP, elle est analysée comme un objet Nette\Neon\Entity:

// PHP
new Nette\Neon\Entity('Column', ['type' => 'int', 'nulls' => true])

Les entités peuvent également être enchaînées :

Column(type: int, nulls: yes) Field(id: 1)

Ce qui est analysé en PHP comme suit :

// 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]),
])

À l'intérieur des parenthèses, les règles de notation en ligne utilisées pour le mappage et les séquences s'appliquent, il peut donc être divisé en plusieurs lignes et il n'est pas nécessaire d'ajouter des virgules :

Column(
	type: int
	nulls: yes
)

Commentaires

Les commentaires commencent par # et tous les caractères suivants à droite sont ignorés :

# cette ligne sera ignorée par l'interpréteur
street: 742 Evergreen Terrace
city: Springfield # cette ligne est également ignorée
country: USA

NEON Versus JSON

JSON est un sous-ensemble de NEON. Chaque JSON peut donc être analysé comme du NEON :

{
"php": {
	"date.timezone": "Europe\/Prague",
	"zlib.output_compression": true
},
"database": {
	"driver": "mysql",
	"username": "root",
	"password": "beruska92"
},
"users": [
	"Dave", "Kryten", "Rimmer"
]
}

Et si nous pouvions omettre les guillemets ?

{
php: {
	date.timezone: Europe/Prague,
	zlib.output_compression: true
},
database: {
	driver: mysql,
	username: root,
	password: beruska92
},
users: [
	Dave, Kryten, Rimmer
]
}

Pourquoi pas des accolades et des virgules ?

php:
	date.timezone: Europe/Prague
	zlib.output_compression: true

database:
	driver: mysql
	username: root
	password: beruska92

users: [
	Dave, Kryten, Rimmer
]

Les puces sont-elles plus lisibles ?

php:
	date.timezone: Europe/Prague
	zlib.output_compression: true

database:
	driver: mysql
	username: root
	password: beruska92

users:
	- Dave
	- Kryten
	- Rimmer

Et les commentaires ?

# la configuration de mon application web

php:
	date.timezone: Europe/Prague
	zlib.output_compression: true  # use gzip

database:
	driver: mysql
	username: root
	password: beruska92

users:
	- Dave
	- Kryten
	- Rimmer

Vous avez trouvé la syntaxe NEON !

version: 3.4