:CategoryDev

次世代Wikiエンジン作成の日に備えて (2002-07-01の、1.3時代の話題)

Wikiテキストの文法

Wikiテキスト := ブロック要素 { ブロック要素 } ;
ブロック要素 :=
   { ^ 空白 行テキスト }
  |{ ^ > 行テキスト }
  |{ ^ - 行テキスト }
  |{ ^ * 行テキスト }
  | { 空行 } { ^ 行頭書式で始まらない行テキスト } { 空行 }
  | #ブロック型プラグイン
     ;
行テキスト :=
   { インライン要素 }
  
インライン要素 ;= { 単語 | 書式指定 | #インライン型プラグイン}
う~ん。うまく書けない。。~

インライン型とブロック型の差は、プラグイン自身が「自分がどっちか」を知っているはずなので、ユーザには意識させない方がよろしいかも。
というか、単純に<div>で囲んでおくだけでブロック要素化できるはず。

上記の図で、現実は

  |{ ^ > 行テキスト }
  |{ ^ - 行テキスト }
  | { 空行 } { ^ 行頭書式で始まらない行テキスト } { 空行 }

になってないんですよねぇ…

インライン型プラグインを認めるのなら、そこで直前までのブロック要素を解除してはいけなくなるほか、行中での使用も認めなきゃいけなくなりますね。インラインなら…。それって厄介じゃないですか?

それならそれで、プラグイン構文を拡張して、行頭#は常にブロック型。インライン型はなにか別の構文、例えば「:plugin(args,...)」とかを用意するとか。まぁ、正規表現での解析が凄く厄介なのは認めます。。

今後そういう純粋なインライン型プラグインが登場することは歓迎なのですが、今あるプラグインはanameをのぞけばすべて実態はブロックなんですよね。ただ、きちんとブロック要素で囲んでいないのがあるというだけで(笑い) で、それがブロック脱出が曖昧になっていたこともあって、結果的にブロックの中に入り込んでインラインであるかのように見えていただけという。ブロックからの脱出がきちんとなされると、プラグインがインラインの状態でブロックの外に置かれるものが出るので、やはり本質的にブロックのプラグインはきちんと<div>なり<dl>なりのブロック要素で囲んでおくべきなんだと思います。

このことが#commentプラグインに典型的に現われ。<ul>との整合性に苦心することになってしまったわけで…

なるほど、

  • WikiEngineは、ブロック脱出をきちんと行う
  • プラグインは自分自身の出力を適切にブロックでくくる。
  • #comment プラグインは何とかする。例えば、挿入したメッセージ自体を箇条書でなく、別のプラグイン呼び出しの形で挿入する等。
#comment_begin  <ul> のみを吐き出す
#comment_msg('メッセージ', '投稿者', '時刻') <li>...</li>を吐き出す
#comment_msg('メッセージ', '投稿者', '時刻')
#comment        投稿フォームと</ul>を吐き出す。

だめだ、我ながら、非現実的ですね。。

あ、あとネストの考え方は、「行頭文字を取り払った後に再帰的に解析」かな?

既知の問題

  • 遅い
  • HTML的に正しくない
  • ブロック要素からの脱出に空行(<p>)を使っているため、<p>にtext-indentを設定できない。
  • ブラウザ毎に異なるHTMLの解釈の違いを吸収しきれない。(ある程度は仕方ないけど)
  • プラグインの中にインライン要素のものも混じっている

HTMLとして云々の話は、書式についての再考察も参照。

次世代へ残したいもの

話合いの上、却下されたもの*1


*1 議論の堂々巡りを避ける為で、他意はありません

トップ   編集 凍結 差分 バックアップ 添付 複製 名前変更 リロード   新規 一覧 検索 最終更新   ヘルプ   最終更新のRSS
Last-modified: 2007-04-19 (木) 00:11:13
Site admin: PukiWiki Development Team

PukiWiki 1.5.2+ © 2001-2019 PukiWiki Development Team. Powered by PHP 5.6.40-0+deb8u7. HTML convert time: 0.289 sec.

OSDN