]> granicus.if.org Git - graphviz/commitdiff
tests: SvgAnalyzer: add handling of the 'stroke' attribute
authorMagnus Jacobsson <Magnus.Jacobsson@berotec.se>
Wed, 27 Jul 2022 13:40:08 +0000 (15:40 +0200)
committerMagnus Jacobsson <Magnus.Jacobsson@berotec.se>
Tue, 16 Aug 2022 10:21:45 +0000 (12:21 +0200)
tests/svg_analyzer.cpp
tests/svg_analyzer.h
tests/svg_analyzer_interface.h
tests/svg_element.cpp
tests/svg_element.h
tests/svgpp_context.cpp
tests/svgpp_context.h
tests/svgpp_document_traverser.cpp
tests/test_svg_analyzer.cpp

index 2bc011657a08400c5e4623dc3f9b7160ac7e7c5d..501171ec27ee53518357d498ad6822ad5e141471 100644 (file)
@@ -123,6 +123,10 @@ void SVGAnalyzer::set_height(double height) {
   current_element().attributes.height = height;
 }
 
+void SVGAnalyzer::set_stroke(std::string_view stroke) {
+  current_element().attributes.stroke = stroke;
+}
+
 void SVGAnalyzer::set_id(std::string_view id) {
   current_element().attributes.id = id;
 }
index 12a201f9a1f0f4f9881fb8019d2076a8c3bb8a52..212fe66a629cd877a4e240919123d6dbd4d9b5f1 100644 (file)
@@ -31,6 +31,7 @@ public:
   void set_height(double height) override;
   void set_id(std::string_view id) override;
   void set_class(std::string_view) override;
+  void set_stroke(std::string_view stroke) override;
   void set_text(std::string_view text) override;
   void set_transform(double a, double b, double c, double d, double e,
                      double f) override;
index a574770d3f0ef8016a227d5f11093b0a7c8ebb8a..086b9ff1dd36c9117a31af7b3f4751272f4a36e3 100644 (file)
@@ -30,6 +30,7 @@ public:
   virtual void set_fill(std::string_view fill) = 0;
   virtual void set_height(double height) = 0;
   virtual void set_id(std::string_view id) = 0;
+  virtual void set_stroke(std::string_view stroke) = 0;
   virtual void set_text(std::string_view text) = 0;
   virtual void set_transform(double a, double b, double c, double d, double e,
                              double f) = 0;
index 55e5c56764b35a4c5c0abf376a7a7eeef38cac92..2d1702331d40e192cdd0db935cbc32ed51ea5f93 100644 (file)
@@ -82,6 +82,15 @@ std::string SVG::SVGElement::id_attribute_to_string() const {
   return fmt::format(R"(id="{}")", attributes.id);
 }
 
+std::string SVG::SVGElement::stroke_attribute_to_string() const {
+  if (attributes.stroke.empty()) {
+    return "";
+  }
+
+  return fmt::format(R"(stroke="{}")",
+                     stroke_to_graphviz_color(attributes.stroke));
+}
+
 std::string SVG::SVGElement::to_string(std::size_t indent_size = 2) const {
   std::string output;
   output += R"(<?xml version="1.0" encoding="UTF-8" standalone="no"?>)"
@@ -121,6 +130,7 @@ void SVG::SVGElement::to_string_impl(std::string &output,
   switch (type) {
   case SVG::SVGElementType::Ellipse:
     append_attribute(attributes_str, fill_attribute_to_string());
+    append_attribute(attributes_str, stroke_attribute_to_string());
     break;
   case SVG::SVGElementType::Group:
     attributes_str += fmt::format(R"( class="{}")", attributes.class_);
@@ -133,12 +143,15 @@ void SVG::SVGElement::to_string_impl(std::string &output,
     break;
   case SVG::SVGElementType::Path:
     append_attribute(attributes_str, fill_attribute_to_string());
+    append_attribute(attributes_str, stroke_attribute_to_string());
     break;
   case SVG::SVGElementType::Polygon:
     append_attribute(attributes_str, fill_attribute_to_string());
+    append_attribute(attributes_str, stroke_attribute_to_string());
     break;
   case SVG::SVGElementType::Polyline:
     append_attribute(attributes_str, fill_attribute_to_string());
+    append_attribute(attributes_str, stroke_attribute_to_string());
     break;
   case SVG::SVGElementType::Svg:
     attributes_str += fmt::format(
@@ -185,6 +198,11 @@ void SVG::SVGElement::to_string_impl(std::string &output,
   }
 }
 
+std::string
+SVG::SVGElement::stroke_to_graphviz_color(const std::string &color) const {
+  return to_graphviz_color(color);
+}
+
 std::string_view SVG::tag(SVGElementType type) {
   switch (type) {
   case SVG::SVGElementType::Circle:
index 87d27bfc42d2034de22270f1ca9ccd2c6e8fad90..4e701c52799152ff57e1665e13a1327adfe73442 100644 (file)
@@ -45,6 +45,7 @@ struct SVGAttributes {
   std::string fill;
   double height;
   std::string id;
+  std::string stroke;
   std::optional<SVGMatrix> transform;
   SVGRect viewBox;
   double width;
@@ -84,6 +85,8 @@ private:
                         const std::string &attribute) const;
   std::string id_attribute_to_string() const;
   std::string fill_attribute_to_string() const;
+  std::string stroke_attribute_to_string() const;
+  std::string stroke_to_graphviz_color(const std::string &color) const;
   void to_string_impl(std::string &output, std::size_t indent_size,
                       std::size_t current_indent) const;
 };
index ea32be5e35f1327647bf34c9c20e5bcf087346db..e75a7cf816ea42b8e663ba51e598d19f0d71a3cb 100644 (file)
@@ -141,6 +141,22 @@ void SvgppContext::set(svgpp::tag::attribute::fill, color_t color,
   m_svgAnalyzer->set_fill(to_color_string(color));
 }
 
+void SvgppContext::set(svgpp::tag::attribute::stroke, svgpp::tag::value::none) {
+  m_svgAnalyzer->set_stroke("none");
+}
+
+void SvgppContext::set(svgpp::tag::attribute::stroke,
+                       svgpp::tag::value::currentColor) {
+  throw std::runtime_error{
+      "the 'stroke' attribute 'currentColor' value is not yet implemented"};
+}
+
+void SvgppContext::set(svgpp::tag::attribute::stroke,
+                       SvgppContext::color_t color,
+                       svgpp::tag::skip_icc_color) {
+  m_svgAnalyzer->set_stroke(to_color_string(color));
+}
+
 void SvgppContext::transform_matrix(const boost::array<double, 6> &matrix) {
   double a = matrix.at(0);
   double b = matrix.at(1);
index f024f0e3e50d50b7c6c59c85b9e8afe8b1812fb2..35b88d275e63077822e58393affe486262bb9f65 100644 (file)
@@ -99,6 +99,56 @@ public:
     throw std::runtime_error{
         "this flavor of the 'fill' attribute is not yet implemented"};
   };
+  void set(svgpp::tag::attribute::stroke, svgpp::tag::value::none);
+  void set(svgpp::tag::attribute::stroke, svgpp::tag::value::currentColor);
+  void set(svgpp::tag::attribute::stroke, color_t color,
+           svgpp::tag::skip_icc_color = svgpp::tag::skip_icc_color());
+  template <class IRI> void set(svgpp::tag::attribute::stroke, IRI const &) {
+    throw std::runtime_error{
+        "this flavor of the 'stroke' attribute is not yet implemented"};
+  };
+  template <class IRI>
+  void set(svgpp::tag::attribute::stroke, svgpp::tag::iri_fragment,
+           IRI const &) {
+    throw std::runtime_error{
+        "this flavor of the 'stroke' attribute is not yet implemented"};
+  };
+  template <class IRI>
+  void set(svgpp::tag::attribute::stroke, IRI const &,
+           svgpp::tag::value::none) {
+    throw std::runtime_error{
+        "this flavor of the 'stroke' attribute is not yet implemented"};
+  };
+  template <class IRI>
+  void set(svgpp::tag::attribute::stroke, svgpp::tag::iri_fragment, IRI const &,
+           svgpp::tag::value::none) {
+    throw std::runtime_error{
+        "this flavor of the 'stroke' attribute is not yet implemented"};
+  };
+  template <class IRI>
+  void set(svgpp::tag::attribute::stroke, IRI const &,
+           svgpp::tag::value::currentColor) {
+    throw std::runtime_error{
+        "this flavor of the 'stroke' attribute is not yet implemented"};
+  };
+  template <class IRI>
+  void set(svgpp::tag::attribute::stroke, svgpp::tag::iri_fragment, IRI const &,
+           svgpp::tag::value::currentColor) {
+    throw std::runtime_error{
+        "this flavor of the 'stroke' attribute is not yet implemented"};
+  };
+  template <class IRI>
+  void set(svgpp::tag::attribute::stroke, IRI const &, color_t,
+           svgpp::tag::skip_icc_color = svgpp::tag::skip_icc_color()) {
+    throw std::runtime_error{
+        "this flavor of the 'stroke' attribute is not yet implemented"};
+  };
+  template <class IRI>
+  void set(svgpp::tag::attribute::stroke, svgpp::tag::iri_fragment, IRI const &,
+           color_t, svgpp::tag::skip_icc_color = svgpp::tag::skip_icc_color()) {
+    throw std::runtime_error{
+        "this flavor of the 'stroke' attribute is not yet implemented"};
+  };
   void transform_matrix(const boost::array<double, 6> &matrix);
   void set(svgpp::tag::attribute::r r, double v);
   void set(svgpp::tag::attribute::rx rx, double v);
index a73c9599c65de3ccbf622d1d7a0d542803063b11..3894ded48c21ce5d8012555465aa28933527ac96 100644 (file)
@@ -30,6 +30,7 @@ void traverseDocumentWithSvgpp(SvgppContext &context, char *text) {
                         svgpp::tag::attribute::fill,      //
                         svgpp::tag::attribute::height,    //
                         svgpp::tag::attribute::id,        //
+                        svgpp::tag::attribute::stroke,    //
                         svgpp::tag::attribute::transform, //
                         svgpp::tag::attribute::viewBox,   //
                         svgpp::tag::attribute::width      //
index 12bb9ae97de5fcf5d91af72de1ae7fd6bbd29767..32197d7ea69f7fe9caa3b29355b5dd2b00ca5db3 100644 (file)
@@ -123,7 +123,8 @@ TEST_CASE(
     boost::split(recreated_svg_lines, recreated_svg, boost::is_any_of("\n"));
     for (std::size_t i = 0; i < original_svg_lines.size(); i++) {
       REQUIRE(i < recreated_svg_lines.size());
-      if (recreated_svg_lines[i] == "<polygon fill=\"white\"/>") {
+      if (recreated_svg_lines[i] ==
+          "<polygon fill=\"white\" stroke=\"none\"/>") {
         // stop comparison here since we do not yet handle all attributes on the
         // 'polygon' element
         break;
@@ -140,8 +141,10 @@ TEST_CASE(
       CHECK(recreated_svg.find("<text>a</text>") != std::string::npos);
       CHECK(recreated_svg.find("<text>b</text>") != std::string::npos);
     }
-    CHECK(recreated_svg.find("<polygon fill=\"white\"/>") != std::string::npos);
-    CHECK(recreated_svg.find("<path fill=\"none\"/>") != std::string::npos);
+    CHECK(recreated_svg.find("<polygon fill=\"white\" stroke=\"none\"/>") !=
+          std::string::npos);
+    CHECK(recreated_svg.find("<path fill=\"none\" stroke=\"black\"/>") !=
+          std::string::npos);
     CHECK(recreated_svg.find("<!-- a -->") != std::string::npos);
     CHECK(recreated_svg.find("<!-- b -->") != std::string::npos);
     CHECK(recreated_svg.find("<!-- a&#45;&gt;b -->") != std::string::npos);