[librsvg: 1/20] Store a QualName instead of a LocalName for a node's element_name
- From: Federico Mena Quintero <federico src gnome org>
- To: commits-list gnome org
- Cc:
- Subject: [librsvg: 1/20] Store a QualName instead of a LocalName for a node's element_name
- Date: Sat, 26 Oct 2019 23:34:58 +0000 (UTC)
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]