hrhr49 blog

Graph Easyの使い方

2020-09-22 tool CLI

Graph Easyとは

テキストベースで作成したコードから、アスキーアートの状態遷移図とか作れるツール。

こんな感じのコードから...。

1[Alice] -> [Bob]

こんな感じのアスキーアートを作れる。

1+-------+     +-----+
2| Alice | --> | Bob |
3+-------+     +-----+

インストール

Perlのパッケージマネージャであるcpanを使用してインストールする。

1cpan install Graph::Easy

使い方

以下のコマンドを実行する。

1graph-easy <ソースファイル名>

より詳細については、以下の記事が参考になる。

Graph::Easyの使い方 - Qiita

残念なところ

全角文字も、半角の幅の長さで計算されている。 そのため、以下のようにアスキーアートが崩れてしまう。

1このコードが...
2[あ]
3
4こんなふうになってしまう...
5+---+
6| あ |
7+---+

一応、以下の記事で紹介されているパッチを使えば良さそうだけど...正直そこまでやりたくない...。

本を読む Perlでカラム数単位のlengthとsubstrを作ってみる

暫定の対処

自分の用途としては、Vim上で編集しているときにちょっとしたアスキーアートを作成するために 使う程度なので、以下のキーマッピングを使うことでとりあえずは満足している。 (かなりひどい対応だが、今の所それほど問題になっていない)

1vnoremap ge :s/[^\x01-\x7E]/&/ge<CR> \| gv:!graph-easy<CR> \| :'[,']s///ge<CR>

このキーマッピングを使うと以下の動画のように、選択範囲のテキストに対してGrapy::Easyの 変換を適用できる。(補足:Asciinemaでのフォントの関係上、若干ずれているように見えるが実際にはちゃんとできている。)

このキーマッピングでは以下のような処理を行っている。

  1. :s/[^\x01-\x7E]/&薔/ge<CR> の部分。 選択範囲の全角文字([^\x01-\x7E]という正規表現に一致するもの)の直後に「薔」という 文字を追加して、全角文字の横幅を無理やり文字2つ分にする。 (なお、「薔」という文字は別に他のものでも構わないが、自分が絶対に使わないであろう文字を暫定で選んだ)
1このテキストが
2[おはよう]
3
4以下のように変換される
5[お薔は薔よ薔う薔]
  1. gv:!graph-easy<CR> の部分。 先程選択していた範囲のテキストを標準入力として graph-easy コマンドに与えて、 その出力結果でもとのテキストを置き換える。
1このテキストが
2[お薔は薔よ薔う薔]
3
4以下のように変換される
5+----------+
6| お薔は薔よ薔う薔 |
7+----------+
  1. :'[,']s/薔//ge<CR> の部分。 「1.」のときに横幅の帳尻合わせのために追加した文字を削除する。
1このテキストが
2[お薔は薔よ薔う薔]
3
4以下のように変換される
5+----------+
6| おはよう |
7+----------+

参考


Categories: