- 2010-01-03 (日) 23:09
- MovableType


- テーマ作成時のチップス
季節感無しで、晦日・大晦日・正月三が日と、ゴリゴリとテーマ作ってました。
で、Tipsと言うほどでも無いのですが、「こうすると良いと思うよ」ってのを書きます。
海外の作者のテンプレートセット/テーマを日本語環境で使えるようにする
海外の作者による、テンプレートセットやテーマを見つけた場合、日本語環境にインストールした場合に発生する問題は、まず間違いなくローカライズの問題です。
自分の環境での動作確認で済ませる傾向が一般的なため、1バイト圏の方々は、どうしてもテンプレートにローカライズの為の記述をしない傾向にあります。というか、日本でもMTMLにUTF8の日本語直書きが多いらしいから、2バイト圏の方々(てか日本人)も一緒か。
テンプレート内のローカライズが行われない為、不幸にもMTのデフォルトテンプレートと同じ名前のテンプレートの場合でも、テンプレートの呼び出しはオリジナルの言語で呼び出されます。
一方テンプレートセット・テーマの適用を行うと、MT自体が持つ変換辞書内に対応した「テンプレート名」が存在する場合、自動的に使用言語(日本語ですね)に変換されます。デフォルトテンプレートで使われているテンプレート名(厳密にはその他のMTで使われている語句も含まれます)は、変換対象になってしまう訳です。
結果として<$MTInclude$>や<$MTWidgetManager$>でのモジュールやウィジェットセット指定で、存在しないテンプレートを呼び出すために、再構築時にエラーが発生します。
ローカライズの逆を行う
対応させるには、2つの方法があります。
MTMLの中身で、MTIncludeやMTWidgetManagerしてされている部分を見つけ出し、<__trans phrase="HogeHogeTemplate">としてやる方法。ただし、動作の確認をしてみたところ、単独でテンプレートの初期化を行った場合(テンプレートセット全体ではなく)、L10Nローカライズが無効になりました。
「config.yamlで書いたテーマでのL10N適用 - WolaWola」で書いたように、<__trans_section component="HogeFuga"><__trans phrase="HogeHogeTemplate"></__trans_section>と、プラグイン自身の辞書を使う宣言が必要でした。
これは、MT4.xでのテンプレートセットでは、必須な指定でしたから、MTバージョンによらず動作するようにするためには、初めから書くようにしておく必要があります。(trans phrase使わないで、UTF-8で日本語直書きする事も多いのでしょうが、美しくないので嫌いです。)
ただこの方法は、テンプレート全てを確認する必要があるので意外と面倒です。見つけたテンプレートを試してみたいだけなのに、そんな事やってられないですよね。
それで、ちょっとだけ横着する方法を見つけました。L10Nの機能を使って、MTML内の指定に、テンプレート名を合わせる方法です。実は試すだけだったら、ブログ作成時の言語を「英語」にすればいいんだけど、これは後々変更できないので、一時的な利用以外はやめた方が良いです。
L10NにはLexiconと呼ばれる、オリジナルに対する翻訳がかかれます。通常(日本語用の)これには、英語に対する日本語のように、言葉が列記されています。この日本語用辞書に、翻訳結果としてオリジナルの英語を書いておけば、翻訳された結果、英語名のテンプレートが作成される事になります。
結果が異なるのは、MTデフォルトのローカライズが使われるケースなので、事前に辞書を作っておく事が可能です。それ以外はそもそも変換されません(辞書内に対象語句が存在しない)ので、気にしなくて良いです。(余裕出来たら作っておきます)
一つだけ注意しなくてはならないのは、グローバルテンプレートを呼び出すようになっている場合で、そちらはブログレベルでのテンプレートセットの適用とは無関係なので、その部分のみ、先に書いたようにMTML内での呼び出しを書き換える必要があります。
テンプレート(MTML)の便利な書き方
テンプレートは、こうやって書くと良いよというハナシです。ただし、MT5の動作を元にしているので、他のバージョンでは通用しないものもあります。
インクルード部分でのズレを解消する
MTIncludeの開始部分で、インデントがずれたりしていませんか?
これは、MT4の頃に散々取り上げられた、頭スカスカ問題(asiamothアニキ命名)への対応が原因となっています。テンプレートの出力(インクルードされるモジュールは、そのモジュール単位で)の、行頭の空行・空白のみの行と、実際のコンテンツの最初の行の行頭空白文字が削除されます。(いわゆる仕様ですね)
その結果、一生懸命インデントさせて美しく書いたモジュール内でのインデントが、最初の行だけ適用されなくなります。
この現象には、呼び出す側のMTIncludeをインデントさせる事で対応出来ます。本来2重にインデントしているようでも、実際にはモジュール側の行頭インデントが無効になる為です。
実はウィジェットの呼び出しでも、同じ現象が起こっています。しかしこちらの場合は、呼び出しをインデントさせる事が出来ませんので、対応は不可能です。
ブロックタグでインデントをきれいにそろえるコツ
一生懸命テンプレートをインデントさせて書いたのに、出力されるとガタガタになっていて、ショックだったりしませんか?別に出力ソースは見ないから気にならないですか。私はすごく気になります。
実はMTML上でのインデントの書き方に問題があるんです。出力をキレイにする方法を書きます。
ブロックタグや条件タグの始まり・終了を、HTMLの構造に合わせてインデントして無いでしょうか?実はコレが大きな原因になっています。
例えば<MTComments>の出力などは、コメントが投稿されていない状況では、出力が行われずに、タグに対するインデントだけが残ってしまいます。
この様な場合には<MTComments>を行頭に書き、改行をはさんで、内部のタグを書くようにします。改行をはさまない方が、出力されるHTML的には美しい(コメントがある場合には、<MTComments>の行は空の行を出力します)のですが、HTMLのインデントが把握しづらくなるので、改行したほうが良いでしょう。
なお、ファンクションタグは、実際に結果を出力する部分なので、HTMLに合わせたインデントをさせます。変数を扱う部分(<MTSetVar>など)は出力が無くMTMLの構造に関係した部分なので、行頭に書くようにします。
この様に書いた結果、どうしても無駄な改行が存在します。私はプラグインを使って「空行」を削除するようにしています。その為だけにプラグインを使うのに抵抗がある方もいると思うので、そこはお好きにどうぞ。
なお、MT5ではタブによるインデントは、テンプレート適用時に自動的に削除されますので、スペースを使ったインデントを使う様にしましょう。
MT5でタブが消えるのを積極活用
ただ、ブロックタグや条件タグのインデントをやめた場合、どうしてもテンプレートの見通しが悪くなります。これを解決する手段として、タブによるインデントが削除される現象を逆手に取ります。
テンプレートのファイルを作成する時に、ブロックタグや条件タグをタブを使ってインデントしておきます。ファイルの状態でなら、構造の把握がしやすくなります。
テキストエディタの設定で、「タブを表示する」設定にしておくと、どの部分がHTMLのインデントで、どれがMTMLの構造のインデントなのかが判断可能になります。それぞれを別個に追いかけやすくなります。
ちょっとした書き方の変更で認識率アップ
こうなってくると、変数の取り回し部分のタグが解りづらいのが気になってきます。MTSetVarBlockやMTSetVarTemplateのような、ブロックタグならばそれほどでは無いのですが、<SetVar>やファンクションタグにsetvar モディファイアを指定した場合(私はコレを多用します)などは、通常のファンクションタグと見分けが付けづらくなっています。
最近始めたのですが、こういう場合にタグの書き方を使い分けるようにしています。通常のファンクションタグは、昔どおりのタグに対して前後に「$」を入れる書き方をします。(MT4以降で、様々な書き方が出来るようになっておかげで、ファンクションタグに$を付けない書き方を見かけますが、ブロックタグと明確に違いがわかる、$をつけた記述を使うほうが好きです)
ソレに対して、変数を扱う場合は<MTVar name="counter" op="++" />の様に、単独のタグであることを表す書き方を使うようにしだしました。モディファイアの場合も<MTBlogURL setvar="blog_url" />とし、この書き方の場合は値が出力されない事を視覚的に判断可能になります。
テンプレート内でバージョン判別
MTのバージョンによって、使えないタグの書き方があると思います。この様な場合にはMTのバージョンを、分岐条件として書き出しを振り分ける方法が可能です。
MT4.0以降からのMTのバージョンを出力するコードを試しに作ってみました。MT4だと色々な事が出来なくて、こんなに長いコードになりました。
<MTSetVarBlock name="version_no"><$MTVersion$></MTSetVarBlock><MTUnless name="version_no" like="4.0"><$MTVersion regex_replace="/([\.0-9]+).*/","$1"$><MTElse><$MTGetVar name="version_no"$></MTUnless>
MT4.1以上だけで済むなら、<$MTVersion regex_replace="/([\.0-9]+).*/","$1"$>で大丈夫です。どうして<$MTVersion$>だけじゃないんだろうと思いましたか?MT4.24あたりのバージョンでは、「4.24-ja」と言う風に言語コードも出力していたからです。(現在は出力しないですが、以後の改変でどうなるかは予測できません)
実際にはもっと単純に<MTIf tag="Version" like="4.2">HogeHoge</MTIf>(MT4.2xの場合)という使い方が、実用的な気がします。細かく数字として比較する場合には、上記コードを使ってみてください。
とりあえず少しテーマ作りました
いくつかテーマ作ったり、失敗したりしました。ひとまず完成はしているのですが、公開は少し待ってください。自分のじゃないものなので。(といいつつ、ココから落とせたりするんですが)
テーマ作っていて思ったんですが、Mid-Century テーマのように、プラグインの有無を判別するタグがあると、便利だなと思いました。テーマの適用自体をプラグインで判断(適用できなくする)機能(slidonで使われてますね)はあるのですが、テンプレート内で使えるかどうかの分岐が出来ると、便利になると思うのですけれど。検討してみてくれないかしら?
- Newer >: スタイルキャッチャー・ライブラリとパーミッション
- < Older: なんか実感わかねぇ・・
- « Older in MovableType: mt.Vicuna Simple 2.3.1公開します
ping a Trackback
- TrackBack URL for this entry.(1)







スクリプトの読み込みが完了していません。
メールフォーム(Javascriptを使用していません)や、
Twitter経由のCommentでもReplyいたします。ただし返信はブログのコメントとして行う事もあります。