[1] SuikaWiki/0.9 は、 SuikaWiki2 で主として使われている WikiPage の記法です。
[2] YukiWiki/WalWiki の記法を基本に、種々の修正を加えている。 (もはや別物か。)
文書 := 頭部 本体部
頭部 := '#?SuikaWiki/0.9' *(*WSP 引数) *WSP 改行
引数 := 名前 "=" <引用文字列 (中身は引数値並び)>
引数値並び := 引数値 *("," 引数値)
引数値 := 1*(図形文字 −",")
引数:
default-name
import
引数値
は、 WikiName として解釈する。既定値は、「なし」。interactive
yes
または no
(既定値)。
実際の処理は実装依存。動的に変化する WikiForm を含んでいるような場合に都合よくキャッシュ制御することを想定している。obsolete
yes
または no
(既定値)。page-icon
本体部 := *(ブロック)
ブロック := 段落 / 見出し / 並び / 見出し付き並び / 引用 / 整形済み文 / 編集 / 表 / 空ブロック
空ブロック := 改行
段落 := [実体参照 / フォーム] 行 改行 ブロックの続き
ブロックの続き := 行 / 並び / 見出し付き並び / 整形済み文 / 編集 / 表
段落
の最初の行の一番最初に実体参照
またはフォーム
があるときは、互換性のため特別扱いします。
実体参照
を置換した内容やフォーム
を HTML などで出力する時に本来なら行内要素のみである必要がありますが、
この位置にある場合はその制限が課せられません。 (ブロック水準に置換されるならブロックとして、そうでないなら行内として振舞います。)
空ブロック
は、それがなければ前のブロックに含まれてしまうがそれを望まない時に自由に挿入できます。
見出しの水準は星一つが一番大きく、任意個の深さにできます。
途中で水準が飛んでも構いませんが、その時はその位置で暗黙のうちに
section
が複数個同時に始まると解釈されます。
一般的には文書構造として異常です。
最初の記号連続の、最後が "-" なら順序なし、最後が "=" なら順序付きとします。 最後以外は個数だけが重要で、種類は意味を持ちません。
- 順序なし A - 順序なし B -= 順序付き B.1 -= 順序付き B.2 -- 順序なし B.A =- 順序なし B.B - 順序なし C
水準が飛んでいてはいけませんが、実装は飛んでいても適当に扱わないといけません。
引用符で始まる行は、引用部内のブロック境界として作用します。
> 段落1 段落1の続きの文 > 段落2 段落2の続きの文
引用符2つに数字
が続くものは引用
ではなく内部リンク始点
とみなします。
整形済み文 := '[PRE' [級指定] '[' *WSP 改行 *(行 改行) ']PRE]' *WSP 改行 / 廃止整形済み文
廃止整形済み文 := WSP 行 改行 *(行 改行) ;; 注 >>16, >>17
編集 := '[' ('INS' / 'DEL') [級指定] '[' *WSP 改行 本体部 ']' ('INS' / 'DEL') ']' *WSP 改行 ;; 注 >>17
編集 := 挿入部 / 削除部
挿入部 := '[' 'INS' [級指定] '[' *WSP 改行 本体部 ']' 'INS' ']' *WSP 改行 ;; 注 >>17
削除部 := '[' 'DEL' [級指定] '[' *WSP 改行 本体部 ']' 'DEL' ']' *WSP 改行 ;; 注 >>17
空白で始まる行から始まるブロックは整形済みブロックとしていましたが、 非推奨とします。タグ指定方式を使ってください。 なお、最初の空白もデータの一部とします。
[16] 編集
ブロック内にあるときは、直近の編集
ブロックを終わらせる終了タグがあればその編集
ブロックもろとも閉じます。
たとえば、
[INS[ 整形済み ブロック ]INS]
と
[INS[ [PRE[ 整形済み ブロック ]PRE] ]INS]
は同義です。
[17] 廃止でない整形済み文
は、
最初に ']PRE]' *WSP 改行
を見つけたところで終了します。
対して編集
は、入れ子に出来ます。
表 := 1*表の行
表の行 := 1*("," こま) 改行
こま := *WSP ( ( 行 − ((行 ("," / <">) 行) / "==") ) / <引用文字列 (中身は行)> / 前のこまの続きです。 ) *WSP
こま := *WSP ( (行 − (<"> 行 / 行 "," 行 / 前のこまの続きです。)) / <引用文字列 (中身は行)> / 前のこまの続きです。) *WSP
;; 2004-01-01 訂正前のこまの続きです。 := "=="
前のこまの続きです。
だけがこまの内容である時には、
直前のこまと結合します。直前のこまが連結したこまであっても構いません。
一番最初のこまが前のこまの続きです。
であるときの扱いは実装依存とします。
値 0
が正しく扱われることは保証されません。
先導零は使用しないことが望ましいですが、実装は対応しなければなりません。
しかしそれが始点・終点で正しく一致することは保証されません。
外部参照リンク始点 := "<" 外部参照識別子 ">"
外部参照 := <URI参照 (scheme 名は小文字でなければならない)> / 参照方式 ":" 参照引数
参照方式 := 1*大文字
参照引数 := 1*(図形文字 ‐("<" / ">" / <">) / 引用文字列)
定義されている参照方式:
参照方式名 | 参照引数の形式 | 意味 |
IW | (識別子 / 引用文字列) ":" (識別子 / 引用文字列) (拡張検討中) | InterWiki による参照 (最初の引数が InterWikiName, 2つ目の引数がそれへの引数) |
MAIL | <<RFC 2822 addr-spec> ‐<RFC 2822 obs-addr-spec> (但し最初と最後に FWS を使ってはいけない。図形文字以外も使ってはいけない。)> | 電子メイルの宛先 |
URI | <URI 参照> | URI 参照。 |
URL | <URI 参照 (意味的に URL でなければならない。)> | URL。URL 仕様書の <URL:http://foo.example/> に対応。 |
[53] 参照方式名
URL
は、非推奨とします。代わりに URI
または無指定とするべきです。
タグ付き行内要素 := 開始タグ 行内要素 *(中間タグ 行内要素) 終了タグ
開始タグ := "[" 要素型名 [級指定] "["
中間タグ := "]" 1*WSP "["
終了タグ := "]" [内部参照リンク始点 / 外部参照リンク始点] "]"
要素型名 := 1*大文字
要素型:
要素型名 | 級指定 | 中間タグ個数 | 内部参照リンク始点 | 外部参照リンク始点 | 意味 |
ABBR | ○ | 0〜1 | × | × | 略語 |
CODE | ○ | 0 | × | × | 符号 |
DEL | ○ | 0 | ○ | ○ | 削除 |
DFN | ○ | 0 | × | × | 被定義語 |
INS | ○ | 0 | ○ | ○ | 挿入 |
KBD | ○ | 0 | × | × | 鍵盤入力・鍵名 |
Q | ○ | 0 | ○ | ○ | 引用句 |
RUBY | ○ | 1〜2 | × | × | ルビ |
RUBYB | ○ | 1 | × | × | 従属的ルビ |
SAMP | ○ | 0 | × | × | 例示 |
SUP | ○ | 0 | × | × | 上付き |
SUB | ○ | 0 | × | × | 下付き |
VAR | ○ | 0 | × | × | 変数・変化量 |
WEAK | ○ | 0 | × | × | 弱調 |
括弧名 | − | − | ○ | × | 語集団化 |
○
は指定可能、×
・0
は指定に現時点で意味がないことを表します。
INS
および PRE
は、行のはじめにあるとブロック水準要素としてのそれらと紛らわしくなるので、そうしてはいけません。
[55] SuikaWiki/0.10 や他の版では、 SuikaWiki/0.9 で定義されていない要素型名が定義されているかもしれません。 SuikaWiki/0.9 構文解析におけるその解釈は、 実装依存とします。
フォーム := 汎用フォーム / 特定フォーム
汎用フォーム := "[" "[" '#form:' フォーム欄 ":" フォーム欄 [":" フォーム欄] "]" "]"
汎用フォーム := "[" "[" '#form' [フォーム名指定] ":" フォーム欄 ":" フォーム欄 [":" フォーム欄] "]" "]"
フォーム欄 := "'" *(図形文字 −("'" / "\") / "\" 図形文字) "'"
特定フォーム := "[" "[" "#" 名前 [":" 特定フォーム引数] "]" "]"
特定フォーム引数 := 識別子 *(":" 識別子)
汎用フォーム
のフォーム欄
はそれぞれ入力, 雛形, 選択肢指定です。
それぞれ WikiForm の定義により解釈します。
[56] フォーム名
[21] フォーム名
は、そのフォームの名前です。
この名前は文書内で固有でなければなりません。
フォーム名として実際に使える構文 (文字の種類など)
は、 WikiForm の定義によります。
現在定義されている特定フォーム:
特定フォーム名 | 識別子部分の構文 | 意味 |
comment | (使用しない) | 注釈入力欄 |
form | (使用しない) | (予約) 汎用フォーム |
既に廃止された特定フォーム:
特定フォーム名 | 識別子部分の構文 | 意味 |
embed | ['IMG:'] 識別子 | 引数を WikiName とみなし、 HTML 出力時にその WikiPage を埋め込む。 IMG: がついているときには、画像として埋め込む。 |
rcomment | (使用しない) | 注釈入力欄 (逆順) |
searched | 識別子 | HTML 出力時、引数を検索した結果をその位置に挿入 |
[22] 特定フォーム名 form
は、汎用フォームであることを表す名前として予約しますが、
実際に特定フォーム
で使用してはなりません。
強調 := "" (行内要素 −強調) "" / "" (行内要素 −強調) ""
強調 := "'" "'" (行内要素 −強調) "'" "'" / "'" "'" "'" (行内要素 −強調) "'" "'" "'"
引用符は2つよりも3つの方が強い強調とします。
実体参照は、その名前で表される、
輸入されている実体の内容を行内要素の文脈で構文解析した結果で置換します。
(ただし、ブロックとして扱われる特別な位置の実体参照は、ブロック水準の文脈で構文解析します。)
実体の構文はその中で完結していなければなりません。例えば、開始タグ
は実体内、
終了タグ
は本文内のような曲芸はできません。
指定された実体が見つからない時の処理は実装依存です。
[59] 実体参照
は、非推奨とします。
実装は、実体参照
に対応しなくても構いません。
対応しない場合に実体参照
をどう処理するかは、
実装依存とします。
[47] 文字データ
他のマーク付けとみなされない文字列は、そのままの文字列として解釈します。
ただし、マークとよく似ているもののそうではない文字列の処理は実装依存とします。
たとえば、対応する終了タグ
のない終了タグ
や、
開始タグ
の最後の ]
が欠けたものなどの処理は不定です。
なお、 SuikaWiki/0.9 で今後新たな構文が導入されることはありません。
識別子 := 1*(基本ラテン文字 / 数字 / "-" / 仮名 / 漢字)
名前 := 1*(小文字 / "-")
基本ラテン文字 := 大文字 / 小文字
大文字 := 'A' / 'B' / ... / 'Y' / 'Z' ;; 26文字
小文字 := 'a' / 'b' / ... / 'y' / 'z' ;; 26文字
数字 := "0" / "1" / ... / "8" / "9" ;; 10文字
仮名 := <厳密には将来定義する。>
漢字 := <厳密には将来定義する。>
[37] 引用文字列
[60] システム間の情報交換 (MIME や HTTP での転送を含むが、 ファイル・システムや内部データベースへの保存は含まない。) の際には外部正規形を使います。 内部処理では内部正規形の使用を推奨します。
[61]
SuikaWiki/0.9 構文解析器が DOM
またはそれに類する木を構築する場合、
改行
は内部正規形に統一するべきです。
級指定 := "(" *(図形文字 −("(" / ")" / "\")) ")"
級指定 := "(" 級並び ")"
級並び := *(図形文字 −("(" / ")" / "\" / "[" / "]")) −"0"
[63]
級指定の中身は XML 的名前字句並びになっていないといけません。
但し、 0
だけ (つまり級指定 (0)
) は不可とします。
[5] SuikaWiki/0.9 文書の表現に使用する符号化文字集合は特に規定しません。 ただし、最低限 ISO/IEC 646 の国際基準版の文字集合を含んでいないと非実用的でしょう。
転送プロトコル等ではそのプロトコルによって使用している符号化方式を識別します。
[6] MIME や HTTP などで使用する媒体型としては、
text/x-suikawiki
を使います。
(text/*
を使っていい程度に人間可読でしょう。)
[7] 媒体型引数:
引数名 | 引数値 | 既定値 | 説明 |
charset | MIME.charset | (必須) | Charset。 |
version | HTTP.token | (必須) | 版。 0.9 でなければならない。 |
[8] なお、 MIME で使うときには本文が正規化の対象になります。
[27] charset
引数は、
内部データベースでの蓄積や他のマーク付け言語の文書内の埋め込み、
あるいは Accept
欄などで必要がないか、あると有害な時には省略しても構いません。
そうでない場合 (MIME や HTTP 一般)
では必須です。
[67]
実装は、version
引数と頭部
で指定された版が異なる場合、
version
引数の指定を優先しなければなりません。
[68]
実装は、処理しようとする実体の
version
引数の値が
0.9
の時、その実体本体を処理しなければなりません。
それ以外の値の時、その実体本体を処理しても構いません。
[9] Windoze などでファイル名に使用する拡張子は、特に決まっていません。
SuikaWiki の実装では、 YukiWiki 以来の伝統 (or 惰性) で
.txt
になっています。
[28] 生成規則頭部
(>>29) を、次のとおり置き換える。
頭部
の
'#?SuikaWiki/0.9'
の部分を
'#?SuikaWikiImage/0.9'
とし、
引数
を記述する必要がある。
従って、 SuikaWikiImage/0.9 では頭部
を空にできない。[57] フォーム名
(>>20) を、
次の通り置き換えます。
[10] 2003-12-12 14:24:32 +00:00 わかば: 今更ですが、構文を ABNF でちゃんと書いてみました。新しい実装がほぼできたので、それを元に整理しました。
[11] 拡張可能部分のうち、頭部
の引数
と、要素型
の種類については確定で、今後追加しません。要素型
の引数の解釈 (外部参照リンク始点
とかに意味を持たせるか) や参照方式
や特定フォーム
の種類はまだ検討の余地があります。
[13] >>10-11 頭部
引数
interactive
が抜けていたので追加しました。
新たに外部参照リンク始点
の参照方式
に URI
を追加しました。
[14] 2004年1月1日: こま
の定義に誤りが見つかったので訂正しました。
引用文字列
ではないこま
には二重引用符
(<">
) を含められないように定義していましたが、
従来の実装や文書ではこれを認めていました。
そこで、二重引用符を認めないのは最初の1文字だけとしました。
なお、廃止整形済み文
の閉じられる場所の実装は
SuikaWiki 1 以来安定していません。
一文字目に非空白文字がくる行の直前で終わることにしていたときもありました。
>>16 の規定は、 (たぶん) SuikaWiki 2 の最新の実装と一致します。 SuikaWiki 3 の最新版もそう実装しています。
[25] 2004年1月30日: >>20-26 を追加・修正しました。
汎用フォーム
の定義で、
フォーム名指定
が抜けていました。フォーム名
, フォーム名指定
を追加しました。フォーム名
についての規定を追加しました。form
を表に加えました。
>>23 それに関する規定を追加しました。強調
の式が SuikaWiki/0.9 的に解釈されてしまうので、表現を変更しました。[31] 2004年6月13日: 技術訂正 >>28。
この修正は、 #?SuikaWiki/0.9
の魔法行を必須ではないことにします。
SuikaWiki2 以来、旧来の文書との互換性のために、
魔法行がなくても SuikaWiki/0.9 形式と認めてきました。
また、 SuikaWiki3 の新しい実装では媒体型を魔法行ではなく外部情報で判断するので、
魔法行を含める必然性がなくなりました。
これらの理由から、 #?SuikaWiki/0.9
は省略してよいこととします。
[32] 2004年8月8日: >>16 の例示の一部が SuikaWiki/0.9 のタグと認識されてしまうので修正しました。
[70] 2006年5月5日: >>34-69 を削除とマーク付けまたは追加しました。
変更点は:
[3] >>2 もはや非互換だけど、構文解析の基本方針は概ね同じ。大体上位互換だから、 SuikaWiki から YukiWiki にもってけば (ごみは出るけど) それなりにつかいもんになる程度には互換性はあるはず。
[12] 2003-12-12 14:35:39 +00:00 >>3: なんて書いていましたけど、 SuikaWiki 3 の新しい実装では完全に書き直してしまいました。とはいっても以前とほとんど互換性があります。誤り処理の仕方は違います。 SuikaWiki/0.9 と YukiWiki の書式の互換性は、確かに >>3 の通りですけど、情報劣化を考えると非現実的です。 YukiWiki→SuikaWiki/0.9 はそのままでほとんどの場合 OK でしょうが、最新の YukiWiki で導入された plugin の仕組みは互換性がありませんから駄目です。
[15] 古い文書では頭部
が存在しませんから、実装は存在しない文書も扱えるとよいかもしれません。また、内部処理形式等としては本体部
だけを処理することとしてもいいでしょう。頭部
が SuikaWiki/0.9
だけ (先頭に #?
がない。) の形式が一時期使われていましたが、実装はこの形式に対応する必要はありません。 (SuikaWiki 2 も、かなり昔に切り捨てています。 SuikaWiki 3 はそもそも未対応。最初の段落とみなします。)
[18] 編集
ブロック内に見出し
が入ると、実装によってはうまく扱えないことがあります。
たとえば、
* 第2章
** 2.1
あいうえお。
[INS[
** 2.2
かきくけこ。
]INS]
]PRE]
は、 SuikaWiki 2 では思った通りの結果が得られますが、 SuikaWiki 3 では
* 第2章
** 2.1
あいうえお。
[INS[
]INS]
*** 2.2
かきくけこ。
となってしまいます。
これは、 SuikaWiki 3 で内部的に行っている節の処理との相性が悪いために起こります。 SuikaWiki 3 は内部的に
[section[ [heading[ 第2章 ]heading] [section[ [heading[ 2.1 ]heading] あいうえお。 [INS[ ]INS] [section[ [heading[ 2.2 ]heading] かきくけこ。 ]section] ]section] ]section]
と扱うからです。 [INS[
の直前で節を閉じることが出来れば思った通りの結果が得られるはずですが、
SuikaWiki/0.9 では陽に閉じる方法がありません。
SuikaWiki/0.9 仕様の立場としては、 この例のような文書の書き方は望ましくなく、 (SuikaWiki/0.9 で表現できる範囲を超えており、) どう処理されるかは実装依存としておきます。
[33] 仕様書の構文にいくつか間違いが見つかっているので修正を検討中です。。。 (名無しさん 2005-02-03 22:46:34 +00:00)
開始タグ
と中間タグ
が拡張され、 言語札を指定することができます。