@@ -4,7 +4,6 @@ use std::io:: Write;
use std::collections::{btree_map, BTreeMap};
use std::str;
-use std::cell::RefCell;
use std::rc::Rc;
use std::borrow::Cow;
@@ -20,6 +19,7 @@ use std::str::FromStr;
use std::slice;
use convert::{IntoElements, IntoAttributeValue, ElementEmitter};
+use namespaces::NamespaceSet;
/// Escape XML text
pub fn write_escaped<W: Write>(writer: &mut W, input: &str) -> Result<()> {
@@ -97,103 +97,6 @@ impl Node {
}
}
-#[derive(Clone, Debug, PartialEq, Eq)]
-struct NamespaceSet {
- parent: RefCell<Option<Rc<NamespaceSet>>>,
- namespaces: BTreeMap<Option<String>, String>,
-}
-
-impl Default for NamespaceSet {
- fn default() -> Self {
- NamespaceSet {
- parent: RefCell::new(None),
- namespaces: BTreeMap::new(),
- }
- }
-}
-
-impl NamespaceSet {
- fn get(&self, prefix: &Option<String>) -> Option<String> {
- match self.namespaces.get(prefix) {
- Some(ns) => Some(ns.clone()),
- None => match *self.parent.borrow() {
- None => None,
- Some(ref parent) => parent.get(prefix)
- },
- }
- }
-
- fn has<NS: AsRef<str>>(&self, prefix: &Option<String>, wanted_ns: NS) -> bool {
- match self.namespaces.get(prefix) {
- Some(ns) =>
- ns == wanted_ns.as_ref(),
- None => match *self.parent.borrow() {
- None =>
- false,
- Some(ref parent) =>
- parent.has(prefix, wanted_ns),
- },
- }
- }
-
- fn set_parent(&self, parent: Rc<NamespaceSet>) {
- let mut parent_ns = self.parent.borrow_mut();
- let new_set = parent;
- *parent_ns = Some(new_set);
- }
-
-}
-
-impl From<BTreeMap<Option<String>, String>> for NamespaceSet {
- fn from(namespaces: BTreeMap<Option<String>, String>) -> Self {
- NamespaceSet {
- parent: RefCell::new(None),
- namespaces: namespaces,
- }
- }
-}
-
-impl From<Option<String>> for NamespaceSet {
- fn from(namespace: Option<String>) -> Self {
- match namespace {
- None => Self::default(),
- Some(namespace) => Self::from(namespace),
- }
- }
-}
-
-impl From<String> for NamespaceSet {
- fn from(namespace: String) -> Self {
- let mut namespaces = BTreeMap::new();
- namespaces.insert(None, namespace);
-
- NamespaceSet {
- parent: RefCell::new(None),
- namespaces: namespaces,
- }
- }
-}
-
-impl From<(Option<String>, String)> for NamespaceSet {
- fn from(prefix_namespace: (Option<String>, String)) -> Self {
- let (prefix, namespace) = prefix_namespace;
- let mut namespaces = BTreeMap::new();
- namespaces.insert(prefix, namespace);
-
- NamespaceSet {
- parent: RefCell::new(None),
- namespaces: namespaces,
- }
- }
-}
-
-impl From<(String, String)> for NamespaceSet {
- fn from(prefix_namespace: (String, String)) -> Self {
- let (prefix, namespace) = prefix_namespace;
- Self::from((Some(prefix), namespace))
- }
-}
-
#[derive(Clone, PartialEq, Eq, Debug)]
/// A struct representing a DOM Element.
pub struct Element {
@@ -437,7 +340,7 @@ impl Element {
};
write!(writer, "<{}", name)?;
- for (prefix, ns) in &self.namespaces.namespaces {
+ for (prefix, ns) in self.namespaces.declared_ns() {
match prefix {
&None => {
write!(writer, " xmlns=\"")?;
@@ -0,0 +1,105 @@
+use std::collections::BTreeMap;
+use std::cell::RefCell;
+use std::rc::Rc;
+
+
+#[derive(Clone, Debug, PartialEq, Eq)]
+pub struct NamespaceSet {
+ parent: RefCell<Option<Rc<NamespaceSet>>>,
+ namespaces: BTreeMap<Option<String>, String>,
+}
+
+impl Default for NamespaceSet {
+ fn default() -> Self {
+ NamespaceSet {
+ parent: RefCell::new(None),
+ namespaces: BTreeMap::new(),
+ }
+ }
+}
+
+impl NamespaceSet {
+ pub fn declared_ns(&self) -> &BTreeMap<Option<String>, String> {
+ &self.namespaces
+ }
+
+ pub fn get(&self, prefix: &Option<String>) -> Option<String> {
+ match self.namespaces.get(prefix) {
+ Some(ns) => Some(ns.clone()),
+ None => match *self.parent.borrow() {
+ None => None,
+ Some(ref parent) => parent.get(prefix)
+ },
+ }
+ }
+
+ pub fn has<NS: AsRef<str>>(&self, prefix: &Option<String>, wanted_ns: NS) -> bool {
+ match self.namespaces.get(prefix) {
+ Some(ns) =>
+ ns == wanted_ns.as_ref(),
+ None => match *self.parent.borrow() {
+ None =>
+ false,
+ Some(ref parent) =>
+ parent.has(prefix, wanted_ns),
+ },
+ }
+ }
+
+ pub fn set_parent(&self, parent: Rc<NamespaceSet>) {
+ let mut parent_ns = self.parent.borrow_mut();
+ let new_set = parent;
+ *parent_ns = Some(new_set);
+ }
+
+}
+
+impl From<BTreeMap<Option<String>, String>> for NamespaceSet {
+ fn from(namespaces: BTreeMap<Option<String>, String>) -> Self {
+ NamespaceSet {
+ parent: RefCell::new(None),
+ namespaces: namespaces,
+ }
+ }
+}
+
+impl From<Option<String>> for NamespaceSet {
+ fn from(namespace: Option<String>) -> Self {
+ match namespace {
+ None => Self::default(),
+ Some(namespace) => Self::from(namespace),
+ }
+ }
+}
+
+impl From<String> for NamespaceSet {
+ fn from(namespace: String) -> Self {
+ let mut namespaces = BTreeMap::new();
+ namespaces.insert(None, namespace);
+
+ NamespaceSet {
+ parent: RefCell::new(None),
+ namespaces: namespaces,
+ }
+ }
+}
+
+impl From<(Option<String>, String)> for NamespaceSet {
+ fn from(prefix_namespace: (Option<String>, String)) -> Self {
+ let (prefix, namespace) = prefix_namespace;
+ let mut namespaces = BTreeMap::new();
+ namespaces.insert(prefix, namespace);
+
+ NamespaceSet {
+ parent: RefCell::new(None),
+ namespaces: namespaces,
+ }
+ }
+}
+
+impl From<(String, String)> for NamespaceSet {
+ fn from(prefix_namespace: (String, String)) -> Self {
+ let (prefix, namespace) = prefix_namespace;
+ Self::from((Some(prefix), namespace))
+ }
+}