<html xmlns="http://www.w3.org/1999/xhtml"><head></head><body><p><anchor-end xmlns="urn:x-suika-fam-cx:markup:suikawiki:0:9:" a0:anchor="25" xmlns:a0="urn:x-suika-fam-cx:markup:suikawiki:0:9:">[25]</anchor-end> <dfn>SuikaWikiConfig/2.0</dfn> は、 <anchor xmlns="urn:x-suika-fam-cx:markup:suikawiki:0:9:">SuikaWiki3</anchor>
の種々の設定ファイルや <anchor xmlns="urn:x-suika-fam-cx:markup:suikawiki:0:9:">WikiPlugin</anchor> 
原始ファイルの記述のために設計された汎用の記述形式です。
SuikaWiki のほかにも、いくつかの簡易工具で使用されています。</p><p>SuikaWikiConfig/2.0 では、入れ子になった構造 (木構造)
を手軽に扱うことができます。また、簡単な<ruby>並び<rt>リスト</rt></ruby>を扱うこともできます。</p><section><h1>SuikaWikiConfig/2.0 構文</h1><ul><li><anchor-end xmlns="urn:x-suika-fam-cx:markup:suikawiki:0:9:" a0:anchor="1" xmlns:a0="urn:x-suika-fam-cx:markup:suikawiki:0:9:">[1]</anchor-end> <code class="ABNF"><dfn>document</dfn> := header body</code></li><li><anchor-end xmlns="urn:x-suika-fam-cx:markup:suikawiki:0:9:" a0:anchor="2" xmlns:a0="urn:x-suika-fam-cx:markup:suikawiki:0:9:">[2]</anchor-end> <code class="ABNF"><dfn>header</dfn> := ['#?SuikaWikiConfig/2.0' CRLF] </code><ul><li>[誤り] 外部プロトコル (HTTP, MIME 等) で<anchor xmlns="urn:x-suika-fam-cx:markup:suikawiki:0:9:">媒体型</anchor>情報が得られないときに
<code class="ABNF">header</code> が空であるのは誤り。</li></ul></li><li><anchor-end xmlns="urn:x-suika-fam-cx:markup:suikawiki:0:9:" a0:anchor="3" xmlns:a0="urn:x-suika-fam-cx:markup:suikawiki:0:9:">[3]</anchor-end> <code class="ABNF"><dfn>body</dfn> := *(entry / comment / s)</code></li><li><anchor-end xmlns="urn:x-suika-fam-cx:markup:suikawiki:0:9:" a0:anchor="4" xmlns:a0="urn:x-suika-fam-cx:markup:suikawiki:0:9:">[4]</anchor-end> <code class="ABNF"><dfn>entry</dfn> := entry-name &quot;:&quot; *WSP (entry-line − *echar &quot;:&quot; *echar CRLF / CRLF entry-body) / list-entry</code><ul><li><code class="ABNF">entry-name</code> は <code class="ABNF">&quot;:&quot;</code> を含み得ることに注意。
<code class="ABNF">entry-name</code> は、行の中で最後の <code class="ABNF">&quot;:&quot;</code> の直前までである。</li></ul></li><li><anchor-end xmlns="urn:x-suika-fam-cx:markup:suikawiki:0:9:" a0:anchor="5" xmlns:a0="urn:x-suika-fam-cx:markup:suikawiki:0:9:">[5]</anchor-end> <code class="ABNF"><dfn>anon-entry</dfn> := &quot;@:&quot; *WSP (entry-line / CRLF simple-entry-body)</code><ul><li>[誤り] <code class="ABNF">anon-entry</code> で <code class="ABNF">complex-entry-body</code>
を使うことは<strong>できない</strong>。</li></ul></li><li><anchor-end xmlns="urn:x-suika-fam-cx:markup:suikawiki:0:9:" a0:anchor="6" xmlns:a0="urn:x-suika-fam-cx:markup:suikawiki:0:9:">[6]</anchor-end> <code class="ABNF"><dfn>entry-name</dfn> := first-echar *echar − first-echar '[list]'</code><ul><li><code class="ABNF">entry-name</code> の最後を <code class="ABNF">&quot;[&quot; *echar &quot;]&quot;</code>
とする<strong>べきではない</strong>。そのような名前は将来の版の SuikaWikiConfig
では禁止されるかもしれない。</li></ul></li><li><anchor-end xmlns="urn:x-suika-fam-cx:markup:suikawiki:0:9:" a0:anchor="7" xmlns:a0="urn:x-suika-fam-cx:markup:suikawiki:0:9:">[7]</anchor-end> <code class="ABNF"><dfn>entry-body</dfn> := simple-entry-body / complex-entry-body</code></li><li><anchor-end xmlns="urn:x-suika-fam-cx:markup:suikawiki:0:9:" a0:anchor="8" xmlns:a0="urn:x-suika-fam-cx:markup:suikawiki:0:9:">[8]</anchor-end> <code class="ABNF"><dfn>simple-entry-body</dfn> := *(1*WSP entry-line)</code></li><li><anchor-end xmlns="urn:x-suika-fam-cx:markup:suikawiki:0:9:" a0:anchor="9" xmlns:a0="urn:x-suika-fam-cx:markup:suikawiki:0:9:">[9]</anchor-end> <code class="ABNF"><dfn>complex-entry-body</dfn> := *(1*WSP 1*&quot;@&quot; entry / comment / s) 1*WSP 1*&quot;@&quot; anon-entry *(1*WSP 1*&quot;@&quot; entry / comment / s)</code><ul><li>[整形式制約] <code class="ABNF">&quot;@&quot;</code> の数は、親 <code class="ABNF">entry</code>
(その <code class="ABNF">complex-entry-body</code> を内容の一部として含む直近の 
<code class="ABNF">entry</code>) の <code class="ABNF">entry-name</code> 直前の <code class="ABNF">&quot;@&quot;</code>
の個数より丁度一つ多くなければならない。</li><li>ここに現れる <code class="ABNF">comment</code> は、必ずしも情報項目に対応しない。</li></ul></li><li><anchor-end xmlns="urn:x-suika-fam-cx:markup:suikawiki:0:9:" a0:anchor="10" xmlns:a0="urn:x-suika-fam-cx:markup:suikawiki:0:9:">[10]</anchor-end> <del> <code class="ABNF"><dfn>entry-line</dfn> := [first-echar *echar] CRLF</code> </del></li><li><anchor-end xmlns="urn:x-suika-fam-cx:markup:suikawiki:0:9:" a0:anchor="29" xmlns:a0="urn:x-suika-fam-cx:markup:suikawiki:0:9:">[29]</anchor-end> <ins> <code class="ABNF"><dfn>entry-line</dfn> := [first-echar *echar / &quot;\&quot;] CRLF</code> </ins><ul><li>空の (<code class="ABNF">CRLF</code> だけの) <code class="ABNF">entry-line</code> は、
情報項目に反映されない (無視される)。</li><li><code class="ABNF">&quot;\&quot; CRLF</code> だけの行は、空行 (行末の改行文字だけの行) とする。</li></ul></li><li><anchor-end xmlns="urn:x-suika-fam-cx:markup:suikawiki:0:9:" a0:anchor="11" xmlns:a0="urn:x-suika-fam-cx:markup:suikawiki:0:9:">[11]</anchor-end> <code class="ABNF"><dfn>first-echar</dfn> := (echar − (&quot;@&quot; / WSP / &quot;#&quot; / &quot;\&quot;)) / quoted-pair</code><ul><li><code class="ABNF">quoted-pair</code> を使うのは、そうしなければ表現できない4種類の文字群に限ることを<strong>推奨する</strong>。</li></ul></li><li><anchor-end xmlns="urn:x-suika-fam-cx:markup:suikawiki:0:9:" a0:anchor="12" xmlns:a0="urn:x-suika-fam-cx:markup:suikawiki:0:9:">[12]</anchor-end> <code class="ABNF"><dfn>quoted-pair</dfn> := &quot;\&quot; echar</code></li><li><anchor-end xmlns="urn:x-suika-fam-cx:markup:suikawiki:0:9:" a0:anchor="13" xmlns:a0="urn:x-suika-fam-cx:markup:suikawiki:0:9:">[13]</anchor-end> <code class="ABNF"><dfn>echar</dfn> := CHAR − (CR / LF)</code></li><li><anchor-end xmlns="urn:x-suika-fam-cx:markup:suikawiki:0:9:" a0:anchor="14" xmlns:a0="urn:x-suika-fam-cx:markup:suikawiki:0:9:">[14]</anchor-end> <code class="ABNF"><dfn>s</dfn> := CRLF ;; 空行</code><ul><li><code class="ABNF">s</code> は、情報項目に対応しない (捨てられる)。</li></ul></li><li><anchor-end xmlns="urn:x-suika-fam-cx:markup:suikawiki:0:9:" a0:anchor="15" xmlns:a0="urn:x-suika-fam-cx:markup:suikawiki:0:9:">[15]</anchor-end> <code class="ABNF"><dfn>comment</dfn> := &quot;#&quot; *echar CRLF</code></li><li><anchor-end xmlns="urn:x-suika-fam-cx:markup:suikawiki:0:9:" a0:anchor="16" xmlns:a0="urn:x-suika-fam-cx:markup:suikawiki:0:9:">[16]</anchor-end> <code class="ABNF"><dfn>list-entry</dfn> := entry-name &quot;[list]:&quot; *WSP (entry-line − *echar &quot;:&quot; *echar CRLF / CRLF simple-entry-body)</code><ul><li>一つの <code class="ABNF">entry-line</code> が一つの並びの項目とみなされる。
並びの項目を複数行とする (<code class="ABNF">CRLF</code> を含める) ことはできない。</li><li>[誤り] <code class="ABNF">list-entry</code> で <code class="ABNF">complex-entry-body</code>
を使っては<strong>ならない</strong>。</li></ul></li><li><anchor-end xmlns="urn:x-suika-fam-cx:markup:suikawiki:0:9:" a0:anchor="17" xmlns:a0="urn:x-suika-fam-cx:markup:suikawiki:0:9:">[17]</anchor-end> <code class="ABNF"><dfn>WSP</dfn> := <anchor xmlns="urn:x-suika-fam-cx:markup:suikawiki:0:9:">SP</anchor> / <anchor xmlns="urn:x-suika-fam-cx:markup:suikawiki:0:9:">TAB</anchor></code></li></ul><section><h1>改行の取扱い</h1><p><anchor-end xmlns="urn:x-suika-fam-cx:markup:suikawiki:0:9:" a0:anchor="18" xmlns:a0="urn:x-suika-fam-cx:markup:suikawiki:0:9:">[18]</anchor-end> 改行 (<code class="ABNF">CRLF</code>) は、環境に応じて <code class="ABNF">CR</code>,
<code class="ABNF">LF</code>, <code class="ABNF">CRLF</code> のいずれを使っても<strong>よい</strong>。
また、これらが混在しても<strong>よい</strong>。正規形は <code class="ABNF">CRLF</code> とし、
解析器は構文解析の前に正規形に変換されているかのように扱わなければ<strong>ならない</strong>。
ネットワーク転送時には正規形にする<strong>べきである</strong>。</p></section><section><h1>符号化文字集合</h1><p><anchor-end xmlns="urn:x-suika-fam-cx:markup:suikawiki:0:9:" a0:anchor="19" xmlns:a0="urn:x-suika-fam-cx:markup:suikawiki:0:9:">[19]</anchor-end> SuikaWikiConfig/2.0 文書は、
構文に必要な文字を含んでいるどのような<anchor xmlns="urn:x-suika-fam-cx:markup:suikawiki:0:9:">符号化文字集合</anchor>を使って表現しても<strong>よい</strong>。
解析器は MIME charset <code class="charset"><anchor xmlns="urn:x-suika-fam-cx:markup:suikawiki:0:9:">US-ASCII</anchor></code> に対応しなければ<strong>ならない</strong>。</p><p>SuikaWikiConfig/2.0 文書の符号化文字集合には、 <code class="charset">US-ASCII</code>
の符号化文字をすべて含むものを使用することを<strong>推奨する</strong>。
解析器や応用プログラムの使用する符号化方式は、実装定義とする。</p></section></section><section><h1>SuikaWikiConfig/2.0 情報集合</h1><p><anchor-end xmlns="urn:x-suika-fam-cx:markup:suikawiki:0:9:" a0:anchor="20" xmlns:a0="urn:x-suika-fam-cx:markup:suikawiki:0:9:">[20]</anchor-end> <dfn>SuikaWikiConfig/2.0 情報集合</dfn>は、 SuikaWikiConfig/2.0
で表現できる情報の抽象模型である。
解析器は、情報集合の情報項目に対応する情報を応用プログラムに提供できなければ<strong>ならない</strong>
(が、具体的な提供方法は実装定義とし、情報集合の抽象模型に直接対応する必要はない)。</p><ul><li>文書情報項目<ul><li><code class="infoprop">子供</code>: 子供情報項目の順序並び (文書順)。
子供情報項目は要素情報項目または注釈情報項目で、それぞれ任意個、任意順。</li></ul></li><li>要素情報項目<ul><li><code class="infoprop">局所名</code>: <code class="ABNF">entry-name</code>。
<code class="ABNF">quoted-pair</code> の <code class="ABNF">&quot;\&quot;</code> は値の一部ではない。</li><li><code class="infoprop">子供</code>: 子供情報項目の順序並び (文書順)。
子供情報項目は要素情報項目で、任意個。
<code class="ABNF">complex-entry-body</code> 中の <code class="ABNF">entry</code> に対応する。</li><li><code class="infoprop">値</code>: 一つの文字列または文字列の並び
(<code class="infoprop">並び</code>特性に拠る)。
<code class="ABNF">entry-line</code> (の連結) に対応する。
(<code class="ABNF">complex-entry-body</code> では、
<code class="ABNF">anon-entry</code> 内の <code class="ABNF">entry-line</code> (の連結) とする。)
ただし、 <code class="ABNF">quoted-pair</code> の <code class="ABNF">&quot;\&quot;</code> と一番最後の
<code class="ABNF">CRLF</code> は値の一部ではない。</li><li><code class="infoprop">並び</code>: <code class="ABNF">list-entry</code> なら真、
普通の <code class="ABNF">entry</code> なら偽。</li><li><code class="infoprop">親</code>: 親情報項目。すなわち、
この要素情報項目を<code class="infoprop">子供</code>に持つ文書情報項目または要素情報項目。</li></ul></li><li>注釈情報項目<ul><li><code class="infoprop">値</code>: <code class="ABNF">comment</code> のうち、
<code class="ABNF">#</code> と <code class="ABNF">CRLF</code> を除いた部分。</li></ul></li></ul><p><anchor-end xmlns="urn:x-suika-fam-cx:markup:suikawiki:0:9:" a0:anchor="30" xmlns:a0="urn:x-suika-fam-cx:markup:suikawiki:0:9:">[30]</anchor-end> SuikaWikiConfig/2.0 では、注釈情報項目の<code class="infoprop">親</code>は常に文書情報項目とする。
将来の版の SuikaWikiConfig では、要素情報項目も<code class="infoprop">親</code>と認めるかもしれない。</p></section><section><h1>直列化</h1><p><anchor-end xmlns="urn:x-suika-fam-cx:markup:suikawiki:0:9:" a0:anchor="21" xmlns:a0="urn:x-suika-fam-cx:markup:suikawiki:0:9:">[21]</anchor-end> SuikaWikiConfig/2.0 情報集合を SuikaWikiConfig/2.0
文書に直列化するときに、次の場合にはそのままでは直列化できない。</p><ul><li>要素情報項目の<code class="infoprop">子供</code>特性が空でなく、
<code class="infoprop">並び</code>特性が真であるとき</li><li>要素情報項目の<code class="infoprop">並び</code>特性が真で、
<code class="infoprop">値</code>特性の値の文字列のいずれかが改行を含むとき</li><li>注釈情報項目の<code class="infoprop">値</code>特性が改行を含むとき</li><li>出力する符号化文字集合で表現できない文字が要素情報項目の<code class="infoprop">局所名</code>特性もしくは要素情報項目または注釈情報項目の<code class="infoprop">値</code>特性が含むとき</li><li><anchor-end xmlns="urn:x-suika-fam-cx:markup:suikawiki:0:9:" a0:anchor="33" xmlns:a0="urn:x-suika-fam-cx:markup:suikawiki:0:9:">[33]</anchor-end> 注釈情報項目の<code class="infoprop">値</code>特性の値が
<code class="char">?</code> から始まるとき</li></ul><p>これらの場合は誤りとする。直列化器は誤りから回復しても<strong>よい</strong>。</p></section><section><h1>識別子</h1><p><anchor-end xmlns="urn:x-suika-fam-cx:markup:suikawiki:0:9:" a0:anchor="22" xmlns:a0="urn:x-suika-fam-cx:markup:suikawiki:0:9:">[22]</anchor-end> SuikaWikiConfig/2.0 文書のインターネット<anchor xmlns="urn:x-suika-fam-cx:markup:suikawiki:0:9:">媒体型</anchor>は 
<code class="MIME"><anchor xmlns="urn:x-suika-fam-cx:markup:suikawiki:0:9:">application/x.suikawiki.config</anchor></code> とする。</p><p>引数:<table><tbody><tr><td>名前</td><td>値の型</td><td>既定値</td><td>意味</td></tr><tr><td><code class="MIME"><anchor xmlns="urn:x-suika-fam-cx:markup:suikawiki:0:9:">charset</anchor></code></td><td><code class="ABNF"><anchor xmlns="urn:x-suika-fam-cx:markup:suikawiki:0:9:">charset</anchor></code></td><td>(ほぼ必須)</td><td>MIME charset</td></tr><tr><td><code class="MIME"><anchor xmlns="urn:x-suika-fam-cx:markup:suikawiki:0:9:">version</anchor></code></td><td><code class="ABNF">&quot;2.0&quot;</code></td><td>(必須)</td><td>SuikaWikiConfig の版</td></tr></tbody></table></p><p>引数 <code class="MIME">charset</code> は、外部プロトコルの一部を構成する場合
(たとえば <anchor xmlns="urn:x-suika-fam-cx:markup:suikawiki:0:9:">XML</anchor> <anchor xmlns="urn:x-suika-fam-cx:markup:suikawiki:0:9:">実体</anchor>に直接埋め込まれている場合)
には使用しては<strong>ならない</strong>。外部プロトコルが別途指定手段を有するときや、
SuikaWikiConfig/2.0 文書そのものは転送されない場合 
(たとえば <anchor xmlns="urn:x-suika-fam-cx:markup:suikawiki:0:9:">HTTP</anchor> の <code class="HTTP"><anchor xmlns="urn:x-suika-fam-cx:markup:suikawiki:0:9:">Accept</anchor>:</code> 欄の場合) には省略しても<strong>よい</strong>。
それ以外の場合 (たとえば <anchor xmlns="urn:x-suika-fam-cx:markup:suikawiki:0:9:">MIME</anchor> や HTTP の <code class="HTTP"><anchor xmlns="urn:x-suika-fam-cx:markup:suikawiki:0:9:">Content-Type</anchor>:</code>
欄の場合) には指定しなければ<strong>ならない</strong>。</p><p>SuikaWikiConfig/2.0 の処理器が <code class="MIME">version</code> が <code class="MIME">2.0</code>
でない実体を渡されたときの動作は実装定義とする。</p><p><anchor-end xmlns="urn:x-suika-fam-cx:markup:suikawiki:0:9:" a0:anchor="31" xmlns:a0="urn:x-suika-fam-cx:markup:suikawiki:0:9:">[31]</anchor-end> 参考: HTTP の <code class="HTTP">Accept:</code> 欄を使用する場合で、
<code class="MIME">charset</code> を指定したい時は、通常 <code class="MIME">charset</code>
引数ではなく <code class="HTTP"><anchor xmlns="urn:x-suika-fam-cx:markup:suikawiki:0:9:">Accept-Charset</anchor>:</code> 欄を使用する。</p><p><anchor-end xmlns="urn:x-suika-fam-cx:markup:suikawiki:0:9:" a0:anchor="23" xmlns:a0="urn:x-suika-fam-cx:markup:suikawiki:0:9:">[23]</anchor-end> SuikaWikiConfig/2.0 を構文として使用する応用形式は、
独自の媒体型を定義しても<strong>よい</strong>。その場合は媒体亜型の最後を
<code class="MIME">+swcfg</code> としなければ<strong>ならない</strong>。
また、引数 <code class="MIME">charset</code> および <code class="MIME">version</code>
を <anchor-internal xmlns="urn:x-suika-fam-cx:markup:suikawiki:0:9:" a0:anchor="22" xmlns:a0="urn:x-suika-fam-cx:markup:suikawiki:0:9:">&gt;&gt;22</anchor-internal> と同じと定義するか、またはより制限されたものとしなければ<strong>ならない</strong>。
処理器は、未知の媒体型であっても <code class="MIME">+swcfg</code>
で終わるものは <code class="MIME">application/x.suikawiki.config</code>
とみなす<strong>べきである</strong>。</p></section><section><h1>歴史</h1><p><anchor-end xmlns="urn:x-suika-fam-cx:markup:suikawiki:0:9:" a0:anchor="27" xmlns:a0="urn:x-suika-fam-cx:markup:suikawiki:0:9:">[27]</anchor-end> SuikaWikiConfig/2.0 は、 SuikaWiki3 を期に
<anchor xmlns="urn:x-suika-fam-cx:markup:suikawiki:0:9:">SuikaWikiConfig/0.9</anchor>, <anchor xmlns="urn:x-suika-fam-cx:markup:suikawiki:0:9:">SuikaWikiConfig/1.0</anchor>, <anchor xmlns="urn:x-suika-fam-cx:markup:suikawiki:0:9:">SuikaWikiConst/0.9</anchor>,
<anchor xmlns="urn:x-suika-fam-cx:markup:suikawiki:0:9:">SuikaWikiConfig/1.1</anchor> を統一・拡張して設計されました。</p><p><anchor-end xmlns="urn:x-suika-fam-cx:markup:suikawiki:0:9:" a0:anchor="28" xmlns:a0="urn:x-suika-fam-cx:markup:suikawiki:0:9:">[28]</anchor-end> SuikaWikiConst/0.9 などは <anchor xmlns="urn:x-suika-fam-cx:markup:suikawiki:0:9:">SuikaWiki2</anchor> で使用されていた書式です。</p><p><anchor-end xmlns="urn:x-suika-fam-cx:markup:suikawiki:0:9:" a0:anchor="32" xmlns:a0="urn:x-suika-fam-cx:markup:suikawiki:0:9:">[32]</anchor-end> 2004年9月21日: <anchor-internal xmlns="urn:x-suika-fam-cx:markup:suikawiki:0:9:" a0:anchor="29" xmlns:a0="urn:x-suika-fam-cx:markup:suikawiki:0:9:">&gt;&gt;29</anchor-internal>-32 を追加。 <anchor-internal xmlns="urn:x-suika-fam-cx:markup:suikawiki:0:9:" a0:anchor="23" xmlns:a0="urn:x-suika-fam-cx:markup:suikawiki:0:9:">&gt;&gt;23</anchor-internal> の typo を修正。
<anchor-internal xmlns="urn:x-suika-fam-cx:markup:suikawiki:0:9:" a0:anchor="10" xmlns:a0="urn:x-suika-fam-cx:markup:suikawiki:0:9:">&gt;&gt;10</anchor-internal> は削除。</p><p><anchor-end xmlns="urn:x-suika-fam-cx:markup:suikawiki:0:9:" a0:anchor="34" xmlns:a0="urn:x-suika-fam-cx:markup:suikawiki:0:9:">[34]</anchor-end> 2005年2月17日: <anchor-internal xmlns="urn:x-suika-fam-cx:markup:suikawiki:0:9:" a0:anchor="33" xmlns:a0="urn:x-suika-fam-cx:markup:suikawiki:0:9:">&gt;&gt;33</anchor-internal> を追加。</p></section><section><h1>例</h1><p><anchor-end xmlns="urn:x-suika-fam-cx:markup:suikawiki:0:9:" a0:anchor="24" xmlns:a0="urn:x-suika-fam-cx:markup:suikawiki:0:9:">[24]</anchor-end><pre>#?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/</pre></p></section><section><h1>メモ</h1></section></body></html>