]> granicus.if.org Git - graphviz/commitdiff
fix 'id' attribute in SVG output omitting input graph id
authorMatthew Fernandez <matthew.fernandez@gmail.com>
Sat, 27 Aug 2022 22:17:09 +0000 (15:17 -0700)
committerMatthew Fernandez <matthew.fernandez@gmail.com>
Sat, 27 Aug 2022 22:17:09 +0000 (15:17 -0700)
When using an ID attribute on the input graph,¹ this attribute would only be
propagated to some output elements. In particular, generated `linearGradient`
and `radialGradient` elements in SVGs would be missing the ID.

Gitlab: fixes #2258

¹ https://graphviz.org/docs/attrs/id/

CHANGELOG.md
plugin/core/gvrender_core_svg.c
tests/test_regression.py

index 259669a9f067edb042218c07a442493e6c31903e..5ab3b3dfdd9dab3c5b809f0e9fb452678bcd971c 100644 (file)
@@ -14,6 +14,10 @@ and this project adheres to [Semantic Versioning](https://semver.org/spec/v2.0.0
 - Accuracy of the bounding boxes printed by the `showboxes` feature have been
   improved.
 
+### Fixed
+
+- Id attribute is not used in linearGradient. #2258
+
 ### Removed
 
 - The `$GV_FILE_PATH` sandboxing mechanism has been removed #2257
index d77532c80100df94cd0dc24cddeba66f2f734e66..363ef2985d2b9afee43c9a18dcf5681ffa50ee80 100644 (file)
@@ -553,8 +553,12 @@ static int svg_gradstyle(GVJ_t * job, pointf * A, int n)
     G[0].x = G[0].y = G[1].x = G[1].y = 0.;
     get_gradient_points(A, G, n, angle, 0);    //get points on gradient line
 
-    gvprintf(job,
-            "<defs>\n<linearGradient id=\"l_%d\" gradientUnits=\"userSpaceOnUse\" ", id);
+    gvputs(job, "<defs>\n<linearGradient id=\"");
+    if (obj->id != NULL) {
+        gvputs_xml(job, obj->id);
+        gvputc(job, '_');
+    }
+    gvprintf(job, "l_%d\" gradientUnits=\"userSpaceOnUse\" ", id);
     gvputs(job, "x1=\"");
     gvprintdouble(job, G[0].x);
     gvputs(job, "\" y1=\"");
@@ -589,8 +593,12 @@ static int svg_rgradstyle(GVJ_t * job)
        ifx = round(50 * (1 + cos(angle)));
        ify = round(50 * (1 - sin(angle)));
     }
-    gvprintf(job,
-            "<defs>\n<radialGradient id=\"r_%d\" cx=\"50%%\" cy=\"50%%\" r=\"75%%\" "
+    gvputs(job, "<defs>\n<radialGradient id=\"");
+    if (obj->id != NULL) {
+       gvputs_xml(job, obj->id);
+       gvputc(job, '_');
+    }
+    gvprintf(job, "r_%d\" cx=\"50%%\" cy=\"50%%\" r=\"75%%\" "
             "fx=\"%.0f%%\" fy=\"%.0f%%\">\n",
             id, ifx, ify);
 
index 548e7bd6ad8551575a5a80128d6b12ed7d787669..5f73a04da040bfc0fcdd8a49e4b330fd85456850 100644 (file)
@@ -1928,7 +1928,6 @@ def test_2257():
   with pytest.raises(subprocess.CalledProcessError):
     subprocess.check_call(["dot", "-Tsvg", input, "-o", os.devnull], env=env)
 
-@pytest.mark.xfail(strict=True)
 def test_2258():
   """
   'id' attribute should be propagated to all graph children in output