use contextual_encoder::{
for_cdata, for_css_string, for_css_url, for_go_byte_string, for_go_char, for_go_string,
for_html, for_html_attribute, for_html_content, for_html_unquoted_attribute, for_java,
for_javascript, for_javascript_attribute, for_javascript_block, for_javascript_source,
for_js_template, for_json, for_python_bytes, for_python_raw_string, for_python_string,
for_rust_byte_string, for_rust_char, for_rust_string, for_sql, for_sql_backslash,
for_uri_component, for_xml, for_xml11, for_xml11_attribute, for_xml11_content,
for_xml_attribute, for_xml_comment, for_xml_content,
};
fn main() {
let input = r#"<script>alert("xss")</script>"#;
println!("input: {input}");
println!();
println!("--- html ---");
println!(" for_html: {}", for_html(input));
println!(
" for_html_content: {}",
for_html_content(input)
);
println!(
" for_html_attribute: {}",
for_html_attribute(input)
);
println!(
" for_html_unquoted_attribute: {}",
for_html_unquoted_attribute(input)
);
println!();
println!("--- javascript ---");
println!(" for_javascript: {}", for_javascript(input));
println!(
" for_javascript_attribute: {}",
for_javascript_attribute(input)
);
println!(
" for_javascript_block: {}",
for_javascript_block(input)
);
println!(
" for_javascript_source: {}",
for_javascript_source(input)
);
let template_input = r#"`Hello ${name}`, welcome</script>"#;
println!(
" for_js_template: {}",
for_js_template(template_input)
);
println!();
println!("--- css ---");
println!(" for_css_string: {}", for_css_string(input));
println!(" for_css_url: {}", for_css_url(input));
println!();
println!("--- uri ---");
println!(
" for_uri_component: {}",
for_uri_component(input)
);
println!();
println!("--- xml 1.0 ---");
println!(" for_xml: {}", for_xml(input));
println!(" for_xml_content: {}", for_xml_content(input));
println!(
" for_xml_attribute: {}",
for_xml_attribute(input)
);
println!(" for_xml_comment: {}", for_xml_comment(input));
println!(" for_cdata: {}", for_cdata(input));
println!();
println!("--- xml 1.1 ---");
let xml11_input = "a\x01b<c>";
println!(" for_xml11: {}", for_xml11(xml11_input));
println!(
" for_xml11_content: {}",
for_xml11_content(xml11_input)
);
println!(
" for_xml11_attribute: {}",
for_xml11_attribute(xml11_input)
);
println!();
println!("--- java ---");
println!(" for_java: {}", for_java(input));
println!();
println!("--- go ---");
println!(" for_go_string: {}", for_go_string(input));
println!(" for_go_char: {}", for_go_char(input));
println!(
" for_go_byte_string: {}",
for_go_byte_string(input)
);
println!();
println!("--- rust ---");
println!(" for_rust_string: {}", for_rust_string(input));
println!(" for_rust_char: {}", for_rust_char(input));
println!(
" for_rust_byte_string: {}",
for_rust_byte_string(input)
);
println!();
println!("--- json ---");
println!(" for_json: {}", for_json(input));
println!();
println!("--- python ---");
println!(
" for_python_string: {}",
for_python_string(input)
);
println!(
" for_python_bytes: {}",
for_python_bytes(input)
);
println!(
" for_python_raw_string: {}",
for_python_raw_string(input)
);
println!();
println!("--- sql ---");
println!(" for_sql: {}", for_sql(input));
println!(
" for_sql_backslash: {}",
for_sql_backslash(input)
);
let user_name = r#"Bob <img src=x onerror="alert(1)">"#;
let user_query = "hello world & goodbye";
let user_text = r#"hi from </script><script>alert(1)</script>"#;
let user_css_text = r#"hello "css" \ test"#;
println!("--- practical usage ---");
println!(r#" <p>{}</p>"#, for_html_content(user_name));
let href = format!("/search?q={}", for_uri_component(user_query));
println!(r#" <a href="{}">search</a>"#, for_html_attribute(&href),);
println!(
r#" <style>.msg::after {{ content: "{}"; }}</style>"#,
for_css_string(user_css_text),
);
println!(
r#" <button onclick="greet('{}');">hi</button>"#,
for_javascript_attribute(user_text),
);
}