use std::any::Any;
pub use self::document_end::*;
pub use self::element::*;
pub use self::mutations::{ContentType, Mutations};
pub use self::tokens::*;
pub trait UserData {
fn user_data(&self) -> &dyn Any;
fn user_data_mut(&mut self) -> &mut dyn Any;
fn set_user_data(&mut self, data: impl Any);
}
macro_rules! impl_user_data {
($Unit:ident<$($lt:lifetime),+>) => {
impl crate::rewritable_units::UserData for $Unit<$($lt),+> {
#[inline]
fn user_data(&self) -> &dyn Any {
&*self.user_data
}
#[inline]
fn user_data_mut(&mut self) -> &mut dyn Any {
&mut *self.user_data
}
#[inline]
fn set_user_data(&mut self, data: impl Any){
self.user_data = Box::new(data);
}
}
};
}
#[macro_use]
mod mutations;
mod document_end;
mod element;
mod tokens;
#[cfg(test)]
mod test_utils {
use crate::rewriter::AsciiCompatibleEncoding;
use crate::test_utils::{Output, ASCII_COMPATIBLE_ENCODINGS};
use crate::*;
use encoding_rs::Encoding;
use std::borrow::Cow;
pub fn encoded(input: &str) -> Vec<(Vec<u8>, &'static Encoding)> {
ASCII_COMPATIBLE_ENCODINGS
.iter()
.filter_map(|enc| {
let (input, _, has_unmappable_characters) = enc.encode(input);
if has_unmappable_characters {
None
} else {
Some((input.into_owned(), *enc))
}
})
.collect()
}
pub fn rewrite_html(
html: &[u8],
encoding: &'static Encoding,
element_content_handlers: Vec<(Cow<'_, Selector>, ElementContentHandlers)>,
document_content_handlers: Vec<DocumentContentHandlers>,
) -> String {
let mut output = Output::new(encoding);
{
let mut rewriter = HtmlRewriter::new(
Settings {
element_content_handlers,
document_content_handlers,
encoding: AsciiCompatibleEncoding::new(encoding).unwrap(),
..Settings::default()
},
|c: &[u8]| output.push(c),
);
rewriter.write(html).unwrap();
rewriter.end().unwrap();
}
output.into()
}
}