- 2009年6月16日 09:06
- mt4


Movable Typeのグローバル・モディファイアのtrim_toを使うとき、エンコードすべき文字の途中でトリムされる場合の検証と対処について
説明がわかりにくいと思うので、いきなりですが、やりたいことをテストテンプレートにて示します。
- test template 1
-
<mt:setvars>data=0123456789&ABCDEF</mt:setvars> <?xml version="1.0" encoding="<$MTPublishCharset$>" standalone="yes" ?> <data><mt:var name="data" encode_xml="1" trim_to="11" /></data>
上に示したテンプレートでは、0から&(アンパサンド)までを指定して出力するものです。
このテンプレートをそのまま出力(XMLファイルとして)させてブラウザで見ると、パースエラーとなってるはずです。
では、trim_toの値を15にしてみるとどうでしょうか。これはエンコード後のアンパサンドの文字数を含める数値です。
- test template 2
-
<mt:setvars>data=0123456789&ABCDEF</mt:setvars> <?xml version="1.0" encoding="<$MTPublishCharset$>" standalone="yes" ?> <data><mt:var name="data" encode_xml="1" trim_to="15" /></data>
今度は、モディファイアの順番をいれかえして、trim_toを先に記述してみます。
- test template 3
-
<mt:setvars>data=0123456789&ABCDEF</mt:setvars> <?xml version="1.0" encoding="<$MTPublishCharset$>" standalone="yes" ?> <data><mt:var name="data" trim_to="11" encode_xml="1" /></data>
この場合だと、問題なく表示されます。
日本語の場合でテストしてみます。下のテンプレートではどうでしょうか。
- test template 4
-
<mt:setvars>data=あいうえお&かきくけこ</mt:setvars> <?xml version="1.0" encoding="<$MTPublishCharset$>" standalone="yes" ?> <data><mt:var name="data" encode_xml="1" trim_to="9" /></data>
まとめのようなもの
以上のテンプレートは故意にエスケープすべき場所を指定してトリムをおこなっていますが、普通に記述していて予期しない箇所でパースエラーを引き起こす原因になっていることがありうるかも。
回避の方法としては、先にtrim_toを記述してから、encodeをおこなう形にするか、それが具合悪いのであれば、setvar、getvarで変数に渡してから処理するとか、XMLならば当該箇所をCDATAにするか、でしょうか。
それと、グローバル・モディファイアの処理を先に書いたものが先に実行されるらしいというかそういう仕様っぽいです。
- Newer: 今月のいらんことしい(2009年6月)
- Older: 買い物はいつものスーパーで
- MovableTypeのカスタムフィールドで特定キーワードを含む記事をリストアップするテンプレート
- メモ:特定カスタムフィールドの値は提供されたタグで
- コメントタグ内のMTタグ
- ウェブページのページごとでカラムレイアウトを替える
- メモ:タイトルに角形括弧が含まれる記事に何かするテンプレート
- 記事ページのTopicPathをひとつだけにした
- 今頃、MTのヘッダの出力解決メモ
- Movable Typeのjsファイル内の関数を利用したShow-Hideのカスタマイズ
- Movable Type5.0ベータ1、InstaMTにインストールしたよ、のメモと注意点
- MT:EntryBasenameに基づいた記事のフィルタリング