]> granicus.if.org Git - graphviz/commitdiff
tests: SvgAnalyzer: add storage of the Graphviz component ID on 'g' elements
authorMagnus Jacobsson <Magnus.Jacobsson@berotec.se>
Mon, 25 Jul 2022 07:02:15 +0000 (09:02 +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_element.h

index 5224d7a938478408cb5c18acf807f99db1ae7cac..67b1d8fee9874b7b27bd2580b83da865f09c5207 100644 (file)
@@ -69,6 +69,16 @@ void SVGAnalyzer::on_enter_element_title() {
 
 void SVGAnalyzer::on_exit_element() { m_elements_in_process.pop_back(); }
 
+SVG::SVGElement &SVGAnalyzer::parent_element() {
+  if (m_elements_in_process.empty()) {
+    throw std::runtime_error{"No current element to get parent of"};
+  }
+  if (m_elements_in_process.size() == 1) {
+    throw std::runtime_error{"No parent element"};
+  }
+  return *m_elements_in_process.end()[-2];
+}
+
 SVG::SVGElement &SVGAnalyzer::current_element() {
   if (m_elements_in_process.empty()) {
     throw std::runtime_error{"No current element"};
@@ -91,6 +101,16 @@ void SVGAnalyzer::enter_element(SVG::SVGElementType type) {
 void SVGAnalyzer::set_text(std::string_view text) {
   auto &element = current_element();
   element.text = text;
+
+  if (element.type == SVG::SVGElementType::Title) {
+    // The title text is normally the 'graph_id', 'node_id' or 'edgeop'
+    // according to the DOT language specification. Save it on the parent 'g'
+    // element to avoid having to look it up later.
+    if (parent_element().type != SVG::SVGElementType::Group) {
+      throw std::runtime_error{"Unexpected parent element of 'title' element"};
+    }
+    parent_element().graphviz_id = text;
+  }
 }
 
 void SVGAnalyzer::set_graphviz_version(std::string_view version) {
index be537585fd9de0c3c7baeede770c542dc26ecb6d..b788ced9915eff11ec8b87ff10e769f6853be918 100644 (file)
@@ -49,6 +49,9 @@ private:
   /// Enter a new SVG element retrieved by the SVG document traverser into the
   /// list of elements currently being processed
   void enter_element(SVG::SVGElementType type);
+  /// Get the parent element of the current element being processed by the SVG
+  /// document traverser
+  SVG::SVGElement &parent_element();
 
   /// A list of pointers to elements currently being processed by the SVG++
   /// document traverser, in hierarchical order. The front element is the top
index 42e15cb58f1bd8f6838cdf34a1a0f29f705758ca..6ef88f1e510c84cd88ce50a01df4f426ce3299f1 100644 (file)
@@ -36,6 +36,10 @@ public:
   /// The Graphviz build date
   std::string graphviz_build_date;
   std::vector<SVGElement> children;
+  /// The `graph_id`, `node_id` or `edgeop` according to the DOT language
+  /// specification. Note that this is not the same as the `id` attribute of the
+  /// SVG element
+  std::string graphviz_id;
   /// The Graphviz release version
   std::string graphviz_version;
   /// The SVG element text node contents. Not to be confused with an SVG `text`