Formato NEON
NEON é um formato de dados estruturados legível por humanos. No Nette, é usado para arquivos de configuração. Também é usado para dados estruturados, como configurações, traduções de idiomas, etc. Experimente.
NEON é a abreviação de Nette Object Notation. É menos complexo e desajeitado que XML ou JSON, mas fornece recursos semelhantes. É muito semelhante ao YAML. A principal vantagem é que o NEON possui as chamadas entidades, graças às quais a configuração dos serviços de DI é tão sexy. E permite indentação com tabulações.
O NEON foi construído desde o início para ser fácil de usar.
Integração
- NetBeans (possui suporte integrado)
- PhpStorm (plugin)
- Visual Studio Code (Nette Latte + Neon) ou Nette for VS Code)
- Sublime Text 3 (plugin)
- Sublime Text 2 (plugin)
- VIM (plugin)
- Emacs (plugin)
- Prism.js (linguagem integrada)
Sintaxe
Um arquivo escrito em NEON geralmente representa um array ou um mapeamento.
Mapeamento
Um mapeamento é um conjunto de pares chave-valor, em PHP seria chamado de array associativo. Cada par é escrito como
key: value
, o espaço após :
é necessário. O valor pode ser qualquer coisa: string, número,
booleano, null, sequência ou outro mapeamento.
street: 742 Evergreen Terrace
city: Springfield
country: USA
Em PHP, a mesma estrutura seria escrita como:
[ // PHP
'street' => '742 Evergreen Terrace',
'city' => 'Springfield',
'country' => 'USA',
]
Essa notação é chamada de bloco, porque todos os itens estão em linhas separadas e têm a mesma indentação (neste caso, nenhuma). O NEON também suporta uma representação inline de mapeamento, que é fechada entre chaves, a indentação não desempenha nenhum papel e o separador dos elementos individuais é uma vírgula ou uma nova linha:
{street: 742 Evergreen Terrace, city: Springfield, country: USA}
O mesmo escrito em várias linhas (a indentação não importa):
{
street: 742 Evergreen Terrace
city: Springfield, country: USA
}
Em vez de :
, também pode ser usado =
tanto na notação de bloco quanto na inline:
{street=742 Evergreen Terrace, city=Springfield, country=USA}
Sequência
Sequências são arrays indexados em PHP. São escritas como linhas começando com um hífen -
seguido por um
espaço. O valor novamente pode ser qualquer coisa: string, número, booleano, null, sequência ou outro mapeamento.
- Cat
- Dog
- Goldfish
Em PHP, a mesma estrutura seria escrita como:
[ // PHP
'Cat',
'Dog',
'Goldfish',
]
Essa notação é chamada de bloco, porque todos os itens estão em linhas separadas e têm a mesma indentação (neste caso, nenhuma). O NEON também suporta uma representação inline de sequência, que é fechada entre colchetes, a indentação não desempenha nenhum papel e o separador dos elementos individuais é uma vírgula ou uma nova linha:
[Cat, Dog, Goldfish]
O mesmo escrito em várias linhas (a indentação não importa):
[
Cat, Dog
Goldfish
]
Na representação inline, não é possível usar marcadores de indentação.
Combinações
Os valores de mapeamentos e sequências podem ser outros mapeamentos e sequências. O nível de indentação desempenha
o papel principal. No exemplo a seguir, o hífen usado para marcar os itens da sequência tem uma indentação maior que a chave
pets
, então os itens se tornam o valor da primeira linha:
pets:
- Cat
- Dog
cars:
- Volvo
- Skoda
Em PHP, a mesma estrutura seria escrita como:
[ // PHP
'pets' => [
'Cat',
'Dog',
],
'cars' => [
'Volvo',
'Skoda',
],
]
É possível combinar a notação de bloco e inline:
pets: [Cat, Dog]
cars: [
Volvo,
Skoda,
]
Dentro da notação inline, não é mais possível usar a notação de bloco, isso não funciona:
item: [
pets:
- Cat # ISTO NÃO É POSSÍVEL!!!
- Dog
]
No caso anterior, escrevemos um mapeamento cujos elementos eram sequências, agora tentaremos o contrário e criaremos uma sequência contendo mapeamentos:
-
name: John
age: 35
-
name: Peter
age: 28
Não é necessário que os marcadores estejam em linhas separadas, eles também podem ser colocados desta forma:
- name: John
age: 35
- name: Peter
age: 28
Depende de você se alinha as chaves em uma coluna usando espaços ou usa uma tabulação.
Como em PHP a mesma estrutura, ou seja, array, é usada tanto para mapeamentos quanto para sequências, ambos podem ser mesclados. A indentação desta vez é a mesma:
- Cat
street: 742 Evergreen Terrace
- Goldfish
Em PHP, a mesma estrutura seria escrita como:
[ // PHP
'Cat',
'street' => '742 Evergreen Terrace',
'Goldfish',
]
Strings
Strings em NEON podem ser fechadas em aspas simples ou duplas. Mas, como você pode ver, elas também podem ficar sem aspas.
- String em NEON sem aspas
- 'String em NEON em aspas simples'
- "String em NEON em aspas duplas"
Se a string contiver os caracteres # " ' , : = - [ ] { } ( )
, que podem ser confundidos com a sintaxe NEON, ela
precisa ser fechada entre aspas. Recomendamos o uso de aspas simples, pois nelas não se usa escaping. Se você precisar escrever
uma aspa em tal string, duplique-a:
'Aspas '' dentro de uma string em aspas simples'
Aspas duplas permitem usar sequências de escape para escrever caracteres especiais usando barras invertidas \
.
Todas as sequências de escape como no formato JSON são suportadas, e adicionalmente \_
, que é um espaço
inseparável, ou seja, \u00A0
.
- "\t \n \r \f \b \" \\ \/ \_"
- "\u00A9"
Existem outros casos em que é necessário fechar strings entre aspas:
- começam ou terminam com espaços
- parecem números, booleanos ou null
- NEON as entenderia como datas
Strings Multilinha
Uma string multilinha começa e termina com aspas triplas em linhas separadas. A indentação da primeira linha é ignorada para todas as linhas:
'''
primeira linha
segunda linha
terceira linha
'''
Em PHP, escreveríamos o mesmo como:
"primeira linha\n\tsegunda linha\nterceira linha" // PHP
Sequências de escape funcionam apenas para strings fechadas em aspas duplas em vez de apóstrofos:
"""
Copyright \u00A9
"""
Números
NEON entende números escritos na chamada notação científica e também números nos sistemas binário, octal e hexadecimal:
- 12 # inteiro
- 12.3 # float
- +1.2e-34 # número exponencial
- 0b11010 # número binário
- 0o666 # número octal
- 0x7A # número hexadecimal
Nulos
Null pode ser expresso em NEON usando null
ou omitindo o valor. Variantes com a primeira letra maiúscula ou
todas as letras maiúsculas também são permitidas.
a: null
b:
Booleanos
Valores lógicos são expressos em NEON usando true
/ false
ou yes
/ no
.
Variantes com a primeira letra maiúscula ou todas as letras maiúsculas também são permitidas.
[true, TRUE, True, false, yes, no]
Datas
NEON usa os seguintes formatos para expressar datas e os converte automaticamente em objetos
DateTimeImmutable
:
- 2016-06-03 # data
- 2016-06-03 19:00:00 # data & hora
- 2016-06-03 19:00:00.1234 # data & microtempo
- 2016-06-03 19:00:00 +0200 # data & hora & zona
- 2016-06-03 19:00:00 +02:00 # data & hora & zona
Entidades
Uma entidade é uma estrutura que se assemelha a uma chamada de função:
Column(type: int, nulls: yes)
Em PHP, é analisado como um objeto Nette\Neon\Entity:
// PHP
new Nette\Neon\Entity('Column', ['type' => 'int', 'nulls' => true])
Entidades também podem ser encadeadas:
Column(type: int, nulls: yes) Field(id: 1)
O que é analisado em PHP desta forma:
// 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]),
])
Dentro dos parênteses, aplicam-se as regras para a notação inline usada para mapeamentos e sequências, ou seja, pode ser multilinha e, nesse caso, não é necessário usar vírgulas:
Column(
type: int
nulls: yes
)
Comentários
Comentários começam com o caractere #
e todos os caracteres seguintes à direita são ignorados:
# esta linha será ignorada pelo interpretador
street: 742 Evergreen Terrace
city: Springfield # isto também é ignorado
country: USA
Neon versus JSON
JSON é um subconjunto do NEON. Portanto, todo JSON pode ser analisado como NEON:
{
"php": {
"date.timezone": "Europe\/Prague",
"zlib.output_compression": true
},
"database": {
"driver": "mysql",
"username": "root",
"password": "beruska92"
},
"users": [
"Dave", "Kryten", "Rimmer"
]
}
E se omitirmos as aspas?
{
php: {
date.timezone: Europe/Prague,
zlib.output_compression: true
},
database: {
driver: mysql,
username: root,
password: beruska92
},
users: [
Dave, Kryten, Rimmer
]
}
E as chaves e vírgulas?
php:
date.timezone: Europe/Prague
zlib.output_compression: true
database:
driver: mysql
username: root
password: beruska92
users: [
Dave, Kryten, Rimmer
]
As listas com marcadores não são mais legíveis?
php:
date.timezone: Europe/Prague
zlib.output_compression: true
database:
driver: mysql
username: root
password: beruska92
users:
- Dave
- Kryten
- Rimmer
Adicionamos comentários?
# config da minha aplicação web
php:
date.timezone: Europe/Prague
zlib.output_compression: true # use gzip
database:
driver: mysql
username: root
password: beruska92
users:
- Dave
- Kryten
- Rimmer
Viva, agora você conhece a sintaxe do NEON!