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

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!

versiyon: 3.x