From ddf4b8ac13eeab59b1eb9819632d5a9546980066 Mon Sep 17 00:00:00 2001 From: rhysd Date: Sat, 4 Jan 2020 08:05:02 +0900 Subject: [PATCH] prefer &str to String for reducing allocations --- src/html.rs | 53 +++++++++++++++++++++++++---------------------------- 1 file changed, 25 insertions(+), 28 deletions(-) diff --git a/src/html.rs b/src/html.rs index 27dcfbc..b03b656 100644 --- a/src/html.rs +++ b/src/html.rs @@ -29,10 +29,10 @@ pub fn get_parent_node(node: &Handle) -> Handle { parent.and_then(|node| node.upgrade()).unwrap() } -pub fn get_node_name(node: &Handle) -> String { +pub fn get_node_name(node: &Handle) -> &'_ str { match &node.data { - NodeData::Element { ref name, .. } => name.local.as_ref().to_string(), - _ => str!(), + NodeData::Element { ref name, .. } => name.local.as_ref(), + _ => "", } } @@ -95,10 +95,10 @@ pub fn walk_and_embed_assets( for attr in attrs_mut.iter_mut() { if &attr.name.local == "rel" { - if is_icon(&attr.value.to_string()) { + if is_icon(attr.value.as_ref()) { link_type = "icon"; break; - } else if attr.value.to_string() == "stylesheet" { + } else if attr.value.as_ref() == "stylesheet" { link_type = "stylesheet"; break; } @@ -111,8 +111,8 @@ pub fn walk_and_embed_assets( if opt_no_images { attr.value.clear(); } else { - let href_full_url = resolve_url(&url, &attr.value.to_string()) - .unwrap_or_default(); + let href_full_url = + resolve_url(&url, attr.value.as_ref()).unwrap_or_default(); let (favicon_dataurl, _) = retrieve_asset( cache, client, @@ -133,8 +133,8 @@ pub fn walk_and_embed_assets( if opt_no_css { attr.value.clear(); } else { - let href_full_url = resolve_url(&url, &attr.value.to_string()) - .unwrap_or_default(); + let href_full_url = + resolve_url(&url, &attr.value.as_ref()).unwrap_or_default(); let replacement_text = match retrieve_asset( cache, client, @@ -172,7 +172,7 @@ pub fn walk_and_embed_assets( for attr in attrs_mut.iter_mut() { if &attr.name.local == "href" { let href_full_url = - resolve_url(&url, &attr.value.to_string()).unwrap_or_default(); + resolve_url(&url, attr.value.as_ref()).unwrap_or_default(); attr.value.clear(); attr.value.push_slice(&href_full_url.as_str()); } @@ -230,8 +230,8 @@ pub fn walk_and_embed_assets( let attr_name: &str = &attr.name.local; if attr_name == "src" { - let src_full_url: String = resolve_url(&url, &attr.value.to_string()) - .unwrap_or(attr.value.to_string()); + let src_full_url: String = resolve_url(&url, attr.value.as_ref()) + .unwrap_or_else(|_| attr.value.to_string()); attr.value.clear(); attr.value.push_slice(src_full_url.as_str()); } else if attr_name == "srcset" { @@ -241,8 +241,7 @@ pub fn walk_and_embed_assets( attr.value.push_slice(TRANSPARENT_PIXEL); } else { let srcset_full_url: String = - resolve_url(&url, &attr.value.to_string()) - .unwrap_or_default(); + resolve_url(&url, attr.value.as_ref()).unwrap_or_default(); let (source_dataurl, _) = retrieve_asset( cache, client, @@ -268,7 +267,7 @@ pub fn walk_and_embed_assets( } let href_full_url: String = - resolve_url(&url, &attr.value.to_string()).unwrap_or_default(); + resolve_url(&url, attr.value.as_ref()).unwrap_or_default(); attr.value.clear(); attr.value.push_slice(href_full_url.as_str()); } @@ -297,8 +296,8 @@ pub fn walk_and_embed_assets( } else { for attr in attrs_mut.iter_mut() { if &attr.name.local == "src" { - let src_full_url: String = - resolve_url(&url, &attr.value.to_string()).unwrap_or_default(); + let src_full_url = + resolve_url(&url, attr.value.as_ref()).unwrap_or_default(); let (js_dataurl, _) = retrieve_asset( cache, client, @@ -342,8 +341,8 @@ pub fn walk_and_embed_assets( if &attr.name.local == "action" { // Modify action to be a full URL if !is_valid_url(&attr.value) { - let href_full_url: String = - resolve_url(&url, &attr.value.to_string()).unwrap_or_default(); + let href_full_url = + resolve_url(&url, attr.value.as_ref()).unwrap_or_default(); attr.value.clear(); attr.value.push_slice(href_full_url.as_str()); } @@ -359,15 +358,14 @@ pub fn walk_and_embed_assets( continue; } - let iframe_src: String = attr.value.to_string(); + let iframe_src = attr.value.as_ref(); // Ignore iframes with empty source (they cause infinite loops) - if iframe_src == str!() { + if iframe_src.is_empty() { continue; } - let src_full_url: String = - resolve_url(&url, &iframe_src).unwrap_or_default(); + let src_full_url = resolve_url(&url, iframe_src).unwrap_or_default(); let (iframe_data, iframe_final_url) = retrieve_asset( cache, client, @@ -400,10 +398,10 @@ pub fn walk_and_embed_assets( "video" => { for attr in attrs_mut.iter_mut() { if &attr.name.local == "poster" { - let video_poster = attr.value.to_string(); + let video_poster = attr.value.as_ref(); // Skip posters with empty source - if video_poster == str!() { + if video_poster.is_empty() { continue; } @@ -411,7 +409,7 @@ pub fn walk_and_embed_assets( attr.value.clear(); } else { let poster_full_url = - resolve_url(&url, &video_poster).unwrap_or_default(); + resolve_url(&url, video_poster).unwrap_or_default(); let (poster_dataurl, _) = retrieve_asset( cache, client, @@ -556,7 +554,6 @@ pub fn stringify_document( if opt_no_images { content_attr += " img-src data:;"; } - content_attr = content_attr.trim().to_string(); let meta = dom.create_element( QualName::new(None, ns!(), local_name!("meta")), @@ -567,7 +564,7 @@ pub fn stringify_document( }, Attribute { name: QualName::new(None, ns!(), local_name!("content")), - value: format_tendril!("{}", content_attr), + value: format_tendril!("{}", content_attr.trim()), }, ], Default::default(),