・Wikipedia(en)での説明
Textile (markup language) - Wikipedia, the free encyclopedia
このWikipedia のページでは、いくつかのサイトが紹介されている。
classTextile.php という PHP 用のTextile を配布しているところ。デモもできる。
Textile
また別のデモページ
Textism: Tools: Textile
この二番目のデモページでは、右下の所のリンクを押すと、サンプルコードがロードされて、変換ボタンを押すと、変換されたコードと、その下にそのコードが実際に表示される。
そこで、ここのTextileのコードを最初のデモページにコピーしてみると、ほとんど同じように表示されるが、コードの部分がくずれる。
今度は、最初のサイトから PHPで書かれた textile をダウンロードして、例のぶろぐん+フィルタモジュールで実際に使ってみると、これまた、おかしい。サンプルコードを変換させてみると、上で見つけた問題だけでなくリスト表示も崩れてしまう。
Multi-level list:
- one
- aye
- bee
- see
- two
- x
- y
- three
classTextile.php のソースコードを眺めて原因を調べてみた。
いろいろ分かった。List を表示している関数の中のループで、次の行の参照目的で next 関数を使っている。nextを使うとポインタが動いてしまうので、リストのレベルの変化がうまく反映できない。またコード部分が崩れてしまうのは、常に空行がブロックの区切になっているからだった。開始タグと終了タグが空行で分断されて別々のブロックになってしまう。そのためタグが閉じることができない。これは仕様といってしまえば、それまでなんだけど、プログラムのコードの引用で空行を使わないというのはとても不便だろう。
ふと、このサイトで紹介されている Textpattern というサイト構築ソフトをダウンロードしてみた。textile 使われているのは書いてあったので知っていたけど、必要ではなかったので今まで中味をよくよく確かめることもなかった。同じものを使っているとばかり思っていたし。でも、実際に中のファイルを調べてみるとリビジョン番号が違っていた。単品で公開されているものの日付は2006/10/18、Textpatternに含まれたものは2008/01/24だった。古い方を使っていたのか。
Textpattern で使われている方を使って動作を確かめてみると、入れ子のリストの問題は解決されていた。コードブロックの問題の方はそのままだった。空行でブロックを分けるのが仕様だから、仕方がないということなのだろう。
せっかく原因が分かったので、<code>と<pre>で終了タグがないときは、解釈をやり直して次のブロックと連結するように書き直してみた。考えてみると、textile記法を無効にする<notextile>タグの要素に改行が使えないというのも不便なのでそれも書き直してみた。
プログラミングの雑多なメモ::Textile テスト
追記
よく解説を読み直してみたら、ブロックタグの後に通常の「.」のかわりに「..」を置くと、ブロック連結になることがわかった。この連結はブロックにこのような修飾がつけられるまで続く。
つまり、空行を含むプログラムのコードを引用したいときは、
bc.. $text = str_replace("<p>%::%</p>","",$text);
$text = str_replace("%::%</p>","",$text);
$text = str_replace("%::%","",$text);
こんなふうに書けばよかった。ただし引用の終わりを示すために、次のブロックで 「p. 」などの修飾を付ける。複数行の空行は1行にまとめられてしまう。
なお、classTextile.php でブロックを修飾するタグは、bq、bc、notextile、pre、h1、fn1、p。
■関連ページ
7:3 blog : Textile で定義リスト(dl)
classTextile.phpを拡張して定義リストを使えるようにしたファイルが配布されているところ