NEONフォーマット

NEONは、人間が判読可能な構造化データ形式です。Netteでは設定ファイルに使用されます。また、設定、言語翻訳などの構造化データにも使用されます。試してみてください

NEONは Nette Object Notation の略です。XMLやJSONよりも複雑でなく、扱いにくくありませんが、同様の機能を提供します。YAMLに非常に似ています。主な利点は、NEONにはいわゆるentityがあり、これによりDIサービスの設定が非常に洗練されることです。そして、タブによるインデントが可能です。

NEONは、使いやすいようにゼロから構築されています。

統合

構文

NEONで書かれたファイルは、通常、配列またはマッピングを表します。

マッピング

マッピングはキーと値のペアのセットであり、PHPでは連想配列と呼ばれます。各ペアは key: value として記述され、: の後のスペースが必要です。値は、文字列、数値、ブール値、null、シーケンス、または他のマッピングなど、何でもかまいません。

street: 742 Evergreen Terrace
city: Springfield
country: USA

PHPでは、同じ構造は次のように記述されます:

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

この表記法はブロック表記と呼ばれます。すべての項目が別々の行にあり、同じインデント(この場合はなし)を持つためです。NEONは、括弧で囲まれたマッピングのインライン表現もサポートしています。インデントは役割を果たさず、個々の要素の区切り文字はカンマまたは改行のいずれかです:

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

同じものを複数行で記述(インデントは関係ありません):

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

: の代わりに = を使用することもできます。これはブロック表記とインライン表記の両方で可能です:

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

シーケンス

シーケンスはPHPのインデックス付き配列です。ハイフン - とそれに続くスペースで始まる行として記述されます。値は再び、文字列、数値、ブール値、null、シーケンス、または他のマッピングなど、何でもかまいません。

- Cat
- Dog
- Goldfish

PHPでは、同じ構造は次のように記述されます:

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

この表記法はブロック表記と呼ばれます。すべての項目が別々の行にあり、同じインデント(この場合はなし)を持つためです。NEONは、括弧で囲まれたシーケンスのインライン表現もサポートしています。インデントは役割を果たさず、個々の要素の区切り文字はカンマまたは改行のいずれかです:

[Cat, Dog, Goldfish]

同じものを複数行で記述(インデントは関係ありません):

[
	Cat, Dog
		Goldfish
]

インライン表現ではインデントされた箇条書きは使用できません。

組み合わせ

マッピングとシーケンスの値は、他のマッピングやシーケンスにすることができます。インデントレベルが重要な役割を果たします。次の例では、シーケンス項目を示すために使用されるハイフンは、キー pets よりも大きなインデントを持っているため、項目は最初の行の値になります:

pets:
   - Cat
   - Dog
cars:
   - Volvo
   - Skoda

PHPでは、同じ構造は次のように記述されます:

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

ブロック表記とインライン表記を組み合わせることができます:

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

インライン表記内では、ブロック表記を使用することはできません。これは機能しません:

item: [
	pets:
	 - Cat     # TOHLE NELZE!!!
	 - Dog
]

前のケースでは、要素がシーケンスであるマッピングを記述しました。今度は逆にして、マッピングを含むシーケンスを作成してみましょう:

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

箇条書きが別々の行にある必要はありません。このように配置することもできます:

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

キーをスペースで列に揃えるか、タブを使用するかはあなた次第です。

PHPではマッピングとシーケンスの両方に同じ構造、つまり配列が使用されるため、両方をマージできます。今回はインデントは同じです:

- Cat
street: 742 Evergreen Terrace
- Goldfish

PHPでは、同じ構造は次のように記述されます:

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

文字列

NEONの文字列は、単一引用符または二重引用符で囲むことができます。しかし、ご覧のとおり、引用符なしにすることもできます。

- Řetězec v NEON bez uvozovek
- 'Řetězec v NEON v jednoduchých uvozovkách'
- "Řetězec v NEON ve dvojitých uvozovkách"

文字列にNEON構文と混同される可能性のある文字 # " ' , : = - [ ] { } ( ) が含まれている場合は、引用符で囲む必要があります。エスケープが使用されないため、単一引用符を使用することをお勧めします。そのような文字列に引用符を記述する必要がある場合は、二重にします:

'Uvozovka '' uvnitř řetezce v jednoduchých uvozovkách'

二重引用符を使用すると、バックスラッシュ \ を使用して特殊文字を記述するためのエスケープシーケンスを使用できます。JSON形式と同様のすべてのエスケープシーケンスがサポートされており、さらに \_(ノーブレークスペース、つまり \u00A0)もサポートされています。

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

文字列を引用符で囲む必要があるその他のケースがあります:

  • スペースで始まるか終わる
  • 数値、ブール値、またはnullのように見える
  • NEONがそれらをdatumとして解釈する

複数行文字列

複数行文字列は、別々の行にある3つの引用符で始まり、終わります。最初の行のインデントは、すべての行で無視されます:

'''
	první řádek
		druhý řádek
	třetí řádek
	'''

PHPでは、同じことを次のように記述します:

"první řádek\n\tdruhý řádek\ntřetí řádek" // PHP

エスケープシーケンスは、アポストロフィの代わりに二重引用符で囲まれた文字列でのみ機能します:

"""
	Copyright \u00A9
"""

数値

NEONは、いわゆる科学表記法で記述された数値、および2進数、8進数、16進数の数値を理解します:

- 12         # celé číslo
- 12.3       # float
- +1.2e-34   # exponenciální číslo

- 0b11010    # binární číslo
- 0o666      # osmičkové číslo
- 0x7A       # hexa číslo

Null

Nullは、NEONでは null を使用するか、値を指定しないことによって表現できます。最初の文字が大文字またはすべて大文字のバリアントも許可されます。

a: null
b:

ブール値

論理値は、NEONでは true / false または yes / no を使用して表現されます。最初の文字が大文字またはすべて大文字のバリアントも許可されます。

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

日付

NEONは、日付を表現するために次の形式を使用し、それらを自動的に DateTimeImmutable オブジェクトに変換します:

- 2016-06-03                  # datum
- 2016-06-03 19:00:00         # datum & čas
- 2016-06-03 19:00:00.1234    # datum & mikročas
- 2016-06-03 19:00:00 +0200   # datum & čas & zóna
- 2016-06-03 19:00:00 +02:00  # datum & čas & zóna

エンティティ

エンティティは、関数呼び出しに似た構造です:

Column(type: int, nulls: yes)

PHPでは、Nette\Neon\Entity オブジェクトとして解析されます:

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

エンティティは連結することもできます:

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

これはPHPで次のように解析されます:

// 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]),
])

括弧内では、マッピングとシーケンスで使用されるインライン表記のルールが適用されます。つまり、複数行にすることもでき、その場合はカンマを指定する必要はありません:

Column(
	type: int
	nulls: yes
)

コメント

コメントは # 文字で始まり、右側の後続のすべての文字は無視されます:

# this line will be ignored by the interpreter
street: 742 Evergreen Terrace
city: Springfield  # this is ignored too
country: USA

Neon 対 JSON

JSONはNEONのサブセットです。したがって、すべてのJSONはNEONとして解析できます:

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

引用符を省略したらどうなるでしょうか?

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

そして波括弧とカンマは?

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

database:
	driver: mysql
	username: root
	password: beruska92

users: [
	Dave, Kryten, Rimmer
]

箇条書きリストの方が読みやすいのではないでしょうか?

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

database:
	driver: mysql
	username: root
	password: beruska92

users:
	- Dave
	- Kryten
	- Rimmer

コメントを追加しますか?

# 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の構文がわかりました!

バージョン: 3.4