Skip to content
Open
Changes from all commits
Commits
File filter

Filter by extension

Filter by extension

Conversations
Failed to load comments.
Loading
Jump to
Jump to file
Failed to load files.
Loading
Diff view
Diff view
35 changes: 34 additions & 1 deletion lib/score.js
Original file line number Diff line number Diff line change
@@ -1,16 +1,43 @@
export class Score {

constructor() {
// Regler som direkt sätter sin kategoripoäng till 0 ("showstoppers"),
// i stället för att gå genom det vanliga severity-avdraget.
//
// Används när en specifik regel innebär att kategorin är de facto
// underkänd — t.ex. när en lagstadgad tillgänglighetsredogörelse
// helt saknas. Lista bara regler där frånvaron är ett underkänt
// prov, inte saker som "delvis förenlig" eller liknande, för då
// tappar man nyans i poängsättningen.
//
// Vill man lägga till fler i framtiden (t.ex. om HTTPS helt saknas)
// är detta rätt ställe.
this.showstopperRules = new Set([
'no-a11y-statement'
]);
}

calculateScore(issues) {
let categoryScores = {
'overall': 100,
};

// Spåra vilka kategorier som ska nollas pga showstopper-regler
const zeroedCategories = new Set();

issues.forEach(issue => {
if (!categoryScores[issue.category]) {
categoryScores[issue.category] = 100;
}

// Showstopper-regler nollar kategorin direkt. Kolla att severity
// inte är 'resolved' — då är regeln visserligen med i listan men
// som godkänd, och ska inte trigga nollställning.
if (this.showstopperRules.has(issue.rule) && issue.severity !== 'resolved') {
zeroedCategories.add(issue.category);
return; // Hoppa över vanlig poängdragning för detta issue
}

if (issue.severity === 'critical') {
categoryScores[issue.category] -= 25;
} else if (issue.severity === 'error') {
Expand All @@ -19,11 +46,17 @@ export class Score {
categoryScores[issue.category] -= 1;
}
});

// Tvinga showstopper-kategorier till 0
zeroedCategories.forEach(category => {
categoryScores[category] = 0;
});

const Scores = Object.entries(categoryScores)
.filter(([key]) => key !== 'overall') // Exclude 'overall' from the calculation
.map(([, value]) => value);
const total = Scores.reduce((sum, Score) => sum + Score, 0);
categoryScores['overall'] = Scores.length > 0 ? total / Scores.length : 100; // Use average
return categoryScores;
}
}
}