diff --git a/Cargo.lock b/Cargo.lock index 0cdfdd8b..d86fad77 100644 --- a/Cargo.lock +++ b/Cargo.lock @@ -312,7 +312,6 @@ dependencies = [ "precomputed-hash", "selectors", "serde", - "tendril", ] [[package]] diff --git a/scraper/Cargo.toml b/scraper/Cargo.toml index 417966d4..2e2b0c9f 100644 --- a/scraper/Cargo.toml +++ b/scraper/Cargo.toml @@ -21,7 +21,6 @@ indexmap = { version = "2.14.0", optional = true } precomputed-hash = "0.1.1" selectors = "0.38.0" serde = { version = "1.0.228", optional = true } -tendril = "0.5.0" [dependencies.getopts] version = "0.2.24" diff --git a/scraper/README.md b/scraper/README.md index f2d9af90..5f11ac4b 100644 --- a/scraper/README.md +++ b/scraper/README.md @@ -148,6 +148,18 @@ let document = tree.finish(); assert_eq!(document.html(), "hello"); ``` +### Using the library across threads +The `html5ever` crate uses the +[`Tendril`](https://docs.rs/html5ever/latest/html5ever/tendril/struct.Tendril.html) +type as their reference counted string. By default, it's thread-local and thus +`!Send`, enabling the `atomic` flag will use the atomic counting version of +[`Tendril`](https://docs.rs/html5ever/latest/html5ever/tendril/struct.Tendril.html), +implementing `Send` and allow their use across threads. +```toml +[dependencies] +scraper = { version = "0.27.0", features = ["atomic"] } +``` + ## Contributing Please feel free to open pull requests. If you're planning on implementing diff --git a/scraper/src/html/mod.rs b/scraper/src/html/mod.rs index a201f1f8..31873ee2 100644 --- a/scraper/src/html/mod.rs +++ b/scraper/src/html/mod.rs @@ -8,10 +8,10 @@ use std::iter::FusedIterator; use ego_tree::Tree; use ego_tree::iter::Nodes; use html5ever::serialize::SerializeOpts; +use html5ever::tendril::TendrilSink; use html5ever::tree_builder::QuirksMode; use html5ever::{QualName, driver, serialize}; use selectors::matching::SelectorCaches; -use tendril::TendrilSink; use crate::selector::Selector; use crate::{ElementRef, Node}; @@ -65,12 +65,11 @@ impl Html { /// ``` /// # extern crate html5ever; /// # extern crate scraper; - /// # extern crate tendril; /// # fn main() { /// # let document = ""; /// use html5ever::driver::{self, ParseOpts}; + /// use html5ever::tendril::TendrilSink; /// use scraper::{Html, HtmlTreeSink}; - /// use tendril::TendrilSink; /// /// let parser = driver::parse_document(HtmlTreeSink::new(Html::new_document()), ParseOpts::default()); /// let html = parser.one(document);