From 3dac2f97626abefd0485436651abeff05a86d42b Mon Sep 17 00:00:00 2001 From: Joshua Thijssen Date: Sun, 29 Sep 2024 16:37:38 +0200 Subject: [PATCH] fixed clippy formatting and issues --- benches/tree_iterator.rs | 21 +- crates/gosub_css3/src/matcher/styling.rs | 5 +- crates/gosub_css3/src/system.rs | 9 +- crates/gosub_html5/src/document.rs | 4 +- crates/gosub_html5/src/document/builder.rs | 5 +- .../gosub_html5/src/document/document_impl.rs | 56 ++-- crates/gosub_html5/src/document/query.rs | 250 +++++++++--------- crates/gosub_html5/src/document/task_queue.rs | 25 +- crates/gosub_html5/src/node/arena.rs | 8 +- crates/gosub_html5/src/node/data/element.rs | 10 +- crates/gosub_html5/src/node/node_impl.rs | 52 ++-- crates/gosub_html5/src/parser.rs | 82 +++--- crates/gosub_html5/src/parser/helper.rs | 17 +- crates/gosub_html5/src/parser/quirks.rs | 20 +- crates/gosub_html5/src/parser/tree_builder.rs | 13 +- crates/gosub_render_utils/src/render_tree.rs | 15 +- .../src/render_tree/desc.rs | 6 +- crates/gosub_shared/src/traits.rs | 1 - crates/gosub_shared/src/traits/css3.rs | 203 +++++++------- crates/gosub_shared/src/traits/document.rs | 6 +- crates/gosub_shared/src/traits/node.rs | 2 +- crates/gosub_shared/src/traits/render_tree.rs | 5 +- .../src/testing/tree_construction.rs | 4 +- examples/html5-parser.rs | 3 +- src/bin/css3-parser.rs | 2 +- src/bin/display-text-tree.rs | 5 +- src/bin/gosub-parser.rs | 2 +- 27 files changed, 423 insertions(+), 408 deletions(-) diff --git a/benches/tree_iterator.rs b/benches/tree_iterator.rs index 0532ab999..639246007 100644 --- a/benches/tree_iterator.rs +++ b/benches/tree_iterator.rs @@ -1,10 +1,13 @@ use std::fs::File; use criterion::{criterion_group, criterion_main, Criterion}; -use gosub_html5::node::NodeId; -use gosub_html5::parser::document::{Document, DocumentBuilder, TreeIterator}; +use gosub_css3::system::Css3System; +use gosub_html5::document::builder::DocumentBuilderImpl; +use gosub_html5::document::document_impl::TreeIterator; use gosub_html5::parser::Html5Parser; use gosub_shared::byte_stream::{ByteStream, Encoding}; +use gosub_shared::node::NodeId; +use gosub_shared::traits::document::DocumentBuilder; fn wikipedia_main_page(c: &mut Criterion) { // Criterion can report inconsistent results from run to run in some cases. We attempt to @@ -17,13 +20,12 @@ fn wikipedia_main_page(c: &mut Criterion) { let mut stream = ByteStream::new(Encoding::UTF8, None); let _ = stream.read_from_file(html_file); - let main_document = DocumentBuilder::new_document(None); - let document = Document::clone(&main_document); - let _ = Html5Parser::parse_document(&mut stream, document, None); + let doc_handle = >::new_document(None); + let _ = Html5Parser::parse_document(&mut stream, doc_handle.clone(), None); group.bench_function("wikipedia main page", |b| { b.iter(|| { - let tree_iterator = TreeIterator::new(&main_document); + let tree_iterator = TreeIterator::new(doc_handle.clone()); let _ = tree_iterator.collect::>(); }) }); @@ -43,13 +45,12 @@ fn stackoverflow_home(c: &mut Criterion) { let mut bytestream = ByteStream::new(Encoding::UTF8, None); let _ = bytestream.read_from_file(html_file); - let main_document = DocumentBuilder::new_document(None); - let document = Document::clone(&main_document); - let _ = Html5Parser::parse_document(&mut bytestream, document, None); + let doc_handle = >::new_document(None); + let _ = Html5Parser::parse_document(&mut bytestream, doc_handle.clone(), None); group.bench_function("stackoverflow home", |b| { b.iter(|| { - let tree_iterator = TreeIterator::new(&main_document); + let tree_iterator = TreeIterator::new(doc_handle.clone()); let _ = tree_iterator.collect::>(); }) }); diff --git a/crates/gosub_css3/src/matcher/styling.rs b/crates/gosub_css3/src/matcher/styling.rs index c1f363582..0a1c46004 100644 --- a/crates/gosub_css3/src/matcher/styling.rs +++ b/crates/gosub_css3/src/matcher/styling.rs @@ -3,12 +3,12 @@ use gosub_shared::document::DocumentHandle; use gosub_shared::node::NodeId; use gosub_shared::traits::css3::{CssOrigin, CssPropertyMap, CssSystem}; use gosub_shared::traits::document::Document; +use gosub_shared::traits::node::ClassList; use gosub_shared::traits::node::ElementDataType; use gosub_shared::traits::node::Node; use itertools::Itertools; use std::cmp::Ordering; use std::collections::HashMap; -use gosub_shared::traits::node::ClassList; use crate::matcher::property_definitions::get_css_definitions; use crate::stylesheet::{Combinator, CssSelector, CssSelectorPart, CssValue, MatcherType, Specificity}; @@ -620,7 +620,6 @@ impl CssProperties { impl CssPropertyMap for CssProperties { type Property = CssProperty; - fn insert_inherited(&mut self, name: &str, value: Self::Property) { self.properties.entry(name.to_string()).or_insert(value); } @@ -654,8 +653,6 @@ impl CssPropertyMap for CssProperties { } } - - #[cfg(test)] mod tests { use super::*; diff --git a/crates/gosub_css3/src/system.rs b/crates/gosub_css3/src/system.rs index 5d10a237a..1c44c83c7 100644 --- a/crates/gosub_css3/src/system.rs +++ b/crates/gosub_css3/src/system.rs @@ -99,9 +99,12 @@ impl CssSystem for Css3System { } } - impl Css3System { - fn resolve_inheritance>(tree: &mut T, node_id: T::NodeId, inherit_props: &Vec<(String, CssValue)>) { + fn resolve_inheritance>( + tree: &mut T, + node_id: T::NodeId, + inherit_props: &Vec<(String, CssValue)>, + ) { let Some(current_node) = tree.get_node_mut(node_id) else { return; }; @@ -143,7 +146,6 @@ impl Css3System { } } - pub fn prop_is_inherit(name: &str) -> bool { get_css_definitions() .find_property(name) @@ -151,7 +153,6 @@ pub fn prop_is_inherit(name: &str) -> bool { .unwrap_or(false) } - pub fn add_property_to_map( css_map_entry: &mut CssProperties, sheet: &crate::stylesheet::CssStylesheet, diff --git a/crates/gosub_html5/src/document.rs b/crates/gosub_html5/src/document.rs index a3abe3065..6456d6b49 100644 --- a/crates/gosub_html5/src/document.rs +++ b/crates/gosub_html5/src/document.rs @@ -1,5 +1,5 @@ +pub mod builder; pub mod document_impl; pub mod fragment; -pub mod builder; -pub mod task_queue; pub mod query; +pub mod task_queue; diff --git a/crates/gosub_html5/src/document/builder.rs b/crates/gosub_html5/src/document/builder.rs index b53051396..2cdd48dc3 100644 --- a/crates/gosub_html5/src/document/builder.rs +++ b/crates/gosub_html5/src/document/builder.rs @@ -6,9 +6,9 @@ use url::Url; use crate::document::document_impl::DocumentImpl; use crate::node::HTML_NAMESPACE; use crate::DocumentHandle; +use gosub_shared::traits::document::DocumentBuilder; use gosub_shared::traits::document::{Document, DocumentType}; use gosub_shared::traits::node::{Node, QuirksMode}; -use gosub_shared::traits::document::DocumentBuilder; /// This struct will be used to create a fully initialized document or document fragment pub struct DocumentBuilderImpl {} @@ -36,7 +36,8 @@ impl DocumentBuilder for DocumentBuilderImpl { HashMap::new(), context_node.location(), ); - let mut fragment_handle = >::new(DocumentType::HTML, None, Some(fragment_root_node)); + let mut fragment_handle = + >::new(DocumentType::HTML, None, Some(fragment_root_node)); // let context_node = context_node.clone(); match quirks_mode { diff --git a/crates/gosub_html5/src/document/document_impl.rs b/crates/gosub_html5/src/document/document_impl.rs index c3a2239ab..374677a9f 100755 --- a/crates/gosub_html5/src/document/document_impl.rs +++ b/crates/gosub_html5/src/document/document_impl.rs @@ -1,8 +1,8 @@ use crate::DocumentHandle; use core::fmt::Debug; +use gosub_shared::traits::document::{Document as OtherDocument, Document, DocumentType}; use std::cell::RefCell; use std::collections::hash_map::Entry; -use gosub_shared::traits::document::{Document as OtherDocument, Document, DocumentType}; use std::collections::HashMap; use std::fmt; use std::fmt::{Display, Formatter}; @@ -11,6 +11,7 @@ use url::Url; use crate::document::builder::DocumentBuilderImpl; use crate::document::fragment::DocumentFragmentImpl; +use crate::document::task_queue::is_valid_id_attribute_value; use crate::node::arena::NodeArena; use crate::node::data::comment::CommentData; use crate::node::data::doctype::DocTypeData; @@ -24,7 +25,6 @@ use gosub_shared::node::NodeId; use gosub_shared::traits::css3::CssSystem; use gosub_shared::traits::node::Node; use gosub_shared::traits::node::QuirksMode; -use crate::document::task_queue::is_valid_id_attribute_value; /// Defines a document #[derive(Debug)] @@ -105,14 +105,15 @@ impl Document for DocumentImpl { self.doctype } - /// Fetches a node by id or returns None when no node with this ID is found fn node_by_id(&self, node_id: NodeId) -> Option<&Self::Node> { self.arena.node_ref(node_id) } fn node_by_named_id(&self, id: &str) -> Option<&Self::Node> { - self.named_id_elements.get(id).and_then(|node_id| self.arena.node_ref(*node_id)) + self.named_id_elements + .get(id) + .and_then(|node_id| self.arena.node_ref(*node_id)) } fn stylesheets(&self) -> &Vec { @@ -155,7 +156,7 @@ impl Document for DocumentImpl { } else { parent_node.insert(node_id, position); } - }, + } None => { // No position given, add to end of the children list parent_node.push(node_id); @@ -204,7 +205,7 @@ impl Document for DocumentImpl { } fn update_node(&mut self, node: Self::Node) { - if ! node.is_registered() { + if !node.is_registered() { log::warn!("Node is not registered to the arena"); return; } @@ -214,7 +215,7 @@ impl Document for DocumentImpl { } fn update_node_ref(&mut self, node: &Self::Node) { - if ! node.is_registered() { + if !node.is_registered() { log::warn!("Node is not registered to the arena"); return; } @@ -359,7 +360,13 @@ impl Document for DocumentImpl { NodeImpl::new( handle.clone(), location, - &NodeDataTypeInternal::Element(ElementData::new(handle.clone(), name, namespace, attributes, class_list)), + &NodeDataTypeInternal::Element(ElementData::new( + handle.clone(), + name, + namespace, + attributes, + class_list, + )), ) } @@ -385,7 +392,7 @@ impl DocumentImpl { /// Update document's named id structure when the node has ID elements fn on_document_node_mutation_update_named_id(&mut self, node: &NodeImpl) { - if ! node.is_element_node() { + if !node.is_element_node() { return; } @@ -396,7 +403,7 @@ impl DocumentImpl { match self.named_id_elements.entry(id_value.clone()) { Entry::Vacant(entry) => { entry.insert(node.id()); - }, + } Entry::Occupied(_) => {} } } @@ -605,20 +612,20 @@ impl, C: CssSystem> Iterator for TreeIterator { #[cfg(test)] mod tests { - use crate::document::query::DocumentQuery; - use crate::parser::query::Query; use super::*; use crate::document::builder::DocumentBuilderImpl; - use gosub_css3::system::Css3System; + use crate::document::query::DocumentQuery; use crate::document::task_queue::DocumentTaskQueue; use crate::node::HTML_NAMESPACE; + use crate::parser::query::Query; + use crate::parser::tree_builder::TreeBuilder; + use gosub_css3::system::Css3System; use gosub_shared::byte_stream::Location; use gosub_shared::traits::document::DocumentBuilder; + use gosub_shared::traits::node::ClassList; use gosub_shared::traits::node::ElementDataType; use gosub_shared::traits::node::NodeType; - use gosub_shared::traits::node::ClassList; use std::collections::HashMap; - use crate::parser::tree_builder::TreeBuilder; type Document = DocumentImpl; @@ -743,8 +750,7 @@ mod tests { #[test] fn document_task_queue() { - let doc_handle: DocumentHandle, Css3System> = - DocumentBuilderImpl::new_document(None); + let doc_handle: DocumentHandle, Css3System> = DocumentBuilderImpl::new_document(None); // Using task queue to create the following structure initially: //
@@ -1020,7 +1026,7 @@ mod tests { drop(binding); let doc_read = doc_handle.get(); - let Some(data)= doc_read.node_by_id(node_id).unwrap().get_element_data() else { + let Some(data) = doc_read.node_by_id(node_id).unwrap().get_element_data() else { panic!() }; assert_eq!(data.attributes().get("key").unwrap(), "value"); @@ -1076,8 +1082,7 @@ mod tests { #[test] fn task_queue_insert_class_attribute() { - let doc_handle: DocumentHandle, Css3System> = - DocumentBuilderImpl::new_document(None); + let doc_handle: DocumentHandle, Css3System> = DocumentBuilderImpl::new_document(None); let mut task_queue = DocumentTaskQueue::new(doc_handle.clone()); let div_id = task_queue.create_element("div", NodeId::root(), None, HTML_NAMESPACE, Location::default()); @@ -1096,8 +1101,7 @@ mod tests { #[test] fn uninitialized_query() { - let doc_handle: DocumentHandle, Css3System> = - DocumentBuilderImpl::new_document(None); + let doc_handle: DocumentHandle, Css3System> = DocumentBuilderImpl::new_document(None); let query = Query::new(); let found_ids = DocumentQuery::query(doc_handle.clone(), &query); @@ -2185,7 +2189,7 @@ mod tests { ); let p_id = doc_handle.get_mut().register_node_at(p_node, div_id_2, None); - let text_node = Document::new_text_node(doc_handle.clone(),"first p tag", Location::default()); + let text_node = Document::new_text_node(doc_handle.clone(), "first p tag", Location::default()); let text_id = doc_handle.get_mut().register_node_at(text_node, p_id, None); let p_node_2 = Document::new_element_node( @@ -2197,7 +2201,7 @@ mod tests { ); let p_id_2 = doc_handle.get_mut().register_node_at(p_node_2, div_id_2, None); - let text_node_2 = Document::new_text_node(doc_handle.clone(),"second p tag", Location::default()); + let text_node_2 = Document::new_text_node(doc_handle.clone(), "second p tag", Location::default()); let text_id_2 = doc_handle.get_mut().register_node_at(text_node_2, p_id_2, None); let p_node_3 = Document::new_element_node( doc_handle.clone(), @@ -2208,7 +2212,7 @@ mod tests { ); let p_id_3 = doc_handle.get_mut().register_node_at(p_node_3, div_id, None); - let text_node_3 = Document::new_text_node(doc_handle.clone(),"third p tag", Location::default()); + let text_node_3 = Document::new_text_node(doc_handle.clone(), "third p tag", Location::default()); let text_id_3 = doc_handle.get_mut().register_node_at(text_node_3, p_id_3, None); let tree_iterator = TreeIterator::new(doc_handle.clone()); @@ -2259,7 +2263,7 @@ mod tests { "div_1", Some(HTML_NAMESPACE), HashMap::new(), - Location::default() + Location::default(), ); let div_id_2 = doc_handle.get_mut().register_node_at(div_node_2, NodeId::root(), None); diff --git a/crates/gosub_html5/src/document/query.rs b/crates/gosub_html5/src/document/query.rs index 95558ac1e..8983f746e 100644 --- a/crates/gosub_html5/src/document/query.rs +++ b/crates/gosub_html5/src/document/query.rs @@ -1,125 +1,125 @@ -use gosub_shared::document::DocumentHandle; -use gosub_shared::node::NodeId; -use gosub_shared::traits::css3::CssSystem; -use gosub_shared::traits::document::Document; -use gosub_shared::traits::node::Node; -use crate::document::document_impl::TreeIterator; -use crate::errors::Error; -use crate::parser::query::{Condition, Query, SearchType}; -use gosub_shared::traits::node::ElementDataType; -use gosub_shared::traits::node::ClassList; - -pub struct DocumentQuery, C: CssSystem> { - _phantom: std::marker::PhantomData<(D, C)>, -} - -impl, C: CssSystem> DocumentQuery { - /// Perform a single query against the document. - /// If query search type is uninitialized, returns an error. - /// Otherwise, returns a vector of NodeIds that match the predicate in tree order (preorder depth-first.) - pub fn query(doc_handle: DocumentHandle, query: &Query) -> gosub_shared::types::Result> { - if query.search_type == SearchType::Uninitialized { - return Err(Error::Query("Query predicate is uninitialized".to_owned()).into()); - } - - let tree_iterator = TreeIterator::new(doc_handle.clone()); - - let mut found_ids = Vec::new(); - for current_node_id in tree_iterator { - let mut predicate_result: bool = true; - for condition in &query.conditions { - if !Self::matches_query_condition(doc_handle.clone(), ¤t_node_id, condition) { - predicate_result = false; - break; - } - } - - if predicate_result { - found_ids.push(current_node_id); - if query.search_type == SearchType::FindFirst { - return Ok(found_ids); - } - } - } - - Ok(found_ids) - } - - /// Check if a given node's children contain a certain tag name - pub fn contains_child_tag(doc_handle: DocumentHandle, node_id: NodeId, tag: &str) -> bool { - if let Some(node) = doc_handle.get().node_by_id(node_id) { - for child_id in &node.children().to_vec() { - if let Some(child) = doc_handle.get().node_by_id(*child_id) { - if let Some(data) = child.get_element_data() { - if data.name() == tag { - return true; - } - } - } - } - } - - false - } - - fn matches_query_condition( - doc_handle: DocumentHandle, - current_node_id: &NodeId, - condition: &Condition, - ) -> bool { - let binding = doc_handle.get(); - let Some(current_node) = binding.node_by_id(*current_node_id) else { - return false; - }; - - match condition { - Condition::EqualsTag(tag) => { - let Some(current_node_data) = current_node.get_element_data() else { - return false; - }; - current_node_data.name() == *tag - }, - Condition::EqualsId(id) => { - let Some(current_node_data) = current_node.get_element_data() else { - return false; - }; - - if let Some(id_attr) = current_node_data.attributes().get("id") { - return *id_attr == *id; - } - - false - } - Condition::ContainsClass(class_name) => { - let Some(current_node_data) = current_node.get_element_data() else { - return false; - }; - - return current_node_data.classlist().contains(class_name); - } - Condition::ContainsAttribute(attribute) => { - let Some(current_node_data) = current_node.get_element_data() else { - return false; - }; - - return current_node_data.attributes().contains_key(attribute); - } - Condition::ContainsChildTag(child_tag) => { - Self::contains_child_tag(doc_handle.clone(), current_node.id(), child_tag) - } - Condition::HasParentTag(parent_tag) => { - if let Some(parent_id) = current_node.parent_id() { - // making an assumption here that the parent node is actually valid - let parent = binding.node_by_id(parent_id).unwrap(); - if let Some(parent_data) = parent.get_element_data() { - return parent_data.name() == *parent_tag; - } else { - return false; - } - } - - false - } - } - } -} \ No newline at end of file +use crate::document::document_impl::TreeIterator; +use crate::errors::Error; +use crate::parser::query::{Condition, Query, SearchType}; +use gosub_shared::document::DocumentHandle; +use gosub_shared::node::NodeId; +use gosub_shared::traits::css3::CssSystem; +use gosub_shared::traits::document::Document; +use gosub_shared::traits::node::ClassList; +use gosub_shared::traits::node::ElementDataType; +use gosub_shared::traits::node::Node; + +pub struct DocumentQuery, C: CssSystem> { + _phantom: std::marker::PhantomData<(D, C)>, +} + +impl, C: CssSystem> DocumentQuery { + /// Perform a single query against the document. + /// If query search type is uninitialized, returns an error. + /// Otherwise, returns a vector of NodeIds that match the predicate in tree order (preorder depth-first.) + pub fn query(doc_handle: DocumentHandle, query: &Query) -> gosub_shared::types::Result> { + if query.search_type == SearchType::Uninitialized { + return Err(Error::Query("Query predicate is uninitialized".to_owned()).into()); + } + + let tree_iterator = TreeIterator::new(doc_handle.clone()); + + let mut found_ids = Vec::new(); + for current_node_id in tree_iterator { + let mut predicate_result: bool = true; + for condition in &query.conditions { + if !Self::matches_query_condition(doc_handle.clone(), ¤t_node_id, condition) { + predicate_result = false; + break; + } + } + + if predicate_result { + found_ids.push(current_node_id); + if query.search_type == SearchType::FindFirst { + return Ok(found_ids); + } + } + } + + Ok(found_ids) + } + + /// Check if a given node's children contain a certain tag name + pub fn contains_child_tag(doc_handle: DocumentHandle, node_id: NodeId, tag: &str) -> bool { + if let Some(node) = doc_handle.get().node_by_id(node_id) { + for child_id in &node.children().to_vec() { + if let Some(child) = doc_handle.get().node_by_id(*child_id) { + if let Some(data) = child.get_element_data() { + if data.name() == tag { + return true; + } + } + } + } + } + + false + } + + fn matches_query_condition( + doc_handle: DocumentHandle, + current_node_id: &NodeId, + condition: &Condition, + ) -> bool { + let binding = doc_handle.get(); + let Some(current_node) = binding.node_by_id(*current_node_id) else { + return false; + }; + + match condition { + Condition::EqualsTag(tag) => { + let Some(current_node_data) = current_node.get_element_data() else { + return false; + }; + current_node_data.name() == *tag + } + Condition::EqualsId(id) => { + let Some(current_node_data) = current_node.get_element_data() else { + return false; + }; + + if let Some(id_attr) = current_node_data.attributes().get("id") { + return *id_attr == *id; + } + + false + } + Condition::ContainsClass(class_name) => { + let Some(current_node_data) = current_node.get_element_data() else { + return false; + }; + + return current_node_data.classlist().contains(class_name); + } + Condition::ContainsAttribute(attribute) => { + let Some(current_node_data) = current_node.get_element_data() else { + return false; + }; + + return current_node_data.attributes().contains_key(attribute); + } + Condition::ContainsChildTag(child_tag) => { + Self::contains_child_tag(doc_handle.clone(), current_node.id(), child_tag) + } + Condition::HasParentTag(parent_tag) => { + if let Some(parent_id) = current_node.parent_id() { + // making an assumption here that the parent node is actually valid + let parent = binding.node_by_id(parent_id).unwrap(); + if let Some(parent_data) = parent.get_element_data() { + return parent_data.name() == *parent_tag; + } else { + return false; + } + } + + false + } + } + } +} diff --git a/crates/gosub_html5/src/document/task_queue.rs b/crates/gosub_html5/src/document/task_queue.rs index 37a03447a..7f7b0daa9 100644 --- a/crates/gosub_html5/src/document/task_queue.rs +++ b/crates/gosub_html5/src/document/task_queue.rs @@ -2,11 +2,11 @@ use crate::DocumentHandle; use gosub_shared::traits::document::Document; use std::collections::HashMap; +use crate::parser::tree_builder::TreeBuilder; use gosub_shared::byte_stream::Location; use gosub_shared::node::NodeId; use gosub_shared::traits::css3::CssSystem; use gosub_shared::traits::node::{ElementDataType, Node}; -use crate::parser::tree_builder::TreeBuilder; use gosub_shared::types::Result; /// Enum of tasks that can be performed to add or @@ -87,8 +87,13 @@ impl, C: CssSystem> DocumentTaskQueue { position, location, } => { - let node = - D::new_element_node(self.doc_handle.clone(), name, Some(namespace), HashMap::new(), *location); + let node = D::new_element_node( + self.doc_handle.clone(), + name, + Some(namespace), + HashMap::new(), + *location, + ); self.doc_handle.get_mut().register_node_at(node, *parent_id, *position); } DocumentTask::CreateText { @@ -107,7 +112,9 @@ impl, C: CssSystem> DocumentTaskQueue { let node = D::new_comment_node(self.doc_handle.clone(), content, *location); self.doc_handle.get_mut().register_node_at(node, *parent_id, None); } - DocumentTask::InsertAttribute { key, value, element_id, ..} => { + DocumentTask::InsertAttribute { + key, value, element_id, .. + } => { // Invalid ID value? if key == "id" && !is_valid_id_attribute_value(value) { errors.push(format!("ID attribute value '{value}' did not pass validation")); @@ -129,7 +136,6 @@ impl, C: CssSystem> DocumentTaskQueue { continue; }; - if !node.is_element_node() { errors.push(format!("Node id {} is not an element", element_id)); continue; @@ -205,13 +211,7 @@ impl, C: CssSystem> TreeBuilder for DocumentTaskQueue { new_id } - fn insert_attribute( - &mut self, - key: &str, - value: &str, - element_id: NodeId, - location: Location, - ) -> Result<()> { + fn insert_attribute(&mut self, key: &str, value: &str, element_id: NodeId, location: Location) -> Result<()> { let attribute = DocumentTask::InsertAttribute { key: key.to_owned(), value: value.to_owned(), @@ -233,4 +233,3 @@ impl, C: CssSystem> DocumentTaskQueue { } } } - diff --git a/crates/gosub_html5/src/node/arena.rs b/crates/gosub_html5/src/node/arena.rs index d3e2d4238..515d989fa 100644 --- a/crates/gosub_html5/src/node/arena.rs +++ b/crates/gosub_html5/src/node/arena.rs @@ -78,9 +78,8 @@ impl, C: CssSystem> NodeArena { self.nodes.insert(node.id(), node); } - pub fn register_node_with_node_id(&mut self, mut node: N, node_id: NodeId) { - assert_eq!(node.is_registered(), false, "Node is already attached to an arena"); + assert!(!node.is_registered(), "Node is already attached to an arena"); node.set_id(node_id); node.set_registered(true); @@ -90,7 +89,7 @@ impl, C: CssSystem> NodeArena { /// Registered an unregistered node into the arena pub fn register_node(&mut self, mut node: N) -> NodeId { - assert_eq!(node.is_registered(), false, "Node is already attached to an arena"); + assert!(!node.is_registered(), "Node is already attached to an arena"); let id = self.next_id; self.next_id = id.next(); @@ -116,12 +115,11 @@ impl, C: CssSystem> Default for NodeArena { #[cfg(test)] mod tests { use super::*; + use crate::document::document_impl::DocumentImpl; use gosub_css3::system::Css3System; use gosub_shared::byte_stream::Location; - use crate::document::document_impl::DocumentImpl; use gosub_shared::traits::document::Document; - use crate::document::builder::DocumentBuilderImpl; use gosub_shared::traits::document::DocumentBuilder; diff --git a/crates/gosub_html5/src/node/data/element.rs b/crates/gosub_html5/src/node/data/element.rs index a00d8521c..44bbfe735 100644 --- a/crates/gosub_html5/src/node/data/element.rs +++ b/crates/gosub_html5/src/node/data/element.rs @@ -5,13 +5,13 @@ use crate::node::elements::{ }; use crate::node::{HTML_NAMESPACE, MATHML_NAMESPACE, SVG_NAMESPACE}; use core::fmt::{Debug, Formatter}; -use std::collections::HashMap; -use std::collections::hash_map::IntoIter; +use gosub_shared::document::DocumentHandle; +use gosub_shared::node::NodeId; use gosub_shared::traits::css3::CssSystem; use gosub_shared::traits::node::{ClassList, ElementDataType}; +use std::collections::hash_map::IntoIter; +use std::collections::HashMap; use std::fmt; -use gosub_shared::document::DocumentHandle; -use gosub_shared::node::NodeId; #[derive(Debug)] pub struct ClassListImpl { @@ -351,7 +351,7 @@ impl ElementData { let (force_async, template_contents) = <_>::default(); Self { doc_handle: doc_handle.clone(), - node_id: None, // We are not yet registered in the document, so we have no node-id + node_id: None, // We are not yet registered in the document, so we have no node-id name: name.into(), namespace: Some(namespace.unwrap_or(HTML_NAMESPACE).into()), attributes, diff --git a/crates/gosub_html5/src/node/node_impl.rs b/crates/gosub_html5/src/node/node_impl.rs index 01c197979..22d6827b4 100644 --- a/crates/gosub_html5/src/node/node_impl.rs +++ b/crates/gosub_html5/src/node/node_impl.rs @@ -5,12 +5,12 @@ use crate::node::data::document::DocumentData; use crate::node::data::element::ElementData; use crate::node::data::text::TextData; use core::fmt::Debug; -use std::collections::HashMap; use gosub_shared::byte_stream::Location; use gosub_shared::document::DocumentHandle; use gosub_shared::node::NodeId; use gosub_shared::traits::css3::CssSystem; use gosub_shared::traits::node::{Node, NodeData, NodeType, QuirksMode}; +use std::collections::HashMap; /// Implementation of the NodeDataType trait #[derive(Debug, Clone, PartialEq)] @@ -245,8 +245,16 @@ impl NodeImpl { /// Create a new document node #[must_use] - pub fn new_document(document: DocumentHandle, C>, location: Location, quirks_mode: QuirksMode) -> Self { - Self::new(document, location, &NodeDataTypeInternal::Document(DocumentData::new(quirks_mode))) + pub fn new_document( + document: DocumentHandle, C>, + location: Location, + quirks_mode: QuirksMode, + ) -> Self { + Self::new( + document, + location, + &NodeDataTypeInternal::Document(DocumentData::new(quirks_mode)), + ) } #[must_use] @@ -282,7 +290,7 @@ impl NodeImpl { namespace, attributes, Default::default(), - )) + )), ) } @@ -316,16 +324,15 @@ mod tests { use crate::node::HTML_NAMESPACE; use crate::node::MATHML_NAMESPACE; use crate::node::SVG_NAMESPACE; - use std::collections::HashMap; - use gosub_css3::system::Css3System; use crate::DocumentBuilderImpl; - use gosub_shared::traits::node::ElementDataType; + use gosub_css3::system::Css3System; use gosub_shared::traits::document::DocumentBuilder; + use gosub_shared::traits::node::ElementDataType; + use std::collections::HashMap; #[test] fn new_document() { - let doc_handle: DocumentHandle, Css3System> = - DocumentBuilderImpl::new_document(None); + let doc_handle: DocumentHandle, Css3System> = DocumentBuilderImpl::new_document(None); let node = NodeImpl::new_document(doc_handle.clone(), Location::default(), QuirksMode::NoQuirks); assert_eq!(node.id, NodeId::default()); @@ -339,8 +346,7 @@ mod tests { #[test] fn new_element() { - let doc_handle: DocumentHandle, Css3System> = - DocumentBuilderImpl::new_document(None); + let doc_handle: DocumentHandle, Css3System> = DocumentBuilderImpl::new_document(None); let mut attributes = HashMap::new(); attributes.insert("id".to_string(), "test".to_string()); @@ -368,8 +374,7 @@ mod tests { #[test] fn new_comment() { - let doc_handle: DocumentHandle, Css3System> = - DocumentBuilderImpl::new_document(None); + let doc_handle: DocumentHandle, Css3System> = DocumentBuilderImpl::new_document(None); let node = NodeImpl::new_comment(doc_handle.clone(), Location::default(), "test"); assert_eq!(node.id, NodeId::default()); @@ -383,8 +388,7 @@ mod tests { #[test] fn new_text() { - let doc_handle: DocumentHandle, Css3System> = - DocumentBuilderImpl::new_document(None); + let doc_handle: DocumentHandle, Css3System> = DocumentBuilderImpl::new_document(None); let node = NodeImpl::new_text(doc_handle.clone(), Location::default(), "test"); assert_eq!(node.id, NodeId::default()); @@ -398,8 +402,7 @@ mod tests { #[test] fn is_special() { - let doc_handle: DocumentHandle, Css3System> = - DocumentBuilderImpl::new_document(None); + let doc_handle: DocumentHandle, Css3System> = DocumentBuilderImpl::new_document(None); let mut attributes = HashMap::new(); attributes.insert("id".to_string(), "test".to_string()); @@ -416,8 +419,7 @@ mod tests { #[test] fn type_of() { - let doc_handle: DocumentHandle, Css3System> = - DocumentBuilderImpl::new_document(None); + let doc_handle: DocumentHandle, Css3System> = DocumentBuilderImpl::new_document(None); let node = NodeImpl::new_document(doc_handle.clone(), Location::default(), QuirksMode::NoQuirks); assert_eq!(node.type_of(), NodeType::DocumentNode); @@ -439,8 +441,7 @@ mod tests { #[test] fn special_html_elements() { - let doc_handle: DocumentHandle, Css3System> = - DocumentBuilderImpl::new_document(None); + let doc_handle: DocumentHandle, Css3System> = DocumentBuilderImpl::new_document(None); for element in SPECIAL_HTML_ELEMENTS.iter() { let mut attributes = HashMap::new(); @@ -460,8 +461,7 @@ mod tests { #[test] fn special_mathml_elements() { - let doc_handle: DocumentHandle, Css3System> = - DocumentBuilderImpl::new_document(None); + let doc_handle: DocumentHandle, Css3System> = DocumentBuilderImpl::new_document(None); for element in SPECIAL_MATHML_ELEMENTS.iter() { let mut attributes = HashMap::new(); @@ -480,8 +480,7 @@ mod tests { #[test] fn special_svg_elements() { - let doc_handle: DocumentHandle, Css3System> = - DocumentBuilderImpl::new_document(None); + let doc_handle: DocumentHandle, Css3System> = DocumentBuilderImpl::new_document(None); for element in SPECIAL_SVG_ELEMENTS.iter() { let mut attributes = HashMap::new(); @@ -499,8 +498,7 @@ mod tests { #[test] fn type_of_node() { - let doc_handle: DocumentHandle, Css3System> = - DocumentBuilderImpl::new_document(None); + let doc_handle: DocumentHandle, Css3System> = DocumentBuilderImpl::new_document(None); let node = NodeImpl::new_document(doc_handle.clone(), Location::default(), QuirksMode::NoQuirks); assert_eq!(node.type_of(), NodeType::DocumentNode); diff --git a/crates/gosub_html5/src/parser.rs b/crates/gosub_html5/src/parser.rs index ee0b5103f..9e1155068 100644 --- a/crates/gosub_html5/src/parser.rs +++ b/crates/gosub_html5/src/parser.rs @@ -4275,32 +4275,42 @@ where #[cfg(test)] mod test { - use gosub_css3::system::Css3System; use super::*; - use crate::node::node_impl::NodeDataTypeInternal; + use crate::document::builder::DocumentBuilderImpl; + use crate::document::document_impl::DocumentImpl; use crate::node::data::element::ElementData; + use crate::node::node_impl::NodeDataTypeInternal; use crate::node::node_impl::NodeImpl; + use gosub_css3::system::Css3System; use gosub_shared::byte_stream::Encoding; - use crate::document::document_impl::DocumentImpl; use gosub_shared::traits::node::ClassList; - use crate::document::builder::DocumentBuilderImpl; macro_rules! node_create { ($self:expr, $name:expr) => {{ let node = NodeImpl::new( $self.document.clone(), Location::default(), - &NodeDataTypeInternal::Element(ElementData::new($self.document.clone(), $name, Some(HTML_NAMESPACE), HashMap::new(), Default::default())), + &NodeDataTypeInternal::Element(ElementData::new( + $self.document.clone(), + $name, + Some(HTML_NAMESPACE), + HashMap::new(), + Default::default(), + )), ); - let node_id = $self.document.clone().get_mut().register_node_at(node, NodeId::root(), None); + let node_id = $self + .document + .clone() + .get_mut() + .register_node_at(node, NodeId::root(), None); $self.open_elements.push(node_id); }}; } #[test] fn is_in_scope() { - let mut stream = &mut ByteStream::new(Encoding::UTF8, None); - let mut parser = Html5Parser::, Css3System>::new_parser(&mut stream, Location::default()); + let stream = &mut ByteStream::new(Encoding::UTF8, None); + let mut parser = Html5Parser::, Css3System>::new_parser(stream, Location::default()); node_create!(parser, "html"); node_create!(parser, "div"); @@ -4314,8 +4324,8 @@ mod test { #[test] fn is_in_scope_empty_stack() { - let mut stream = &mut ByteStream::new(Encoding::UTF8, None); - let mut parser = Html5Parser::, Css3System>::new_parser(&mut stream, Location::default()); + let stream = &mut ByteStream::new(Encoding::UTF8, None); + let mut parser = Html5Parser::, Css3System>::new_parser(stream, Location::default()); parser.open_elements.clear(); assert!(!parser.is_in_scope("p", HTML_NAMESPACE, Scope::Regular)); @@ -4326,8 +4336,8 @@ mod test { #[test] fn is_in_scope_non_existing_node() { - let mut stream = &mut ByteStream::new(Encoding::UTF8, None); - let mut parser = Html5Parser::, Css3System>::new_parser(&mut stream, Location::default()); + let stream = &mut ByteStream::new(Encoding::UTF8, None); + let mut parser = Html5Parser::, Css3System>::new_parser(stream, Location::default()); node_create!(parser, "html"); node_create!(parser, "div"); @@ -4342,8 +4352,8 @@ mod test { #[test] fn is_in_scope_1() { - let mut stream = &mut ByteStream::new(Encoding::UTF8, None); - let mut parser = Html5Parser::, Css3System>::new_parser(&mut stream, Location::default()); + let stream = &mut ByteStream::new(Encoding::UTF8, None); + let mut parser = Html5Parser::, Css3System>::new_parser(stream, Location::default()); node_create!(parser, "html"); node_create!(parser, "div"); @@ -4380,9 +4390,8 @@ mod test { #[test] fn is_in_scope_2() { - let mut stream = &mut ByteStream::new(Encoding::UTF8, None); - let mut parser = Html5Parser::, Css3System>::new_parser(&mut stream, Location::default()); - + let stream = &mut ByteStream::new(Encoding::UTF8, None); + let mut parser = Html5Parser::, Css3System>::new_parser(stream, Location::default()); node_create!(parser, "html"); node_create!(parser, "body"); @@ -4400,8 +4409,8 @@ mod test { #[test] fn is_in_scope_3() { - let mut stream = &mut ByteStream::new(Encoding::UTF8, None); - let mut parser = Html5Parser::, Css3System>::new_parser(&mut stream, Location::default()); + let stream = &mut ByteStream::new(Encoding::UTF8, None); + let mut parser = Html5Parser::, Css3System>::new_parser(stream, Location::default()); node_create!(parser, "html"); node_create!(parser, "body"); @@ -4419,8 +4428,8 @@ mod test { #[test] fn is_in_scope_4() { - let mut stream = &mut ByteStream::new(Encoding::UTF8, None); - let mut parser = Html5Parser::, Css3System>::new_parser(&mut stream, Location::default()); + let stream = &mut ByteStream::new(Encoding::UTF8, None); + let mut parser = Html5Parser::, Css3System>::new_parser(stream, Location::default()); node_create!(parser, "html"); node_create!(parser, "body"); @@ -4440,8 +4449,8 @@ mod test { #[test] fn is_in_scope_5() { - let mut stream = &mut ByteStream::new(Encoding::UTF8, None); - let mut parser = Html5Parser::, Css3System>::new_parser(&mut stream, Location::default()); + let stream = &mut ByteStream::new(Encoding::UTF8, None); + let mut parser = Html5Parser::, Css3System>::new_parser(stream, Location::default()); node_create!(parser, "html"); node_create!(parser, "body"); @@ -4460,8 +4469,8 @@ mod test { #[test] fn is_in_scope_6() { - let mut stream = &mut ByteStream::new(Encoding::UTF8, None); - let mut parser = Html5Parser::, Css3System>::new_parser(&mut stream, Location::default()); + let stream = &mut ByteStream::new(Encoding::UTF8, None); + let mut parser = Html5Parser::, Css3System>::new_parser(stream, Location::default()); node_create!(parser, "html"); node_create!(parser, "body"); @@ -4480,8 +4489,8 @@ mod test { #[test] fn is_in_scope_7() { - let mut stream = &mut ByteStream::new(Encoding::UTF8, None); - let mut parser = Html5Parser::, Css3System>::new_parser(&mut stream, Location::default()); + let stream = &mut ByteStream::new(Encoding::UTF8, None); + let mut parser = Html5Parser::, Css3System>::new_parser(stream, Location::default()); node_create!(parser, "html"); node_create!(parser, "body"); @@ -4499,8 +4508,8 @@ mod test { #[test] fn is_in_scope_8() { - let mut stream = &mut ByteStream::new(Encoding::UTF8, None); - let mut parser = Html5Parser::, Css3System>::new_parser(&mut stream, Location::default()); + let stream = &mut ByteStream::new(Encoding::UTF8, None); + let mut parser = Html5Parser::, Css3System>::new_parser(stream, Location::default()); node_create!(parser, "html"); node_create!(parser, "body"); @@ -4522,7 +4531,8 @@ mod test { stream.close(); let doc_handle = DocumentBuilderImpl::new_document(None); - let _ = Html5Parser::, Css3System>::parse_document(&mut stream, doc_handle.clone(), None); + let _ = + Html5Parser::, Css3System>::parse_document(&mut stream, doc_handle.clone(), None); println!("{}", doc_handle.get()); } @@ -4534,7 +4544,8 @@ mod test { stream.close(); let doc_handle = DocumentBuilderImpl::new_document(None); - let _ = Html5Parser::, Css3System>::parse_document(&mut stream, doc_handle.clone(), None); + let _ = + Html5Parser::, Css3System>::parse_document(&mut stream, doc_handle.clone(), None); let binding = doc_handle.get(); @@ -4563,7 +4574,8 @@ mod test { stream.close(); let doc_handle = DocumentBuilderImpl::new_document(None); - let _ = Html5Parser::, Css3System>::parse_document(&mut stream, doc_handle.clone(), None); + let _ = + Html5Parser::, Css3System>::parse_document(&mut stream, doc_handle.clone(), None); let binding = doc_handle.get(); @@ -4596,7 +4608,8 @@ mod test { stream.close(); let doc_handle = DocumentBuilderImpl::new_document(None); - let _ = Html5Parser::, Css3System>::parse_document(&mut stream, doc_handle.clone(), None); + let _ = + Html5Parser::, Css3System>::parse_document(&mut stream, doc_handle.clone(), None); // Any invalid id's are not stored in the document, and thus not searchable assert!(doc_handle.get().get_node_by_named_id("my id").is_none()); @@ -4614,7 +4627,8 @@ mod test { stream.close(); let doc_handle = DocumentBuilderImpl::new_document(None); - let _ = Html5Parser::, Css3System>::parse_document(&mut stream, doc_handle.clone(), None); + let _ = + Html5Parser::, Css3System>::parse_document(&mut stream, doc_handle.clone(), None); // we are expecting the div (ID: 4) and p would be ignored let doc_read = doc_handle.get(); diff --git a/crates/gosub_html5/src/parser/helper.rs b/crates/gosub_html5/src/parser/helper.rs index 68aef9f92..3eb25566e 100644 --- a/crates/gosub_html5/src/parser/helper.rs +++ b/crates/gosub_html5/src/parser/helper.rs @@ -83,7 +83,11 @@ where pub fn insert_element_helper(&mut self, node_id: NodeId, position: InsertionPositionMode) { match position { - InsertionPositionMode::Sibling { handle, parent_id, before_id } => { + InsertionPositionMode::Sibling { + handle, + parent_id, + before_id, + } => { let parent_node = get_node_by_id!(handle, parent_id); let position = parent_node.children().iter().position(|&x| x == before_id); @@ -99,7 +103,11 @@ where pub fn insert_text_helper(&mut self, position: InsertionPositionMode, token: &Token) { match position { - InsertionPositionMode::Sibling { handle, parent_id, before_id } => { + InsertionPositionMode::Sibling { + handle, + parent_id, + before_id, + } => { let parent_node = get_node_by_id!(handle, parent_id); let position = parent_node.children().iter().position(|&x| x == before_id); match position { @@ -235,7 +243,8 @@ where let target_node = get_node_by_id!(self.document, target_id); let target_element_data = get_element_data!(target_node); - if !(self.foster_parenting && ["table", "tbody", "thead", "tfoot", "tr"].contains(&target_element_data.name())) { + if !(self.foster_parenting && ["table", "tbody", "thead", "tfoot", "tr"].contains(&target_element_data.name())) + { if target_element_data.name() == "template" && target_element_data.is_namespace(HTML_NAMESPACE) { if let Some(template_fragment) = target_element_data.template_contents() { return InsertionPositionMode::LastChild { @@ -266,7 +275,7 @@ where if let Some(parent_id) = node.parent_id() { return InsertionPositionMode::Sibling { handle: self.document.clone(), - parent_id: parent_id, + parent_id, before_id: *node_id, }; } diff --git a/crates/gosub_html5/src/parser/quirks.rs b/crates/gosub_html5/src/parser/quirks.rs index 102a98523..084b81d96 100644 --- a/crates/gosub_html5/src/parser/quirks.rs +++ b/crates/gosub_html5/src/parser/quirks.rs @@ -157,16 +157,16 @@ static LIMITED_QUIRKS_PUB_IDENTIFIER_PREFIX_NOT_MISSING_SYS: &[&str] = &[ #[cfg(test)] mod tests { - use gosub_css3::system::Css3System; + use crate::document::document_impl::DocumentImpl; use crate::parser::Html5Parser; use crate::parser::QuirksMode; + use gosub_css3::system::Css3System; use gosub_shared::byte_stream::{ByteStream, Encoding, Location}; - use crate::document::document_impl::DocumentImpl; #[test] fn test_quirks_mode() { - let mut stream = &mut ByteStream::new(Encoding::UTF8, None); - let parser = Html5Parser::, Css3System>::new_parser(&mut stream, Location::default()); + let stream = &mut ByteStream::new(Encoding::UTF8, None); + let parser = Html5Parser::, Css3System>::new_parser(stream, Location::default()); assert_eq!( parser.identify_quirks_mode(&None, None, None, false), @@ -251,8 +251,8 @@ mod tests { #[test] fn test_quirks_mode_force() { - let mut stream = &mut ByteStream::new(Encoding::UTF8, None); - let parser = Html5Parser::, Css3System>::new_parser(&mut stream, Location::default()); + let stream = &mut ByteStream::new(Encoding::UTF8, None); + let parser = Html5Parser::, Css3System>::new_parser(stream, Location::default()); assert_eq!( parser.identify_quirks_mode(&Some("html".to_string()), None, None, true), @@ -325,8 +325,8 @@ mod tests { #[test] fn test_quirks_mode_sys() { - let mut stream = &mut ByteStream::new(Encoding::UTF8, None); - let parser = Html5Parser::, Css3System>::new_parser(&mut stream, Location::default()); + let stream = &mut ByteStream::new(Encoding::UTF8, None); + let parser = Html5Parser::, Css3System>::new_parser(stream, Location::default()); assert_eq!( parser.identify_quirks_mode( @@ -350,8 +350,8 @@ mod tests { #[test] fn test_quirks_mode_sys_missing() { - let mut stream = &mut ByteStream::new(Encoding::UTF8, None); - let parser = Html5Parser::, Css3System>::new_parser(&mut stream, Location::default()); + let stream = &mut ByteStream::new(Encoding::UTF8, None); + let parser = Html5Parser::, Css3System>::new_parser(stream, Location::default()); assert_eq!( parser.identify_quirks_mode( diff --git a/crates/gosub_html5/src/parser/tree_builder.rs b/crates/gosub_html5/src/parser/tree_builder.rs index 4408d3cfe..59d6607ae 100644 --- a/crates/gosub_html5/src/parser/tree_builder.rs +++ b/crates/gosub_html5/src/parser/tree_builder.rs @@ -30,12 +30,12 @@ pub trait TreeBuilder { #[cfg(test)] mod tests { + use crate::document::document_impl::DocumentImpl; + use crate::parser::Html5Parser; + use gosub_css3::system::Css3System; use gosub_testing::testing::tree_construction::fixture::{fixture_root_path, read_fixture_from_path}; use gosub_testing::testing::tree_construction::Harness; use test_case::test_case; - use gosub_css3::system::Css3System; - use crate::document::document_impl::DocumentImpl; - use crate::parser::Html5Parser; const DISABLED_CASES: &[&str] = &[ // tests18.dat @@ -112,7 +112,10 @@ mod tests { // for each test, run it with and without scripting enabled based on the test file for &scripting_enabled in test.script_modes() { let result = harness - .run_test::, Css3System>, Css3System>(test.clone(), scripting_enabled) + .run_test::, Css3System>, Css3System>( + test.clone(), + scripting_enabled, + ) .expect("problem parsing"); // println!( @@ -121,7 +124,7 @@ mod tests { // test.line, // test.document_as_str() // ); - if result.is_success() == false { + if !result.is_success() { println!("tree construction failed: {:#?}", result); } // println!("{:?}\n", result); diff --git a/crates/gosub_render_utils/src/render_tree.rs b/crates/gosub_render_utils/src/render_tree.rs index 42731ce92..cd3d63aae 100644 --- a/crates/gosub_render_utils/src/render_tree.rs +++ b/crates/gosub_render_utils/src/render_tree.rs @@ -79,9 +79,7 @@ impl, C: CssSystem> LayoutTree for RenderTree bool { - self.get_node(id) - .map(|node| node.properties.is_dirty()) - .unwrap_or(true) + self.get_node(id).map(|node| node.properties.is_dirty()).unwrap_or(true) } fn clean_style(&mut self, id: Self::NodeId) { @@ -284,7 +282,7 @@ impl, C: CssSystem> RenderTree { self.remove_unrenderable_nodes(); - C::inheritance(self); + C::inheritance(self); if L::COLLAPSE_INLINE { self.collapse_inline(self.root); @@ -416,9 +414,9 @@ impl, C: CssSystem> RenderTree { } } - - -impl, C: CssSystem> gosub_shared::traits::render_tree::RenderTree for RenderTree { +impl, C: CssSystem> gosub_shared::traits::render_tree::RenderTree + for RenderTree +{ type NodeId = NodeId; type Node = RenderTreeNode; @@ -435,7 +433,7 @@ impl, C: CssSystem> gosub_shared::traits::render_tre } fn get_children(&self, id: Self::NodeId) -> Option> { - self.get_children(id).map(|x| x.clone()) + self.get_children(id).cloned() } } @@ -449,7 +447,6 @@ impl gosub_shared::traits::render_tree::RenderTreeNod } } - // Generates a declaration property and adds it to the css_map_entry pub enum RenderNodeData { diff --git a/crates/gosub_render_utils/src/render_tree/desc.rs b/crates/gosub_render_utils/src/render_tree/desc.rs index e4f30225b..2b32eec19 100644 --- a/crates/gosub_render_utils/src/render_tree/desc.rs +++ b/crates/gosub_render_utils/src/render_tree/desc.rs @@ -34,11 +34,7 @@ impl, C: CssSystem> RenderTree { doc.node_by_id(node.id) .and_then(|n| n.get_element_data()) .map(|e| e.attributes()) - .map(|a| { - a.iter() - .map(|(k, v)| (k.clone(), v.clone())) - .collect::>() - }) + .map(|a| a.iter().map(|(k, v)| (k.clone(), v.clone())).collect::>()) .unwrap_or_default() } else { Vec::new() diff --git a/crates/gosub_shared/src/traits.rs b/crates/gosub_shared/src/traits.rs index bedd553df..f3b2e2e67 100644 --- a/crates/gosub_shared/src/traits.rs +++ b/crates/gosub_shared/src/traits.rs @@ -7,7 +7,6 @@ pub mod node; pub mod render_tree; - /// Context defines how the data needs to be parsed #[derive(Debug, Clone, Copy, PartialEq)] pub enum Context { diff --git a/crates/gosub_shared/src/traits/css3.rs b/crates/gosub_shared/src/traits/css3.rs index f3054682b..76c8b5752 100644 --- a/crates/gosub_shared/src/traits/css3.rs +++ b/crates/gosub_shared/src/traits/css3.rs @@ -1,102 +1,101 @@ -use crate::document::DocumentHandle; -use crate::errors::CssResult; -use crate::node::NodeId; -use crate::traits::document::Document; -use crate::traits::ParserConfig; -use std::fmt::Debug; -use crate::traits::render_tree::RenderTree; - -/// Defines the origin of the stylesheet (or declaration) -#[derive(Debug, PartialEq, Clone, Copy)] -pub enum CssOrigin { - /// Browser/user agent defined stylesheets - UserAgent, - /// Author defined stylesheets that are linked or embedded in the HTML files - Author, - /// User defined stylesheets that will override the author and user agent stylesheets (for instance, custom user styles or extensions) - User, -} - -/// The CssSystem trait is a trait that defines all things CSS3 that are used by other non-css3 crates. This is the main trait that -/// is used to parse CSS3 files. It contains sub elements like the Stylesheet trait that is used in for instance the Document trait. -pub trait CssSystem: Clone { - type Stylesheet: CssStylesheet; - - type PropertyMap: CssPropertyMap; - - type Property: CssProperty; - - /// Parses a string into a CSS3 stylesheet - fn parse_str(str: &str, config: ParserConfig, origin: CssOrigin, source_url: &str) -> CssResult; - - /// Returns the properties of a node - /// If `None` is returned, the node is not renderable - fn properties_from_node>( - node: &D::Node, - sheets: &[Self::Stylesheet], - handle: DocumentHandle, - id: NodeId, - ) -> Option; - - - fn inheritance>(tree: &mut T); -} - -pub trait CssStylesheet: PartialEq { - /// Returns the origin of the stylesheet - fn origin(&self) -> CssOrigin; - - /// Returns the source URL of the stylesheet - fn url(&self) -> &str; -} - -pub trait CssPropertyMap: Default + Debug { - type Property: CssProperty; - - fn insert_inherited(&mut self, name: &str, value: Self::Property); - - fn get(&self, name: &str) -> Option<&Self::Property>; - - fn get_mut(&mut self, name: &str) -> Option<&mut Self::Property>; - - fn make_dirty(&mut self); - - fn iter(&self) -> impl Iterator + '_; - - fn iter_mut(&mut self) -> impl Iterator + '_; - - fn make_clean(&mut self); - fn is_dirty(&self) -> bool; -} -pub trait CssProperty: Debug + Sized { - type Value: CssValue; - - fn compute_value(&mut self); // this should probably be removed - - fn unit_to_px(&self) -> f32; - - fn as_string(&self) -> Option<&str>; - fn as_percentage(&self) -> Option; - fn as_unit(&self) -> Option<(f32, &str)>; - fn as_color(&self) -> Option<(f32, f32, f32, f32)>; - - fn parse_color(&self) -> Option<(f32, f32, f32, f32)>; - - fn as_number(&self) -> Option; - fn as_list(&self) -> Option>; - - fn is_none(&self) -> bool; -} - -pub trait CssValue: Sized { - fn unit_to_px(&self) -> f32; - - fn as_string(&self) -> Option<&str>; - fn as_percentage(&self) -> Option; - fn as_unit(&self) -> Option<(f32, &str)>; - fn as_color(&self) -> Option<(f32, f32, f32, f32)>; - fn as_number(&self) -> Option; - fn as_list(&self) -> Option>; - - fn is_none(&self) -> bool; -} +use crate::document::DocumentHandle; +use crate::errors::CssResult; +use crate::node::NodeId; +use crate::traits::document::Document; +use crate::traits::render_tree::RenderTree; +use crate::traits::ParserConfig; +use std::fmt::Debug; + +/// Defines the origin of the stylesheet (or declaration) +#[derive(Debug, PartialEq, Clone, Copy)] +pub enum CssOrigin { + /// Browser/user agent defined stylesheets + UserAgent, + /// Author defined stylesheets that are linked or embedded in the HTML files + Author, + /// User defined stylesheets that will override the author and user agent stylesheets (for instance, custom user styles or extensions) + User, +} + +/// The CssSystem trait is a trait that defines all things CSS3 that are used by other non-css3 crates. This is the main trait that +/// is used to parse CSS3 files. It contains sub elements like the Stylesheet trait that is used in for instance the Document trait. +pub trait CssSystem: Clone { + type Stylesheet: CssStylesheet; + + type PropertyMap: CssPropertyMap; + + type Property: CssProperty; + + /// Parses a string into a CSS3 stylesheet + fn parse_str(str: &str, config: ParserConfig, origin: CssOrigin, source_url: &str) -> CssResult; + + /// Returns the properties of a node + /// If `None` is returned, the node is not renderable + fn properties_from_node>( + node: &D::Node, + sheets: &[Self::Stylesheet], + handle: DocumentHandle, + id: NodeId, + ) -> Option; + + fn inheritance>(tree: &mut T); +} + +pub trait CssStylesheet: PartialEq { + /// Returns the origin of the stylesheet + fn origin(&self) -> CssOrigin; + + /// Returns the source URL of the stylesheet + fn url(&self) -> &str; +} + +pub trait CssPropertyMap: Default + Debug { + type Property: CssProperty; + + fn insert_inherited(&mut self, name: &str, value: Self::Property); + + fn get(&self, name: &str) -> Option<&Self::Property>; + + fn get_mut(&mut self, name: &str) -> Option<&mut Self::Property>; + + fn make_dirty(&mut self); + + fn iter(&self) -> impl Iterator + '_; + + fn iter_mut(&mut self) -> impl Iterator + '_; + + fn make_clean(&mut self); + fn is_dirty(&self) -> bool; +} +pub trait CssProperty: Debug + Sized { + type Value: CssValue; + + fn compute_value(&mut self); // this should probably be removed + + fn unit_to_px(&self) -> f32; + + fn as_string(&self) -> Option<&str>; + fn as_percentage(&self) -> Option; + fn as_unit(&self) -> Option<(f32, &str)>; + fn as_color(&self) -> Option<(f32, f32, f32, f32)>; + + fn parse_color(&self) -> Option<(f32, f32, f32, f32)>; + + fn as_number(&self) -> Option; + fn as_list(&self) -> Option>; + + fn is_none(&self) -> bool; +} + +pub trait CssValue: Sized { + fn unit_to_px(&self) -> f32; + + fn as_string(&self) -> Option<&str>; + fn as_percentage(&self) -> Option; + fn as_unit(&self) -> Option<(f32, &str)>; + fn as_color(&self) -> Option<(f32, f32, f32, f32)>; + fn as_number(&self) -> Option; + fn as_list(&self) -> Option>; + + fn is_none(&self) -> bool; +} diff --git a/crates/gosub_shared/src/traits/document.rs b/crates/gosub_shared/src/traits/document.rs index 6b9008ea7..6cb0ccf48 100644 --- a/crates/gosub_shared/src/traits/document.rs +++ b/crates/gosub_shared/src/traits/document.rs @@ -20,8 +20,10 @@ pub trait DocumentBuilder { type Document: Document; fn new_document(url: Option) -> DocumentHandle; - fn new_document_fragment(context_node: &>::Node, quirks_mode: QuirksMode) - -> DocumentHandle; + fn new_document_fragment( + context_node: &>::Node, + quirks_mode: QuirksMode, + ) -> DocumentHandle; } pub trait DocumentFragment: Sized { diff --git a/crates/gosub_shared/src/traits/node.rs b/crates/gosub_shared/src/traits/node.rs index ec65cc4c7..c0e21708f 100644 --- a/crates/gosub_shared/src/traits/node.rs +++ b/crates/gosub_shared/src/traits/node.rs @@ -1,10 +1,10 @@ -use std::collections::hash_map::IntoIter; use crate::byte_stream::Location; use crate::document::DocumentHandle; use crate::node::NodeId; use crate::traits::css3::CssSystem; use crate::traits::document::Document; use crate::traits::document::DocumentFragment; +use std::collections::hash_map::IntoIter; use std::collections::HashMap; #[derive(PartialEq, Debug, Copy, Clone)] diff --git a/crates/gosub_shared/src/traits/render_tree.rs b/crates/gosub_shared/src/traits/render_tree.rs index 652ccce1e..e440b0123 100644 --- a/crates/gosub_shared/src/traits/render_tree.rs +++ b/crates/gosub_shared/src/traits/render_tree.rs @@ -10,13 +10,12 @@ pub trait RenderTree { fn get_node(&self, id: Self::NodeId) -> Option<&Self::Node>; fn get_node_mut(&mut self, id: Self::NodeId) -> Option<&mut Self::Node>; - + fn get_children(&self, id: Self::NodeId) -> Option>; } - pub trait RenderTreeNode { fn props(&self) -> &C::PropertyMap; fn props_mut(&mut self) -> &mut C::PropertyMap; -} \ No newline at end of file +} diff --git a/crates/gosub_testing/src/testing/tree_construction.rs b/crates/gosub_testing/src/testing/tree_construction.rs index fc595002c..15c5c1707 100644 --- a/crates/gosub_testing/src/testing/tree_construction.rs +++ b/crates/gosub_testing/src/testing/tree_construction.rs @@ -157,12 +157,12 @@ impl Harness { let context_node = binding.node_by_id(context_node_id).unwrap(); let _ = context_node_id; - let document = >::Builder::new_document_fragment(&context_node, quirks_mode); + let document = >::Builder::new_document_fragment(context_node, quirks_mode); let parser_errors = P::parse_fragment( &mut stream, document.clone(), - &context_node, + context_node, Some(options), start_location, )?; diff --git a/examples/html5-parser.rs b/examples/html5-parser.rs index 01454b15f..af826442d 100644 --- a/examples/html5-parser.rs +++ b/examples/html5-parser.rs @@ -13,8 +13,7 @@ fn main() { stream.close(); // Initialize a document and feed it together with the stream to the html5 parser - let doc_handle: DocumentHandle, Css3System> = - DocumentBuilderImpl::new_document(None); + let doc_handle: DocumentHandle, Css3System> = DocumentBuilderImpl::new_document(None); let _ = Html5Parser::parse_document(&mut stream, doc_handle.clone(), None); diff --git a/src/bin/css3-parser.rs b/src/bin/css3-parser.rs index 6d9e77a5a..68a03ba21 100644 --- a/src/bin/css3-parser.rs +++ b/src/bin/css3-parser.rs @@ -156,7 +156,7 @@ fn display_snippet(css: &str, err: CssError) { /// Print tokens generated by the tokenizer fn print_tokens(css: &str) { let mut stream = ByteStream::new(Encoding::UTF8, None); - stream.read_from_str(&css, Some(Encoding::UTF8)); + stream.read_from_str(css, Some(Encoding::UTF8)); stream.close(); let mut tokenizer = Tokenizer::new(&mut stream, Location::default()); diff --git a/src/bin/display-text-tree.rs b/src/bin/display-text-tree.rs index 50f43439f..dbfc81670 100644 --- a/src/bin/display-text-tree.rs +++ b/src/bin/display-text-tree.rs @@ -1,9 +1,9 @@ use gosub_css3::system::Css3System; +use gosub_html5::document::builder::DocumentBuilderImpl; use gosub_html5::parser::Html5Parser; use gosub_shared::byte_stream::{ByteStream, Encoding}; use gosub_shared::types::Result; use std::process::exit; -use gosub_html5::document::builder::DocumentBuilderImpl; use gosub_html5::document::document_impl::DocumentImpl; use gosub_shared::document::DocumentHandle; @@ -33,8 +33,7 @@ fn main() -> Result<()> { stream.read_from_str(&html, Some(Encoding::UTF8)); stream.close(); - let doc_handle: DocumentHandle, Css3System> = - DocumentBuilderImpl::new_document(None); + let doc_handle: DocumentHandle, Css3System> = DocumentBuilderImpl::new_document(None); let parse_errors = Html5Parser::, Css3System>::parse_document(&mut stream, doc_handle.clone(), None)?; diff --git a/src/bin/gosub-parser.rs b/src/bin/gosub-parser.rs index 394c415b3..d895fc172 100644 --- a/src/bin/gosub-parser.rs +++ b/src/bin/gosub-parser.rs @@ -7,12 +7,12 @@ use gosub_shared::byte_stream::{ByteStream, Encoding}; use gosub_shared::document::DocumentHandle; use gosub_shared::timing::Scale; use gosub_shared::timing_display; +use gosub_shared::traits::document::DocumentBuilder; use gosub_shared::types::Result; use std::fs; use std::process::exit; use std::str::FromStr; use url::Url; -use gosub_shared::traits::document::DocumentBuilder; fn bail(message: &str) -> ! { println!("{message}");