[25] SuikaWikiConfig/2.0 は、 SuikaWiki3 の種々の設定ファイルや WikiPlugin 原始ファイルの記述のために設計された汎用の記述形式です。 SuikaWiki のほかにも、いくつかの簡易工具で使用されています。
SuikaWikiConfig/2.0 では、入れ子になった構造 (木構造) を手軽に扱うことができます。また、簡単な並びを扱うこともできます。
document := header body
header := ['#?SuikaWikiConfig/2.0' CRLF]
body := *(entry / comment / s)
entry := entry-name ":" *WSP (entry-line − *echar ":" *echar CRLF / CRLF entry-body) / list-entry
entry-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-body
simple-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-pair
quoted-pair
を使うのは、そうしなければ表現できない4種類の文字群に限ることを推奨する。quoted-pair := "\" echar
echar := CHAR − (CR / LF)
s := CRLF ;; 空行
s
は、情報項目に対応しない (捨てられる)。comment := "#" *echar CRLF
list-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/