Ruby で JSONCanvas 形式を読み書きできるライブラリを作りました

json_canvasJSONCanvasは形式のファイルを Ruby で簡単に読み書きできるライブラリです。すでにいくつかの言語のライブラリはあったのですが Ruby 用が無かったので作りました。

インストール方法

json_canvas を使い始めるには、まずアプリケーションのGemfileに以下の行を追加してください。

gem 'json_canvas'

その後、ターミナルで以下のコマンドを実行します。

$ bundle install

もしくは、直接以下のコマンドを使ってインストールすることも可能です。

$ gem install json_canvas

基本的な使い方

JsonCanvasを使用するには、Rubyスクリプト内で以下のようにgemを読み込んでください。

require 'json_canvas'

キャンバスの作成

新しいキャンバスを作成するには、次のコードを使用します。

jc = JsonCanvas.create

テキストノードの追加

キャンバスにテキストノードを追加する方法は以下の通りです。

text_node = jc.add_text(text: "Hi")

テキストノードには、id, 位置, サイズ, 内容, 色などのパラメータをカスタマイズして設定することができます。

custom_text = jc.add_text(id: "unique_id", x: 50, y: 100, width: 200, height: 50, text: "Hello World!", color: "2")

このテキストを後述の save メソッドを使ってファイルに保存してから Obsidian などの対応するアプリケーションで開くと以下のように表示されます。

その他のノードタイプ

ファイルノードやリンクノード、グループノードを特定の属性で追加することもできます。

file_node = jc.add_file(file: "path/to/file")
link_node = jc.add_link(url: "https://example.com")
group_node = jc.add_group(label: "Test Group")

エッジの追加

ノード間をエッジで接続することができます。

jc = JsonCanvas.create
start = jc.add_text(id: "START", text: "start")
goal = jc.add_text(id: "GOAL", x: 400, text: "goal")
jc.add_edge(id: "edge1", fromNode: start.id, toNode: goal.id)
jc.add_edge(id: "edge2", fromNode: start.id, fromSide: "top", fromEnd: "arrow", toNode: goal.id, toSide: "bottom", toEnd: "arrow", color: "2", label: "HELLO")

JSON文字列への変換

作成したキャンバスインスタンスJSON文字列に変換する場合は、to_jsonメソッドを使用します。

jc.to_json  #=> '{"nodes":[{"id":"START","x":0,"y":0,"width":250,"height":60,"type":"text","text":"start"},{"id":"GOAL","x":400,"y":0,"width":250,"height":60,"type":"text","text":"goal"}],"edges":[{"id":"edge1","fromNode":"START","toNode":"GOAL","fromSide":"right","toSide":"left"},{"id":"edge2","fromNode":"START","toNode":"GOAL","fromSide":"top","fromEnd":"arrow","toSide":"bottom","toEnd":"arrow","color":"2","label":"HELLO"}]}'

保存と読み込み

キャンバスをファイルに保存することや、ファイルからキャンバスオブジェクトを読み込むことができます。

# "sample.canvas"ファイルに保存。
jc.save("sample.canvas")

# キャンバスオブジェクトを読み込み。
loaded_canvas = JsonCanvas.parse(File.read("sample.canvas"))

まとめ

Ruby コードからクラス構造を出力したり、複雑なルールに沿ったグラフを自動生成したいときなどはスクリプトから作るのが便利かもしれません。もしくは Obsidian で生成したグラフを読み込んで特定のルールに沿ってノードを整形するなどもよさそうです。是非色々な使い方を考えてみてください。