Kobitoのエントリーを一度にエクスポートするワンライナー
Kobitoのエントリー全てを.mdファイルとして一度にエクスポートするワンライナーです。
Kobitoのエントリーを複数PCで共有したい機会がありました。OSXの場合はQiitaで紹介されているKobito.db等を共有する方法で問題ないのですが、自分の場合OSXとWindowsマシンで共有したいという。しょうがないので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とタイトルを取得できます。
kobito show [item id]
...IDを指定し、エントリーの中身を表示します。
この2つのコマンドをうまく使ってさくさくっと.mdファイルに出力できるかと思いましたが、パイプ時の挙動で少しはまってしまいました。
kobito-cliのパイプ時の問題
パイプやリダイレクトなどで入力を渡すとKobitoのエントリーになります
実はこれがちょっとつらくて、kobito-cliはコマンドを指定してもパイプで入力が渡って来た際、Kobitoのエントリーにしてしまいます。
たとえばecho hoge | kobito version
とすると、下記画像のようにエントリーが新しくできてしまいます。
これはkobito-cliのmain.goで最初に呼ばれている関数processStdin()
に起因します。processStdin()
の中では標準入力がパイプやリダイレクトの場合に新しいエントリーを作ります。つまり、どんなコマンドがきても最初にprocessStdin()
が呼ばれてるのでパイプの場合エントリーが作られてしまいます。
※なお先輩に聞いた所、パイプかどうかを判定するためには、標準入力/出力がttyに結合してるかどうかを返すisatty
を使うのが常套手段だそうです。Goの場合、mattn / go-isattyを用いることができます。
参考:
解決策
レポジトリをforkして、パイプで挙動が変わる部分をkobito write
コマンドとして追加しました。中ではprocessStdin()
の内容を実行してるだけです。
nanonanomachine/kobito-cli · GitHub
これが正解なのかどうかわからないのでPRは送っていません。パイプで挙動を変えるべきか、結構迷うところです。
参考:
詳細
というわけで以下の流れで各エントリーを.mdファイルに出力します
kobito ls
を用いてIDとタイトル一覧を取得sed '1d'
を用い、kobito ls
の1行目のヘッダーを削除- readコマンドを用い、IDとタイトルを変数に格納し、
kobito show
を呼んで中身を.mdファイルに出力
フォークしたレポジトリでmake install
後、下記のコマンドを叩くと、
kobito ls | sed '1d' | while read n t; do kobito show $n >> "$t.md"; done
できた!これでクラウドストレージなどでさくさく共有できますね!