NEON Formatı
NEON, insan tarafından okunabilir yapılandırılmış bir veri formatıdır. Nette'de yapılandırma dosyaları için kullanılır. Ayrıca ayarlar, dil çevirileri vb. gibi yapılandırılmış veriler için de kullanılır. Deneyin.
NEON, Nette Object Notation'ın kısaltmasıdır. XML veya JSON'dan daha az karmaşık ve hantaldır, ancak benzer işlevler sunar. YAML'ye çok benzer. Ana avantajı, NEON'un DI servislerinin yapılandırılmasını çok seksi yapan sözde varlıklar'a sahip olmasıdır. Ve sekmelerle girintilemeye izin verir.
NEON, kullanımı kolay olacak şekilde sıfırdan oluşturulmuştur.
Entegrasyon
- NetBeans (yerleşik desteği vardır)
- PhpStorm (eklenti)
- Visual Studio Code (Nette Latte + Neon) veya Nette for VS Code)
- Sublime Text 3 (eklenti)
- Sublime Text 2 (eklenti)
- VIM (eklenti)
- Emacs (eklenti)
- Prism.js (entegre dil)
Sözdizimi
NEON'da yazılmış bir dosya genellikle bir dizi veya bir eşleme temsil eder.
Eşleme (Mapping)
Eşleme, anahtar-değer çiftleri kümesidir, PHP'de ilişkisel dizi denir. Her çift key: value
olarak yazılır,
:
işaretinden sonraki boşluk gereklidir. Değer herhangi bir şey olabilir: karakter dizisi, sayı, boolean, null,
dizi (sequence) veya başka bir eşleme.
street: 742 Evergreen Terrace
city: Springfield
country: USA
PHP'de aynı yapı şu şekilde yazılırdı:
[ // PHP
'street' => '742 Evergreen Terrace',
'city' => 'Springfield',
'country' => 'USA',
]
Bu gösterim blok gösterimi olarak adlandırılır, çünkü tüm öğeler ayrı bir satırdadır ve aynı girintiye sahiptir (bu durumda hiçbiri). NEON ayrıca, parantez içine alınmış, girintinin rol oynamadığı ve tek tek öğelerin ayırıcısının virgül veya yeni satır olduğu eşlemelerin satır içi temsilini de destekler:
{street: 742 Evergreen Terrace, city: Springfield, country: USA}
Aynı şey birden çok satırda yazılmıştır (girintinin önemi yoktur):
{
street: 742 Evergreen Terrace
city: Springfield, country: USA
}
:
yerine alternatif olarak hem blok hem de satır içi gösterimde =
kullanılabilir:
{street=742 Evergreen Terrace, city=Springfield, country=USA}
Diziler (Sequences)
Diziler PHP'de indekslenmiş dizilerdir. Tire -
ile başlayıp boşlukla devam eden satırlar olarak yazılırlar.
Değer yine herhangi bir şey olabilir: karakter dizisi, sayı, boolean, null, dizi veya başka bir eşleme.
- Cat
- Dog
- Goldfish
PHP'de aynı yapı şu şekilde yazılırdı:
[ // PHP
'Cat',
'Dog',
'Goldfish',
]
Bu gösterim blok gösterimi olarak adlandırılır, çünkü tüm öğeler ayrı bir satırdadır ve aynı girintiye sahiptir (bu durumda hiçbiri). NEON ayrıca, parantez içine alınmış, girintinin rol oynamadığı ve tek tek öğelerin ayırıcısının virgül veya yeni satır olduğu dizilerin satır içi temsilini de destekler:
[Cat, Dog, Goldfish]
Aynı şey birden çok satırda yazılmıştır (girintinin önemi yoktur):
[
Cat, Dog
Goldfish
]
Satır içi gösterimde girintili madde işaretleri kullanılamaz.
Kombinasyonlar
Eşlemelerin ve dizilerin değerleri başka eşlemeler ve diziler olabilir. Ana rolü girinti seviyesi oynar. Aşağıdaki
örnekte, dizi öğelerini belirtmek için kullanılan tire işareti, pets
anahtarından daha büyük bir girintiye
sahiptir, bu nedenle öğeler ilk satırın değeri haline gelir:
pets:
- Cat
- Dog
cars:
- Volvo
- Skoda
PHP'de aynı yapı şu şekilde yazılırdı:
[ // PHP
'pets' => [
'Cat',
'Dog',
],
'cars' => [
'Volvo',
'Skoda',
],
]
Blok ve satır içi gösterimi birleştirmek mümkündür:
pets: [Cat, Dog]
cars: [
Volvo,
Skoda,
]
Satır içi gösterim içinde artık blok gösterimi 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 tersini deneyelim ve eşlemeler içeren bir dizi oluşturalım:
-
name: John
age: 35
-
name: Peter
age: 28
Madde işaretlerinin ayrı satırlarda olması gerekmez, şu şekilde de yerleştirilebilirler:
- name: John
age: 35
- name: Peter
age: 28
Anahtarları boşluklarla bir sütuna hizalamak veya sekme kullanmak size kalmış.
PHP'de hem eşlemeler hem de diziler için aynı yapı, yani dizi kullanıldığından, her ikisi de birleştirilebilir. Girinti bu sefer aynıdır:
- Cat
street: 742 Evergreen Terrace
- Goldfish
PHP'de aynı yapı şu şekilde yazılırdı:
[ // PHP
'Cat',
'street' => '742 Evergreen Terrace',
'Goldfish',
]
Karakter Dizileri (Strings)
NEON'daki karakter dizileri tek veya çift tırnak içine alınabilir. Ancak gördüğünüz gibi, tırnak işaretleri olmadan da olabilirler.
- NEON'da tırnak işareti olmayan karakter dizisi
- 'NEON'da tek tırnak işaretli karakter dizisi'
- "NEON'da çift tırnak işaretli karakter dizisi"
Bir karakter dizisi # " ' , : = - [ ] { } ( )
karakterlerini içeriyorsa, bunlar NEON sözdizimi ile
karıştırılabileceğinden tırnak içine alınmalıdır. Tek tırnak işaretleri kullanmanızı öneririz, çünkü bunlarda
kaçış kullanılmaz. Böyle bir karakter dizisinde tırnak işareti yazmanız gerekiyorsa, çiftleyin:
'Tek tırnak işaretli karakter dizisi içinde tırnak işareti '''
Çift tırnak işaretleri, ters eğik çizgiler \
kullanarak özel karakterleri yazmak için kaçış dizilerini
kullanmanıza olanak tanır. JSON formatındaki tüm kaçış dizileri desteklenir ve ek olarak \_
, yani bölünemez
boşluk, yani \u00A0
desteklenir.
- "\t \n \r \f \b \" \\ \/ \_"
- "\u00A9"
Karakter dizilerini tırnak içine almanız gereken başka durumlar da vardır:
- boşluklarla başlar veya biterler
- sayılar, booleanlar veya null gibi görünürler
- NEON onları tarih olarak anlardı
Çok Satırlı Karakter Dizileri
Çok satırlı bir karakter dizisi, ayrı satırlarda üçlü tırnak işaretiyle başlar ve biter. İlk satırın girintisi tüm satırlar için yok sayılır:
'''
ilk satır
ikinci satır
üçüncü satır
'''
PHP'de aynı şeyi şu şekilde yazardık:
"ilk satır\n\tikinci satır\nüçüncü satır" // PHP
Kaçış dizileri yalnızca tırnak yerine çift tırnak içine alınmış karakter dizilerinde çalışır:
"""
Telif Hakkı \u00A9
"""
Sayılar
NEON, bilimsel gösterimde yazılmış sayıları ve ayrıca ikili, sekizlik ve onaltılık tabandaki sayıları anlar:
- 12 # tamsayı
- 12.3 # float
- +1.2e-34 # üstel sayı
- 0b11010 # ikili sayı
- 0o666 # sekizlik sayı
- 0x7A # onaltılık sayı
Null Değerler
Null, NEON'da null
kullanılarak veya değer belirtmeyerek ifade edilebilir. İlk harfi büyük veya tüm harfleri
büyük olan varyantlara da izin verilir.
a: null
b:
Boolean Değerler
Mantıksal değerler NEON'da true
/ false
veya yes
/ no
kullanılarak ifade
edilir. İlk harfi büyük veya tüm harfleri büyük olan varyantlara da izin verilir.
[true, TRUE, True, false, yes, no]
Tarih
NEON, tarihleri ifade etmek için aşağıdaki formatları kullanır ve bunları otomatik olarak DateTimeImmutable
nesnelerine dönüştürür:
- 2016-06-03 # tarih
- 2016-06-03 19:00:00 # tarih & saat
- 2016-06-03 19:00:00.1234 # tarih & mikrosaniye
- 2016-06-03 19:00:00 +0200 # tarih & saat & bölge
- 2016-06-03 19:00:00 +02:00 # tarih & saat & bölge
Varlıklar (Entities)
Varlık, bir fonksiyon çağrısını andıran bir yapıdır:
Column(type: int, nulls: yes)
PHP'de 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 şu şekilde 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]),
])
Parantez içinde, eşlemeler ve diziler için kullanılan satır içi gösterim kuralları geçerlidir, yani birden çok satırlı olabilir ve o zaman virgül belirtmek gerekli değildir:
Column(
type: int
nulls: yes
)
Yorumlar
Yorumlar #
karakteriyle 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 vs JSON
JSON, NEON'un bir alt kümesidir. Bu nedenle her JSON, NEON olarak ayrıştırılabilir:
{
"php": {
"date.timezone": "Europe\/Prague",
"zlib.output_compression": true
},
"database": {
"driver": "mysql",
"username": "root",
"password": "beruska92"
},
"users": [
"Dave", "Kryten", "Rimmer"
]
}
Ya tırnak işaretlerini çıkarsaydık?
{
php: {
date.timezone: Europe/Prague,
zlib.output_compression: true
},
database: {
driver: mysql,
username: root,
password: beruska92
},
users: [
Dave, Kryten, Rimmer
]
}
Ve süslü parantezler ve virgüller?
php:
date.timezone: Europe/Prague
zlib.output_compression: true
database:
driver: mysql
username: root
password: beruska92
users: [
Dave, Kryten, Rimmer
]
Madde işaretli listeler daha okunaklı değil mi?
php:
date.timezone: Europe/Prague
zlib.output_compression: true
database:
driver: mysql
username: root
password: beruska92
users:
- Dave
- Kryten
- Rimmer
Yorum 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: beruska92
users:
- Dave
- Kryten
- Rimmer
Yaşasın, şimdi NEON sözdizimini biliyorsunuz!