NEON Biçimi
NEON, insan tarafından okunabilen, yapılandırılmış bir veri biçimidir. Nette'de yapılandırma dosyaları için kullanılır. Ayrıca ayarlar, dil çevirileri vb. yapılandırılmış veriler için de kullanılır. Onu sandbox'ta deneyin.
NEON, Nette Object Notation anlamına gelir. XML ya da JSON'dan daha az karmaşık ve daha az hantaldır, ama benzer yetenekler sunar. YAML'ye çok benzer. Ana avantajı, NEON'un Varlıklar denen şeye sahip olmasıdır; DI servislerinin yapılandırması bu sayede bu kadar seksidir. Ve girinti için sekmelere izin verir.
NEON, kullanımı kolay olacak biçimde en baştan kurulmuştur.
Entegrasyon
- NetBeans (yerleşik desteği var)
- PhpStorm (eklenti)
- Visual Studio Code (Nette Latte + Neon ya da Nette for VS Code)
- Sublime Text 3 (eklenti)
- Sublime Text 2 (eklenti)
- VIM (eklenti)
- Emacs (eklenti)
- Prism.js (tümleşik dil)
Sözdizimi
NEON ile yazılmış bir dosya genellikle bir dizi ya da bir eşleme temsil eder.
Eşlemeler
Eşleme, anahtar-değer çiftlerinden oluşan bir kümedir; PHP'de ona ilişkisel dizi denirdi. Her çift
key: value biçiminde yazılır, : işaretinden sonra bir boşluk gereklidir. Değer herhangi bir şey
olabilir: dize, sayı, mantıksal değer, null, dizi ya da başka bir eşleme.
street: 742 Evergreen Terrace
city: Springfield
country: USA
PHP'de aynı yapı şöyle yazılırdı:
[ // PHP
'street' => '742 Evergreen Terrace',
'city' => 'Springfield',
'country' => 'USA',
]
Bu yazıma blok yazımı denir, çünkü tüm öğeler ayrı satırlardadır ve aynı girintiye sahiptir (bu durumda hiç girinti yok). NEON, eşleme için satır içi bir gösterimi de destekler; bu, parantezlerle çevrilir, girinti hiçbir rol oynamaz ve öğelerin ayırıcısı ya virgül ya da yeni satırdır:
{street: 742 Evergreen Terrace, city: Springfield, country: USA}
Aynısı birden çok satırda yazılmış hâliyle (girinti önemli değil):
{
street: 742 Evergreen Terrace
city: Springfield, country: USA
}
Hem blok hem satır içi yazımda, : yerine = de kullanılabilir:
{street=742 Evergreen Terrace, city=Springfield, country=USA}
Diziler
Diziler, PHP'deki indeksli dizilerdir. Bir tire - ve ardından bir boşlukla başlayan satırlar olarak
yazılırlar. Yine değer herhangi bir şey olabilir: dize, sayı, mantıksal değer, null, dizi ya da başka bir eşleme.
- Cat
- Dog
- Goldfish
PHP'de aynı yapı şöyle yazılırdı:
[ // PHP
'Cat',
'Dog',
'Goldfish',
]
Bu yazıma blok yazımı denir, çünkü tüm öğeler ayrı satırlardadır ve aynı girintiye sahiptir (bu durumda hiç girinti yok). NEON, diziler için satır içi bir gösterimi de destekler; bu, köşeli parantezlerle çevrilir, girinti hiçbir rol oynamaz ve öğelerin ayırıcısı ya virgül ya da yeni satırdır:
[Cat, Dog, Goldfish]
Aynısı birden çok satırda yazılmış hâliyle (girinti önemli değil):
[
Cat, Dog
Goldfish
]
Satır içi gösterimde tireler (madde imleri) kullanılamaz.
Bileşimler
Eşlemelerin ve dizilerin değerleri başka eşlemeler ve diziler olabilir. Girinti düzeyi büyük bir rol oynar. Aşağıdaki
örnekte, dizi öğelerini göstermek için kullanılan tire pets anahtarından daha çok girintilidir, dolayısıyla
öğeler ilk satırın değeri olur:
pets:
- Cat
- Dog
cars:
- Volvo
- Skoda
PHP'de aynı yapı şöyle yazılırdı:
[ // PHP
'pets' => [
'Cat',
'Dog',
],
'cars' => [
'Volvo',
'Skoda',
],
]
Blok ve satır içi yazımı birleştirmek mümkündür:
pets: [Cat, Dog]
cars: [
Volvo,
Skoda,
]
Satır içi bir yazımın içinde blok yazımı kullanılamaz; bu çalışmaz:
item: [
pets:
- Cat # BU MÜMKÜN DEĞİL!!!
- Dog
]
Önceki durumda, öğeleri dizi olan bir eşleme yazdık. Şimdi bunu tersine deneyelim ve eşlemeler içeren bir dizi oluşturalım:
-
name: John
age: 35
-
name: Peter
age: 28
Tirelerin ayrı satırlarda olması gerekmez; şöyle de yerleştirilebilirler:
- name: John
age: 35
- name: Peter
age: 28
Anahtarları boşluklarla bir sütunda hizalamak ya da sekme karakteri kullanmak size kalmış.
PHP eşlemeler ve diziler için aynı yapıyı (yani dizileri) kullandığından, ikisi birleştirilebilir. Bu kez girinti aynıdır:
- Cat
street: 742 Evergreen Terrace
- Goldfish
PHP'de aynı yapı şöyle yazılırdı:
[ // PHP
'Cat',
'street' => '742 Evergreen Terrace',
'Goldfish',
]
Dizeler
NEON'daki dizeler tek ya da çift tırnak içine alınabilir. Ama gördüğünüz gibi tırnaksız da olabilirler.
- NEON icinde tirnaksiz bir dize
- 'NEON icinde tek tirnakli bir dize'
- "NEON icinde cift tirnakli bir dize"
Dize, NEON sözdizimiyle karıştırılabilecek ` # " ' ` , : = - [ ] { } ( ) ` karakterlerini içeriyorsa,
tırnak içine alınmalıdır. Kaçış kullanmadıkları için tek tırnak kullanmanızı öneririz. Böyle bir dizeye tırnak
karakteri eklemeniz gerekiyorsa, onu ikiye katlayın:
'Tek tirnakli bir dizenin icinde '' tek tirnak'
Çift tırnaklar, özel karakterleri ters eğik çizgi \ kullanarak yazmak için kaçış dizileri kullanmanızı
sağlar. JSON biçiminin desteklediği tüm kaçış dizileri desteklenir, ayrıca bölünemez boşluğu yani \u00A0
karakterini temsil eden \_ de desteklenir.
- "\t \n \r \f \b \" \\ \/ \_"
- "\u00A9"
Dizeleri tırnak içine almanız gereken başka durumlar da vardır:
- boşlukla başlıyor ya da bitiyorlarsa
- sayı, mantıksal değer ya da null gibi görünüyorlarsa
- NEON onları tarih olarak yorumlayacaksa
Çok Satırlı Dizeler
Çok satırlı bir dize, ayrı satırlarda üçlü tırnakla başlar ve biter. İlk satırın girintisi tüm satırlar için yok sayılır:
'''
birinci satır
ikinci satır
üçüncü satır
'''
PHP'de aynısını şöyle yazardık:
"birinci satır\n\tikinci satır\nüçüncü satır" // PHP
Kaçış dizileri yalnızca kesme işareti yerine çift tırnak içine alınmış dizeler için çalışır:
"""
Copyright \u00A9
"""
Sayılar
NEON, bilimsel gösterimle yazılmış sayıları ve ayrıca ikilik, sekizlik ve on altılık tabandaki sayıları anlar:
- 12 # tam sayı
- 12.3 # kayan noktalı sayı
- +1.2e-34 # üstel sayı
- 0b11010 # ikilik sayı
- 0o666 # sekizlik sayı
- 0x7A # on altılık sayı
Null Değerler
NEON'da null, null kullanılarak ya da değer atlanarak ifade edilebilir. İlk harfi büyük olan ya da tümü
büyük harfli çeşitlere de izin verilir (Null, NULL).
a: null
b:
Mantıksal Değerler
NEON'da mantıksal değerler true / false ya da yes / no kullanılarak
ifade edilir. İlk harfi büyük olan ya da tümü büyük harfli çeşitlere de izin verilir (True,
TRUE, False, FALSE, Yes, YES, No,
NO).
[true, TRUE, True, false, yes, no]
Tarihler
NEON, tarihleri ifade etmek için şu biçimleri kullanır ve onları otomatik olarak DateTimeImmutable
nesnelerine dönüştürür:
- 2016-06-03 # tarih
- 2016-06-03 19:00:00 # tarih ve saat
- 2016-06-03 19:00:00.1234 # tarih ve mikrosaniye
- 2016-06-03 19:00:00 +0200 # tarih, saat ve saat dilimi
- 2016-06-03 19:00:00 +02:00 # tarih, saat ve saat dilimi
Varlıklar
Varlık (entity), bir fonksiyon çağrısını andıran bir yapıdır:
Column(type: int, nulls: yes)
PHP'de bir Nette\Neon\Entity nesnesi olarak ayrıştırılır:
// PHP
new Nette\Neon\Entity('Column', ['type' => 'int', 'nulls' => true])
Varlıklar zincirlenebilir de:
Column(type: int, nulls: yes) Field(id: 1)
Bu PHP'de şöyle ayrıştırılır:
// 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]),
])
Parantezlerin içinde, eşlemeler ve diziler için kullanılan satır içi yazımın kuralları geçerlidir, dolayısıyla çok satırlı olabilir ve virgüller gerekmez:
Column(
type: int
nulls: yes
)
Yorumlar
Yorumlar # ile başlar ve sağdaki tüm sonraki karakterler yok sayılır:
# bu satır yorumlayıcı tarafından yok sayılacak
street: 742 Evergreen Terrace
city: Springfield # bu da yok sayılır
country: USA
NEON ile JSON Karşılaştırması
JSON, NEON'un bir alt kümesidir. Bu yüzden herhangi bir JSON, NEON olarak ayrıştırılabilir:
{
"php": {
"date.timezone": "Europe\/Prague",
"zlib.output_compression": true
},
"database": {
"driver": "mysql",
"username": "root",
"password": "password123"
},
"users": [
"Dave", "Kryten", "Rimmer"
]
}
Peki tırnakları atlasaydık?
{
php: {
date.timezone: Europe/Prague,
zlib.output_compression: true
},
database: {
driver: mysql,
username: root,
password: password123
},
users: [
Dave, Kryten, Rimmer
]
}
Peki süslü parantezler ve virgüller?
php:
date.timezone: Europe/Prague
zlib.output_compression: true
database:
driver: mysql
username: root
password: password123
users: [
Dave, Kryten, Rimmer
]
Madde imli listeler daha okunur değil mi?
php:
date.timezone: Europe/Prague
zlib.output_compression: true
database:
driver: mysql
username: root
password: password123
users:
- Dave
- Kryten
- Rimmer
Yorumlar da ekleyelim mi?
# web uygulamamın yapılandırması
php:
date.timezone: Europe/Prague
zlib.output_compression: true # gzip kullan
database:
driver: mysql
username: root
password: password123
users:
- Dave
- Kryten
- Rimmer
Yaşasın, artık NEON sözdizimini biliyorsunuz!