+#include <string>
+
#include "graphviz_edge.h"
GraphvizEdge::GraphvizEdge(SVG::SVGElement &svg_g_element)
SVG::SVGPoint GraphvizEdge::center() const { return bbox().center(); }
+std::string GraphvizEdge::color() const {
+ const auto stroke = m_svg_g_element.attribute_from_subtree<std::string>(
+ &SVG::SVGAttributes::stroke, &SVG::SVGElement::is_shape_element, "");
+ const auto stroke_opacity = m_svg_g_element.attribute_from_subtree<double>(
+ &SVG::SVGAttributes::stroke_opacity, &SVG::SVGElement::is_shape_element,
+ 1);
+ return SVG::to_dot_color(stroke, stroke_opacity);
+}
+
double GraphvizEdge::penwidth() const {
return m_svg_g_element.attribute_from_subtree<double>(
&SVG::SVGAttributes::stroke_width, &SVG::SVGElement::is_shape_element, 1);
SVG::SVGRect bbox() const;
/// Return the center of the edge's bounding box
SVG::SVGPoint center() const;
+ /// Return the edge's `color` attribute in RGB hex format if the opacity is
+ /// 100 % or in RGBA hex format otherwise.
+ std::string color() const;
/// Return the 'edgeop' according to the DOT language specification. Note that
/// this is not the same as the 'id' attribute of an edge.
std::string_view edgeop() const;
--- /dev/null
+#include <catch2/catch.hpp>
+#include <fmt/format.h>
+
+#include "svg_analyzer.h"
+#include "test_utilities.h"
+
+TEST_CASE("Edge color",
+ "Test that the Graphviz `color` attribute is used to set the "
+ "`stroke` and `stroke-opacity` attributes correctly for edges in the "
+ "generated SVG") {
+
+ const auto primitive_arrow_shape =
+ GENERATE(from_range(all_primitive_arrow_shapes));
+ INFO(fmt::format("Primitive arrow shape: {}", primitive_arrow_shape));
+
+ const auto edge_rgb_color = GENERATE("#000000", "#ffffff", "#5580aa");
+ const auto opacity = GENERATE(0, 100, 255);
+ const auto edge_rgba_color = fmt::format("{}{:02x}", edge_rgb_color, opacity);
+ INFO(fmt::format("Edge color: {}", edge_rgba_color));
+
+ auto dot =
+ fmt::format("digraph g1 {{edge [arrowhead={} color=\"{}\"]; a -> b}}",
+ primitive_arrow_shape, edge_rgba_color);
+
+ const auto engine = "dot";
+ auto svg_analyzer = SVGAnalyzer::make_from_dot(dot, engine);
+
+ const auto expected_edge_color = [&]() -> const std::string {
+ if (opacity == 255) {
+ return edge_rgb_color;
+ }
+ if (opacity == 0) {
+ return "#00000000"; // transparent/none
+ }
+ return edge_rgba_color;
+ }();
+
+ for (const auto &graph : svg_analyzer.graphs()) {
+ for (const auto &edge : graph.edges()) {
+ CHECK(edge.color() == expected_edge_color);
+ }
+ }
+}