新TypePadの上級者テンプレート、旧バージョンからの変更点
新TypePadに移行して、運営ブログの表示がガタガタに崩れてから丸五日。なんとか『未完の映画評』の修復は終わった。(と思う。そう願いたい。)
思いのほか内部の仕様が変わっていて、前とまったく同じとはいかなかったのだが、いろいろ妥協しつつ折り合いを付けて、とにもかくにも緊急突貫工事を終わらせた。
それにしても、シックスアパートが移行の遅れの言い訳に「できるだけ移行後にユーザーにやっていただくことを減らすため」と言っていたのはなんだったのか、ってぐらい手間が掛かったぞ、プンプン。
それというのも、管理画面の変更とかはあれこれ「こんなに便利になりました」とアピールするのに(実際は便利になってないと思う、かえって使いにくくなった)、内部仕様の変更をまるで明文化してくれていないため、修正がいちいち手探りだったから。
ということで、現時点で気付いたことを箇条書きにしてみる。
なお、一部はバグのような気もするので、その内こっそり修正されるかも。
また、詳細に検証したわけでもないので、本当の原因は別のところにあるのを勘違いしている可能性もあります。
そんなわけで、ここに書いたことを信じるかどうかは閲覧者の自己判断でお願いします。
■テンプレートで作成したファイルの末尾に余計な「<!-- ph=1 -->、<!-- nhm:from_kauri -->」が付く
(拡張子がcssのスタイルシートファイルだと「/* ph=1 */、/* nhm:from_kauri */」が付く)
HTMLファイルならコメントアウトされるから実害はないんだけど、拡張子がjsの外部JavaScriptファイルにも「<!-- ph=1 -->、<!-- nhm:from_kauri -->」が付く。
とりあえず問題なく動いているみたいなんだけど、jsならスタイルシートファイルと同じく「/* ph=1 */、/* nhm:from_kauri */」にすべきでしょうに。
いや、そもそも上級者テンプレートでそんな余計なもの付けて欲しくない。
■モジュールの挿入で「<$MTInclude module="module-hoge" encode_js="1"$>」がJavaScript用にエンコードされない
前バージョンはちゃんと意図通りエンコードされていたのに、なぜかエンコードしてくれない。
JavaScript用以外はちゃんと調べてない。
■MTタグ互換でのencode_url="1"の出力結果が旧バージョンと違う
リンクのhrefに使用するだけなら問題ないんだろうけど、「%3c」→「%3C」と大文字に変わり、変換される文字コードの範囲も変わったような気がする。
■タイプリストからの挿入「<$MTListItem field="asin"$>」が「ASIN番号:jp」で出力されるようになった
ASIN番号に余計な「:jp」が付く。理由はどうあれ余計でしかない。
こういう変更はちゃんと発表して欲しい。
■「<MTEntries all="1">」のallが効かなくなった
以前は全エントリーが出力されたのに、デフォルト分しか出力されない。
■時間が掛かる処理だとタイムアップすることがある
再構築がなくなってリアルタイム処理になった弊害と思うが、「<MTEntries>」をいくつか並べるなどすると、途中までの処理しかやってくれないことがある。
本来の仕様通りに動かないなら、そんな理想を追っただけの机上の空論はやめればいいのに。
と、ここまではMTタグまわりだったけど、ここから先はSSI関係。
公式にはSSIの使用はまったく明言されていなかったと思うので、自己責任の範疇です。
とはいうものの、とにかくこれがめちゃくちゃ変わった。
■ほとんどの環境変数がSSIで扱えない
現時点で使える確認の取れた環境変数は、
$DATE_LOCAL
$DATE_GMT
$DOCUMENT_URI
$HTTP_USER_AGENT
$REMOTE_ADDR
$HTTP_REFERER
の6つだけ。
そのほかは、$HTTP_COOKIE、$QUERY_STRING、$SCRIPT_NAMEといった主だったものも含めすべて結果が「(none)」になる。
セキュリティ的な問題かとは思うけど、せめて$HTTP_COOKIE、$QUERY_STRING($QUERY_STRING_UNESCAPED)ぐらいは使えるようにして欲しかった。
このせいで別ページからSSIにデータを渡せなくなってしまった。
■SSIの正規表現で後方参照が使えない
「<!--#if expr="'$DOCUMENT_URI' == /\\/(\\d{4})\\//" --><!--#set var="year" value="1" -->」とかして、文字列の一部を抜きたいのに、これができなくなった。
■if文で「&&」(and)「||」(or)が使えない
最後の式だけ評価されるらしく、
「<!--#set var="hoge" value="abc" -->」と代入したとすると、
「<!--#if expr="$hoge == /x/ && $hoge == /a/" -->」← true
「<!--#if expr="$hoge == /a/ && $hoge == /x/" -->」← false
■if文での変数を「'」(シングルクォーテーション)でくくらないと意図しない結果になる
「<!--#set var="hoge" value="" -->」と代入したとすると、
「<!--#if expr="$hoge == ''" -->」← falseになる。
「<!--#if expr="'$hoge' == ''" -->」← これならtrue。
■でも「'」でくくると正規表現で先頭、末尾を表すメタ文字「^」「$」が意図したように機能しない
「<!--#set var="hoge" value="abc" -->」と代入したとすると、
「<!--#if expr="'$hoge' == /^a/" -->」← これではfalseになる。
「<!--#if expr="'$hoge' == /^'a/" -->」← これならtrue。
「<!--#if expr="$hoge == /^a/" -->」← これもtrue。
どうも評価前に変数$hogeが展開されて「'」を含めて評価するらしい。
■否定式が変
ここまではなんとなくイメージできたんだが、この辺になると、もうわけわかんない。
「<!--#set var="hoge" value="abc" -->」と代入
「<!--#if expr="$hoge != /b/" -->」← なぜかtrue
「<!--#if expr="!($hoge == /b/)" -->」← これでもtrue
「<!--#if expr="!$hoge == /b/" -->」← これならfalseだけど、最初に意図した評価の結果なのか?
ちなみに、
「<!--#if expr="$hoge != /x/" -->」← 意図通りtrue
「<!--#if expr="!($hoge == /x/)" -->」← これでもtrue
「<!--#if expr="!$hoge == /x/" -->」← これもtrue
さらに、
「<!--#if expr="$hoge == /b/" -->」← 意図通りtrue
「<!--#if expr="($hoge == /b/)" -->」← でもこれはfalse
ほかにもつまづいたところがあったんだけど、自分の理解が追いついていないので、このぐらいにしとく。
環境変数を使わせて貰えなくなったのはともかく、if文での変わりようは、まるで違うプログラム言語になったみたいな印象で、やってみないと結果がわからないという、まさに手探り状態。
やっと「未完の映画評」の改修は終わったけど、この「かみぃの丘」も含めてまだ他のブログもあるから、この先どんな罠が待っているのやら、頭が痛いですわ。
コメント