たぷつきません

おなかがでてきた。もうたぷついてるやん。

writeプロセッサ詳説

 昨日のwriteプロセッサですが、ちょっと詳しく書いた方が良いかなと思いましたので以下に。
 まずパフォーマンスについて。パフォーマンスに影響するのは「子を評価する」ケースです。これまでのwriteはvalue内だけ見れば良かったので「子を評価しない」プロセッサでした。「子を評価する」ケースとは、例えばecho,element,for,ifのtestの結果が真の場合など、doBodyをコントロールできるプロセッサがこれにあたります。ボディでレンダリングされた内容はメモリにスタックするので僅かな差ながらチリツモになります。
 writeが子を評価するケースは以下のいずれかになります。この評価処理はビルド時に行いますのでレンダリングへの影響はほとんどありません。
・valueの指定がなく、プロセッサのボディがある場合。
・valueのスクリプト式内に、識別子bodyTextの存在が認められる場合。
 上記条件から分かりますが、value内から、beforeRender内で定義したfunctionを呼んでその中でbodyTextを参照していてもundefinedとなります。bodyTextを作りなさいという指示は、valueの式がpullすることで行われるというわけです。プロセッサにボディを幾ら書いても、value式内で全くbodyTextを参照しなければ、writeは全くボディ(子)を評価しません。
 子を評価するという意味をおさらいしておきます。mayaaでは他のプロセッサも同様ですが、暗黙に <m:doBody/> が指定されたものと同じ意味のことを指します。writeの場合でも同じメカニズムで子を評価します。.mayaa内でwriteが何も挟んでいなければ、HTMLテンプレート上で対応するidのタグが挟む内容がそのままbodyTextに取り込まれます。value式が実行されるのはbodyTextが準備できてから、即ちHTMLテンプレート上で対応するidのタグの閉じタグに達して、書き出す内容が明らかになってからとなります。この性質上 <html>タグにwriteを割り当てたらbodyTextには巨大なレンダリング結果が書かれているということになります。
 ともあれ、writeが加工対象を掴めるようになったということは大きな転換です。value式内ではスクリプトが使えるのですから、全く加工はしないが何らかの情報をロギングすることに使うといったことや、特別なオプションが指定されればHTMLではなく一括置換して出力結果を全く変えるということすらできるようになったわけです。