#?SuikaWiki/0.9 - [1] [WEAK[2003-07-28 11:27:37 +00:00]] ''[[名無しさん]]'': 現在 [[SuikaWiki]] で主として使われている [[WikiPage]] の記法。 - [2] [[YukiWiki]]/[[WalWiki]] の記法を基本に、種々の修正を加えている。 (もはや別物か。) - [3] >>2 もはや非互換だけど、構文解析の基本方針は概ね同じ。大体上位互換だから、 SuikaWiki から YukiWiki にもってけば (ごみは出るけど) それなりにつかいもんになる程度には互換性はあるはず。 - [4] 詳しくは [[SuikaWiki書式]]を参照。 - [12] [WEAK[2003-12-12 14:35:39 +00:00]] ''>>3'': なんて書いていましたけど、 SuikaWiki 3 の新しい実装では完全に書き直してしまいました。とはいっても以前とほとんど互換性があります。[WEAK[誤り処理の仕方は違います。]] SuikaWiki/0.9 と YukiWiki の書式の互換性は、確かに >>3 の通りですけど、情報劣化を考えると非現実的です。 YukiWiki→SuikaWiki/0.9 はそのままでほとんどの場合 OK でしょうが、最新の YukiWiki で導入された plugin の仕組みは互換性がありませんから駄目です。 [[#comment]] * SuikaWiki/0.9 Formal Specification ** 構造 -[CODE(ABNF)[[DFN[文書]] := 頭部 本体部]] -[CODE(ABNF)[[DFN[頭部]] := '#?SuikaWiki/0.9' *(*WSP 引数) *WSP 改行]] -[CODE(ABNF)[[DFN[引数]] := 名前 "=" <引用文字列 (中身は引数値並び)>]] -[CODE(ABNF)[[DFN[引数値並び]] := 引数値 *("," 引数値)]] -[CODE(ABNF)[[DFN[引数値]] := 1*(図形文字 −",")]] 引数: :[CODE[default-name]]:既定の入力者名。 [[WikiForm]] で入力者の名前を求める場合、既定値として使用する。引数値は1つだけ指定できる。この引数の既定値は実装依存。 :[CODE[import]]:実体定義の輸入。[CODE(ABNF)[引数値]]は、 [[WikiName]] として解釈する。既定値は、「なし」。 :[CODE[interactive]]:対話的内容かどうか。値は [CODE[yes]] または [CODE[no]] (既定値)。 実際の処理は実装依存。動的に変化する [[WikiForm]] を含んでいるような場合に都合よくキャッシュ制御することを想定している。 :[CODE[obsolete]]:その WikiPage は既に廃止されているかどうか。 [CODE[yes]] または [CODE[no]] (既定値)。 :[CODE[page-icon]]:[[WikiPage]] として表示した時に [[favicon]] として使う画像を定義する WikiName。[WEAK[その WikiName の WikiPage に存在する画像かもしれないし、その WikiPage の favicon かもしれないし、その辺は実装依存。]]引数値は1つだけ指定できる。既定値は実装依存。 ** ブロック水準要素 -[CODE(ABNF)[[DFN[本体部]] := *(ブロック)]] -[CODE(ABNF)[[DFN[ブロック]] := 段落 / 見出し / 並び / 見出し付き並び / 引用 / 整形済み文 / 編集 / 表 / 空ブロック]] -[CODE(ABNF)[[DFN[空ブロック]] := 改行]] -[CODE(ABNF)[[DFN[段落]] := [実体参照 / フォーム] 行 改行 ブロックの続き]] -[CODE(ABNF)[[DFN[ブロックの続き]] := 行 / 並び / 見出し付き並び / 整形済み文 / 編集 / 表]] [CODE(ABNF)[段落]]の最初の行の一番最初に[CODE(ABNF)[実体参照]]または[CODE(ABNF)[フォーム]]があるときは、互換性のため特別扱いします。 [CODE(ABNF)[実体参照]]を置換した内容や[CODE(ABNF)[フォーム]]を HTML などで出力する時に本来なら行内要素のみである必要がありますが、 この位置にある場合はその制限が課せられません。 (ブロック水準に置換されるならブロックとして、そうでないなら行内として振舞います。) [CODE(ABNF)[空ブロック]]は、それがなければ前のブロックに含まれてしまうがそれを望まない時に自由に挿入できます。 -[CODE(ABNF)[[DFN[見出し]] := 1*"*" *WSP 行 改行]] 見出しの水準は星一つが一番大きく、任意個の深さにできます。 途中で水準が飛んでも構いませんが、その時はその位置で暗黙のうちに [CODE(XHTMLe)[[[section]]]] が複数個同時に始まると解釈されます。 [WEAK[一般的には文書構造として異常です。]] -[CODE(ABNF)[[DFN[並び]] := 1*("-" / "=") *WSP 行 改行 ブロックの続き]] -[CODE(ABNF)[[DFN[見出し付き並び]] := ":" *WSP 行 *WSP ":" *WSP 行 改行 ブロックの続き]] 最初の記号連続の、最後が "-" なら順序なし、最後が "=" なら順序付きとします。 最後以外は個数だけが重要で、種類は意味を持ちません。 [PRE[ - 順序なし A - 順序なし B -= 順序付き B.1 -= 順序付き B.2 -- 順序なし B.A =- 順序なし B.B - 順序なし C ]PRE] 水準が飛んでいてはいけませんが、実装は飛んでいても適当に扱わないといけません。 -[CODE(ABNF)[[DFN[引用]] := 1*( (1*">" *WSP 行 −(">>" 数字 行)) 改行 ブロックの続き )]] 引用符で始まる行は、引用部内のブロック境界として作用します。 [PRE[ > 段落1 段落1の続きの文 > 段落2 段落2の続きの文 ]PRE] 引用符2つに[CODE(ABNF)[数字]]が続くものは[CODE(ABNF)[引用]]ではなく[CODE(ABNF)[内部リンク始点]]とみなします。 -[CODE(ABNF)[[DFN[整形済み文]] := '[PRE' [級指定] '[' *WSP 改行 *(行 改行) ']PRE]' *WSP 改行 / 廃止整形済み文]] -[CODE(ABNF)[[DFN[廃止整形済み文]] := WSP 行 改行 *(行 改行)]] -[CODE(ABNF)[[DFN[編集]] := '[' ('INS' / 'DEL') [級指定] '[' *WSP 改行 本体部 ']' ('INS' / 'DEL') ']' *WSP 改行]] [[空白]]で始まる行から始まるブロックは整形済みブロックとしていましたが、 非推奨とします。タグ指定方式を使ってください。 なお、最初の空白もデータの一部とします。 -[CODE(ABNF)[[DFN[表]] := 1*表の行]] -[CODE(ABNF)[[DFN[表の行]] := 1*("," こま) 改行]] -[CODE(ABNF)[[DFN[こま]] := *WSP ( ( 行 − ((行 ("," / <">) 行) / "==") ) / <引用文字列 (中身は行)> / 前のこまの続きです。 ) *WSP]] -[CODE(ABNF)[[DFN[前のこまの続きです。]] := "=="]] [CODE(ABNF)[前のこまの続きです。]]だけがこまの内容である時には、 直前のこまと結合します。直前のこまが連結したこまであっても構いません。 一番最初のこまが[CODE(ABNF)[前のこまの続きです。]]であるときの扱いは実装依存とします。 ** 行内要素 -[CODE(ABNF)[[DFN[行]] := [終点アンカー番号] *(内部参照リンク始点 / 外部参照リンク始点 / 括弧名 / タグ付き行内要素 / フォーム / 強調 / 実体参照 / 文字データ)]] -[CODE(ABNF)[[DFN[文字データ]] := 1*図形文字 ‐()]] -[CODE(ABNF)[[DFN[終点アンカー番号]] := "[" 1*数字 "]"]] -[CODE(ABNF)[[DFN[内部参照リンク始点]] := ">>" 1*数字]] 値 [CODE[0]] が正しく扱われることは保証されません。 先導零は使用しないことが望ましいですが、実装は対応しなければなりません。 しかしそれが始点・終点で正しく一致することは保証されません。 -[CODE(ABNF)[[DFN[外部参照リンク始点]] := "<" 外部参照識別子 ">"]] -[CODE(ABNF)[[DFN[外部参照]] := <[[URI参照]] ([[scheme]] 名は小文字でなければ'''ならない''')> / 参照方式 ":" 参照引数]] -[CODE(ABNF)[[DFN[参照方式]] := 1*大文字]] -[CODE(ABNF)[[DFN[参照引数]] := 1*(図形文字 ‐("<" / ">" / <">) / 引用文字列)]] 定義されている参照方式: ,参照方式名 ,参照引数の形式 ,意味 ,[CODE[IW]] ,[CODE(ABNF)[(識別子 / 引用文字列) ":" (識別子 / 引用文字列)]] (拡張検討中) ,"[[InterWiki]] による参照 (最初の引数が [[InterWikiName]], 2つ目の引数がそれへの引数)" ,[CODE[MAIL]] ,[CODE(ABNF)[< (但し最初と最後に [[FWS]] を使ってはいけない。図形文字以外も使ってはいけない。)>]] ,電子メイルの宛先 ,[CODE[URI]] ,[CODE(ABNF)[]] ,URI 参照。 ,[CODE[URL]] ,[CODE(ABNF)[]] ,URL。URL 仕様書の [CODE(URI)[]] に対応。 -[CODE(ABNF)[[DFN[括弧名]] := "[" "[" WikiName 終了タグ]] -[CODE(ABNF)[[DFN[WikiName]] := 1*図形文字 ‐("#" *図形文字 / *図形文字 終了タグ *図形文字)]] -[CODE(ABNF)[[DFN[タグ付き行内要素]] := 開始タグ 行内要素 *(中間タグ 行内要素) 終了タグ]] -[CODE(ABNF)[[DFN[開始タグ]] := "[" 要素型名 [級指定] "["]] -[CODE(ABNF)[[DFN[中間タグ]] := "]" 1*WSP "["]] -[CODE(ABNF)[[DFN[終了タグ]] := "]" [内部参照リンク始点 / 外部参照リンク始点] "]"]] -[CODE(ABNF)[[DFN[要素型名]] := 1*大文字]] 要素型: ,要素型名 ,級指定 ,中間タグ個数 ,内部参照リンク始点 ,外部参照リンク始点 ,意味 ,[CODE[ABBR]] ,○ ,0〜1 ,× ,× ,略語 ,[CODE[CODE]] ,○ ,0 ,× ,× ,符号 ,[CODE[DEL]] ,○ ,0 ,○ ,○ ,削除 ,[CODE[DFN]] ,○ ,0 ,× ,× ,被定義語 ,[CODE[INS]] ,○ ,0 ,○ ,○ ,挿入 ,[CODE[KBD]] ,○ ,0 ,× ,× ,鍵盤入力・鍵名 ,[CODE[Q]] ,○ ,0 ,○ ,○ ,引用句 ,[CODE[RUBY]] ,○ ,1〜2 ,× ,× ,ルビ ,[CODE[RUBYB]] ,○ ,1 ,× ,× ,従属的ルビ ,[CODE[SAMP]] ,○ ,0 ,× ,× ,例示 ,[CODE[SUP]] ,○ ,0 ,× ,× ,上付き ,[CODE[SUB]] ,○ ,0 ,× ,× ,下付き ,[CODE[VAR]] ,○ ,0 ,× ,× ,変数・変化量 ,[CODE[WEAK]] ,○ ,0 ,× ,× ,弱調 ,括弧名 ,− ,− ,○ ,× ,語集団化 [CODE[○]]は指定可能、[CODE[×]]・[CODE[0]] は指定に現時点で意味がないことを表します。 [CODE[INS]] および [CODE[PRE]] は、行のはじめにあるとブロック水準要素としてのそれらと紛らわしくなるので、そうしてはいけません。 -[CODE(ABNF)[[DFN[フォーム]] := 汎用フォーム / 特定フォーム]] -[CODE(ABNF)[[DFN[汎用フォーム]] := "[" "[" '#form:' フォーム欄 ":" フォーム欄 [":" フォーム欄] "]" "]"]] -[CODE(ABNF)[[DFN[フォーム欄]] := "'" *(図形文字 −("'" / "\") / "\" 図形文字) "'"]] -[CODE(ABNF)[[DFN[特定フォーム]] := "[" "[" "#" 名前 [":" 特定フォーム引数] "]" "]"]] -[CODE(ABNF)[[DFN[特定フォーム引数]] := 識別子 *(":" 識別子)]] [CODE(ABNF)[汎用フォーム]]の[CODE(ABNF)[フォーム欄]]はそれぞれ入力, 雛形, 選択肢指定です。 それぞれ [[WikiForm]] の定義により解釈します。 現在定義されている特定フォーム: ,特定フォーム名 ,識別子部分の構文 ,意味 ,[CODE[comment]] ,(使用しない) ,注釈入力欄 既に廃止された特定フォーム: ,特定フォーム名 ,識別子部分の構文 ,意味 ,[CODE[embed]] ,[CODE(ABNF)[['IMG:'] 識別子]] ,引数を WikiName とみなし、 HTML 出力時にその WikiPage を埋め込む。 [CODE[IMG:]] がついているときには、画像として埋め込む。 ,[CODE[rcomment]] ,(使用しない) ,注釈入力欄 (逆順) ,[CODE[searched]] ,[CODE(ABNF)[識別子]] ,HTML 出力時、引数を検索した結果をその位置に挿入 -[CODE(ABNF)[[DFN[強調]] := "''" (行内要素 −強調) "''" / "'''" (行内要素 −強調) "'''"]] 引用符は2つよりも3つの方が強い強調とします。 -[CODE(ABNF)[[DFN[実体参照]] := "__&&" 1*(図形文字 ‐ "&") "&&__" 実体参照は、その名前で表される、 輸入されている実体の内容を行内要素の文脈で構文解析した結果で置換します。 (ただし、ブロックとして扱われる特別な位置の実体参照は、ブロック水準の文脈で構文解析します。) 実体の構文はその中で完結していなければなりません。例えば、[CODE(ABNF)[開始タグ]]は実体内、 [CODE(ABNF)[終了タグ]]は本文内のような曲芸はできません。 指定された実体が見つからない時の処理は実装依存です。 -[CODE(ABNF)[[DFN[文字データ]] := 1*図形文字]] 他のマーク付けとみなされない文字列は、そのままの文字列として解釈します。 ただし、マークとよく似ているもののそうではない文字列の処理は実装依存とします。 たとえば、対応する[CODE(ABNF)[終了タグ]]のない[CODE(ABNF)[終了タグ]]や、 [CODE(ABNF)[開始タグ]]の最後の [CODE(ABNF)[ ] ]] が欠けたものなどの処理は不定です。 なお、 SuikaWiki/0.9 で今後新たな構文が導入されることはありません。 ** 基本字句 -[CODE(ABNF)[[DFN[識別子]] := 1*(基本ラテン文字 / 数字 / "-" / 仮名 / 漢字)]] -[CODE(ABNF)[[DFN[名前]] := 1*(小文字 / "-")]] -[CODE(ABNF)[[DFN[基本ラテン文字]] := 大文字 / 小文字]] -[CODE(ABNF)[[DFN[大文字]] := 'A' / 'B' / ... / 'Y' / 'Z' ;; 26文字]] -[CODE(ABNF)[[DFN[小文字]] := 'a' / 'b' / ... / 'y' / 'z' ;; 26文字]] -[CODE(ABNF)[[DFN[数字]] := "0" / "1" / ... / "8" / "9" ;; 10文字]] -[CODE(ABNF)[[DFN[仮名]] := <厳密には将来定義する。>]] -[CODE(ABNF)[[DFN[漢字]] := <厳密には将来定義する。>]] -[CODE(ABNF)[[DFN[引用文字列]] := <"> *((図形文字 −("\" / <">)) / "\" 図形文字) <">]] -[CODE(ABNF)[[DFN[改行]] := CRLF / CR / LF]] [CODE(ABNF)[CRLF]] を外部正規形, [CODE(ABNF)[LF]] を内部正規形とします。 システム間の情報交換 ([[MIME]] や [[HTTP]] での転送を含むが、 ファイル・システムや内部データベースへの保存は含まない。) の際には外部正規形を使います。 内部処理では内部正規形の使用を推奨します。 -[CODE(ABNF)[[DFN[級指定]] := "(" *(図形文字 −("(" / ")" / "\")) ")"]] 級指定の中身は XML 的[[名前字句並び]]になっていないといけません。 但し、 [CODE[0]] だけ (つまり級指定 [CODE[(0)]]) は不可とします。 * 符号化文字集合 [5] SuikaWiki/0.9 文書の表現に使用する[[符号化文字集合]]は特に規定しません。 ただし、最低限 [[ISO/IEC646]] の[[国際基準版]]の文字集合を含んでいないと非実用的でしょう。 転送プロトコル等ではそのプロトコルによって使用している符号化方式を識別します。 * 書式識別子 ** インターネット媒体型 [6] [[MIME]] や [[HTTP]] などで使用する[[媒体型]]としては、 [CODE(MIME)[[[text/x-suikawiki]]]] を使います。 ([CODE(MIME)[[[text/*]]]] を使っていい程度に人間可読でしょう。) [7] 媒体型引数: ,[CODE(MIME)[[[charset]]]] ,charset ,(必須) ,Charset。 ,[CODE(MIME)[[[version]]]] ,[[token]] ,(必須) ,版。 [CODE(MIME)[0.9]] でなければ'''ならない'''。 [8] なお、 MIME で使うときには本文が正規化の対象になります。 [[#comment]] ** 拡張子 [9] [[Windoze]] などで[[ファイル名]]に使用する[[拡張子]]は、特に決まっていません。 [[SuikaWiki]] の実装では、 [[YukiWiki]] 以来の伝統 (or 惰性) で [CODE(file)[.txt]] になっています。 [[#comment]] * メモ [10] [WEAK[2003-12-12 14:24:32 +00:00]] ''[[わかば]]'': 今更ですが、構文を [[ABNF]] でちゃんと書いてみました。[WEAK[新しい実装がほぼできたので、それを元に整理しました。]] [11] 拡張可能部分のうち、[CODE(ABNF)[頭部]]の[CODE(ABNF)[引数]]と、[CODE(ABNF)[要素型]]の種類については確定で、今後追加しません。[CODE(ABNF)[要素型]]の引数の解釈 ([CODE(ABNF)[外部参照リンク始点]]とかに意味を持たせるか) や[CODE(ABNF)[参照方式]]や[CODE(ABNF)[特定フォーム]]の種類はまだ検討の余地があります。 [13] >>10-11 [CODE(ABNF)[頭部]][CODE(ABNF)[引数]] [CODE(wiki)[interactive]] が抜けていたので追加しました。 新たに[CODE(ABNF)[外部参照リンク始点]]の[CODE(ABNF)[参照方式]]に [CODE(wiki)[URI]] を追加しました。