25
// Markdown renders the GitHub step summary HTML and enforces both the total
26
// summary budget and per-row detail truncation.
28
>
if len(s.Rows) == 0 {
29
return ""
30
}
31
33
>
sb.WriteString("<table>\n<tr><th>Kind</th><th>Test</th></tr>\n")
34
>
35
>
// Reserve bytes for the closing tag so we can always finish the table.
36
>
const tableClose = "</table>\n"
37
>
budget := summaryMarkdownMaxBytes - sb.Len() - len(tableClose)
38
>
39
>
written := 0
40
>
for _, row := range s.Rows {
41
>
rendered := row.Markdown()
42
>
if len(rendered) > budget {
43
omitted := len(s.Rows) - written
44
fmt.Fprintf(&sb, "<tr><td colspan=\"2\">… %d failure(s) not shown — see full output in job logs</td></tr>\n", omitted)
45
break
46
}
48
>
budget -= len(rendered)
49
>
written++
50
}
51
53
>
return sb.String()
54
}
55