テンプレートでJSONなどをスマートに出力するMovable Typeプラグイン

  • 11
    Like
  • 0
    Comment

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を使うのが主流と思いますが、もし出番があれば使ってみてください。