読者です 読者をやめる 読者になる 読者になる

Kobitoのエントリーを一度にエクスポートするワンライナー

Kobitoのエントリー全てを.mdファイルとして一度にエクスポートするワンライナーです。

Kobitoのエントリーを複数PCで共有したい機会がありました。OSXの場合はQiitaで紹介されているKobito.db等を共有する方法で問題ないのですが、自分の場合OSXWindowsマシンで共有したいという。しょうがないのでMarkdownファイルをDropboxに書き出す方法を選択しました。

現在Kobito for Windowsが開発中とのことです。リリースされたらOSXと同じ方法で共有できるかも。楽しみです。

tl;dr

kobito ls | sed '1d' | while read n t; do kobito show $n >> "$t.md"; done

kobito-cli

Kobitoを便利にするGo製のCLIツールsuin / kobito-cliを用います。kobito-cliは主に以下のことができるそうです。

Available Commands:
  ls                                            List all items
  show [item id]                                Show item
  html [item id]                                Show item as HTML
  print [item id]                               Print out item
  link [markdown file]                          Link markdown file to Kobito
  version                                       Print kobito cli tools version
  pdf [item id] | pdf [item id] [pdf file name] Save item as PDF
  password                                      Show Kobito password
  sticker                                       Do you want Kobito sticker?
  help [command]                                Help about any command

ありたがい...!

今回の要件を満たすため、以下の2コマンドを使います。

kobito ls ....Kobitoの全てのエントリーのIDとタイトルを取得できます。

f:id:koyamay:20150322231257p:plain:w300

kobito show [item id]...IDを指定し、エントリーの中身を表示します。

f:id:koyamay:20150322232011p:plain:w300

この2つのコマンドをうまく使ってさくさくっと.mdファイルに出力できるかと思いましたが、パイプ時の挙動で少しはまってしまいました。

kobito-cliのパイプ時の問題

パイプやリダイレクトなどで入力を渡すとKobitoのエントリーになります

suin / kobito-cli

実はこれがちょっとつらくて、kobito-cliはコマンドを指定してもパイプで入力が渡って来た際、Kobitoのエントリーにしてしまいます。

たとえばecho hoge | kobito versionとすると、下記画像のようにエントリーが新しくできてしまいます。

f:id:koyamay:20150322235848p:plain:w300

これはkobito-climain.goで最初に呼ばれている関数processStdin()に起因します。processStdin()では標準入力がパイプやリダイレクトの場合に新しいエントリーを作ります。つまり、どんなコマンドがきても最初にprocessStdin()が呼ばれてるのでパイプの場合エントリーが作られてしまいます。

※なお先輩に聞いた所、パイプかどうかを判定するためには、標準入力/出力がttyに結合してるかどうかを返すisattyを使うのが常套手段だそうです。Goの場合、mattn / go-isattyを用いることができます。

参考:

解決策

レポジトリをforkして、パイプで挙動が変わる部分をkobito writeコマンドとして追加しました。中ではprocessStdin()の内容を実行してるだけです。

nanonanomachine/kobito-cli · GitHub

これが正解なのかどうかわからないのでPRは送っていません。パイプで挙動を変えるべきか、結構迷うところです。

参考:

詳細

というわけで以下の流れで各エントリーを.mdファイルに出力します

  1. kobito lsを用いてIDとタイトル一覧を取得
  2. sed '1d'を用い、kobito lsの1行目のヘッダーを削除
  3. readコマンドを用い、IDとタイトルを変数に格納し、kobito showを呼んで中身を.mdファイルに出力

フォークしたレポジトリmake install後、下記のコマンドを叩くと、

kobito ls | sed '1d' | while read n t; do kobito show $n >> "$t.md"; done

f:id:koyamay:20150323005800p:plain

できた!これでクラウドストレージなどでさくさく共有できますね!