[hack] html出力
アクションプラグインでは
通常は &::puts か &::putenc を使って出力します。
これらによる出力内容は、バッファリングされ、最後の最後になって、正常終了が確定した時になって、はじめて出力されます。
一方、die 文を発行した時、それまで &::puts に与えた文字列は破棄されます (ブラウザ画面には die の出力内容が現れます)。
print を使って、直接出力することも可能です。 その場合、アクションプラグインは exit(0) で終了する必要があります。 また、die による出力ロールバックも効きません。
インラインプラグインでは
出力する html 文字列は、プラグイン関数の戻り値として返します。
インラインプラグインの中で、&::puts などを利用することは可能ですが、たいていの場合、意図した位置とずれた位置に出力されてしまいます。
文字列凍結処理
プラグインの中でリンクタグを書いたのはよいものの、 出力した文字列が後々意図せぬ変換をされてしまうことがあります。
例えば、
<a href="http://foo.co.jp">...</a>
というタグをプラグインで出力したのはよいものの、 出力内容中の URL が後々の自動リンク化処理され、
<a h(null)ref="<a href="http://foo.co.jp">http://foo.co.jp</a>">...</ a>
などとなってしまうケースなどです。
この場合、出力結果を凍結処理をすることで、後々の処理を回避できます。そのための関数が &::verb です。これで処理した文字列は、最終表示に至るまで、他の処理対象になりません。
ロジックとしては
- 凍結処理
- &::verb は引数の内容を \a で囲まれた 16進文字列に変換する
- 解凍処理
- &::flush がバッファリングされた出力文字列の中から "\a" で囲まれた 16進文字列を抽出。元の変換前文字列に戻した上で出力する
というようなことをしています。
|