auditmysite 1.7.3

Resource-efficient WCAG 2.2 AA Accessibility Checker in Rust
Documentation
use super::*;

pub(in crate::output::pdf) fn render_ux(
    mut builder: renderreport::engine::ReportBuilder,
    ux: &UxPresentation,
    is_first: bool,
    i18n: &I18n,
) -> renderreport::engine::ReportBuilder {
    let ux_title = i18n.t("section-ux");
    let ux_takeaway = super::first_sentence(&ux.interpretation);
    builder = super::module_chapter_opener(builder, &ux_title, &ux_takeaway, is_first);
    builder = builder
        .add_component(
            ScoreCard::new(super::module_score_caption(i18n), ux.score)
                .with_description(i18n.t("label-heuristic-indicator"))
                .with_thresholds(75, 40),
        )
        .add_component(
            Label::new(format!(
                "{}: {}",
                i18n.t("pdf-ux-overview-title"),
                ux.interpretation
            ))
            .with_size("10.5pt")
            .with_color(crate::output::pdf::design::tokens::NEUTRAL),
        )
        .add_component(module_customer_context(
            i18n,
            "ux",
            Some(ux.score),
            &ux.interpretation,
        ));
    if let Some(note) = super::derived_from_note(i18n, "UX") {
        builder = builder.add_component(note);
    }
    builder =
        super::a11y_penalty_note(builder, ux.a11y_penalty, ux.score_before_a11y_penalty, i18n);

    // The struct carries canonical English; re-derive everything in the run language.
    let en = is_english(i18n);

    // Dimension scores as KeyValueList
    let mut kv = KeyValueList::new().with_title(i18n.t("ux-dimensions"));
    for dim in &ux.dimensions {
        let name = crate::ux::ux_dimension_name(dim.kind, en);
        let has_flagged_issue = ux
            .issues
            .iter()
            .any(|issue| issue.kind.dimension() == dim.kind);
        let summary = crate::ux::ux_dimension_summary(dim.kind, dim.score, en, has_flagged_issue);
        kv = kv.add(name, format!("{} / 100 — {}", dim.score, summary));
    }
    builder = builder.add_component(kv);

    // Issues as findings (top 3 only)
    for issue in ux.issues.iter().take(3) {
        let sev = map_severity(&match issue.severity.as_str() {
            "high" => crate::taxonomy::Severity::High,
            "medium" => crate::taxonomy::Severity::Medium,
            "low" => crate::taxonomy::Severity::Low,
            _ => crate::taxonomy::Severity::Medium,
        });
        let dimension = crate::ux::ux_dimension_name(issue.kind.dimension(), en);
        let (_problem, impact, recommendation) =
            crate::ux::ux_issue_text(issue.kind, &issue.values, en);
        let desc = format!("{} — {}", impact, recommendation);
        builder = builder.add_component(Finding::new(dimension, sev, &desc));
    }
    if ux.issues.len() > 3 {
        let more_note = i18n.t_args(
            "pdf-ux-more-issues",
            &[("count", (ux.issues.len() - 3).to_string())],
        );
        builder = builder.add_component(Callout::info(&more_note));
    }
    builder
}

pub(in crate::output::pdf) fn render_journey(
    mut builder: renderreport::engine::ReportBuilder,
    journey: &JourneyPresentation,
    is_first: bool,
    i18n: &I18n,
) -> renderreport::engine::ReportBuilder {
    let journey_title = i18n.t("section-journey");
    let journey_takeaway = super::first_sentence(&journey.interpretation);
    builder = super::module_chapter_opener(builder, &journey_title, &journey_takeaway, is_first);
    builder = builder
        .add_component(
            ScoreCard::new(super::module_score_caption(i18n), journey.score)
                .with_description(i18n.t("label-heuristic-indicator"))
                .with_thresholds(75, 40),
        )
        .add_component(
            Label::new(format!(
                "{}: {}",
                i18n.t("pdf-journey-overview-title"),
                journey.interpretation
            ))
            .with_size("10.5pt")
            .with_color(crate::output::pdf::design::tokens::NEUTRAL),
        )
        .add_component(module_customer_context(
            i18n,
            "journey",
            Some(journey.score),
            &journey.interpretation,
        ));
    if let Some(note) = super::derived_from_note(i18n, "Journey") {
        builder = builder.add_component(note);
    }
    builder = super::a11y_penalty_note(
        builder,
        journey.a11y_penalty,
        journey.score_before_a11y_penalty,
        i18n,
    );

    // The struct carries canonical English; re-derive everything in the run language.
    let en = is_english(i18n);

    // Page intent
    let mut kv = KeyValueList::new().with_title(i18n.t("journey-page-type-dimensions"));
    kv = kv.add(
        i18n.t("pdf-journey-detected-page-type"),
        &journey.page_intent,
    );
    for dim in &journey.dimensions {
        let name = crate::journey::journey_dimension_name(dim.kind, en);
        let summary = crate::journey::journey_dimension_summary(dim.kind, dim.score, en);
        kv = kv.add(
            format!("{} ({}%)", name, dim.weight_pct),
            format!("{} / 100 — {}", dim.score, summary),
        );
    }
    builder = builder.add_component(kv);

    // Friction points as findings (top 3 only)
    for fp in journey.friction_points.iter().take(3) {
        let sev = map_severity(&match fp.severity.as_str() {
            "high" => crate::taxonomy::Severity::High,
            "medium" => crate::taxonomy::Severity::Medium,
            "low" => crate::taxonomy::Severity::Low,
            _ => crate::taxonomy::Severity::Medium,
        });
        let (problem, impact, recommendation) =
            crate::journey::journey_friction_text(fp.kind, &fp.values, en);
        let desc = format!("[{}] {} — {}", fp.step, impact, recommendation);
        builder = builder.add_component(Finding::new(&problem, sev, &desc));
    }
    if journey.friction_points.len() > 3 {
        let more_note = i18n.t_args(
            "pdf-journey-more-issues",
            &[("count", (journey.friction_points.len() - 3).to_string())],
        );
        builder = builder.add_component(Callout::info(&more_note));
    }
    builder
}