このReGRaFiLoは一言でいうと「Rustで書かれてたグラフを表現するフォーマットからグラフを表現するフォーマットや画像、アニメーションを生成するCLIツール」です。
Haskellerならおなじみの「ある文書構造を他の形式の文書構造に変換するPandocのグラフ理論的グラフ版」だと思ってもいいかもしれません。
ちなみに読み方は「レグラフィーロ」です。エスペラント語で「再度グラフを扱う道具」的な意味です。
cargo install regrafilo
などでインストールした後にregrafilo input.dot output.png
のように扱います。(予定)
v1.0.0
以降で最初から対応している形式は次の通りです。
- .regrf
ReGRaFiLoの中間形式。詳細は後述。 - .dot
グラフといえばおなじみのdot言語です。 - .gml
グラフモデリング言語(GML)形式です。階層的なAscii形式をベースとした宣言的な形式。非常に簡単な構文でネットワークデータをサポートしている。 - .xgmml
GMLの機能をベースとしたXML形式です。.gmlとお互いに容易に変換できます。 - .gexf
オープンなグラフ可視化プラットフォームであるGephiの内部形式で使われています。非常に変換元として優秀です。 - .gdf
CSVのデータテーブル風に頂点や辺を定義していく形式です。 - .graphml
XML形式のGMLですはノードとエッジの属性、階層グラフをサポートしており、柔軟なアーキテクチャによって多くのメリットを持っている。
- テキスト形式
- .regrf
ReGRaFiLoの中間形式。詳細は後述。 - 対応している入力形式に出ている形式
- 画像形式
- .png
画像データを無劣化な可逆圧縮により記録するラスタ画像形式の一つ。透過も可能。 - .jpg
画像データを劣化する非可逆圧縮により記録するラスタ画像形式の一つ。色の透過はできない。 - .bmp
最も基本的な画像形式の一つ。非圧縮画像のため画質はいいが、データ量は重い。 - .eps
PDFのようにPostScriptから派生したベクタ画像形式の一つ。そのためPDFで使われることの多い。 - .svg
XML形式で記述されるベクタ画像形式の一つ。通常HTML上で使われる上に、アニメーションにも対応している。 - .gif
画像データを可逆圧縮により記録するラスタ画像形式の一つ。色数の少ない画像データの保存に適しており、透過もできる。
- アニメーション対応 ※
v2.0.0
以降から対応予定
- .svg
画像形式だけでなくアニメーションにも対応している。 - .gif
画像形式だけでなくアニメーションにも対応している。
まず丁寧に記述されたdot言語のファイルをご覧ください。
このファイルを入力としてgraphvizのコマンドdot -T png document/example.dot -o document/example.png
により同名のpng画像を出力出力すると次のようになります。
そしてこのdotファイルをregrf形式で記述するとこのregrfファイルになります。
regrf形式のファイルは先にみたように属性無しのXML風の形式で記述します。 XML同様タグを用いて宣言していきますが、XMLと違いいくつかの制限がかかっています。 その制限は
- 属性を利用できない
- タグ名はハイフンが文字列の終始にならない文字列で、半角英文字の小文字とハイフンのみからなる
- 形式の中身を持たないタグは利用できない
- 値を持たない場合はとしなければいけない
となっています。
.regrfでは最初にレイアウト構造を定義し、次にグラフを定義していく形で記述していきます。 regrf形式の全体構造の外形は次のように表現されます。
<regrf>
<meta>
<charset>utf8</charset>
<version>0.0.1</version>
</meta>
<layout>
<colors>
<color>color</color>
</colors>
<labels>
<label>label structure</label>
</labels>
<graphs>
<graph>inner graph structure</graph>
</graphs>
<nodes>
<node>node structure</node>
</nodes>
<edges>
<edge>edge structure</edge>
</edges>
</layout>
<outer-graph>
<nodes>
<node>node body</node>
</nodes>
<inner-graphs>
<inner-graph>inner graph body</inner-graph>
</inner-graphs>
<edges>
<edge>edge body</edge>
</edges>
</outer-graph>
</regrf>
このように.regrfは属性を用いないXML風の形式で記述されます。
中身を見ていくと、regrfタグの下にはmeta、layout、outer-graphタグが定義されています。これらは必須です。
文法について詳しく知りたければこちらのファイルをご覧ください。
ReGRaFiLoは大きく分けてフロントエンド、ミドルエンド、バックエンドに分かれています。
フロントエンドは入力をregrf形式を表す構造体(以下、regrf構造体)に変換する部分です。
この構造体への変換用のトレイトを実装し、コマンド実行時の引数とともに登録することでユーザー定義の構造体でも利用できる実装となっています。
ミドルエンドはregrf構造体の欠けている情報を補って最適化する処理を行います。ここは基本的にユーザーは改造することができません。
バックエンドはフロントエンドの逆のことができます。つまりフロントエンドと同様に変換用のトレイトを実装して登録することでユーザー定義の構造体が利用できます。
このように分かれているのは
cargo install
でデフォルト版をおとしてCLIツールとして使う- ライブラリとして取ってきて自分の言語を追加して、自前ビルドによってCLIツールを生成して使う
- 単にライブラリとして利用する
ということができるようにするためです。
重要な変更があった場合masterブランチに反映される。また、masterブランチはreleaseブランチの役目も持ち、リリースする場合はバージョン名のtag(ex. v0.0.1)をうつ。
バージョンは"v{メジャーバージョン}.{マイナーバージョン}.{改訂バージョン}"からなる。
メインの開発用のブランチはdevelopブランチで行う。使い方としてはdevelopブランチからまずdevelop-ver{メジャーバージョン}ブランチを切る。
そこから機能ごとのブランチを切ってそちらで開発後、develop-ver{メジャーバージョン}ブランチにプルリクを出してマージするという形。
機能ごとのブランチはfeature-ver{メジャーバージョン}-{機能名}ブランチで行う。
developブランチにプルリクを投げてマージされた後にバグが発生した場合、featureタグと同様にfix-ver{メジャーバージョン}-{バグ名}ブランチを切ってそのうえで行う。