generateHtml method
Builds the full HTML document as a string.
Implementation
String generateHtml(
List<AuditRunResult> results, {
required ProjectContext context,
}) {
final securityIssues = <SecurityIssue>[];
final maintenanceIssues = <SecurityIssue>[];
final passedAudits = <Audit>[];
for (final run in results) {
if (!run.result.hasIssues) {
passedAudits.add(run.audit);
continue;
}
if (maintenanceAuditIds.contains(run.audit.id)) {
maintenanceIssues.addAll(run.result.issues);
} else {
securityIssues.addAll(run.result.issues);
}
}
final bySeverity = {
for (final severity in Severity.values)
severity: securityIssues
.where((issue) => issue.severity == severity)
.toList(),
};
final projectName = p.basename(context.rootPath);
final now = DateTime.now();
final date =
'${now.year.toString().padLeft(4, '0')}-'
'${now.month.toString().padLeft(2, '0')}-'
'${now.day.toString().padLeft(2, '0')} '
'${now.hour.toString().padLeft(2, '0')}:'
'${now.minute.toString().padLeft(2, '0')}:'
'${now.second.toString().padLeft(2, '0')}';
final buffer = StringBuffer()
..writeln('<!DOCTYPE html>')
..writeln('<html lang="en">')
..writeln('<head>')
..writeln('<meta charset="UTF-8">')
..writeln(
'<meta name="viewport" content="width=device-width, initial-scale=1.0">',
)
..writeln('<title>Flutter Auditor Report — $projectName</title>')
..writeln('<style>${_css()}</style>')
..writeln('</head>')
..writeln('<body>')
..writeln('<div class="page">');
_writeHeader(
buffer,
projectName: projectName,
context: context,
date: date,
);
_writeSummaryAndChart(
buffer,
bySeverity: bySeverity,
maintenanceCount: maintenanceIssues.length,
passedCount: passedAudits.length,
);
for (final severity in [Severity.critical, Severity.high]) {
_writeIssueSection(
buffer,
title: '${severity.label} Risk',
color: _severityColors[severity]!,
issues: bySeverity[severity]!,
);
}
_writeIssueSection(
buffer,
title: 'Medium Risk',
color: _severityColors[Severity.medium]!,
issues: bySeverity[Severity.medium]!,
);
_writeIssueSection(
buffer,
title: 'Low Risk',
color: _severityColors[Severity.low]!,
issues: [...bySeverity[Severity.low]!, ...bySeverity[Severity.info]!],
collapsedByDefault: true,
);
_writeIssueSection(
buffer,
title: 'Maintenance',
color: _maintenanceColor,
issues: maintenanceIssues,
collapsedByDefault: true,
);
_writePassedSection(buffer, passedAudits: passedAudits);
buffer
..writeln(
'<div class="footer">Generated by flutter_auditor on $date</div>',
)
..writeln('</div>')
..writeln('</body>')
..writeln('</html>');
return buffer.toString();
}