14
9

Delete article

Deleted articles cannot be recovered.

Draft of this article would be also deleted.

Are you sure you want to delete this article?

More than 5 years have passed since last update.

<初心者>Vue.jsとviz.jsでgraphvizのオンラインエディタを作ってみた。<Vue.js練習>

Posted at

Vue.jsの公式にはマークダウンエディタの例がある。これのgraphviz版を作ってみる。
公式のマークダウンエディタ

#作ったもの
Viz.jsにはサンプルがあるので、この記事で作っているのは車輪の再発明(バージョンダウン)です。
Vue.jsもViz.jsもcdnから読み込むため、htmlファイル1つで完結します。

test10.gif

Viz.jsとGraphvizについてはそれぞれの公式参照。
Viz.js-公式
Viz.j-github
Graphviz-公式

サンプルだけ引用します。
Graphvizを使用してDOT言語でこのように書くと

digraph G {
    subgraph cluster_0 {
        style=filled;
        color=lightgrey;
        node [style=filled,color=white];
        a0 -> a1 -> a2 -> a3;
        label = "process #1";
    }
    subgraph cluster_1 {
        node [style=filled];
        b0 -> b1 -> b2 -> b3;
        label = "process #2";
        color=blue
    }
    start -> a0;
    start -> b0;
    a1 -> b3;
    b2 -> a3;
    a3 -> a0;
    a3 -> end;
    b3 -> end;
    start [shape=Mdiamond];
    end [shape=Msquare];
}

こう出力される。
index.png

#中身
最低限、下記をhtml形式で保存するだけで動きます。
CSSとpng保存用のmethodが付いた全文はgithubで公開しています。

<!DOCTYPE html>
<html lang="ja">
<head>
  <meta charset="utf-8">
  <title>Vue.js-Viz.js</title>
  <script src="https://cdn.jsdelivr.net/npm/vue@2.6.10/dist/vue.js"></script>
  <script type="text/javascript" src="https://unpkg.com/viz.js@1.8.0"></script>
  <style>
  </style>
</head>
<body>
  <div class="container">
    <div id="graph">
      <div class="write">
        <h2>入力</h2>
        <textarea v-model="input"></textarea>
      </div>
      <div class="out">
        <h2>結果</h2>
        <div class="graph" v-html="svg"></div>
      </div>
    </div>
  </div>
</body>
<script>
  new Vue({
    el: '#graph',
    data: {
      input: `digraph x {
graph [
charset = "UTF-8",
rankdir = LR,
];
start -> a0;
start -> b0;
a1 -> b3;
b2 -> a3;
a3 -> a0;
a3 -> end;
b3 -> end;
}
`,
    },
    computed: {
      svg: function() {
        return Viz(this.input, {
          format: 'svg'
        });
      },
    },
});
</script>
</html>


vue.jsで初めて作ったwebサービスが外部サーバーを挟んでもっさりしており、なにかリアルタイムで書き換わるものを作ってみたかったので作りました。

まだまだ勉強を始めたばかりです。突っ込みどころがあるかもしれません。お気づきの点ありましたら、コメントなどいただけますと大変ありがたいです。

14
9
0

Register as a new user and use Qiita more conveniently

  1. You get articles that match your needs
  2. You can efficiently read back useful information
  3. You can use dark theme
What you can do with signing up
14
9

Delete article

Deleted articles cannot be recovered.

Draft of this article would be also deleted.

Are you sure you want to delete this article?