toMarkdown method
Generate markdown report.
Implementation
String toMarkdown() {
final buffer = StringBuffer();
buffer.writeln('# Technical Debt Report');
buffer.writeln();
// Summary section
buffer.writeln('## Summary');
buffer.writeln();
buffer.writeln(
'- **Total Cost**: ${summary.totalCost.toStringAsFixed(1)} ${summary.unit}');
buffer.writeln('- **Items**: ${summary.itemCount}');
buffer.writeln(
'- **Threshold**: ${summary.threshold.toStringAsFixed(1)} ${summary.unit}');
buffer.writeln(
'- **Status**: ${summary.exceedsThreshold ? "EXCEEDS THRESHOLD" : "OK"}');
buffer.writeln();
// Breakdown by type
buffer.writeln('## Breakdown by Type');
buffer.writeln();
buffer.writeln('| Type | Count | Cost |');
buffer.writeln('|------|-------|------|');
for (final typeSummary in summary.typesByHighestCost) {
if (typeSummary.count > 0) {
buffer.writeln(
'| ${typeSummary.type.label} | ${typeSummary.count} | '
'${typeSummary.cost.toStringAsFixed(1)} ${summary.unit} |');
}
}
buffer.writeln();
// Breakdown by severity
buffer.writeln('## Breakdown by Severity');
buffer.writeln();
buffer.writeln('| Severity | Cost |');
buffer.writeln('|----------|------|');
for (final severity in DebtSeverity.values) {
final cost = summary.getCostForSeverity(severity);
if (cost > 0) {
buffer.writeln(
'| ${severity.label} | ${cost.toStringAsFixed(1)} ${summary.unit} |');
}
}
buffer.writeln();
// Hotspots
final hotspots = getHotspots(10);
if (hotspots.isNotEmpty) {
buffer.writeln('## Hotspots (Top 10 Files)');
buffer.writeln();
buffer.writeln('| File | Items | Cost |');
buffer.writeln('|------|-------|------|');
for (final file in hotspots) {
buffer.writeln(
'| ${file.filePath} | ${file.itemCount} | '
'${file.totalCost.toStringAsFixed(1)} ${summary.unit} |');
}
buffer.writeln();
}
// Critical items
final criticalItems = getItemsBySeverity(DebtSeverity.critical);
if (criticalItems.isNotEmpty) {
buffer.writeln('## Critical Items');
buffer.writeln();
for (final item in criticalItems) {
buffer.writeln(
'- **${item.type.label}** at `${item.filePath}:${item.location.start.line}`');
buffer.writeln(' - ${item.description}');
if (item.context != null) {
buffer.writeln(' - Context: `${item.context}`');
}
}
buffer.writeln();
}
// High priority items
final highItems = getItemsBySeverity(DebtSeverity.high);
if (highItems.isNotEmpty) {
buffer.writeln('## High Priority Items');
buffer.writeln();
for (final item in highItems.take(20)) {
buffer.writeln(
'- **${item.type.label}** at `${item.filePath}:${item.location.start.line}`');
buffer.writeln(' - ${item.description}');
}
if (highItems.length > 20) {
buffer.writeln();
buffer.writeln('_...and ${highItems.length - 20} more high priority items_');
}
buffer.writeln();
}
return buffer.toString();
}