From 6fee94626b7ccf51f8ca9ed1b3f21ea0c68197a4 Mon Sep 17 00:00:00 2001 From: Mark Rousskov Date: Tue, 31 Mar 2020 18:53:40 -0400 Subject: [PATCH] Migrate to kuchiki --- Cargo.lock | 100 --------------------------- Cargo.toml | 3 +- src/utils/html.rs | 95 ++++++++------------------ src/web/mod.rs | 2 +- src/web/rustdoc.rs | 4 +- tests/regex/body.html | 154 +++++++++++++++++++++--------------------- tests/regex/head.html | 2 +- 7 files changed, 108 insertions(+), 252 deletions(-) diff --git a/Cargo.lock b/Cargo.lock index e2a8e420a..b56d3c252 100644 --- a/Cargo.lock +++ b/Cargo.lock @@ -409,7 +409,6 @@ dependencies = [ "futures 0.1.29 (registry+https://github.com/rust-lang/crates.io-index)", "git2 0.13.6 (registry+https://github.com/rust-lang/crates.io-index)", "handlebars-iron 0.25.2 (registry+https://github.com/rust-lang/crates.io-index)", - "html5ever 0.22.5 (registry+https://github.com/rust-lang/crates.io-index)", "iron 0.5.1 (registry+https://github.com/rust-lang/crates.io-index)", "kuchiki 0.8.0 (registry+https://github.com/rust-lang/crates.io-index)", "lazy_static 1.4.0 (registry+https://github.com/rust-lang/crates.io-index)", @@ -1092,19 +1091,6 @@ dependencies = [ "digest 0.7.6 (registry+https://github.com/rust-lang/crates.io-index)", ] -[[package]] -name = "html5ever" -version = "0.22.5" -source = "registry+https://github.com/rust-lang/crates.io-index" -dependencies = [ - "log 0.4.8 (registry+https://github.com/rust-lang/crates.io-index)", - "mac 0.1.1 (registry+https://github.com/rust-lang/crates.io-index)", - "markup5ever 0.7.5 (registry+https://github.com/rust-lang/crates.io-index)", - "proc-macro2 0.4.30 (registry+https://github.com/rust-lang/crates.io-index)", - "quote 0.6.13 (registry+https://github.com/rust-lang/crates.io-index)", - "syn 0.15.44 (registry+https://github.com/rust-lang/crates.io-index)", -] - [[package]] name = "html5ever" version = "0.25.1" @@ -1505,21 +1491,6 @@ name = "maplit" version = "1.0.2" source = "registry+https://github.com/rust-lang/crates.io-index" -[[package]] -name = "markup5ever" -version = "0.7.5" -source = "registry+https://github.com/rust-lang/crates.io-index" -dependencies = [ - "phf 0.7.24 (registry+https://github.com/rust-lang/crates.io-index)", - "phf_codegen 0.7.24 (registry+https://github.com/rust-lang/crates.io-index)", - "serde 1.0.110 (registry+https://github.com/rust-lang/crates.io-index)", - "serde_derive 1.0.110 (registry+https://github.com/rust-lang/crates.io-index)", - "serde_json 1.0.53 (registry+https://github.com/rust-lang/crates.io-index)", - "string_cache 0.7.5 (registry+https://github.com/rust-lang/crates.io-index)", - "string_cache_codegen 0.4.4 (registry+https://github.com/rust-lang/crates.io-index)", - "tendril 0.4.1 (registry+https://github.com/rust-lang/crates.io-index)", -] - [[package]] name = "markup5ever" version = "0.10.0" @@ -2301,14 +2272,6 @@ name = "proc-macro-nested" version = "0.1.4" source = "registry+https://github.com/rust-lang/crates.io-index" -[[package]] -name = "proc-macro2" -version = "0.4.30" -source = "registry+https://github.com/rust-lang/crates.io-index" -dependencies = [ - "unicode-xid 0.1.0 (registry+https://github.com/rust-lang/crates.io-index)", -] - [[package]] name = "proc-macro2" version = "1.0.13" @@ -2365,14 +2328,6 @@ name = "quote" version = "0.3.15" source = "registry+https://github.com/rust-lang/crates.io-index" -[[package]] -name = "quote" -version = "0.6.13" -source = "registry+https://github.com/rust-lang/crates.io-index" -dependencies = [ - "proc-macro2 0.4.30 (registry+https://github.com/rust-lang/crates.io-index)", -] - [[package]] name = "quote" version = "1.0.6" @@ -3209,20 +3164,6 @@ dependencies = [ "bytes 0.4.12 (registry+https://github.com/rust-lang/crates.io-index)", ] -[[package]] -name = "string_cache" -version = "0.7.5" -source = "registry+https://github.com/rust-lang/crates.io-index" -dependencies = [ - "lazy_static 1.4.0 (registry+https://github.com/rust-lang/crates.io-index)", - "new_debug_unreachable 1.0.4 (registry+https://github.com/rust-lang/crates.io-index)", - "phf_shared 0.7.24 (registry+https://github.com/rust-lang/crates.io-index)", - "precomputed-hash 0.1.1 (registry+https://github.com/rust-lang/crates.io-index)", - "serde 1.0.110 (registry+https://github.com/rust-lang/crates.io-index)", - "string_cache_codegen 0.4.4 (registry+https://github.com/rust-lang/crates.io-index)", - "string_cache_shared 0.3.0 (registry+https://github.com/rust-lang/crates.io-index)", -] - [[package]] name = "string_cache" version = "0.8.0" @@ -3235,18 +3176,6 @@ dependencies = [ "serde 1.0.110 (registry+https://github.com/rust-lang/crates.io-index)", ] -[[package]] -name = "string_cache_codegen" -version = "0.4.4" -source = "registry+https://github.com/rust-lang/crates.io-index" -dependencies = [ - "phf_generator 0.7.24 (registry+https://github.com/rust-lang/crates.io-index)", - "phf_shared 0.7.24 (registry+https://github.com/rust-lang/crates.io-index)", - "proc-macro2 1.0.13 (registry+https://github.com/rust-lang/crates.io-index)", - "quote 1.0.6 (registry+https://github.com/rust-lang/crates.io-index)", - "string_cache_shared 0.3.0 (registry+https://github.com/rust-lang/crates.io-index)", -] - [[package]] name = "string_cache_codegen" version = "0.5.1" @@ -3258,11 +3187,6 @@ dependencies = [ "quote 1.0.6 (registry+https://github.com/rust-lang/crates.io-index)", ] -[[package]] -name = "string_cache_shared" -version = "0.3.0" -source = "registry+https://github.com/rust-lang/crates.io-index" - [[package]] name = "stringprep" version = "0.1.2" @@ -3309,16 +3233,6 @@ dependencies = [ "unicode-xid 0.0.4 (registry+https://github.com/rust-lang/crates.io-index)", ] -[[package]] -name = "syn" -version = "0.15.44" -source = "registry+https://github.com/rust-lang/crates.io-index" -dependencies = [ - "proc-macro2 0.4.30 (registry+https://github.com/rust-lang/crates.io-index)", - "quote 0.6.13 (registry+https://github.com/rust-lang/crates.io-index)", - "unicode-xid 0.1.0 (registry+https://github.com/rust-lang/crates.io-index)", -] - [[package]] name = "syn" version = "1.0.22" @@ -3911,11 +3825,6 @@ name = "unicode-xid" version = "0.0.4" source = "registry+https://github.com/rust-lang/crates.io-index" -[[package]] -name = "unicode-xid" -version = "0.1.0" -source = "registry+https://github.com/rust-lang/crates.io-index" - [[package]] name = "unicode-xid" version = "0.2.0" @@ -4326,7 +4235,6 @@ dependencies = [ "checksum hex 0.3.2 (registry+https://github.com/rust-lang/crates.io-index)" = "805026a5d0141ffc30abb3be3173848ad46a1b1664fe632428479619a3644d77" "checksum hex 0.4.2 (registry+https://github.com/rust-lang/crates.io-index)" = "644f9158b2f133fd50f5fb3242878846d9eb792e445c893805ff0e3824006e35" "checksum hmac 0.5.0 (registry+https://github.com/rust-lang/crates.io-index)" = "44f3bdb08579d99d7dc761c0e266f13b5f2ab8c8c703b9fc9ef333cd8f48f55e" -"checksum html5ever 0.22.5 (registry+https://github.com/rust-lang/crates.io-index)" = "c213fa6a618dc1da552f54f85cba74b05d8e883c92ec4e89067736938084c26e" "checksum html5ever 0.25.1 (registry+https://github.com/rust-lang/crates.io-index)" = "aafcf38a1a36118242d29b92e1b08ef84e67e4a5ed06e0a80be20e6a32bfed6b" "checksum http 0.1.21 (registry+https://github.com/rust-lang/crates.io-index)" = "d6ccf5ede3a895d8856620237b2f02972c1bbc78d2965ad7fe8838d4a0ed41f0" "checksum http 0.2.1 (registry+https://github.com/rust-lang/crates.io-index)" = "28d569972648b2c512421b5f2a405ad6ac9666547189d0c5477a3f200f3e02f9" @@ -4369,7 +4277,6 @@ dependencies = [ "checksum mac 0.1.1 (registry+https://github.com/rust-lang/crates.io-index)" = "c41e0c4fef86961ac6d6f8a82609f55f31b05e4fce149ac5710e439df7619ba4" "checksum maplit 1.0.2 (registry+https://github.com/rust-lang/crates.io-index)" = "3e2e65a1a2e43cfcb47a895c4c8b10d1f4a61097f9f254f183aee60cad9c651d" "checksum markup5ever 0.10.0 (registry+https://github.com/rust-lang/crates.io-index)" = "aae38d669396ca9b707bfc3db254bc382ddb94f57cc5c235f34623a669a01dab" -"checksum markup5ever 0.7.5 (registry+https://github.com/rust-lang/crates.io-index)" = "897636f9850c3eef4905a5540683ed53dc9393860f0846cab2c2ddf9939862ff" "checksum matches 0.1.8 (registry+https://github.com/rust-lang/crates.io-index)" = "7ffc5c5338469d4d3ea17d269fa8ea3512ad247247c30bd2df69e68309ed0a08" "checksum maybe-uninit 2.0.0 (registry+https://github.com/rust-lang/crates.io-index)" = "60302e4db3a61da70c0cb7991976248362f30319e88850c487b9b95bbf059e00" "checksum md5 0.3.8 (registry+https://github.com/rust-lang/crates.io-index)" = "79c56d6a0b07f9e19282511c83fc5b086364cbae4ba8c7d5f190c3d9b0425a48" @@ -4455,14 +4362,12 @@ dependencies = [ "checksum proc-macro-error-attr 1.0.2 (registry+https://github.com/rust-lang/crates.io-index)" = "4f5444ead4e9935abd7f27dc51f7e852a0569ac888096d5ec2499470794e2e53" "checksum proc-macro-hack 0.5.15 (registry+https://github.com/rust-lang/crates.io-index)" = "0d659fe7c6d27f25e9d80a1a094c223f5246f6a6596453e09d7229bf42750b63" "checksum proc-macro-nested 0.1.4 (registry+https://github.com/rust-lang/crates.io-index)" = "8e946095f9d3ed29ec38de908c22f95d9ac008e424c7bcae54c75a79c527c694" -"checksum proc-macro2 0.4.30 (registry+https://github.com/rust-lang/crates.io-index)" = "cf3d2011ab5c909338f7887f4fc896d35932e29146c12c8d01da6b22a80ba759" "checksum proc-macro2 1.0.13 (registry+https://github.com/rust-lang/crates.io-index)" = "53f5ffe53a6b28e37c9c1ce74893477864d64f74778a93a4beb43c8fa167f639" "checksum procfs 0.7.9 (registry+https://github.com/rust-lang/crates.io-index)" = "c434e93ef69c216e68e4f417c927b4f31502c3560b72cfdb6827e2321c5c6b3e" "checksum prometheus 0.7.0 (registry+https://github.com/rust-lang/crates.io-index)" = "5567486d5778e2c6455b1b90ff1c558f29e751fc018130fa182e15828e728af1" "checksum publicsuffix 1.5.4 (registry+https://github.com/rust-lang/crates.io-index)" = "3bbaa49075179162b49acac1c6aa45fb4dafb5f13cf6794276d77bc7fd95757b" "checksum quick-error 1.2.3 (registry+https://github.com/rust-lang/crates.io-index)" = "a1d01941d82fa2ab50be1e79e6714289dd7cde78eba4c074bc5a4374f650dfe0" "checksum quote 0.3.15 (registry+https://github.com/rust-lang/crates.io-index)" = "7a6e920b65c65f10b2ae65c831a81a073a89edd28c7cce89475bff467ab4167a" -"checksum quote 0.6.13 (registry+https://github.com/rust-lang/crates.io-index)" = "6ce23b6b870e8f94f81fb0a363d65d86675884b34a09043c81e5562f11c1f8e1" "checksum quote 1.0.6 (registry+https://github.com/rust-lang/crates.io-index)" = "54a21852a652ad6f610c9510194f398ff6f8692e334fd1145fed931f7fbe44ea" "checksum r2d2 0.8.8 (registry+https://github.com/rust-lang/crates.io-index)" = "1497e40855348e4a8a40767d8e55174bce1e445a3ac9254ad44ad468ee0485af" "checksum r2d2_postgres 0.14.0 (registry+https://github.com/rust-lang/crates.io-index)" = "78c7fe9c0c3d2c298cf262bc3ce4b89cdf0eab620fd9fe759f65b34a1a00fb93" @@ -4549,17 +4454,13 @@ dependencies = [ "checksum staticfile 0.4.0 (registry+https://github.com/rust-lang/crates.io-index)" = "31493480e073d52522a94cdf56269dd8eb05f99549effd1826b0271690608878" "checksum stb_truetype 0.3.1 (registry+https://github.com/rust-lang/crates.io-index)" = "f77b6b07e862c66a9f3e62a07588fee67cd90a9135a2b942409f195507b4fb51" "checksum string 0.2.1 (registry+https://github.com/rust-lang/crates.io-index)" = "d24114bfcceb867ca7f71a0d3fe45d45619ec47a6fbfa98cb14e14250bfa5d6d" -"checksum string_cache 0.7.5 (registry+https://github.com/rust-lang/crates.io-index)" = "89c058a82f9fd69b1becf8c274f412281038877c553182f1d02eb027045a2d67" "checksum string_cache 0.8.0 (registry+https://github.com/rust-lang/crates.io-index)" = "2940c75beb4e3bf3a494cef919a747a2cb81e52571e212bfbd185074add7208a" -"checksum string_cache_codegen 0.4.4 (registry+https://github.com/rust-lang/crates.io-index)" = "f0f45ed1b65bf9a4bf2f7b7dc59212d1926e9eaf00fa998988e420fd124467c6" "checksum string_cache_codegen 0.5.1 (registry+https://github.com/rust-lang/crates.io-index)" = "f24c8e5e19d22a726626f1a5e16fe15b132dcf21d10177fa5a45ce7962996b97" -"checksum string_cache_shared 0.3.0 (registry+https://github.com/rust-lang/crates.io-index)" = "b1884d1bc09741d466d9b14e6d37ac89d6909cbcac41dd9ae982d4d063bbedfc" "checksum stringprep 0.1.2 (registry+https://github.com/rust-lang/crates.io-index)" = "8ee348cb74b87454fff4b551cbf727025810a004f88aeacae7f85b87f4e9a1c1" "checksum strsim 0.8.0 (registry+https://github.com/rust-lang/crates.io-index)" = "8ea5119cdb4c55b55d432abb513a0429384878c15dde60cc77b1c99de1a95a6a" "checksum structopt 0.3.14 (registry+https://github.com/rust-lang/crates.io-index)" = "863246aaf5ddd0d6928dfeb1a9ca65f505599e4e1b399935ef7e75107516b4ef" "checksum structopt-derive 0.4.7 (registry+https://github.com/rust-lang/crates.io-index)" = "d239ca4b13aee7a2142e6795cbd69e457665ff8037aed33b3effdc430d2f927a" "checksum syn 0.11.11 (registry+https://github.com/rust-lang/crates.io-index)" = "d3b891b9015c88c576343b9b3e41c2c11a51c219ef067b264bd9c8aa9b441dad" -"checksum syn 0.15.44 (registry+https://github.com/rust-lang/crates.io-index)" = "9ca4b3b69a77cbe1ffc9e198781b7acb0c7365a883670e8f1c1bc66fba79a5c5" "checksum syn 1.0.22 (registry+https://github.com/rust-lang/crates.io-index)" = "1425de3c33b0941002740a420b1a906a350b88d08b82b2c8a01035a3f9447bac" "checksum syn-mid 0.5.0 (registry+https://github.com/rust-lang/crates.io-index)" = "7be3539f6c128a931cf19dcee741c1af532c7fd387baa739c03dd2e96479338a" "checksum synom 0.11.3 (registry+https://github.com/rust-lang/crates.io-index)" = "a393066ed9010ebaed60b9eafa373d4b1baac186dd7e008555b0f702b51945b6" @@ -4621,7 +4522,6 @@ dependencies = [ "checksum unicode-segmentation 1.6.0 (registry+https://github.com/rust-lang/crates.io-index)" = "e83e153d1053cbb5a118eeff7fd5be06ed99153f00dbcd8ae310c5fb2b22edc0" "checksum unicode-width 0.1.7 (registry+https://github.com/rust-lang/crates.io-index)" = "caaa9d531767d1ff2150b9332433f32a24622147e5ebb1f26409d5da67afd479" "checksum unicode-xid 0.0.4 (registry+https://github.com/rust-lang/crates.io-index)" = "8c1f860d7d29cf02cb2f3f359fd35991af3d30bac52c57d265a3c461074cb4dc" -"checksum unicode-xid 0.1.0 (registry+https://github.com/rust-lang/crates.io-index)" = "fc72304796d0818e357ead4e000d19c9c174ab23dc11093ac919054d20a6a7fc" "checksum unicode-xid 0.2.0 (registry+https://github.com/rust-lang/crates.io-index)" = "826e7639553986605ec5979c7dd957c7895e93eabed50ab2ffa7f6128a75097c" "checksum unicode_categories 0.1.1 (registry+https://github.com/rust-lang/crates.io-index)" = "39ec24b3121d976906ece63c9daad25b85969647682eee313cb5779fdd69e14e" "checksum unidecode 0.2.0 (registry+https://github.com/rust-lang/crates.io-index)" = "d2adb95ee07cd579ed18131f2d9e7a17c25a4b76022935c7f2460d2bfae89fd2" diff --git a/Cargo.toml b/Cargo.toml index 110bd58ea..1f5d8299d 100644 --- a/Cargo.toml +++ b/Cargo.toml @@ -24,7 +24,7 @@ badge = { path = "src/web/badge" } failure = "0.1.3" comrak = { version = "0.3", default-features = false } toml = "0.5" -html5ever = "0.22" +kuchiki = "0.8" schemamama = "0.3" schemamama_postgres = "0.2" rusoto_s3 = "0.40" @@ -77,7 +77,6 @@ features = ["with-chrono", "with-serde_json"] [dev-dependencies] once_cell = "1.2.0" -kuchiki = "0.8" criterion = "0.3" rand = "0.7.3" diff --git a/src/utils/html.rs b/src/utils/html.rs index a217b7069..9a24b4561 100644 --- a/src/utils/html.rs +++ b/src/utils/html.rs @@ -1,78 +1,38 @@ use crate::error::Result; use failure::err_msg; - -use html5ever::driver::{parse_document, ParseOpts}; -use html5ever::rcdom::{Handle, NodeData, RcDom}; -use html5ever::serialize::{serialize, SerializeOpts}; -use html5ever::tendril::TendrilSink; +use kuchiki::traits::TendrilSink; +use kuchiki::NodeRef; /// Extracts the contents of the `` and `` tags from an HTML document, as well as the /// classes on the `` tag, if any. pub fn extract_head_and_body(html: &str) -> Result<(String, String, String)> { - let parser = parse_document(RcDom::default(), ParseOpts::default()); - let dom = parser.one(html); - - let (head, body) = extract_from_rcdom(&dom)?; - let class = extract_class(&body); - - Ok((stringify(head), stringify(body), class)) + let dom = kuchiki::parse_html().one(html); + + let head = dom + .select_first("head") + .map_err(|_| err_msg("couldn't find tag in rustdoc output"))?; + let body = dom + .select_first("body") + .map_err(|_| err_msg("couldn't find tag in rustdoc output"))?; + + let class = body + .attributes + .borrow() + .get("class") + .map(|v| v.to_owned()) + .unwrap_or_default(); + + Ok((serialize(head.as_node()), serialize(body.as_node()), class)) } -fn extract_from_rcdom(dom: &RcDom) -> Result<(Handle, Handle)> { - let mut worklist = vec![dom.document.clone()]; - let (mut head, mut body) = (None, None); - - while let Some(handle) = worklist.pop() { - if let NodeData::Element { ref name, .. } = handle.data { - match name.local.as_ref() { - "head" => { - if head.is_some() { - return Err(err_msg("duplicate tag")); - } else { - head = Some(handle.clone()); - } - } - - "body" => { - if body.is_some() { - return Err(err_msg("duplicate tag")); - } else { - body = Some(handle.clone()); - } - } - - _ => {} // do nothing - } - } - - worklist.extend(handle.children.borrow().iter().cloned()); - } - - let head = head.ok_or_else(|| err_msg("couldn't find tag in rustdoc output"))?; - let body = body.ok_or_else(|| err_msg("couldn't find tag in rustdoc output"))?; - Ok((head, body)) -} - -fn stringify(node: Handle) -> String { - let mut vec = Vec::new(); - serialize(&mut vec, &node, SerializeOpts::default()).expect("serializing into buffer failed"); - - String::from_utf8(vec).expect("html5ever returned non-utf8 data") -} - -fn extract_class(node: &Handle) -> String { - match node.data { - NodeData::Element { ref attrs, .. } => { - let attrs = attrs.borrow(); - - attrs - .iter() - .find(|a| &a.name.local == "class") - .map_or(String::new(), |a| a.value.to_string()) - } - - _ => String::new(), +fn serialize(v: &NodeRef) -> String { + let mut contents = Vec::new(); + for child in v.children() { + child + .serialize(&mut contents) + .expect("serialization failed"); } + String::from_utf8(contents).expect("non utf-8 html") } #[cfg(test)] @@ -82,8 +42,7 @@ mod test { let (head, body, class) = super::extract_head_and_body( r#"

hello

"# ).unwrap(); - - assert_eq!(head, r#""#); + assert_eq!(head, r#""#); assert_eq!(body, "

hello

"); assert_eq!(class, "rustdoc struct"); } diff --git a/src/web/mod.rs b/src/web/mod.rs index 429c3fe84..e31dae5cd 100644 --- a/src/web/mod.rs +++ b/src/web/mod.rs @@ -581,7 +581,7 @@ mod test { test::*, web::{handlebars_engine, match_version}, }; - use html5ever::tendril::TendrilSink; + use kuchiki::traits::TendrilSink; use serde_json::json; fn release(version: &str, db: &TestDatabase) -> i32 { diff --git a/src/web/rustdoc.rs b/src/web/rustdoc.rs index 4d203aa2e..62dcb916b 100644 --- a/src/web/rustdoc.rs +++ b/src/web/rustdoc.rs @@ -567,6 +567,7 @@ mod test { use super::*; use crate::test::*; use chrono::Utc; + use kuchiki::traits::TendrilSink; use reqwest::StatusCode; use serde_json::json; use std::{collections::BTreeMap, iter::FromIterator}; @@ -575,7 +576,6 @@ mod test { path: &str, web: &TestFrontend, ) -> Result, failure::Error> { - use html5ever::tendril::TendrilSink; assert_success(path, web)?; let data = web.get(path).send()?.text()?; println!("{}", data); @@ -872,7 +872,6 @@ mod test { #[test] fn yanked_release_shows_warning_in_nav() { fn has_yanked_warning(path: &str, web: &TestFrontend) -> Result { - use html5ever::tendril::TendrilSink; assert_success(path, web)?; let data = web.get(path).send()?.text()?; Ok(kuchiki::parse_html() @@ -1083,7 +1082,6 @@ mod test { path: &str, web: &TestFrontend, ) -> Result, failure::Error> { - use html5ever::tendril::TendrilSink; assert_success(path, web)?; let data = web.get(path).send()?.text()?; let dom = kuchiki::parse_html().one(data); diff --git a/tests/regex/body.html b/tests/regex/body.html index fdf8dca28..64a141dbc 100644 --- a/tests/regex/body.html +++ b/tests/regex/body.html @@ -1,86 +1,86 @@ -

[][src]Struct regex::CaptureMatches

pub struct CaptureMatches<'r, 't>(_);

An iterator that yields all non-overlapping capture groups matching a +

[][src]Struct regex::CaptureMatches

pub struct CaptureMatches<'r, 't>(_);

An iterator that yields all non-overlapping capture groups matching a particular regular expression.

The iterator stops when no more matches can be found.

'r is the lifetime of the compiled regular expression and 't is the lifetime of the matched string.

-

Trait Implementations

impl<'r, 't> Iterator for CaptureMatches<'r, 't>[src]

type Item = Captures<'t>

The type of the elements being iterated over.

-
+

Auto Trait Implementations

impl<'r, 't> !Sync for CaptureMatches<'r, 't>

impl<'r, 't> !Send for CaptureMatches<'r, 't>

impl<'r, 't> Unpin for CaptureMatches<'r, 't>

impl<'r, 't> !UnwindSafe for CaptureMatches<'r, 't>

impl<'r, 't> !RefUnwindSafe for CaptureMatches<'r, 't>

Blanket Implementations

impl<T, U> Into<U> for T where
    U: From<T>, 
[src]

impl<I> IntoIterator for I where
    I: Iterator
[src]

type Item = <I as Iterator>::Item

The type of the elements being iterated over.

+

type IntoIter = I

Which kind of iterator are we turning this into?

+

impl<T> From<T> for T[src]

impl<T, U> TryFrom<U> for T where
    U: Into<T>, 
[src]

type Error = Infallible

The type returned in the event of a conversion error.

+

impl<T, U> TryInto<U> for T where
    U: TryFrom<T>, 
[src]

type Error = <U as TryFrom<T>>::Error

The type returned in the event of a conversion error.

+

impl<T> BorrowMut<T> for T where
    T: ?Sized
[src]

impl<T> Borrow<T> for T where
    T: ?Sized
[src]

impl<T> Any for T where
    T: 'static + ?Sized
[src]

\ No newline at end of file diff --git a/tests/regex/head.html b/tests/regex/head.html index 2a7cea013..29115c2a3 100644 --- a/tests/regex/head.html +++ b/tests/regex/head.html @@ -1 +1 @@ -regex::CaptureMatches - Rust +regex::CaptureMatches - Rust \ No newline at end of file