#[cfg(debug_assertions)]
use pochoir::{
parser::{Attrs, Node, TreeRefId},
template_engine::TemplateBlock,
Spanned, TransformerResult, TransformerTreeContext,
};
#[cfg(debug_assertions)]
use std::borrow::Cow;
use pochoir::transformers::Transformer;
#[cfg(debug_assertions)]
const CHECKER_JS: &str = concat!(
include_str!("axe.min.js"),
r#"document.addEventListener("DOMContentLoaded", () => {
axe
.run()
.then(results => {
if (results.violations.length) {
console.warn(`${results.violations.length} accessibility issues found:`);
console.table(results.violations);
} else {
console.info("No accessibility issues found!");
}
})
.catch(err => {
console.error(`Something bad happened when checking accessibility: ${err.message}`);
});
});"#
);
#[derive(Debug)]
pub struct AccessibilityChecker;
impl AccessibilityChecker {
pub fn new() -> Self {
Self
}
}
impl Transformer for AccessibilityChecker {
#[cfg(debug_assertions)]
fn on_tree_parsed(&mut self, ctx: &mut TransformerTreeContext) -> TransformerResult {
let parent = ctx.tree.select("body").unwrap().unwrap_or(TreeRefId::Root);
let script_id = ctx.tree.insert(
parent,
Spanned::new(Node::Element(Cow::Borrowed("script"), Attrs::new())),
);
let _text_id = ctx.tree.insert(
script_id,
Spanned::new(Node::TemplateBlock(TemplateBlock::RawText(Cow::Borrowed(
CHECKER_JS,
)))),
);
Ok(())
}
}
impl Default for AccessibilityChecker {
fn default() -> Self {
Self::new()
}
}