]> granicus.if.org Git - graphviz/commitdiff
gxl2gv: fix: recognize and handle HTML-like strings
authorMatthew Fernandez <matthew.fernandez@gmail.com>
Tue, 6 Jul 2021 00:38:44 +0000 (17:38 -0700)
committerMatthew Fernandez <matthew.fernandez@gmail.com>
Sun, 11 Jul 2021 23:04:47 +0000 (16:04 -0700)
When translating a Graphviz file through gv2gxl, HTML-like and non-HTML-like
strings would be translated identically, resulting in a loss of information.
This was fixed in the series merged in d44d19c86f0f469d1c76ce0d7630c8e0ac85e993.
However, to take this through to completion and make round-tripping such strings
possible, changes to gxl2gv were also required.

The present commit updates gxl2gv to recognize the new ‘kind’ GXL attribute that
gv2gxl uses to indicate a string originated as an HTML-like string. The output
of gxl2gv now correctly translates this back to an HTML-like string. Fixes #517.

Note that this fix is orthogonal to the behavior when using an HTML-like and
non-HTML-like string with the same content. It is still not possible to do this
without confusing the internal string interning dictionary (#2089).

CHANGELOG.md
cmd/tools/gxl2gv.c
rtest/test_regression.py

index 0844b548e4ae0e4666955bef6c6009236d0328e9..49e7378f49a6a7e7166e268a1a0321ebf6ae00d1 100644 (file)
@@ -33,6 +33,8 @@ and this project adheres to [Semantic Versioning](https://semver.org/spec/v2.0.0
 - a Bashism removed from the Autotools build system
 - when Criterion is available, the `command_line` test binary is no longer built
   and installed by default, but rather during `make check`
+- round-tripping a file through ``gv2gxl`` and then ``gxl2gv`` no longer causes
+  HTML-like labels to become non-HTML like labels #517
 
 ## [2.47.3] - 2021-06-19
 
index 73bed1c8d3c640b6e4b40c98fdb31ddad6c53bae..df5d8400af9052838fe60ffe0b51c3fb0d7de016 100644 (file)
@@ -40,6 +40,7 @@ typedef enum {
   TAG_GRAPH,
   TAG_NODE,
   TAG_EDGE,
+  TAG_HTML_LIKE_STRING,
 } attr_t;
 
 typedef struct slist slist;
@@ -553,6 +554,8 @@ startElementHandler(void *userData, const char *name, const char **atts)
                ud->globalAttrType = TAG_EDGE;
            else if (strcmp("graph", atts[pos]) == 0)
                ud->globalAttrType = TAG_GRAPH;
+           else if (strcmp("HTML-like string", atts[pos]) == 0)
+               ud->globalAttrType = TAG_HTML_LIKE_STRING;
        } else {
            ud->globalAttrType = TAG_NONE;
        }
@@ -654,6 +657,9 @@ static void endElementHandler(void *userData, const char *name)
        case TAG_GRAPH:
            setGraphAttr(G, name, value, ud);
            break;
+       case TAG_HTML_LIKE_STRING:
+           setAttr(name, value, ud, true);
+           break;
        }
        free(dynbuf);
        ud->globalAttrType = TAG_NONE;
index 8380564e5b84cf75e117f9d026c82151e991060f..5306fcd3e2b63d7a83d3cb93dd5ac6eeab64199c 100644 (file)
@@ -243,7 +243,6 @@ def test_167():
   # Graphviz should not have caused a segfault
   assert ret != -signal.SIGSEGV, "Graphviz segfaulted"
 
-@pytest.mark.xfail(strict=True)
 @pytest.mark.skipif(shutil.which("gv2gxl") is None or
                     shutil.which("gxl2gv") is None,
                     reason="GXL tools not available")