Movable Typeユーザーのみなさん、こんにちは。アイデアマンズの宮永です。
ちょっと遅くなりましたが、2016年のAdvent Calendar、2日目です。
ちゃんとやるのは大変なJSONテンプレート
Movable TypeのテンプレートでJSONやXMLなどの構造体フォーマットを出力することってけっこうあるかと思います。
柔軟にテキストのテンプレートを記述できて、MT便利!と感じる部分ですが、JSONファイルを書き出したりするのはけっこう大変です。
- JSONフォーマットとMTタグが混在して見づらく、フォーマットが正しいか判断しにくい
-
encode
系やescape
モディファイアを忘れてしまうと解析できないJSONになることがある - (あまりないけど)「やっぱりYAMLになったわ」→「ギャー!」
確実に解析し利用できるJSONデータを出力するには、Movable Typeのことをよく理解している必要があります。
encode_json
を忘れてしまい、テストデータでは大丈夫だったけどユーザーがダブルクオーテーション使ったりしてJSONが壊れてしまった…とかMTあるあるですね。
でも、こうは思いませんか? データフォーマットの書式に気を使うのは人間の仕事だろうか、と。
mt-plugin-structure-format
というわけで、これから仕事でも使う予定もあり、さくっと作ってみたプラグインがこちら。
mt-plugin-structure-format (MITライセンス)
https://github.com/ideamans/mt-plugin-structure-format
テンプレートから、JSONやYAMLなどの構造体フォーマットを出力するための支援プラグインです。
BEFORE
通常、テンプレートでJSONファイルを出力しようとする場合はこんな感じです。
{
"title": "<mt:EntryTitle encode_json="1">",
"body": "<mt:EntryBody encode_json="1">",
"categories": [
<mt:EntryCategories glue=",">
"<mt:CategoryLabel encode_json="1">"
</mt:EntryCategories>
]
}
ダブルクオーテーションとか付け忘れそうですし、encode_jsonもうっかり忘れそうですね。
AFTER
<mtsf:Object format="json">
<mt:EntryTitle set_as="title">
<mt:EntryBody set_as="body">
<mtsf:Array set_as="categories">
<mt:EntryCategories><mt:CategoryLabel set_as="_"></mt:EntryCategories>
</mtsf:Array>
</mtsf:Object>
あれ…?
タグが多くて逆に重い感じもしますが…
まずは記号が一切不要になります。そしてformat
モディファイアをyaml
に変更するだけで、YAML形式で出力できます。
エスケープ処理は、出力フォーマットに応じて一括で行われます。
もちろん複雑にネストする場合も問題ありません。
拡張について
標準ではJSONとYAMLのみに対応しますが、MsgPackやBSONなど、構造体データのフォーマットには様々な形式があります。
その場合は別のプラグインで、決まったハンドラをレジストリに登録すると、format
属性に指定できる形式を追加することもできます。
最近であればこういった処理はData APIを使うのが主流と思いますが、もし出番があれば使ってみてください。