Initial commit

main
Charlotte Som 2022-04-28 19:39:41 +01:00
commit dc914b9977
3 changed files with 68 additions and 0 deletions

2
.gitignore vendored Normal file
View File

@ -0,0 +1,2 @@
/target
/Cargo.lock

8
Cargo.toml Normal file
View File

@ -0,0 +1,8 @@
[package]
name = "rewrite-html-blocks"
version = "1.0.0"
edition = "2021"
[dependencies]
html5ever = "0.25"
kuchiki = "0.8.1"

58
src/lib.rs Normal file
View File

@ -0,0 +1,58 @@
use html5ever::QualName;
use kuchiki::{traits::*, NodeRef};
pub fn rewrite_tags(html: &str, selector: &str, mapping: impl Fn(&NodeRef) -> String) -> String {
let document = kuchiki::parse_html().one(html);
for elem in document
.select(selector)
.expect("Failed to select document with given selector")
{
let node = elem.as_node();
let new_contents = kuchiki::parse_fragment(
elem.name.clone(),
elem.attributes
.borrow()
.map
.clone()
.into_iter()
.map(|(name, value)| html5ever::Attribute {
name: QualName::new(value.prefix, name.ns, name.local),
value: value.value.into(),
})
.collect(),
)
.one(mapping(node))
.first_child()
.expect("Root element somehow missing");
for child in node.children() {
child.detach();
}
for child in new_contents.children() {
node.append(child);
}
}
let mut out = Vec::new();
document
.serialize(&mut out)
.expect("Failed to serialize document");
String::from_utf8_lossy(&out).into_owned()
}
#[cfg(test)]
mod tests {
use crate::rewrite_tags;
#[test]
fn remap_block() {
let html = r#"<p>hello, world! <span id="replace-me">REPLACE ME</span></p>"#;
let rewritten_html = rewrite_tags(html, "#replace-me", |_| {
"<strong>it's a me!</strong>".to_string()
});
println!("{}", rewritten_html)
}
}