MTSetVar/MTGetVar and MTSetVarBlock Plugin
MT 3.1以降で加わった機能にOn-the-spot Rebuild(と今私が勝手に名前を付けた)機能があります。これは、インデックステンプレートを編集・保存すると、再構築を促す表示がなされ、「その場で」ポップアップウィンドウなしに再構築することができる機能のことです。再構築忘れもないし、それほど手間でもないという、地味ですが…絶妙な機能と言えましょう。
MT 3.0以前では、ポップアップウィンドウが開き、さらに「再構築」を選択しないと再構築できないはずです。この面倒さゆえ、滅多に再構築することのないテンプレート、例えばスタイルシート、に「このテンプレートにリンクするファイル」を指定することで再構築なしに保存だけで済ますという方法がよく知られています。
[the girlie matters] tips and tricks: link that stylesheet
しかし、この方法はad hocなことこの上ありません。なぜならこの方法を使ったテンプレートではMT Tagが使えないからです。もしあなたが「プログラマ」で、かつこんな安易な方法で簡単に対称性を喪失しても構わない、後ろめたさも感じないのでしたら、すぐに廃業をお勧めしますよ。
一方、MT 3.11ではOn-the-spot Rebuild(仮称)が使えますから再構築するのも以前ほど手間ではなくなりました。言い換えると、上の方法に拠ってまでして得る利得が(MT Tagが使えることによる利得に比べて)相対的に小さなものになってしまった、MT Tagが使えないことによる損失が(On-the-spot Rebuildのわずかな手間という損失に比べて)相対的に大きなものになってしまった、と言えます。
というわけで、これからは絶賛On-the-spot Rebuild推進派なのです。スタイルシートのように自動的に更新される必要のないインデックステンプレートに対しては「自動で再構築」オプションをOffにしておくだけで十分です。「ファイルにリンク」するのは止めましょう。
久々のエントリで前置きが長かったですが、ここからが本論です。
スタイルシートでMT Tagが使えるのは意外に便利です。HINAGATA:CSSの@charsetをご確認ください で上ノ郷谷さんが書かれているようにスタイルシートのcharsetの設定に使えるのは言わずもがなですが、例えば以下のようにフォントセットをマクロ変数として定義することでスタイルシートに散らばりがちなfont-familyを統一的に指定することができます。
<$MTSetVar name="defaultFont" value="Verdana, Arial, sans-serif"$>
<$MTSetVar name="headingsFont" value="Georgia, Times, serif"$>
body {
font-family: <$MTGetVar name="defaultFont"$>
...
}
同様にfont-size、background-colorなどの指定にも使えるでしょう。特に「色」の指定は「数値による表現」より意味を表す「文字列による表現」の方が分かりやすいような気がするのですが…(それは私がデザイナーではない証左かもしれません)。
ところでこのMTSetVarはVariable TagであってContainer Tagではありません。したがって、定義済みのマクロ変数の値を別のマクロ変数に設定したい(例えば、serifFontに設定したフォントセットをdefaultFontに設定したい)とか、他のMT Tagで生成した文字列をマクロ変数に設定したいとか、そういう当然の需要には応えない半端な仕様になっています。
ではというわけで作ってみました(所要時間約1分)、MTSetVarBlock Plug-in。
下のような感じで使えます。
<$MTSetVar name="defaultFont" value="Georgia, Times, serif"$>
<MTSetVarBlock name="bodyFont">
<$MTGetVar name="defaultFont"$>
</MTSetVarBlock>
body {
font-family: <$MTGetVar name="bodyFont"$>
...
}
もちろん、MTSetVarBlockのcontentには何でも書けますから、他にも用途は色々考えられます。例えば、しばしば複雑になりがちなテンプレートを構成要素に分解してテンプレートモジュール化し、MTIncludeしているような人にも役に立つでしょう。MTSetVarBlockでモジュールをwrapしてマクロ化しておけば、いちいちモジュールごとにテンプレートにする必要はなく、単一のグローバルテンプレートだけを管理すればよいことになります。
具体的には、以下のようなテンプレートモジュールを作っておきます。名前は仮にGlobalTemplateとしておきます。
<MTSetVarBlock name="module1"> ... the content of module1 ... </MTSetVarBlock> <MTSetVarBlock name="module2"> ... the content of module2 ... </MTSetVarBlock> ...
これを利用するインデックステンプレート、アーカイブテンプレートでは以下のようにすればよいでしょう。
<!--まず最初にGlobalTemplateを読み込む--> <$MTInclude module="GlobalTemplate"$> ... <!--module1の定義を展開する--> <$MTGetVar name="module1"$> ... <!--module2の定義を展開する--> <$MTGetVar name="module2"$> ...
念のため、この方法ではマクロの中身は定義時にEagerに評価されます(上記の例ではMTIncludeの時点)。したがって定義時に「式」とそれを計算するための「環境(値の束縛)」が必要になり、一般的な意味での(展開された先の環境を用いて式の値が計算される)マクロとは異なります。この(プログラミング言語を大学で教わった人向けの、不親切な)説明が理解できない場合には、例えばMTEntriesの中身だけをこの方法でマクロ化することはできないけれども、MTEntriesごとマクロ化することはできる、ということだけは何となく覚えておいてください。
このエントリーのトラックバックURL: http://as-is.net/mt/mt-tb.cgi/187
Comments (0)