サラーサライラ・ワ・ライラ

千夜一夜物語復刻ライト版

graphviz 生成物を お手軽に

これまでのあらすじ

intelliJ+graphvizを利用して図を書いていたのだが、

  1. intelliJでsample.dotファイルを編集
  2. intelliJでsample.dotファイルをsave
  3. fdp -Tsvg sample.dot -o sample.svg
  4. open sample.svg

とかやるのが面倒になった。 理想的には

  1. intelliJでsample.dotファイルを編集
  2. intelliJでsample.dotファイルをsave
  3. 別窓で開いているsample.svgが更新される

でしょう。ということでなんとかしました。

イメージ

こうなってくれ
http://www.plantuml.com/plantuml/png/SoWkIImgAStDuNhSjE9nS_lZfiMFc_OhwDefwANabpnkdlguQU7ZfYMFcrTRAJpVlkBbx3OY50OdbgLoFMvSzRXnzUF6RaFiYfxDtl9isePdI-OydxyKNN5nMJgQrLFcF-kOW51c15D6m4o4uiVDanytBttSlETnqoAOGYw7rBmKeDy1

見て分かる通り、エディタはIntelliJに限らなくて良い

環境

端的に言ってどうなったのか

このようになった。(plantumlで guard-shell みたいなハイフンが使えないのってなんとかならないのか)
gyazo.com

まとめたリポジトリがこれ、使い方はREADMEにある。 github.com

実際にやったこと

rubyguard というgemがあり、ファイルの変更を検知することができる。

github.com

なにか1

なにか1は.dotファイルの変更を検知し、.svgファイルを生成する必要がある。 guardは変更を検知するだけなので、shellの操作を行うために guard-shell を更に利用する。

github.com

Guardfileにこのように記述する。

def change_ext(filepath, ext)
  File.dirname(filepath) + '/' + File.basename(filepath, ".*") + '.' + ext
end

guard 'shell' do
  watch(/(.*).dot/) { |s| `fdp -Tsvg #{s[0]} -o #{change_ext(s[0], 'svg')}` }
end

なにか2

なにか2は.svgファイルの更新を検知し、ビューアを更新する必要がある。 ビューアとしてgoogle chrome+livereloadを利用し、guard-livereloadと連携させることでこれを実現する。

まずはこのextensionをインストール chrome.google.com

guard-livereloadを利用し、先程のGuardfileにコードを付け足して以下のようにする github.com

def change_ext(filepath, ext)
  File.dirname(filepath) + '/' + File.basename(filepath, ".*") + '.' + ext
end

guard 'shell' do
  watch(/(.*).dot/) { |s| `fdp -Tsvg #{s[0]} -o #{change_ext(s[0], 'svg')}` }
end

guard 'livereload' do
  watch(/(.*).svg/)
end

ところで、chromeで直接svgファイルを開くとlivereloadはreloadに反応してくれない。 そのため、htmlファイルからsvgを読むようにする。

<!DOCTYPE html>
<html lang="en">
<head>
    <meta charset="UTF-8">
    <title>Title</title>
</head>
<body>
    <img src="sample.svg">
</body>
</html>

ここまでをやった後

  1. Guardfileのあるディレクトリで guard -i を打つ
  2. chromeでindex.htmlを開く
  3. chrome右上のLiveReload extensionのアイコンからLiveReloadを有効にする

とすると、.dotファイルを更新した際にchromeで見ているsvgが自動で更新されるようになる。