summaryrefslogtreecommitdiff
path: root/media-gfx/xdot/files/backport-2ace1a1-issue-92.patch
diff options
context:
space:
mode:
authorV3n3RiX <venerix@koprulu.sector>2022-10-30 15:03:33 +0000
committerV3n3RiX <venerix@koprulu.sector>2022-10-30 15:03:33 +0000
commitc9388864702fdd7b0b56c049eddb41bdb9054dcb (patch)
tree3595822471cd11e6f9f92565ab81ab9c5ee39c3f /media-gfx/xdot/files/backport-2ace1a1-issue-92.patch
parenta41f630aea0b4b71a6c9a088571f1eaaf8413d53 (diff)
gentoo auto-resync : 30:10:2022 - 15:03:33
Diffstat (limited to 'media-gfx/xdot/files/backport-2ace1a1-issue-92.patch')
-rw-r--r--media-gfx/xdot/files/backport-2ace1a1-issue-92.patch151
1 files changed, 151 insertions, 0 deletions
diff --git a/media-gfx/xdot/files/backport-2ace1a1-issue-92.patch b/media-gfx/xdot/files/backport-2ace1a1-issue-92.patch
new file mode 100644
index 000000000000..8cb76a43fe55
--- /dev/null
+++ b/media-gfx/xdot/files/backport-2ace1a1-issue-92.patch
@@ -0,0 +1,151 @@
+https://github.com/jrfonseca/xdot.py/issues/92
+https://bugs.gentoo.org/873490
+
+From 2ace1a12d78423d9e7af20fdb0bca34827010408 Mon Sep 17 00:00:00 2001
+From: Jose Fonseca <jose.r.fonseca@gmail.com>
+Date: Tue, 28 Sep 2021 13:19:49 +0100
+Subject: [PATCH] Handle xdot backslashes correctly.
+
+Irrespectively of graphviz version.
+
+Fixes https://github.com/jrfonseca/xdot.py/issues/92
+---
+ tests/issue_92_a.dot | 3 +++
+ tests/issue_92_b.dot | 3 +++
+ xdot/dot/parser.py | 26 +++++++++++++++++++++-----
+ xdot/ui/window.py | 11 ++++++++++-
+ 4 files changed, 37 insertions(+), 6 deletions(-)
+ create mode 100644 tests/issue_92_a.dot
+ create mode 100644 tests/issue_92_b.dot
+
+diff --git a/tests/issue_92_a.dot b/tests/issue_92_a.dot
+new file mode 100644
+index 0000000..ea486b0
+--- /dev/null
++++ b/tests/issue_92_a.dot
+@@ -0,0 +1,3 @@
++digraph {
++ 1 [label="a\\00"]
++}
+diff --git a/tests/issue_92_b.dot b/tests/issue_92_b.dot
+new file mode 100644
+index 0000000..ba90566
+--- /dev/null
++++ b/tests/issue_92_b.dot
+@@ -0,0 +1,3 @@
++digraph {
++ 1 [label="a\\b"]
++}
+diff --git a/xdot/dot/parser.py b/xdot/dot/parser.py
+index 4244e03..6578c23 100644
+--- a/xdot/dot/parser.py
++++ b/xdot/dot/parser.py
+@@ -14,8 +14,11 @@
+ # along with this program. If not, see <http://www.gnu.org/licenses/>.
+ #
+ import colorsys
++import re
+ import sys
+
++from distutils.version import LooseVersion
++
+ from .lexer import ParseError, DotLexer
+
+ from ..ui.colors import lookup_color
+@@ -85,7 +88,14 @@ class XDotAttrParser:
+ - http://www.graphviz.org/doc/info/output.html#d:xdot
+ """
+
+- def __init__(self, parser, buf):
++ def __init__(self, parser, buf, broken_backslashes):
++
++ # `\` should be escaped as `\\`, but older versions of graphviz xdot
++ # output failed to properly escape it. See also
++ # https://github.com/jrfonseca/xdot.py/issues/92
++ if not broken_backslashes:
++ buf = re.sub(br'\\(.)', br'\1', buf)
++
+ self.parser = parser
+ self.buf = buf
+ self.pos = 0
+@@ -427,10 +437,16 @@ class XDotParser(DotParser):
+
+ XDOTVERSION = '1.7'
+
+- def __init__(self, xdotcode):
++ def __init__(self, xdotcode, graphviz_version=None):
+ lexer = DotLexer(buf=xdotcode)
+ DotParser.__init__(self, lexer)
+
++ # https://github.com/jrfonseca/xdot.py/issues/92
++ self.broken_backslashes = False
++ if graphviz_version is not None and \
++ LooseVersion(graphviz_version) < LooseVersion("2.46.0"):
++ self.broken_backslashes = True
++
+ self.nodes = []
+ self.edges = []
+ self.shapes = []
+@@ -480,7 +496,7 @@ def handle_graph(self, attrs):
+
+ for attr in ("_draw_", "_ldraw_", "_hdraw_", "_tdraw_", "_hldraw_", "_tldraw_"):
+ if attr in attrs:
+- parser = XDotAttrParser(self, attrs[attr])
++ parser = XDotAttrParser(self, attrs[attr], self.broken_backslashes)
+ self.shapes.extend(parser.parse())
+
+ def handle_node(self, id, attrs):
+@@ -502,7 +518,7 @@ def handle_node(self, id, attrs):
+ shapes = []
+ for attr in ("_draw_", "_ldraw_"):
+ if attr in attrs:
+- parser = XDotAttrParser(self, attrs[attr])
++ parser = XDotAttrParser(self, attrs[attr], self.broken_backslashes)
+ shapes.extend(parser.parse())
+ try:
+ url = attrs['URL']
+@@ -525,7 +541,7 @@ def handle_edge(self, src_id, dst_id, attrs):
+ shapes = []
+ for attr in ("_draw_", "_ldraw_", "_hdraw_", "_tdraw_", "_hldraw_", "_tldraw_"):
+ if attr in attrs:
+- parser = XDotAttrParser(self, attrs[attr])
++ parser = XDotAttrParser(self, attrs[attr], self.broken_backslashes)
+ shapes.extend(parser.parse())
+ if shapes:
+ src = self.node_by_name[src_id]
+diff --git a/xdot/ui/window.py b/xdot/ui/window.py
+index 893bd1d..e27f000 100644
+--- a/xdot/ui/window.py
++++ b/xdot/ui/window.py
+@@ -56,6 +56,7 @@ class DotWidget(Gtk.DrawingArea):
+ }
+
+ filter = 'dot'
++ graphviz_version = None
+
+ def __init__(self):
+ Gtk.DrawingArea.__init__(self)
+@@ -100,6 +101,7 @@ def error_dialog(self, message):
+
+ def set_filter(self, filter):
+ self.filter = filter
++ self.graphviz_version = None
+
+ def run_filter(self, dotcode):
+ if not self.filter:
+@@ -153,7 +155,14 @@ def set_dotcode(self, dotcode, filename=None, center=True):
+
+ def set_xdotcode(self, xdotcode, center=True):
+ assert isinstance(xdotcode, bytes)
+- parser = XDotParser(xdotcode)
++ if self.graphviz_version is None:
++ stdout = subprocess.check_output([self.filter, '-V'], stderr=subprocess.STDOUT)
++ stdout = stdout.rstrip()
++ mo = re.match(br'^.* - .* version (?P<version>.*) \(.*\)$', stdout)
++ assert mo
++ self.graphviz_version = mo.group('version').decode('ascii')
++
++ parser = XDotParser(xdotcode, graphviz_version=self.graphviz_version)
+ self.graph = parser.parse()
+ self.zoom_image(self.zoom_ratio, center=center)
+