]> granicus.if.org Git - graphviz/commitdiff
gv2gxl: in GXL output, indicate when a label originated as an HTML like label
authorMatthew Fernandez <matthew.fernandez@gmail.com>
Thu, 24 Jun 2021 02:55:29 +0000 (19:55 -0700)
committerMatthew Fernandez <matthew.fernandez@gmail.com>
Mon, 5 Jul 2021 23:09:09 +0000 (16:09 -0700)
When translating Dot to GXL, labels come out as strings. Input something like:
`label="foo"` and the GXL output is something like
`<attr name="label"><string>foo</string></attr>`. This translation is fine and
works well, until you start using HTML like labels.

Graphviz allows `<` and `>` as delimiters to indicate your label string contains
HTML that should be parsed. When you try to use this feature in combination with
gv2gxl, you get a lossy translation. E.g. the labels `label="foo"` and
`label=<foo>` come out identically in GXL.

This commit makes use of the GXL ‘kind’ field on attributes to note that the
source was an HTML like label. If you translate the two labels from above, you
will now get:

  <attr name="label"><string>foo</string></attr>

and

  <attr name="label" kind="HTML-like string"><string>foo</string></attr>

respectively.

This is a partial fix for #517. This makes the translation to GXL no longer
lossy. The other half of this is recognizing the ‘kind’ field during gxl2gv
translation and preserving it on the way back.

CHANGELOG.md
cmd/tools/gv2gxl.c

index 015e37a563176c74886bb7f51137e0d908ae1902..88f801cc05fcd5ea850b4a2c480dd270261d63c7 100644 (file)
@@ -22,6 +22,8 @@ and this project adheres to [Semantic Versioning](https://semver.org/spec/v2.0.0
 - Fix a typo `GD_LIBS` to `GDLIB_LIBS` in `tclpkg/tcldot/Makefile.am` !2022
 - Autotools build system sets libgd variables now instead of incorrectly setting
   GTK variables
+- HTML strings used as labels are distinguishable in GXL output by
+  `kind="HTML-like string"`
 
 ## [2.47.3] - 2021-06-19
 
index c1adbc7f1e3c45719694e211009fdcd56202daed..4f525db7684287e4aa620734f7fdf8e5bfe2d1ff 100644 (file)
@@ -649,7 +649,12 @@ writeNondefaultAttr(void *obj, FILE * gxlFile, Dict_t * defdict)
                        fprintf(gxlFile, "\t</attr>\n");
                    } else {
                        tabover(gxlFile);
-                       fprintf(gxlFile, "\t<attr name=\"%s\">\n", xml_string(sym->name));
+                       fprintf(gxlFile, "\t<attr name=\"%s\"", xml_string(sym->name));
+                       if (aghtmlstr(data->str[sym->id])) {
+                         // This is a <…> string. Note this in the kind.
+                         fprintf(gxlFile, " kind=\"HTML-like string\"");
+                       }
+                       fprintf(gxlFile, ">\n");
                        tabover(gxlFile);
                        fprintf(gxlFile, "\t\t<string>%s</string>\n", xml_string(data->str[sym->id]));
                        tabover(gxlFile);