[librsvg: 1/20] Store a QualName instead of a LocalName for a node's element_name



commit 23b832d7af7da39fde5f1e66039b5bd343cb8e3f
Author: Federico Mena Quintero <federico gnome org>
Date:   Fri Oct 18 18:35:21 2019 -0500

    Store a QualName instead of a LocalName for a node's element_name
    
    We don't read the namespace yet from libxml2; we'll do that next.

 rsvg_internals/src/create_node.rs | 15 ++++++++-------
 rsvg_internals/src/gradient.rs    |  5 +++--
 rsvg_internals/src/node.rs        |  8 ++++----
 rsvg_internals/src/pattern.rs     |  3 ++-
 rsvg_internals/src/xml.rs         |  8 ++++++--
 5 files changed, 23 insertions(+), 16 deletions(-)
---
diff --git a/rsvg_internals/src/create_node.rs b/rsvg_internals/src/create_node.rs
index 3f9f6d4f..56fee676 100644
--- a/rsvg_internals/src/create_node.rs
+++ b/rsvg_internals/src/create_node.rs
@@ -1,5 +1,5 @@
 use lazy_static::lazy_static;
-use markup5ever::{local_name, LocalName};
+use markup5ever::{local_name, namespace_url, ns, LocalName, Prefix, QualName};
 use std::collections::HashMap;
 
 use crate::clip_path::NodeClipPath;
@@ -42,7 +42,7 @@ use crate::text::{NodeTRef, NodeTSpan, NodeText};
 
 macro_rules! n {
     ($name:ident, $node_type:ident, $node_trait:ty) => {
-        pub fn $name(element_name: LocalName, id: Option<&str>, class: Option<&str>) -> RsvgNode {
+        pub fn $name(element_name: QualName, id: Option<&str>, class: Option<&str>) -> RsvgNode {
             RsvgNode::new(NodeData::new(
                 NodeType::$node_type,
                 element_name,
@@ -119,7 +119,7 @@ mod creators {
 
 use creators::*;
 
-type NodeCreateFn = fn(element_name: LocalName, id: Option<&str>, class: Option<&str>) -> RsvgNode;
+type NodeCreateFn = fn(element_name: QualName, id: Option<&str>, class: Option<&str>) -> RsvgNode;
 
 macro_rules! c {
     ($hashset:expr, $str_name:expr, $supports_class:expr, $fn_name:ident) => {
@@ -236,16 +236,17 @@ pub fn create_node_and_register_id(
         }
     }
 
-    let &(supports_class, create_fn) = match NODE_CREATORS.get(name) {
-        Some(c) => c,
+    let (supports_class, create_fn, prefix, namespace) = match NODE_CREATORS.get(name) {
+        // hack in the SVG namespace for supported element names
+        Some(&(supports_class, create_fn)) => (supports_class, create_fn, Some("svg"), ns!(svg)),
 
         // Whenever we encounter a node we don't understand, represent it as a
         // non-rendering node.  This is like a group, but it doesn't do any rendering of
         // children.  The effect is that we will ignore all children of unknown elements.
-        None => &(true, create_non_rendering as NodeCreateFn),
+        None => (true, create_non_rendering as NodeCreateFn, None, ns!()),
     };
 
-    let element_name = LocalName::from(name);
+    let element_name = QualName::new(prefix.map(Prefix::from), namespace, LocalName::from(name));
 
     if !supports_class {
         class = None;
diff --git a/rsvg_internals/src/gradient.rs b/rsvg_internals/src/gradient.rs
index b4803ffe..2e639eac 100644
--- a/rsvg_internals/src/gradient.rs
+++ b/rsvg_internals/src/gradient.rs
@@ -787,6 +787,7 @@ fn acquire_gradient<'a>(
 #[cfg(test)]
 mod tests {
     use super::*;
+    use markup5ever::{namespace_url, ns, QualName};
     use crate::float_eq_cairo::ApproxEqCairo;
     use crate::node::{NodeData, NodeType, RsvgNode};
 
@@ -822,7 +823,7 @@ mod tests {
     fn gradient_resolved_from_defaults_is_really_resolved() {
         let node = RsvgNode::new(NodeData::new(
             NodeType::LinearGradient,
-            local_name!("linearGradient"),
+            QualName::new(None, ns!(svg), local_name!("linearGradient")),
             None,
             None,
             Box::new(NodeLinearGradient::default())
@@ -836,7 +837,7 @@ mod tests {
 
         let node = RsvgNode::new(NodeData::new(
             NodeType::RadialGradient,
-            local_name!("radialGradient"),
+            QualName::new(None, ns!(svg), local_name!("radialGradient")),
             None,
             None,
             Box::new(NodeRadialGradient::default())
diff --git a/rsvg_internals/src/node.rs b/rsvg_internals/src/node.rs
index a7e76702..5d494d12 100644
--- a/rsvg_internals/src/node.rs
+++ b/rsvg_internals/src/node.rs
@@ -1,6 +1,6 @@
 use cairo::Matrix;
 use downcast_rs::*;
-use markup5ever::{local_name, LocalName};
+use markup5ever::{local_name, LocalName, QualName};
 use std::cell::Ref;
 use std::collections::HashSet;
 use std::fmt;
@@ -25,7 +25,7 @@ pub type RsvgWeakNode = rctree::WeakNode<NodeData>;
 /// Contents of a tree node
 pub struct NodeData {
     node_type: NodeType,
-    element_name: LocalName,
+    element_name: QualName,
     id: Option<String>,    // id attribute from XML element
     class: Option<String>, // class attribute from XML element
     specified_values: SpecifiedValues,
@@ -41,7 +41,7 @@ pub struct NodeData {
 impl NodeData {
     pub fn new(
         node_type: NodeType,
-        element_name: LocalName,
+        element_name: QualName,
         id: Option<&str>,
         class: Option<&str>,
         node_impl: Box<dyn NodeTrait>,
@@ -79,7 +79,7 @@ impl NodeData {
     }
 
     pub fn element_name(&self) -> &str {
-        self.element_name.as_ref()
+        self.element_name.local.as_ref()
     }
 
     pub fn get_id(&self) -> Option<&str> {
diff --git a/rsvg_internals/src/pattern.rs b/rsvg_internals/src/pattern.rs
index dab166b7..4d9afe90 100644
--- a/rsvg_internals/src/pattern.rs
+++ b/rsvg_internals/src/pattern.rs
@@ -588,13 +588,14 @@ impl NodePattern {
 #[cfg(test)]
 mod tests {
     use super::*;
+    use markup5ever::{namespace_url, ns, QualName};
     use crate::node::{NodeData, NodeType, RsvgNode};
 
     #[test]
     fn pattern_resolved_from_defaults_is_really_resolved() {
         let node = RsvgNode::new(NodeData::new(
             NodeType::Pattern,
-            local_name!("pattern"),
+            QualName::new(None, ns!(svg), local_name!("pattern")),
             None,
             None,
             Box::new(NodePattern::default()),
diff --git a/rsvg_internals/src/xml.rs b/rsvg_internals/src/xml.rs
index a584499d..c2afa3ec 100644
--- a/rsvg_internals/src/xml.rs
+++ b/rsvg_internals/src/xml.rs
@@ -2,7 +2,7 @@ use crate::xml_rs::{reader::XmlEvent, ParserConfig};
 use encoding::label::encoding_from_whatwg_label;
 use encoding::DecoderTrap;
 use libc;
-use markup5ever::{local_name, LocalName};
+use markup5ever::{local_name, LocalName, Namespace, QualName};
 use std::cell::RefCell;
 use std::collections::HashMap;
 use std::rc::{Rc, Weak};
@@ -362,7 +362,11 @@ impl XmlState {
         } else {
             let child = RsvgNode::new(NodeData::new(
                 NodeType::Chars,
-                LocalName::from("rsvg-chars"),
+                QualName::new(
+                    None,
+                    Namespace::from("https://wiki.gnome.org/Projects/LibRsvg";),
+                    LocalName::from("rsvg-chars"),
+                ),
                 None,
                 None,
                 Box::new(NodeChars::new()),


[Date Prev][Date Next]   [Thread Prev][Thread Next]   [Thread Index] [Date Index] [Author Index]