Wikiテキスト := ブロック要素 { ブロック要素 } ; ブロック要素 := { ^ 空白 行テキスト } |{ ^ > 行テキスト } |{ ^ - 行テキスト } |{ ^ * 行テキスト } | { 空行 } { ^ 行頭書式で始まらない行テキスト } { 空行 } | #ブロック型プラグイン ; 行テキスト := { インライン要素 } インライン要素 ;= { 単語 | 書式指定 | #インライン型プラグイン}
う~ん。うまく書けない。。~
インライン型とブロック型の差は、プラグイン自身が「自分がどっちか」を知っているはずなので、ユーザには意識させない方がよろしいかも。
というか、単純に<div>で囲んでおくだけでブロック要素化できるはず。
上記の図で、現実は
|{ ^ > 行テキスト } |{ ^ - 行テキスト } | { 空行 } { ^ 行頭書式で始まらない行テキスト } { 空行 }
になってないんですよねぇ…
インライン型プラグインを認めるのなら、そこで直前までのブロック要素を解除してはいけなくなるほか、行中での使用も認めなきゃいけなくなりますね。インラインなら…。それって厄介じゃないですか?
それならそれで、プラグイン構文を拡張して、行頭#は常にブロック型。インライン型はなにか別の構文、例えば「:plugin(args,...)」とかを用意するとか。まぁ、正規表現での解析が凄く厄介なのは認めます。。
今後そういう純粋なインライン型プラグインが登場することは歓迎なのですが、今あるプラグインはanameをのぞけばすべて実態はブロックなんですよね。ただ、きちんとブロック要素で囲んでいないのがあるというだけで(笑い) で、それがブロック脱出が曖昧になっていたこともあって、結果的にブロックの中に入り込んでインラインであるかのように見えていただけという。ブロックからの脱出がきちんとなされると、プラグインがインラインの状態でブロックの外に置かれるものが出るので、やはり本質的にブロックのプラグインはきちんと<div>なり<dl>なりのブロック要素で囲んでおくべきなんだと思います。
このことが#commentプラグインに典型的に現われ。<ul>との整合性に苦心することになってしまったわけで…
なるほど、
#comment_begin <ul> のみを吐き出す #comment_msg('メッセージ', '投稿者', '時刻') <li>...</li>を吐き出す #comment_msg('メッセージ', '投稿者', '時刻') #comment 投稿フォームと</ul>を吐き出す。
だめだ、我ながら、非現実的ですね。。
あ、あとネストの考え方は、「行頭文字を取り払った後に再帰的に解析」かな?
HTMLとして云々の話は、書式についての再考察も参照。