Livedoorブログからの移動

Viz.jsは, javascript単独でdot言語を解析するライブラリ. svgにして, htmlに直接書きだせば, browser上で, グラフを可視化できる.

便利なのだが, どうにもバグがあるっぽい. 同じdot言語テキストをparseしているのに, なんか挙動が違う時がある. 具体的には, HTMLのtableをlabelに使った時に発生した. 
digraph {
  subgraph cluster0 {
    node0 [
      shape=none;
      label=<<table>
        <tr><td>x</td><td>y</td><td>z</td></tr>
      </table>>
  }
}
上のような有向グラフをparseすると, まれに, 「Syntax Error ... 」という感じのエラーメッセージが表示され,  node0が表として表示されなくなる.
再現性は全くなく, 同じ引数を与えても起きたり起きなかったり. ただし, 一度起こると連続して何回か起こる気もする.

※ ただし, 具体的な発生条件はわからないので, 上のdot scriptで本当にエラーが発生するかはわからない. 大体こんな感じってことで. 

根本的解決は難しそうなので, 諦めて成功するまでloopすることで対処した. しかし, Viz.jsのViz関数は, エラー発生時に例外を投げたり, callback関数を登録できたりするわけではない.
内部コードを読むと, console.logにエラーメッセージを出力して, エラー処理が終わっている.

なので, parseが失敗したことをしらべるためには, 以下のようにする必要がある.
var log = console.log
var isSuccess = true
console.log = function(message) { isSuccess = false; }
var svg = Viz(dotScript, "svg", "dot")
console.log = log
if (isSuccess) {
  // parse成功時の処理
} else {
  // parse失敗時の処理
}
これと, setInterval関数によるループを組み合わせたらparse失敗で変なグラフが表示されることはなくなった.

dotコマンドで起きたことはないので, なんかViz.jsに特有の問題なんだろうな.