[25] SuikaWikiConfig/2.0 は、 SuikaWiki3 の種々の設定ファイルや WikiPlugin 原始ファイルの記述のために設計された汎用の記述形式です。 SuikaWiki のほかにも、いくつかの簡易工具で使用されています。
SuikaWikiConfig/2.0 では、入れ子になった構造 (木構造) を手軽に扱うことができます。また、簡単な並びを扱うこともできます。
document := header bodyheader := ['#?SuikaWikiConfig/2.0' CRLF] body := *(entry / comment / s)entry := entry-name ":" *WSP (entry-line − *echar ":" *echar CRLF / CRLF entry-body) / list-entryentry-name は ":" を含み得ることに注意。
entry-name は、行の中で最後の ":" の直前までである。anon-entry := "@:" *WSP (entry-line / CRLF simple-entry-body)anon-entry で complex-entry-body
を使うことはできない。entry-name := first-echar *echar − first-echar '[list]'entry-name の最後を "[" *echar "]"
とするべきではない。そのような名前は将来の版の SuikaWikiConfig
では禁止されるかもしれない。entry-body := simple-entry-body / complex-entry-bodysimple-entry-body := *(1*WSP entry-line)complex-entry-body := *(1*WSP 1*"@" entry / comment / s) 1*WSP 1*"@" anon-entry *(1*WSP 1*"@" entry / comment / s)"@" の数は、親 entry
(その complex-entry-body を内容の一部として含む直近の
entry) の entry-name 直前の "@"
の個数より丁度一つ多くなければならない。comment は、必ずしも情報項目に対応しない。entry-line := [first-echar *echar] CRLF entry-line := [first-echar *echar / "\"] CRLF CRLF だけの) entry-line は、
情報項目に反映されない (無視される)。"\" CRLF だけの行は、空行 (行末の改行文字だけの行) とする。first-echar := (echar − ("@" / WSP / "#" / "\")) / quoted-pairquoted-pair を使うのは、そうしなければ表現できない4種類の文字群に限ることを推奨する。quoted-pair := "\" echarechar := CHAR − (CR / LF)s := CRLF ;; 空行s は、情報項目に対応しない (捨てられる)。comment := "#" *echar CRLFlist-entry := entry-name "[list]:" *WSP (entry-line − *echar ":" *echar CRLF / CRLF simple-entry-body)entry-line が一つの並びの項目とみなされる。
並びの項目を複数行とする (CRLF を含める) ことはできない。list-entry で complex-entry-body
を使ってはならない。WSP := SP / TAB[18] 改行 (CRLF) は、環境に応じて CR,
LF, CRLF のいずれを使ってもよい。
また、これらが混在してもよい。正規形は CRLF とし、
解析器は構文解析の前に正規形に変換されているかのように扱わなければならない。
ネットワーク転送時には正規形にするべきである。
[19] SuikaWikiConfig/2.0 文書は、
構文に必要な文字を含んでいるどのような符号化文字集合を使って表現してもよい。
解析器は MIME charset US-ASCII に対応しなければならない。
SuikaWikiConfig/2.0 文書の符号化文字集合には、 US-ASCII
の符号化文字をすべて含むものを使用することを推奨する。
解析器や応用プログラムの使用する符号化方式は、実装定義とする。
[20] SuikaWikiConfig/2.0 情報集合は、 SuikaWikiConfig/2.0 で表現できる情報の抽象模型である。 解析器は、情報集合の情報項目に対応する情報を応用プログラムに提供できなければならない (が、具体的な提供方法は実装定義とし、情報集合の抽象模型に直接対応する必要はない)。
子供: 子供情報項目の順序並び (文書順)。
子供情報項目は要素情報項目または注釈情報項目で、それぞれ任意個、任意順。局所名: entry-name。
quoted-pair の "\" は値の一部ではない。子供: 子供情報項目の順序並び (文書順)。
子供情報項目は要素情報項目で、任意個。
complex-entry-body 中の entry に対応する。値: 一つの文字列または文字列の並び
(並び特性に拠る)。
entry-line (の連結) に対応する。
(complex-entry-body では、
anon-entry 内の entry-line (の連結) とする。)
ただし、 quoted-pair の "\" と一番最後の
CRLF は値の一部ではない。並び: list-entry なら真、
普通の entry なら偽。親: 親情報項目。すなわち、
この要素情報項目を子供に持つ文書情報項目または要素情報項目。[30] SuikaWikiConfig/2.0 では、注釈情報項目の親は常に文書情報項目とする。
将来の版の SuikaWikiConfig では、要素情報項目も親と認めるかもしれない。
[21] SuikaWikiConfig/2.0 情報集合を SuikaWikiConfig/2.0 文書に直列化するときに、次の場合にはそのままでは直列化できない。
子供特性が空でなく、
並び特性が真であるとき並び特性が真で、
値特性の値の文字列のいずれかが改行を含むとき値特性が改行を含むとき局所名特性もしくは要素情報項目または注釈情報項目の値特性が含むとき値特性の値が
? から始まるときこれらの場合は誤りとする。直列化器は誤りから回復してもよい。
[22] SuikaWikiConfig/2.0 文書のインターネット媒体型は
application/x.suikawiki.config とする。
引数:
| 名前 | 値の型 | 既定値 | 意味 |
charset | charset | (ほぼ必須) | MIME charset |
version | "2.0" | (必須) | SuikaWikiConfig の版 |
引数 charset は、外部プロトコルの一部を構成する場合
(たとえば XML 実体に直接埋め込まれている場合)
には使用してはならない。外部プロトコルが別途指定手段を有するときや、
SuikaWikiConfig/2.0 文書そのものは転送されない場合
(たとえば HTTP の Accept: 欄の場合) には省略してもよい。
それ以外の場合 (たとえば MIME や HTTP の Content-Type:
欄の場合) には指定しなければならない。
SuikaWikiConfig/2.0 の処理器が version が 2.0
でない実体を渡されたときの動作は実装定義とする。
[31] 参考: HTTP の Accept: 欄を使用する場合で、
charset を指定したい時は、通常 charset
引数ではなく Accept-Charset: 欄を使用する。
[23] SuikaWikiConfig/2.0 を構文として使用する応用形式は、
独自の媒体型を定義してもよい。その場合は媒体亜型の最後を
+swcfg としなければならない。
また、引数 charset および version
を >>22 と同じと定義するか、またはより制限されたものとしなければならない。
処理器は、未知の媒体型であっても +swcfg
で終わるものは application/x.suikawiki.config
とみなすべきである。
[27] SuikaWikiConfig/2.0 は、 SuikaWiki3 を期に SuikaWikiConfig/0.9, SuikaWikiConfig/1.0, SuikaWikiConst/0.9, SuikaWikiConfig/1.1 を統一・拡張して設計されました。
[28] SuikaWikiConst/0.9 などは SuikaWiki2 で使用されていた書式です。
#?SuikaWikiConfig/2.0
Foo:
aiueo
Bar: aiueo
# comment
# comment
FooBar:
@@:something
@Foo:\ foo
@Bar:
bar
foo
@foo:
@@foo:@@foo@@
@@bar:@@bar@@
@@\@foo:@@foo@@
@@@: FOO BAR
@\@foo:Hello!
@bar:
\@foo:bar
foo[list]:
http://foo.example/
http://bar.example/
http://baz.example/