LoginSignup
12
10

More than 5 years have passed since last update.

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

Last updated at Posted at 2016-12-02

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

12
10
0

Register as a new user and use Qiita more conveniently

  1. You get articles that match your needs
  2. You can efficiently read back useful information
  3. You can use dark theme
What you can do with signing up
12
10