in internal/history/history.go [156:211]
func (r *Release) ComponentsAndPackages() template.HTML {
var buf strings.Builder
// List components, if any.
for i, comp := range r.Components {
if len(r.Packages) == 0 {
// No packages, so components are joined with more rules.
switch {
case i != 0 && len(r.Components) == 2:
buf.WriteString(" and ")
case i != 0 && len(r.Components) >= 3 && i != len(r.Components)-1:
buf.WriteString(", ")
case i != 0 && len(r.Components) >= 3 && i == len(r.Components)-1:
buf.WriteString(", and ")
}
} else {
// When there are packages, all components are comma-separated.
if i != 0 {
buf.WriteString(", ")
}
}
buf.WriteString(string(comp))
}
// Join components and packages using a comma and/or "and" as needed.
if len(r.Components) > 0 && len(r.Packages) > 0 {
if len(r.Components)+len(r.Packages) >= 3 {
buf.WriteString(",")
}
buf.WriteString(" and ")
}
// List packages, if any.
if len(r.Packages) > 0 {
buf.WriteString("the ")
}
for i, pkg := range r.Packages {
switch {
case i != 0 && len(r.Packages) == 2:
buf.WriteString(" and ")
case i != 0 && len(r.Packages) >= 3 && i != len(r.Packages)-1:
buf.WriteString(", ")
case i != 0 && len(r.Packages) >= 3 && i == len(r.Packages)-1:
buf.WriteString(", and ")
}
buf.WriteString("<code>" + html.EscapeString(pkg) + "</code>")
}
switch {
case len(r.Packages) == 1:
buf.WriteString(" package")
case len(r.Packages) >= 2:
buf.WriteString(" packages")
}
return template.HTML(buf.String())
}