vis-network icon indicating copy to clipboard operation
vis-network copied to clipboard

vis.parseDOTNetwork() doesn't handle default label of \N to mean use the node's name.

Open donno opened this issue 2 years ago • 0 comments

The vis.parseDOTNetwork() function does not take into account the default label of "\N" which means use the name/ID of the label instead. See GraphViz documentation for the label attribute for more.

This results in every node ending up with the label that is \N.

This is problematic because if the input DOT network is run through dot before being parsed it ends up with node [label="\N"];

System Details

Operating System Microsoft Windows 10 Version 22H2 (OS Build 19045.4170)

Browsers

  • Mozilla Firefox 123.0.1 (64-Bit)
  • Micorosoft Edge (Version 122.0.2365.80 (Official build) (64-bit))

Minimal code example

Example on JSBin can be seen here: https://jsbin.com/robupadela/1/edit?html,js,output

The example uses the version from GitHub as per your CodePen examples.

It can be switched to https://cdnjs.cloudflare.com/ajax/libs/vis-network/9.1.9/standalone/umd/vis-network.min.js to be the old version.

HTML

<!DOCTYPE html>
<html>
<head>
  <meta charset="utf-8">
  <meta name="viewport" content="width=device-width">
  <title>Repo</title>
  <script type="text/javascript"
    src="https://visjs.github.io/vis-network/standalone/umd/vis-network.min.js"></script>
</head>
<body>
<p>
  Demonstration of the lack of support for a label with "\N" in DOT language parser.
  This syntax means that the name/ID of the node should be used as the label.
  See <a href="https://graphviz.org/docs/attrs/label/">label documentation</a>.
</p>
<div id="mynetwork"></div>
</body>
</html>

JavaScript

var container = document.getElementById("mynetwork");
var dot =
  "dinetwork {node[label=\"\\N\"]; 1 -> 1 -> 2; 2 -> 3; 2 -- 4; 2 -> 1 }";
var data = vis.parseDOTNetwork(dot);
var network = new vis.Network(container, data);

Work around

            var parsed = vis.parseDOTNetwork(dotString);
            parsed.nodes.forEach(element => {
              // As per https://graphviz.org/docs/attrs/label/ a value of
              // \N is meant to mean use the node's ID or name as the label.
              if (element.label === "\\N")
              {
                element.label = element.id;
              }
            });

donno avatar Mar 16 '24 11:03 donno