+ // NOTE: it seems in base rust, you can't really combine "if" and "if let" so I
+ // had to introduce more nesting... please suggest cleaner alternatives if any!
+ if let Ok(contains_class) = node.contains_attribute("class") {
+ if contains_class {
+ if let Some(class_string) = node.get_attribute("class") {
+ node.classes = Some(ElementClass::from_string(class_string));
+ }
+ }
+ }
// if parent_id is possible to insert element (for instance: document already has child element etc)
// if parser not created as part of html fragmentparsing algorithm
@@ -3679,4 +3692,68 @@ mod test {
println!("{}", parser.document);
}
+
+ #[test]
+ fn element_no_classes() {
+ let mut stream = InputStream::new();
+ stream.read_from_str("
", Some(Encoding::UTF8));
+
+ let mut parser = Html5Parser::new(&mut stream);
+ let (doc, _) = parser.parse();
+
+ assert!(doc.get_root().classes.is_none());
+ }
+
+ #[test]
+ fn element_with_classes() {
+ let mut stream = InputStream::new();
+ stream.read_from_str("
", Some(Encoding::UTF8));
+
+ let mut parser = Html5Parser::new(&mut stream);
+ let (doc, _) = parser.parse();
+
+ // document -> html -> head -> body -> div
+ let div = doc.get_node_by_id(NodeId(4)).unwrap();
+ assert!(div.classes.is_some());
+
+ if let Some(classes) = div.classes.as_ref() {
+ assert_eq!(classes.len(), 3);
+
+ assert!(classes.contains("one"));
+ assert!(classes.contains("two"));
+ assert!(classes.contains("three"));
+
+ assert!(classes.is_active("one"));
+ assert!(classes.is_active("two"));
+ assert!(classes.is_active("three"));
+ }
+ }
+
+ #[test]
+ fn element_with_classes_extra_whitespace() {
+ let mut stream = InputStream::new();
+ stream.read_from_str(
+ "
",
+ Some(Encoding::UTF8),
+ );
+
+ let mut parser = Html5Parser::new(&mut stream);
+ let (doc, _) = parser.parse();
+
+ // document -> html -> head -> body -> div
+ let div = doc.get_node_by_id(NodeId(4)).unwrap();
+ assert!(div.classes.is_some());
+
+ if let Some(classes) = div.classes.as_ref() {
+ assert_eq!(classes.len(), 3);
+
+ assert!(classes.contains("one"));
+ assert!(classes.contains("two"));
+ assert!(classes.contains("three"));
+
+ assert!(classes.is_active("one"));
+ assert!(classes.is_active("two"));
+ assert!(classes.is_active("three"));
+ }
+ }
}