[librsvg: 6/8] Store each element's name as a LocalName instead of generating it
- From: Federico Mena Quintero <federico src gnome org>
- To: commits-list gnome org
- Cc:
- Subject: [librsvg: 6/8] Store each element's name as a LocalName instead of generating it
- Date: Tue, 21 May 2019 00:47:00 +0000 (UTC)
commit c216653450a5fbacc99ff796ed9db88a3cde74db
Author: Federico Mena Quintero <federico gnome org>
Date: Mon May 20 19:20:21 2019 -0500
Store each element's name as a LocalName instead of generating it
rsvg_internals/src/create_node.rs | 28 ++++++++++++++----
rsvg_internals/src/node.rs | 61 ++++-----------------------------------
rsvg_internals/src/xml.rs | 8 ++++-
3 files changed, 35 insertions(+), 62 deletions(-)
---
diff --git a/rsvg_internals/src/create_node.rs b/rsvg_internals/src/create_node.rs
index c6758dd4..98f58188 100644
--- a/rsvg_internals/src/create_node.rs
+++ b/rsvg_internals/src/create_node.rs
@@ -1,3 +1,4 @@
+use markup5ever::LocalName;
use std::collections::HashMap;
use crate::clip_path::NodeClipPath;
@@ -35,9 +36,20 @@ use crate::text::{NodeTRef, NodeTSpan, NodeText};
macro_rules! n {
($name:ident, $node_type:ident, $new_fn:expr) => {
- pub fn $name(id: Option<&str>, class: Option<&str>, parent: Option<&RsvgNode>) -> RsvgNode {
+ pub fn $name(
+ element_name: LocalName,
+ id: Option<&str>,
+ class: Option<&str>,
+ parent: Option<&RsvgNode>,
+ ) -> RsvgNode {
RsvgNode::new(
- NodeData::new(NodeType::$node_type, id, class, Box::new($new_fn())),
+ NodeData::new(
+ NodeType::$node_type,
+ element_name,
+ id,
+ class,
+ Box::new($new_fn()),
+ ),
parent,
)
}
@@ -112,8 +124,12 @@ mod creators {
use creators::*;
-type NodeCreateFn =
- fn(id: Option<&str>, class: Option<&str>, parent: Option<&RsvgNode>) -> RsvgNode;
+type NodeCreateFn = fn(
+ element_name: LocalName,
+ id: Option<&str>,
+ class: Option<&str>,
+ parent: Option<&RsvgNode>,
+) -> RsvgNode;
lazy_static! {
// Lines in comments are elements that we don't support.
@@ -234,11 +250,13 @@ pub fn create_node_and_register_id(
None => &(true, create_non_rendering as NodeCreateFn),
};
+ let element_name = LocalName::from(name);
+
if !supports_class {
class = None;
};
- let node = create_fn(id, class, parent);
+ let node = create_fn(element_name, id, class, parent);
if let Some(id) = id {
// This is so we don't overwrite an existing id
diff --git a/rsvg_internals/src/node.rs b/rsvg_internals/src/node.rs
index 62be59a4..7a37a04a 100644
--- a/rsvg_internals/src/node.rs
+++ b/rsvg_internals/src/node.rs
@@ -23,6 +23,7 @@ pub type RsvgWeakNode = NodeWeakRef<NodeData>;
/// Contents of a tree node
pub struct NodeData {
node_type: NodeType,
+ element_name: LocalName,
id: Option<String>, // id attribute from XML element
class: Option<String>, // class attribute from XML element
specified_values: RefCell<SpecifiedValues>,
@@ -38,12 +39,14 @@ pub struct NodeData {
impl NodeData {
pub fn new(
node_type: NodeType,
+ element_name: LocalName,
id: Option<&str>,
class: Option<&str>,
node_impl: Box<NodeTrait>,
) -> NodeData {
NodeData {
node_type,
+ element_name,
id: id.map(str::to_string),
class: class.map(str::to_string),
specified_values: RefCell::new(Default::default()),
@@ -415,62 +418,8 @@ impl RsvgNode {
self.borrow().node_type
}
- pub fn element_name(&self) -> &'static str {
- match self.get_type() {
- NodeType::Chars => "rsvg-chars", // Dummy element name for chars
- NodeType::Circle => "circle",
- NodeType::ClipPath => "clipPath",
- NodeType::ComponentTransferFunctionA => "feFuncA",
- NodeType::ComponentTransferFunctionB => "feFuncB",
- NodeType::ComponentTransferFunctionG => "feFuncG",
- NodeType::ComponentTransferFunctionR => "feFuncR",
- NodeType::Defs => "defs",
- NodeType::DistantLight => "feDistantLight",
- NodeType::Ellipse => "ellipse",
- NodeType::Filter => "filter",
- NodeType::Group => "g",
- NodeType::Image => "image",
- NodeType::Line => "line",
- NodeType::LinearGradient => "linearGradient",
- NodeType::Link => "a",
- NodeType::Marker => "marker",
- NodeType::Mask => "mask",
- NodeType::NonRendering => "rsvg-non-rendering", // Dummy element name
- NodeType::Path => "path",
- NodeType::Pattern => "pattern",
- NodeType::PointLight => "fePointight",
- NodeType::Polygon => "polygon",
- NodeType::Polyline => "polyline",
- NodeType::RadialGradient => "radialGradient",
- NodeType::Rect => "rect",
- NodeType::SpotLight => "feSpotLight",
- NodeType::Stop => "stop",
- NodeType::Style => "style",
- NodeType::Svg => "svg",
- NodeType::Switch => "switch",
- NodeType::Symbol => "symbol",
- NodeType::Text => "text",
- NodeType::TRef => "tref",
- NodeType::TSpan => "tspan",
- NodeType::Use => "use",
- NodeType::FeBlend => "feBlend",
- NodeType::FeColorMatrix => "feColorMatrix",
- NodeType::FeComponentTransfer => "feComponentTransfer",
- NodeType::FeComposite => "feComposite",
- NodeType::FeConvolveMatrix => "feConvolveMatrix",
- NodeType::FeDiffuseLighting => "feDiffuseLighting",
- NodeType::FeDisplacementMap => "feDisplacementMap",
- NodeType::FeFlood => "feFlood",
- NodeType::FeGaussianBlur => "feGaussianBlur",
- NodeType::FeImage => "feImage",
- NodeType::FeMerge => "feMerge",
- NodeType::FeMergeNode => "feMergeNode",
- NodeType::FeMorphology => "feMorphology",
- NodeType::FeOffset => "feOffset",
- NodeType::FeSpecularLighting => "feSpecularLighting",
- NodeType::FeTile => "feTile",
- NodeType::FeTurbulence => "feTurbulence",
- }
+ pub fn element_name(&self) -> &str {
+ self.borrow().element_name.as_ref()
}
pub fn get_id(&self) -> Option<&str> {
diff --git a/rsvg_internals/src/xml.rs b/rsvg_internals/src/xml.rs
index f1e2d6a0..053b7292 100644
--- a/rsvg_internals/src/xml.rs
+++ b/rsvg_internals/src/xml.rs
@@ -290,7 +290,13 @@ impl XmlState {
child
} else {
let child = RsvgNode::new(
- NodeData::new(NodeType::Chars, None, None, Box::new(NodeChars::new())),
+ NodeData::new(
+ NodeType::Chars,
+ LocalName::from("rsvg-chars"),
+ None,
+ None,
+ Box::new(NodeChars::new()),
+ ),
Some(node),
);
node.append(&child);
[
Date Prev][
Date Next] [
Thread Prev][
Thread Next]
[
Thread Index]
[
Date Index]
[
Author Index]