]> granicus.if.org Git - graphviz/commitdiff
Fix incorrect json output from input
authorEmden R. Gansner <erg@emdenrg.net>
Sun, 8 May 2016 18:46:54 +0000 (14:46 -0400)
committerEmden R. Gansner <erg@emdenrg.net>
Sun, 8 May 2016 18:46:54 +0000 (14:46 -0400)
graph {
  a
  subgraph X {
    subgraph Y {
    }
  }
}

and improve pretty-printing.

plugin/core/gvrender_core_json.c

index 4a0b848a23ec1981b054b9df4dd06ae2e9d86a5e..3c7682579326d5b3ca1a8b86ab3f0d1347e82984 100644 (file)
@@ -397,7 +397,6 @@ static void write_subg(Agraph_t * g, GVJ_t * job, state_t* sp)
     write_graph (g, job, FALSE, sp);
     for (sg = agfstsubg(g); sg; sg = agnxtsubg(sg)) {
        gvputs(job, ",\n");
-       indent(job, sp->Level-1);
        write_subg(sg, job, sp);
     }
 }
@@ -483,9 +482,7 @@ static void write_edge(Agedge_t * e, GVJ_t * job, int top, state_t* sp)
        gvputs(job, "}");
     }
     else {
-       indent (job, sp->Level++);
        gvprintf(job, "%d", ED_gid(e));
-       sp->Level--;
     }
 }
 
@@ -510,10 +507,15 @@ static int write_edges(Agraph_t * g, GVJ_t * job, int top, state_t* sp)
     gvputs(job, ",\n");
     indent (job, sp->Level++);
     gvputs(job, "\"edges\": [\n");
+    if (!top)
+        indent (job, sp->Level);
     for (; np; np = agnxtnode(g,np)) {
        for (ep = agfstout(g, np); ep; ep = agnxtout(g,ep)) {
            if (not_first) 
-               gvputs(job, ",\n");
+                if (top)
+                   gvputs(job, ",\n");
+                else
+                   gvputs(job, ",");
            else
                not_first = 1;
            write_edge(ep, job, top, sp);
@@ -553,7 +555,7 @@ static int write_nodes(Agraph_t * g, GVJ_t * job, int top, int has_subgs, state_
 
     n = agfstnode(g);
     if (!n) {
-       if (has_subgs) {
+       if (has_subgs && top) {
            sp->Level--;
            gvputs(job, "\n");
            indent (job, sp->Level);
@@ -562,18 +564,24 @@ static int write_nodes(Agraph_t * g, GVJ_t * job, int top, int has_subgs, state_
        return 0;
     }
     gvputs(job, ",\n");
-    indent (job, sp->Level++);
     if (top) {
-       if (!has_subgs) gvputs(job, "\"objects\": [\n");
+       if (!has_subgs) {
+            indent (job, sp->Level++);
+            gvputs(job, "\"objects\": [\n");
+        }
     }
     else {
+        indent (job, sp->Level++);
        gvputs(job, "\"nodes\": [\n");
        indent (job, sp->Level);
     }
     for (; n; n = agnxtnode(g, n)) {
        if (IS_CLUSTER(n)) continue;
        if (not_first) 
-           gvputs(job, ",");
+            if (top)
+               gvputs(job, ",\n");
+            else
+               gvputs(job, ",");
        else
            not_first = 1;
        write_node (n, job, top, sp);