開発の動機
最近 esa.io を業務で使うようになりました。とても便利です。
ブラウザでの編集も快適なのですが、年中端末に引き篭っている身からすると、どうにか CLI でも記事を更新をしたいと思っていました。
例えば CLI で esa.io の記事更新ができるようになると、以下のようなことができるようになります。
- vi/emacs などお気に入りのエディタを使って編集できる
- screen/tmux など端末プレクサとのコピペが楽になる
- 他の CLI ツールと連携しやすくなる
- cron などで記事更新を自動化できる
既存の esa.io 関連ツール
公式のライブラリとして esa-ruby があります。
サードパーティ製の esa.io ツールは以下のページでまとめられています。
CLI ツールとしては esa-cli がありますが、記事の観閲がメインです。
esa.vim のようなエディタのプラグインを使えばローカルでも記事作成はできますが、他の CLI ツールとの連携には使えません。
esautils
概要
CLI で記事の投稿・更新をするためのコマンド群です。
記事の取得もできますが、検索のためのコマンドはありません。
言語は Go 言語を使用しました。
ライブラリとしては upamune さんの go-esa を利用させていただきました。
設計思想
esautils では記事のNumber
ごとにディレクトリを作成し、その直下に JSON キーと対応するファイルを配置します。
例えば esa.io の API からの応答は以下のような JSON です。
{
"number": 1,
"name": "hi!",
"full_name": "日報/2015/05/09/hi! #api #dev",
"wip": true,
"body_md": "# Getting Started",
"message": "Add Getting Started section",
"tags": [
"api",
"dev"
],
"category": "日報/2015/05/09",
}
これを JSON のキーごとに個別のファイルに書き出します。
esa_new
というコマンドで記事を作成すると以下のようなファイルが作成されます。
$ esa_new "日報/2015/05/09" "hi!"
$ ls -F
$ 352/
$ tree 352/
352/
├── BodyMd
├── Category
├── Message
├── Name
├── Tags
└── Wip
それぞれのファイルの内容は単なるテキストファイルです。
-
BodyMd
: 記事の本文 (Markdown記法) -
Category
: カテゴリ -
Message
: 記事作成・更新の際のメッセージ -
Name
: 記事タイトル -
Tags
: タグ (改行区切り) -
Wip
: WIPフラグ (true
orfalse
)
環境変数
各コマンドの使用前にいくつかの環境変数を設定する必要があります。
-
ESA_API_KEY
- アプリケーショントークン
-
ESA_TEAM
- esa.io のチーム名
-
ESA_USER
- ユーザ名
API KEYの取得は以下のURLから行うことができます。
各コマンドの使い方
-
esa_new CATEGORY NAME
- 説明:
- 新規に記事を作成する
- 引数:
- CATEGORY: 記事カテゴリ
- NAME: 記事タイトル
- 説明:
-
esa_update NUMBER
- 説明:
- 記事を更新する
- 引数:
- NUMBER: 記事の
Number
(esa_new
が作成したディレクトリ名を指定)
- NUMBER: 記事の
- 説明:
-
esa_attach PATH
- 説明:
- 添付ファイルをアップロードする
- 引数:
- PATH: アップロードするファイルのパスを指定
- 返り値:
- アップロード先のURL
- 説明:
-
esa_get NUMBER
- 説明:
- 指定した
Number
の記事を取得する
- 指定した
- 引数:
- NUMBER: 記事の
Number
- NUMBER: 記事の
- 説明:
-
esa_getall
- 説明:
- 自分のユーザ名に紐付く全ての記事を取得する
- 説明:
esa_new
やesa_get
で記事の作成・取得を行い、ローカルで編集した後、esa_update
で更新する、という流れを想定しています。
使用例
(1) fswatchとの連携
fswatch
がファイルの更新を検知する度に自動で esa.io の対応記事をアップデートします。
#!/bin/bash
fswatch --one-per-batch -d -0 . | while read -d "" path; do
POST_NUM=`basename $(dirname $path)`
PATTERN="[0-9]+"
diff $POST_NUM/BodyMd{.draft,} && continue
cp $POST_NUM/BodyMd{.draft,}
if [[ $POST_NUM =~ $PATTERN ]]; then
esa_update $POST_NUM
fi
done