Search code examples
asciigraphviz

Convert dot to ascii: nested subgraph not recognized by Graph::Easy::Parser::Graphviz?


I'm trying go-callvis to visualize call graph of a Go program:

go-callvis -debug -group pkg -format dot github.com/syncthing/syncthing/cmd/stindex

Output: https://gist.github.com/quantonganh/d2052370bfcae6b1788465c9b5dcffd9

From this output, I want to convert to ASCII art instead of an image by using graph-easy:

❯ graph-easy syncthing-cmd-stindex.dot
Warning: Ignoring unknown attribute 'lheight' for class graph at /Library/Perl/5.18/Graph/Easy/Parser.pm line 1302.
Warning: Ignoring unknown attribute 'lwidth' for class graph at /Library/Perl/5.18/Graph/Easy/Parser.pm line 1302.
Warning: Ignoring unknown attribute 'pad' for class graph at /Library/Perl/5.18/Graph/Easy/Parser.pm line 1302.
Warning: Ignoring unknown attribute 'penwidth' for class graph at /Library/Perl/5.18/Graph/Easy/Parser.pm line 1302.
Warning: Ignoring unknown attribute 'penwidth' for class node at /Library/Perl/5.18/Graph/Easy/Parser.pm line 1302.
Warning: Ignoring unknown attribute 'lheight' for class graph at /Library/Perl/5.18/Graph/Easy/Parser.pm line 1302.
Warning: Ignoring unknown attribute 'lwidth' for class graph at /Library/Perl/5.18/Graph/Easy/Parser.pm line 1302.
',798.1", lwidth=0.37, penwidth=0.8, rank=sink, style=filled, tooltip="package: github.com/syncthing/syncthing/lib/db" ]; "(*github.com/syncthing/syncthing/lib/db.VersionList)

...


112.31,203.1 154.04,203.1 237.26,203.1 299.56,203.1"]; } }' not recognized by Graph::Easy::Parser::Graphviz at /usr/local/bin/graph-easy line 93.

https://gist.github.com/quantonganh/d2052370bfcae6b1788465c9b5dcffd9#file-syncthing-cmd-stindex-dot-L45

Can you tell me what is the problem? Why it always failed at lp attribute in a nested subgraph?


Solution

  • By adding --parse --debug=1:

    # Parser: found subcluster 'cluster_github.com/syncthing/syncthing/lib/db'
    # Creating new group 'cluster_github.com/syncthing/syncthing/lib/db'.
    # remapping attributes 'HASH(0x7f89b1a0b7a0)' for graph
    #$VAR1 = {
              'fontsize' => '16',
              'fillcolor' => 'lightyellow',
              'label' => '[db',
              'URL' => '/?f=github.com/syncthing/syncthing/lib/db',
              'bb' => '265.57,734.1,493.03,810.1',
              'fontname' => 'bold'
            };
    
    # Parser: new node '", lheight=0.22, lp="'
    # Parser: Creating normal node from name ', lheight=0.22, lp='.
    # Parser: new node '379.3'
    # Parser: Creating normal node from name '379.3'.
    # Parsing done.
    # Parser cleanup pass
    ',798.1", lwidth=0.37, penwidth=0.8, rank=sink, style=filled, tooltip="package: github.com/syncthing/syncthing/lib/db" ]; "(*github.com/syncthing/syncthing/lib/db.VersionList)
    ...
    

    If you look at the label value carefully, you will see that it is parsed as '[db' while its value is [db], so the next ones are parsed wrongly:

    # Parser: new node '", lheight=0.22, lp="'
    # Parser: Creating normal node from name ', lheight=0.22, lp='.
    # Parser: new node '379.3'
    # Parser: Creating normal node from name '379.3'.
    # Parsing done.
    

    I have to remove all square brackets around label value to make it can be parsed completely:

    # Parser: found subcluster 'cluster_github.com/syncthing/syncthing/lib/db'
    # Creating new group 'cluster_github.com/syncthing/syncthing/lib/db'.
    # remapping attributes 'HASH(0x7fe097c34a38)' for graph
    #$VAR1 = {
              'fontname' => 'bold',
              'URL' => '/?f=github.com/syncthing/syncthing/lib/db',
              'style' => 'filled',
              'bb' => '265.57,734.1,493.03,810.1',
              'rank' => 'sink',
              'lwidth' => '0.37',
              'label' => 'db',
              'lp' => '379.3,798.1',
              'fillcolor' => 'lightyellow',
              'tooltip' => 'package: github.com/syncthing/syncthing/lib/db',
              'lheight' => '0.22',
              'penwidth' => '0.8',
              'fontsize' => '16'
            };