NEON Formatı

NEON insan tarafından okunabilen yapılandırılmış bir veri formatıdır. Nette, 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. Sandbox üzerinde deneyin.

NEON, Nette Nesne Notasyonu anlamına gelir. XML veya JSON'dan daha az karmaşık ve hantaldır, ancak benzer yetenekler sağlar. YAML'ye çok benzemektedir. Ana avantajı, NEON'un DI hizmetlerinin yapılandırılmasının çok seksi olması sayesinde sözde varlıklara sahip olmasıdır. Ve girinti için sekmelere izin verir.

NEON, kullanımı basit olacak şekilde sıfırdan inşa edilmiştir.

Entegrasyon

Sözdizimi

NEON'da yazılmış bir dosya genellikle bir dizi veya eşlemeden oluşur.

Eşlemeler

Eşleme bir anahtar-değer çiftleri kümesidir, PHP'de buna ilişkisel dizi denir. Her çift key: value şeklinde yazılır, :'dan sonra bir boşluk bırakılması gerekir. Değer herhangi bir şey olabilir: dize, sayı, boolean, null, dizi veya başka bir eşleme.

street: 742 Evergreen Terrace
city: Springfield
country: USA

PHP'de aynı yapı şu şekilde yazılacaktır:

[ // PHP
	'street' => '742 Evergreen Terrace',
	'city' => 'Springfield',
	'country' => 'USA',
]

Bu gösterime blok gösterimi denir çünkü tüm öğeler ayrı bir satırdadır ve aynı girintiye sahiptir (bu durumda hiçbiri). NEON ayrıca parantez içine alınan, girintinin rol oynamadığı ve her bir öğenin ayırıcısının virgül veya satırsonu olduğu eşleme için satır içi gösterimi de destekler:

{street: 742 Evergreen Terrace, city: Springfield, country: USA}

Bu, birden fazla satırda yazılanın aynısıdır (girinti önemli değildir):

{
	street: 742 Evergreen Terrace
		city: Springfield, country: USA
}

Alternatif olarak, = yerine kullanılabilir : , hem blok hem de satır içi gösterimde kullanılabilir:

{street=742 Evergreen Terrace, city=Springfield, country=USA}

Diziler

Diziler PHP'de dizinlenmiş dizilerdir. Bunlar - tire işareti ve ardından bir boşluk ile başlayan satırlar olarak yazılır. Yine, değer herhangi bir şey olabilir: dize, sayı, boolean, null, dizi veya başka bir eşleme.

- Cat
- Dog
- Goldfish

PHP'de aynı yapı şu şekilde yazılacaktır:

[ // PHP
	'Cat',
	'Dog',
	'Goldfish',
]

Bu gösterime blok gösterimi denir çünkü tüm öğeler ayrı bir satırdadır ve aynı girintiye sahiptir (bu durumda hiçbiri). NEON ayrıca diziler için parantez içine alınmış satır içi gösterimi de destekler, girinti bir rol oynamaz ve her bir öğenin ayırıcısı virgül veya satırsonudur:

[Cat, Dog, Goldfish]

Bu, birden fazla satırda yazılanın aynısıdır (girinti önemli değildir):

[
	Cat, Dog
		Goldfish
]

Satır içi gösterimde kısa çizgiler kullanılamaz.

Kombinasyon

Eşlemelerin ve dizilerin değerleri başka eşlemeler ve diziler olabilir. Girinti seviyesi önemli bir rol oynar. Aşağıdaki örnekte, sıra öğelerini belirtmek için kullanılan kısa çizgi pets tuşundan 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ılacaktır:

[ // PHP
	'pets' => [
		'Cat',
		'Dog',
	],
	'cars' => [
		'Volvo',
		'Skoda',
	],
]

Blok ve satır içi gösterimleri birleştirmek mümkündür:

pets: [Cat, Dog]
cars: [
	Volvo,
	Skoda,
]

Blok gösterimi artık bir satır içi gösterimin içinde kullanılamaz, bu çalışmaz:

item: [
	pets:
	 - Cat     # THIS IS NOT POSSIBLE!!!
	 - Dog
]

Önceki durumda, elemanları diziler olan bir eşleme yazmıştık. Şimdi de tam tersini deneyelim ve eşlemeleri içeren bir dizi oluşturalım:

-
	name: John
	age: 35
-
	name: Peter
	age: 28

Madde işaretlerinin ayrı satırlarda olması gerekli değildir; bu şekilde de yerleştirilebilirler:

- name: John
  age: 35
- name: Peter
  age: 28

Bir sütundaki tuşları boşluk veya sekme kullanarak hizalayıp hizalamayacağınız size bağlıdır.

PHP eşleme ve diziler için aynı yapıyı, yani dizileri kullandığından, her ikisi de birleştirilebilir. Girintileme bu sefer aynıdır:

- Cat
street: 742 Evergreen Terrace
- Goldfish

PHP'de aynı yapı şu şekilde yazılacaktır:

[ // PHP
	'Cat',
	'street' => '742 Evergreen Terrace',
	'Goldfish',
]

Dizeler

NEON'daki dizeler tek veya çift tırnak içine alınabilir. Ancak görebileceğiniz gibi, tırnak işaretleri olmadan da olabilirler.

- A unquoted string in NEON
- 'A singled-quoted string in NEON'
- "A double-quoted string in NEON"

Dize karakter içeriyorsa # " ' , : = - [ ] { } ( ) NEON sözdizimi ile karıştırılabileceği için tırnak içine alınmalıdır. Kaçış kullanmadıkları için tek tırnak kullanmanızı öneririz. Böyle bir dizede bir tırnak işareti içine almanız gerekiyorsa, iki katına çıkarın:

'A single quote '' inside a single-quoted string'

Çift tırnaklar, ters eğik çizgileri kullanarak özel karakterler yazmak için kaçış dizilerini kullanmanıza olanak tanır \. All escape sequences as in the JSON format are supported, plus \_, bu boşluk bırakmayan bir boşluktur, yani \u00A0.

- "\t \n \r \f \b \" \\ \/ \_"
- "\u00A9"

Dizeleri tırnak işareti içine almanız gereken başka durumlar da vardır:

  • boşluklarla başlar veya biterler
  • sayı, boole veya null gibi görünebilir
  • NEON bunları tarih olarak anlayacaktır

Çok Satırlı Dizeler

Çok satırlı bir dize 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:

'''
	first line
		second line
	third line
	'''

PHP'de aynısını şöyle yazardık:

"first line\n\tsecond line\nthird line" // PHP

Kaçış dizileri yalnızca kesme işaretleri yerine çift tırnak içine alınmış dizeler için çalışır:

"""
	Copyright \u00A9
"""

Sayılar

NEON, bilimsel gösterim olarak adlandırılan şekilde yazılmış sayıları ve ayrıca ikili, sekizli ve onaltılı sayıları anlar:

- 12 # bir tamsayı
- 12.3 # a float
- +1.2e-34 # üstel bir sayı

- 0b11010 # ikili sayı
- 0o666 # sekizli sayı
- 0x7A # hexa sayısı

Nulls

Null NEON'da null kullanılarak veya bir değer belirtilmeden ifade edilebilir. Baş harfi büyük olan veya tüm harfleri büyük olan varyantlara da izin verilir.

a: null
b:

Booleans

Boolean değerler NEON'da true / false veya yes / no kullanılarak ifade edilir. Baş harfi büyük veya tamamı büyük harf olan varyantlara da izin verilir.

[true, TRUE, True, false, yes, no]

Tarihler

NEON, verileri 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 ve saat
- 2016-06-03 19:00:00.1234 # tarih ve mikro zaman
- 2016-06-03 19:00:00 +0200 # tarih & saat & zaman dilimi
- 2016-06-03 19:00:00 +02:00 # tarih & saat & zaman dilimi

Varlıklar

Varlık, bir fonksiyon çağrısına benzeyen bir yapıdır:

Column(type: int, nulls: yes)

PHP'de bir nesne olarak ayrıştırılır Nette\Neon\Entity:

// PHP
new Nette\Neon\Entity('Column', ['type' => 'int', 'nulls' => true])

Varlıklar da zincirlenebilir:

Column(type: int, nulls: yes) Field(id: 1)

PHP'de aşağıdaki gibi 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şleme ve diziler için kullanılan satır içi gösterim kuralları geçerlidir, bu nedenle birkaç satıra bölünebilir ve virgül eklemek gerekli değildir:

Column(
	type: int
	nulls: yes
)

Yorumlar

Yorumlar # ile başlar ve sağdaki tüm karakterler yok sayılır:

# bu satır yorumlayıcı tarafından göz ardı edilecektir
Sokak: 742 Evergreen Terrace
Şehir: Springfield # bu da göz ardı edildi
ülke ABD

NEON JSON'a Karşı

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"
]
}

Tırnak işaretlerini çıkarırsak ne olur?

{
php: {
	date.timezone: Europe/Prague,
	zlib.output_compression: true
},
database: {
	driver: mysql,
	username: root,
	password: beruska92
},
users: [
	Dave, Kryten, Rimmer
]
}

Parantez ve virgüllere ne dersiniz?

php:
	date.timezone: Europe/Prague
	zlib.output_compression: true

database:
	driver: mysql
	username: root
	password: beruska92

users: [
	Dave, Kryten, Rimmer
]

Mermiler daha okunaklı mı?

php:
	date.timezone: Europe/Prague
	zlib.output_compression: true

database:
	driver: mysql
	username: root
	password: beruska92

users:
	- Dave
	- Kryten
	- Rimmer

Peki ya yorumlar?

# my web application config

php:
	date.timezone: Europe/Prague
	zlib.output_compression: true  # use gzip

database:
	driver: mysql
	username: root
	password: beruska92

users:
	- Dave
	- Kryten
	- Rimmer

NEON sözdizimini buldunuz!

versiyon: 3.4