先日 ターミナル操作の記録(ttyrec)からGIFアニメを生成するツールを作った - すぎゃーんメモ を書いたところ、思っていた以上に反響があって。
自分的にも結構便利だなーと思っていたのだけど、
ttygifとその系列、端末マニアではない人の95%くらいのユースケースでは端末に依存するシーケンスとか流さないだろうし、色とかが微妙に違ってもそこが主眼じゃないと思うので、単純に内部に端末を持ってダイレクトにGIFを吐ければ良くて、いちいちスクリーンショト取るの筋悪ではないの?
という意見をいただいて。うーん 確かに、と。
C版
で、はやくもそういうのを実現するものが作られました。すごい。
●https://github.com/saitoha/seq2gif
こんなカンジで使える。
エスケープシーケンスの処理なんかも内部の仮想端末でちゃんとやってくれる。
その他、オプションで端末サイズや色の調整なども出来るようで。
こんなカンジで使える。
![f:id:sugyan:20140730152914g:image f:id:sugyan:20140730152914g:image](http://cdn-ak.f.st-hatena.com/images/fotolife/s/sugyan/20140730/20140730152914.gif)
エスケープシーケンスの処理なんかも内部の仮想端末でちゃんとやってくれる。
![f:id:sugyan:20140730151802g:image f:id:sugyan:20140730151802g:image](http://cdn-ak.f.st-hatena.com/images/fotolife/s/sugyan/20140730/20140730151802.gif)
その他、オプションで端末サイズや色の調整なども出来るようで。
Go版
せっかくなのでGoでもそういうの作れないか?と調べてみたところ、端末のエミュレートできるライブラリがちゃんとあった。
●http://godoc.org/j4k.co/terminal
これを使って入力を流し込むことで見事にttyrecordの再生を内部で再現することができた。便利!
各状態で
﹁ttyrecordからGIFを作る﹂というのは前回書いた ttygif と同じではあるのだけど、アプローチが全然違うので﹁ttyrec2gif﹂という名前で別のpackageとして分けておいた。
すごく特殊な再生内容があったりターミナルのフォントなどの見た目とかにこだわりがあってスクリーンショットを使った方が良い場合は ttygif を使えば良いと思うし、そうでない場合は こっちを使えば良い、んじゃないかな。
コマンドの入出力も
まぁでも いちおう
(余談: このslの再生しようとしてvirtual termianlが固まる事象があってハマった。調べたら ものすごい単純なバグ だった)
func (t *State) Cell(x, y in
t) (ch rune, fg Color, bg Color)
を使ってy行目のx列目の文字、色、背景色が取得できるので、ひとつひとつ描画していけば良い。
code.google.com/p/freetype-go/freetype を使うことで画像への文字の描画ができる。 go-bindata を使って適当なmonospace fontを埋め込んで、それを読んで使う。
ということで内部での再生&描画ができたのでGoでもスクリーンショット撮ることなくttyrecordからGIFアニメを作ることができた。
●https://github.com/sugyan/ttyrec2gif
![f:id:sugyan:20140730152915g:image f:id:sugyan:20140730152915g:image](http://cdn-ak.f.st-hatena.com/images/fotolife/s/sugyan/20140730/20140730152915.gif)
seq2gif
に倣ってstdin, stdoutの方が良かったかなぁ…。
ちなみにseq2gif
の方がこのttyrec2gif
より圧倒的に早い。
まぁでも いちおう
ttyrec2gif
でもそれなりにエスケープシーケンスとか扱って描画できている、と思う。
例: SL
![f:id:sugyan:20140730152916g:image f:id:sugyan:20140730152916g:image](http://cdn-ak.f.st-hatena.com/images/fotolife/s/sugyan/20140730/20140730152916.gif)