「Wiki処理系を作る前に知るべきこと/考えるべきこと」にて:
残念ながら、形式的な構文記述には至っていません。
世の中にひとつくらいは形式仕様を持つWiki処理系があってもいいんじゃないかと思ったり思わなかったり。
というわけで、遅きに失したけれど、Wiki構文の厳密な形式的記述の準備を始めました。
Wikiマークアップされたテキストは、XHTMLに変換することを前提にします。そこで、XMLの要素に対応するテキスト範囲(連続した部分)も「要素」と呼ぶことにします。さらに、XHTMLのpre要素に変換されるべきWikiのテキスト範囲も「pre要素」と呼ぶような、用語の流用(乱用か?)を行ないます。
以下では、「要素」という言葉を上のような意味で使います。
Wikiではテキストの改行が重要な意味を持ちます。この点は、多くのプログラミング言語やHTMLとは異なります*1。そこで、要素の内容に改行を許すか(複数のテキスト行を含むか)どうかでWikiCreoleの要素を分類してみます。
もともと、(X)HTMLの要素にはインラインとブロックの区別があるので、この分類と「1行か複数行」かの分類を組み合わせると、次のようになります。
1行ブロック要素 | h1からh6, hr |
複数行ブロック要素 | p, ol, ul, table |
1行インライン要素 | br, img, a?, tt?, URL |
複数行インライン要素 | em, strong |
特殊ブロック要素 | pre |
補足説明:
- br(Wikiマークアップは「\\」)は、「0行インライン」かもしれません :-)
- 疑問符が付いているモノは不明なものです。a要素のアンカーテキスト(リンクテキスト)に相当する部分に改行を許すかどうかがよく分かりません。インラインのNoWikiであるttも不明。おそらくは、行を超えて続けることはできないと思われます。
- URLはa要素と同じ扱いをするので、1行インライン要素の仲間に入れておきました。
- preを特別扱いしたのは、他のブロック要素が空行により終了できるのに、pre要素は空行を超えて継続できるからです。明示的な終了記号がないと、テキストの最後まで続いてしまいます。
WikiCreoleでは、blockquoteやdivに相当する要素はありません。これらを入れると再帰的階層構造が出来てしまい複雑化するのを嫌ったのでしょう。もし、blockquoteやdivを入れるなら、これらはまた別な分類にしたほうがいいようです。ラッパー要素とかコンテナ要素とか呼ぶべきものです。
ラッパー要素(コンテナ要素)は内容としてブロック要素の列を含むものですが、次の2種に分けましょう。
- 平坦なラッパー要素 -- 内容にラッパー要素を含まない
- 再帰的なラッパー要素 -- 内容にさらにラッパー要素を含んでもよい
ラッパー要素のWikiマークアップでは、開始記号と終了記号が同じだと、必然的に平坦なラッパー要素になります。再帰的なラッパー要素のマークアップは次のどちらかの方法を使います。
- 開始記号と終了記号に異なる文字列を使う。
- レベルを持った一群の開始記号を決めて、同レベルまたは上位レベルの開始記号により、今開いているラッパー要素は閉じるとする。
以上に述べたようなことは、ほんとに基本的な事項だと思うのですが、説明を見かけないので確認してみました。
*1:Pythonはプログラミング言語でも改行が意味を持ちます。HTMLでも、改行のあるなしで表示が微妙に違ってしまうことがあります