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

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!

versiyon: 3.4