From 402e745b2829239fae538c83e1b25911d8296db5 Mon Sep 17 00:00:00 2001 From: David Froger Date: Tue, 21 Sep 2021 17:09:09 +0200 Subject: [PATCH] allow href for line separator --- src/seqdiag/builder.py | 2 +- src/seqdiag/drawer.py | 13 +++++++++---- src/seqdiag/elements.py | 3 ++- src/seqdiag/parser.py | 34 +++++++++++++++++++++------------- 4 files changed, 33 insertions(+), 19 deletions(-) diff --git a/src/seqdiag/builder.py b/src/seqdiag/builder.py index 47f3f19..969f0f0 100644 --- a/src/seqdiag/builder.py +++ b/src/seqdiag/builder.py @@ -157,7 +157,7 @@ def instantiate(self, group, block, tree): group.set_attribute(stmt) elif isinstance(stmt, parser.Separator): - sep = EdgeSeparator(stmt.type, unquote(stmt.value)) + sep = EdgeSeparator(stmt.type, unquote(stmt.value), stmt.href) sep.group = group self.diagram.separators.append(sep) group.edges.append(sep) diff --git a/src/seqdiag/drawer.py b/src/seqdiag/drawer.py index a381158..5a02244 100644 --- a/src/seqdiag/drawer.py +++ b/src/seqdiag/drawer.py @@ -152,17 +152,22 @@ def edge_label(self, edge): fill=edge.color, halign=halign) def separator(self, sep): + if sep.href and self.format == 'SVG': + drawer = self.drawer.anchor(sep.href) + else: + drawer = self.drawer + m = self.metrics.separator(sep) for line in m.lines: - self.drawer.line(line, fill=self.fill, style=sep.style) + drawer.line(line, fill=self.fill, style=sep.style) if sep.type == 'delay': - self.drawer.rectangle(m.labelbox, fill='white', outline='white') + drawer.rectangle(m.labelbox, fill='white', outline='white') elif sep.type == 'divider': - self.drawer.rectangle(m.labelbox, fill=sep.color, + drawer.rectangle(m.labelbox, fill=sep.color, outline=sep.linecolor) - self.drawer.textarea(m.labelbox, sep.label, + drawer.textarea(m.labelbox, sep.label, self.metrics.font_for(sep), fill=sep.textcolor) def altblock(self, block): diff --git a/src/seqdiag/elements.py b/src/seqdiag/elements.py index 22aa43f..1ae457c 100644 --- a/src/seqdiag/elements.py +++ b/src/seqdiag/elements.py @@ -67,9 +67,10 @@ def clear(cls): cls.basecolor = (208, 208, 208) cls.linecolor = (0, 0, 0) - def __init__(self, _type, label): + def __init__(self, _type, label, href): super(EdgeSeparator, self).__init__() self.label = label + self.href = href self.group = None self.style = None self.color = self.basecolor diff --git a/src/seqdiag/parser.py b/src/seqdiag/parser.py index e793bee..c807eb8 100644 --- a/src/seqdiag/parser.py +++ b/src/seqdiag/parser.py @@ -37,6 +37,7 @@ import io from collections import namedtuple +import re from re import DOTALL, MULTILINE from blockdiag.parser import create_mapper, flatten, oneplus_to_list @@ -51,7 +52,7 @@ Edge = namedtuple('Edge', ('from_node edge_type to_node ' 'followers attrs edge_block')) Statements = namedtuple('Statements', 'stmts') -Separator = namedtuple('Separator', 'type value') +Separator = namedtuple('Separator', 'type value href') Extension = namedtuple('Extension', 'type name attrs') Fragment = namedtuple('Fragment', 'type id stmts') @@ -60,20 +61,24 @@ class ParseException(Exception): pass +SEP_PATTERN = r'(?P===|\.\.\.)(?P