use std::io::{self, Write};
use chrono::Local;
use crate::modules::{ModuleStatus, QCModule};
use crate::report::charts::png_to_data_uri;
use crate::report::html::{format_java_date, write_escaped};
use crate::report::templates::ReportTemplate;
use crate::VERSION;
const ICON_FASTQC: &[u8] = include_bytes!("../../../assets/icons/fastqc_icon.png");
const ICON_TICK: &[u8] = include_bytes!("../../../assets/icons/tick.png");
const ICON_WARNING: &[u8] = include_bytes!("../../../assets/icons/warning.png");
const ICON_ERROR: &[u8] = include_bytes!("../../../assets/icons/error.png");
const CSS: &str = include_str!("../../../assets/header_template.html");
pub struct ClassicTemplate;
impl ReportTemplate for ClassicTemplate {
fn write_html_report(
&self,
modules: &[Box<dyn QCModule>],
filename: &str,
w: &mut dyn Write,
) -> io::Result<()> {
write!(w, "<!DOCTYPE html>")?;
write!(w, "<html>")?;
write!(w, "<head>")?;
write!(w, "<title>")?;
write_escaped(w, filename)?;
write!(w, " FastQC Report")?;
write!(w, "</title>")?;
write!(w, "<style type=\"text/css\">")?;
write_escaped(w, CSS)?;
write!(w, "</style>")?;
write!(w, "</head>")?;
write!(w, "<body>")?;
write!(w, "<div class=\"header\">")?;
write!(w, "<div id=\"header_title\">")?;
write!(
w,
"<img src=\"{}\" alt=\"FastQC\"/>",
png_to_data_uri(ICON_FASTQC)
)?;
write!(w, "FastQC Report")?;
write!(w, "</div>")?;
write!(w, "<div id=\"header_filename\">")?;
let now = Local::now();
let date_str = format_java_date(&now);
write_escaped(w, &date_str)?;
write!(w, "<br/>")?;
write_escaped(w, filename)?;
write!(w, "</div>")?;
write!(w, "</div>")?;
write!(w, "<div class=\"summary\">")?;
write!(w, "<h2>")?;
write!(w, "Summary")?;
write!(w, "</h2>")?;
write!(w, "<ul>")?;
for (i, module) in modules.iter().enumerate() {
if module.ignore_in_report() {
continue;
}
write!(w, "<li>")?;
let (icon, alt) = match module.status() {
ModuleStatus::Pass => (ICON_TICK, "[PASS]"),
ModuleStatus::Warn => (ICON_WARNING, "[WARNING]"),
ModuleStatus::Fail => (ICON_ERROR, "[FAIL]"),
};
write!(
w,
"<img src=\"{}\" alt=\"{}\"/>",
png_to_data_uri(icon),
alt
)?;
write!(w, "<a href=\"#M{}\">", i)?;
write_escaped(w, module.name())?;
write!(w, "</a>")?;
write!(w, "</li>")?;
}
write!(w, "</ul>")?;
write!(w, "</div>")?;
write!(w, "<div class=\"main\">")?;
for (i, module) in modules.iter().enumerate() {
if module.ignore_in_report() {
continue;
}
write!(w, "<div class=\"module\">")?;
write!(w, "<h2 id=\"M{}\">", i)?;
let (icon, alt) = match module.status() {
ModuleStatus::Pass => (ICON_TICK, "[OK]"),
ModuleStatus::Warn => (ICON_WARNING, "[WARN]"),
ModuleStatus::Fail => (ICON_ERROR, "[FAIL]"),
};
write!(
w,
"<img src=\"{}\" alt=\"{}\"/>",
png_to_data_uri(icon),
alt
)?;
write_escaped(w, module.name())?;
write!(w, "</h2>")?;
module.write_html_report(w)?;
write!(w, "</div>")?;
}
write!(w, "</div>")?;
write!(w, "<div class=\"footer\">")?;
write!(w, "Produced by ")?;
write!(
w,
"<a href=\"http://www.bioinformatics.babraham.ac.uk/projects/fastqc/\">"
)?;
write!(w, "FastQC")?;
write!(w, "</a>")?;
write!(w, " (version {})", VERSION)?;
write!(w, "</div>")?;
write!(w, "</body>")?;
write!(w, "</html>")?;
Ok(())
}
}