]> granicus.if.org Git - graphviz/commitdiff
tests: SvgAnalyzer: add handling of the 'id' attribute
authorMagnus Jacobsson <Magnus.Jacobsson@berotec.se>
Wed, 27 Jul 2022 09:05:08 +0000 (11:05 +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 118f869af2277bfb61d42e8d3ef6f6a96144d214..cd1e88a99450ed5f83d22b7212429a5cbeb601ce 100644 (file)
@@ -119,6 +119,10 @@ void SVGAnalyzer::set_height(double height) {
   current_element().attributes.height = height;
 }
 
+void SVGAnalyzer::set_id(std::string_view id) {
+  current_element().attributes.id = id;
+}
+
 void SVGAnalyzer::set_text(std::string_view text) {
   auto &element = current_element();
   element.text = text;
index 541d600cd99e00001573c9897a7640666804463f..26c6bd633fe55f8223b6113ee7e54da6576b3814 100644 (file)
@@ -28,6 +28,7 @@ public:
   void on_enter_element_title() override;
   void on_exit_element() override;
   void set_height(double height) override;
+  void set_id(std::string_view id) override;
   void set_class(std::string_view) override;
   void set_text(std::string_view text) override;
   void set_viewBox(double x, double y, double width, double height) override;
index ac186e95331d889129a8f7c076cddb880654e584..48a10f2c4c02534f8cd1d7da876c84dcd159c77a 100644 (file)
@@ -28,6 +28,7 @@ public:
   virtual void on_exit_element() = 0;
   virtual void set_class(std::string_view) = 0;
   virtual void set_height(double height) = 0;
+  virtual void set_id(std::string_view id) = 0;
   virtual void set_text(std::string_view text) = 0;
   virtual void set_viewBox(double x, double y, double width, double height) = 0;
   virtual void set_width(double width) = 0;
index 639fa955482aa1220c6365f297dfb350f418b5f6..2a50161c5a46f0136802014b79939caccc8a04ff 100644 (file)
@@ -36,6 +36,25 @@ static std::string xml_encode(const std::string &text) {
   return out;
 }
 
+void SVG::SVGElement::append_attribute(std::string &output,
+                                       const std::string &attribute) const {
+  if (attribute.empty()) {
+    return;
+  }
+  if (!output.empty()) {
+    output += " ";
+  }
+  output += attribute;
+}
+
+std::string SVG::SVGElement::id_attribute_to_string() const {
+  if (attributes.id.empty()) {
+    return "";
+  }
+
+  return fmt::format(R"(id="{}")", attributes.id);
+}
+
 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"?>)"
@@ -71,12 +90,13 @@ void SVG::SVGElement::to_string_impl(std::string &output,
   output += tag(type);
 
   std::string attributes_str{};
+  append_attribute(attributes_str, id_attribute_to_string());
   switch (type) {
   case SVG::SVGElementType::Ellipse:
     // ignore for now
     break;
   case SVG::SVGElementType::Group:
-    attributes_str += fmt::format(R"(class="{}")", attributes.class_);
+    attributes_str += fmt::format(R"( class="{}")", attributes.class_);
     break;
   case SVG::SVGElementType::Path:
     // ignore for now
index 628bede7c490fbdfbe461f39728b987d5cff65e9..e910a7cb104f776de8f703d4deb63fcc2d058422 100644 (file)
@@ -33,6 +33,7 @@ std::string_view tag(SVG::SVGElementType type);
 struct SVGAttributes {
   std::string class_;
   double height;
+  std::string id;
   SVGRect viewBox;
   double width;
 };
@@ -65,6 +66,11 @@ public:
   const SVGElementType type;
 
 private:
+  /// append a string possibly containing an attribute to another string,
+  /// handling space separation
+  void append_attribute(std::string &output,
+                        const std::string &attribute) const;
+  std::string id_attribute_to_string() const;
   void to_string_impl(std::string &output, std::size_t indent_size,
                       std::size_t current_indent) const;
 };
index 1a311a22074bb24e8299291788050476af2ac012..24d33c3944df969754f2f8cd677b1e4bcedebf46 100644 (file)
@@ -170,6 +170,11 @@ void SvgppContext::set(svgpp::tag::attribute::height, const double v) {
   m_svgAnalyzer->set_height(v);
 }
 
+void SvgppContext::set(svgpp::tag::attribute::id,
+                       boost::iterator_range<const char *> v) {
+  m_svgAnalyzer->set_id({v.begin(), v.end()});
+}
+
 void SvgppContext::set(svgpp::tag::attribute::class_,
                        boost::iterator_range<const char *> v) {
   m_svgAnalyzer->set_class({v.begin(), v.end()});
index d52053720b7b4e41cef06d870206085b7c06ee09..ec9a5b68be59b6fc603b9fefd04f389fb77f0e3f 100644 (file)
@@ -63,6 +63,7 @@ public:
   void set(svgpp::tag::attribute::y y, double v);
   void set(svgpp::tag::attribute::width width, double v);
   void set(svgpp::tag::attribute::height height, double v);
+  void set(svgpp::tag::attribute::id a, boost::iterator_range<const char *> v);
   void set(svgpp::tag::attribute::class_ a,
            boost::iterator_range<const char *> v);
   void set(svgpp::tag::attribute::viewBox a, double v1, double v2, double v3,
index 824834bd26bb23dfd01c313ad86c662cf525f681..ad63276c1a8706e4c000ffee9e36cf349d68b565 100644 (file)
@@ -28,6 +28,7 @@ void traverseDocumentWithSvgpp(SvgppContext &context, char *text) {
         boost::mpl::set<svgpp::traits::shapes_attributes_by_element,
                         svgpp::tag::attribute::class_,  //
                         svgpp::tag::attribute::height,  //
+                        svgpp::tag::attribute::id,      //
                         svgpp::tag::attribute::viewBox, //
                         svgpp::tag::attribute::width    //
                         >::type;
index a77530f4fb417099373c1a44f42c301c6b06025f..786681f62c35bea8abc2af21817e31b69e0b667e 100644 (file)
@@ -123,7 +123,7 @@ 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] == "<g class=\"graph\">") {
+      if (recreated_svg_lines[i] == "<g id=\"graph0\" class=\"graph\">") {
         // stop comparison here since we do not yet handle all attributes on the
         // 'g' element
         break;
@@ -133,9 +133,14 @@ TEST_CASE(
 
     // do some sanity checks of the parts of the recreated SVG that we cannot
     // yet compare with the original SVG
-    CHECK(recreated_svg.find("<g class=\"graph\">") != std::string::npos);
-    CHECK(recreated_svg.find("<g class=\"node\">") != std::string::npos);
-    CHECK(recreated_svg.find("<g class=\"edge\">") != std::string::npos);
+    CHECK(recreated_svg.find("<g id=\"graph0\" class=\"graph\">") !=
+          std::string::npos);
+    CHECK(recreated_svg.find("<g id=\"node1\" class=\"node\">") !=
+          std::string::npos);
+    CHECK(recreated_svg.find("<g id=\"node2\" class=\"node\">") !=
+          std::string::npos);
+    CHECK(recreated_svg.find("<g id=\"edge1\" class=\"edge\">") !=
+          std::string::npos);
     CHECK(recreated_svg.find("</g>") != std::string::npos);
     CHECK(recreated_svg.find("<title>g1</title>") != std::string::npos);
     CHECK(recreated_svg.find("<title>a</title>") != std::string::npos);