NEONフォーマット
NEONは、人間が判読可能な構造化データ形式です。Netteでは設定ファイルに使用されます。また、設定、言語翻訳などの構造化データにも使用されます。試してみてください。
NEONは Nette Object Notation の略です。XMLやJSONよりも複雑でなく、扱いにくくありませんが、同様の機能を提供します。YAMLに非常に似ています。主な利点は、NEONにはいわゆるエンティティがあり、これによりDIサービスの設定が非常に洗練されることです。そして、タブによるインデントが可能です。
NEONは、使いやすいようにゼロから構築されています。
統合
- NetBeans(組み込みサポートあり)
- PhpStorm(プラグイン)
- Visual Studio Code(Nette Latte + Neon)または(Nette for VS Code)
- Sublime Text 3(プラグイン)
- Sublime Text 2(プラグイン)
- VIM(プラグイン)
- Emacs(プラグイン)
- Prism.js(統合言語)
構文
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 # これはできません!!! - 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の文字列は、単一引用符または二重引用符で囲むことができます。しかし、ご覧のとおり、引用符なしにすることもできます。
- 引用符なしの NEON 文字列 - '単一引用符で囲まれた NEON 文字列' - "二重引用符で囲まれた NEON 文字列" 文字列にNEON構文と混同される可能性のある文字 # " ' , : = - [ ] { } ( ) が含まれている場合は、引用符で囲む必要があります。エスケープが使用されないため、単一引用符を使用することをお勧めします。そのような文字列に引用符を記述する必要がある場合は、二重にします:
'単一引用符で囲まれた文字列内の引用符 '' ' 二重引用符を使用すると、バックスラッシュ \ を使用して特殊文字を記述するためのエスケープシーケンスを使用できます。JSON形式と同様のすべてのエスケープシーケンスがサポートされており、さらに \_(ノーブレークスペース、つまり \u00A0)もサポートされています。
- "\t \n \r \f \b \" \\ \/ \_" - "\u00A9" 文字列を引用符で囲む必要があるその他のケースがあります:
- スペースで始まるか終わる
- 数値、ブール値、またはnullのように見える
- NEONがそれらを日付として解釈する
複数行文字列
複数行文字列は、別々の行にある3つの引用符で始まり、終わります。最初の行のインデントは、すべての行で無視されます:
''' 最初の行 2行目 3行目 ''' PHPでは、同じことを次のように記述します:
"最初の行\n\t2行目\n3行目" // PHP エスケープシーケンスは、アポストロフィの代わりに二重引用符で囲まれた文字列でのみ機能します:
""" Copyright \u00A9 """ 数値
NEONは、いわゆる科学表記法で記述された数値、および2進数、8進数、16進数の数値を理解します:
- 12 # 整数 - 12.3 # 浮動小数点数 - +1.2e-34 # 指数表記の数値 - 0b11010 # 2進数 - 0o666 # 8進数 - 0x7A # 16進数 Nulls
Nullは、NEONでは null を使用するか、値を指定しないことによって表現できます。最初の文字が大文字またはすべて大文字のバリアントも許可されます。
a: null b: ブール値
論理値は、NEONでは true / false または yes / no を使用して表現されます。最初の文字が大文字またはすべて大文字のバリアントも許可されます。
[true, TRUE, True, false, yes, no] 日付
NEONは、日付を表現するために次の形式を使用し、それらを自動的に DateTimeImmutable オブジェクトに変換します:
- 2016-06-03 # 日付 - 2016-06-03 19:00:00 # 日付と時刻 - 2016-06-03 19:00:00.1234 # 日付とマイクロ秒 - 2016-06-03 19:00:00 +0200 # 日付、時刻、タイムゾーン - 2016-06-03 19:00:00 +02:00 # 日付、時刻、タイムゾーン エンティティ
エンティティは、関数呼び出しに似た構造です:
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 ) コメント
コメントは # 文字で始まり、右側の後続のすべての文字は無視されます:
# この行はインタプリタによって無視されます street: 742 Evergreen Terrace city: Springfield # これも無視されます 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 コメントを追加しますか?
# 私のウェブアプリケーション設定 php: date.timezone: Europe/Prague zlib.output_compression: true # gzip を使用 database: driver: mysql username: root password: beruska92 users: - Dave - Kryten - Rimmer やった!これでNEONの構文がわかりました!