diff --git a/src/node.rs b/src/node.rs index d1e1b689..37de7a55 100644 --- a/src/node.rs +++ b/src/node.rs @@ -8,7 +8,6 @@ use std::ops::Deref; use html5ever::tendril::StrTendril; use html5ever::{Attribute, LocalName, QualName}; - use selectors::attr::CaseSensitivity; /// An HTML node. @@ -238,25 +237,26 @@ pub struct Element { impl Element { #[doc(hidden)] - pub fn new(name: QualName, attrs: Vec) -> Self { - let id = attrs - .iter() - .find(|a| a.name.local.deref() == "id") - .map(|a| LocalName::from(a.value.deref())); - - let classes: HashSet = attrs - .iter() - .find(|a| a.name.local.deref() == "class") - .map_or_else(HashSet::new, |a| { - a.value - .deref() - .split_whitespace() - .map(LocalName::from) - .collect() - }); + pub fn new(name: QualName, attributes: Vec) -> Self { + let mut classes: HashSet = HashSet::new(); + let mut attrs = Attributes::with_capacity(attributes.len()); + let mut id: Option = None; + + for a in attributes { + match a.name.local.deref() { + "id" => { + id = Some(LocalName::from(a.value.deref())); + } + "class" => { + classes.extend(a.value.deref().split_whitespace().map(LocalName::from)); + } + _ => (), + }; + attrs.insert(a.name, a.value); + } Element { - attrs: attrs.into_iter().map(|a| (a.name, a.value)).collect(), + attrs, name, id, classes,