{{{ #!trachtml

TracのMarkupClassについて

[[VisitCounter(TracDoc/MarkupClass)]]

今回はTracの内部の話です。プラグインや、マクロを作る人むけ。

Trac 0.9.3で、クロスサイトスクリプティングを防ぐために、Markupというクラスが作られました。
(詳しく知りたい人は、Tracサイトのチケット!#2473、チェンジセット![2724]あたりを参照。)
0.9.3以降のプラグインやマクロを開発する際には、ほとんどの場合(嫌でも)Markupクラスを使う必要があります。
これにより、0.9.2以前用に作られたPluginやマクロは、ほとんど動かなくなっちゃっいました。
TinyMCEPluginも公開直前に0.9.4で試したら、
やたらと文字化けするようになってすげ-困りました。(・_・?)
タグを生成しないならいいんですが、メニュー表示の際に既にタグを使わざるを得ないし。。

Markupクラスは、「このテキストに含まれるHTMLタグは、エスケープしないでね」という宣言をするための
strクラスのラッパーです。Markupクラスを通してない(かつHTMLタグを含む)文字列をHDFに入れると、
全て勝手にエスケープされてしまいます。
eq.hdf[xxx] = '<b>強調</b>'

×: <b>強調</b>

文字として"<b>あ</b>"と表示したいのではなく、""とタグとして表示したい場合
は、Markupクラスを使う必要があります。

req.hdf[xxx] = Markup'<b>強調</b>'

○: 強調

■Markupの使い方と実験
タグをHDFに入れるには、

req.hdf[xxx] = Markup('<b>強調</b>')
○:強調

Markupされた文字同士をつなげるには、

req.hdf[xxx] = Markup('<b>強調</b>')+Markup('<b>強調</b>')

○:強調強調

ただし、Markupしてない文字列とつなげると、エスケープされちゃいます。

req.hdf[xxx] = '<b>強調</b>'+Markup('<b>強調</b>')+Markup('<b>強調</b>')

×:<b>強調</b><b>強調</b><b>強調</b>

wiki_to_htmlなど、Markupを済ませた値を返すメソッドもあり、注意が必要です。

req.hdf[xxx] = wiki_to_oneliner("'''強調'''", self.env, db,
shorten=True)+Markup(Markup('<b>強調</b>'))
○:強調強調

まあ、2重にMarkupしてもよいので、とりあえずMarkupで囲っておけば大丈夫かも。

req.hdf[xxx] = Markup('<b>強調</b>'+Markup('<b>強調</b>'))
○:強調強調

 

}}}