Graph::Easyの使い方

[syui](http://qiita.com/syui)さんの[コマンドラインからフローチャートや図を描く方法](http://qiita.com/syui/items/eaa89cf57266db8f1eab)を読んで使いたくなったので、必要最低限の使い方を調べてみた。

Graph::EasyはCPANというPerlアーカイブにあるモジュールですが、cpan自体はMacに入っているようなのでいきなり`cpan Graph::Easy`でインストール完了。

## 左から右、一般的なフロー図
まずは超基本。コマンド名は`graph-easy`。コマンドライン入力は''で括ったパラメータを&lt;&lt;&lt;で流し込む。

下のようなハコ図を書きたい場合、ハコの中に表示したい文字列を[]で囲んで-&gt;で結ぶだけ。

```bash
MBP2011:~ $ graph-easy <<< '[a]->[b]'
+---+     +---+
| a | --> | b |
+---+     +---+
```

もっと続けたければ増やすだけ。超簡単！

```bash
MBP2011:~ $ graph-easy <<< '[a]->[b]->[c]->[d]->[e]'
+---+     +---+     +---+     +---+     +---+
| a | --> | b | --> | c | --> | d | --> | e |
+---+     +---+     +---+     +---+     +---+
```

## 分岐させてみよう
上のaからeまで一直線に並んでいたのを、bでcとd-&gt;eの２系統に分岐させてみます。

一旦abcを-&gt;で結んだら、分岐開始点のbから改めてdeを-&gt;で結べばOK。Graph::Easyは同じ名前のハコを一つのものと認識します。

```bash
MBP2011:~ $ graph-easy <<< '[a]->[b]->[c][b]->[d]->[e]'
+---+     +---+     +---+     +---+
| a | --> | b | --> | d | --> | e |
+---+     +---+     +---+     +---+
            |
            |
            v
          +---+
          | c |
          +---+
```

ここでうっかりcとbの間を-&gt;で結んじゃうとくるりとループして戻っちゃうので、分岐させたいラインは間違って結ばないこと。

```bash
MBP2011:~ $ graph-easy <<< '[a]->[b]->[c]->[b]->[d]->[e]'

  +--------------+
  |              v
  |  +---+     +---+     +---+     +---+
  |  | a | --> | b | --> | d | --> | e |
  |  +---+     +---+     +---+     +---+
  |              |
  |              |
  |              v
  |            +---+
  +----------- | c |
               +---+
```

## 合流させてみる
てことはうまく合流点を指定すれば簡単にできるね。

```bash
MBP2011:~ $ graph-easy <<< '[a]->[b]->[c][d]->[e]->[b]'
+---+     +---+     +---+
| a | --> | b | --> | c |
+---+     +---+     +---+
            ^
            |
            |
+---+     +---+
| d | --> | e |
+---+     +---+
```

合流というか元に戻すこともできる。

```bash
MBP2011:~ $ graph-easy <<< '[a]->[b]->[c]->[d]->[a]'

  +-----------------------------+
  v                             |
+---+     +---+     +---+     +---+
| a | --> | b | --> | c | --> | d |
+---+     +---+     +---+     +---+
```

## 記号に文字列を表示する
上の図、dからaにフィードバック掛かってるみたいだ。この矢印にFeedBackって表示したいなと思ったら、該当するコマンド（４つ目の-&gt;）に対して指示をする。

指示の仕方は{}で囲って繋げるだけ。表示する文字列のことをラベルと呼ぶので`{label:"hoge";}`とか指定する。

```bash
MBP2011:~ $ graph-easy <<< '[a]->[b]->[c]->[d]->{label:"FeedBack";}[a]'
      FeedBack
  +-----------------------------+
  v                             |
+---+     +---+     +---+     +---+
| a | --> | b | --> | c | --> | d |
+---+     +---+     +---+     +---+
```

ラベルを付けられるのは矢印だけじゃない。てか指定間違えたらハコに文字列が入った。。。というわけで{}で指定したい属性は必ず指定すべき記号の後ろに書く。

```bash
MBP2011:~ $ graph-easy <<< '[a]->[b]->[c]->[d]{label:"feedback";}->[a]'

  +-----------------------------+
  v                             |
+---+     +---+     +---+     +----------+
| a | --> | b | --> | c | --> | feedback |
+---+     +---+     +---+     +----------+
```

つまり今までハコをあらわす[]の中に入っていたのは変数名であって、ラベルが指定されていなかったために一時的に変数名が表示されていただけみたいだ。

ただまぁそういう振る舞いである以上、あえて[]に対して{label:}指定はしなくていいですけどね。

```bash
MBP2011:~ $ graph-easy <<< '[apple]->[banana]->[cherry]'
+-------+     +--------+     +--------+
| apple | --> | banana | --> | cherry |
+-------+     +--------+     +--------+
```

## 上から下へ、縦フロー図
実はこれがやりたかった。大抵ハコに表示する文字列は長いし、Webで使う分には縦フローのほうが扱いやすい。Graph::Easyを使おうと思ったのもQiitaにフローチャートを書きたかったから。

というわけでこれまで横書きで表示していたフロー図を縦書きにする指示は{flow:}属性。これを使って`graph{flow:south;}`と指定する。

```bash
MBP2011:~ $ graph-easy <<< 'graph{flow:south;}[apple]->[banana]->[cherry]'
+--------+
| apple  |
+--------+
  |
  |
  v
+--------+
| banana |
+--------+
  |
  |
  v
+--------+
| cherry |
+--------+
```

いきなり出てきたgraphってなんだ？とか何故south？とか思ってはいけない。そういうものだ。が、勘のいい人なら横フロー図を右から左へ流せるようになるはず。

## パラメータをファイルで流し込む
そろそろ入力文字数が増えてきてtypoとか気になってくる頃。これまで''で括って指定していたパラメータをそのままファイルに記述して、これをGraph::Easyに渡すことができる。

```bash
MBP2011:~ $ cat graph.txt
graph{flow:west;}[apple]->[banana]->[cherry]
MBP2011:~ $ graph-easy graph.txt
+--------+     +--------+     +-------+
| cherry | <-- | banana | <-- | apple |
+--------+     +--------+     +-------+
```

このくらい知っていれば大抵事足りるんじゃないかと。

これ以上詳しいことは、[Graph::Easyのマニュアル](http://bloodgate.com/perl/graph/manual/index.html)読んで。