in internal/godoc/dochtml/internal/render/render.go [246:290]
func docToBlocks(doc string) []block {
docLines := unindent(strings.Split(strings.Trim(doc, "\n"), "\n"))
// Group the lines based on indentation and blank lines.
var groups [][]string
var lastGroup []string
var wasInCode bool
for _, line := range docLines {
hasIndent := indentLength(line) > 0
nowInCode := hasIndent || (wasInCode && line == "")
newGroup := wasInCode != nowInCode || (!nowInCode && line == "")
wasInCode = nowInCode
if newGroup && len(lastGroup) > 0 {
groups = append(groups, lastGroup)
lastGroup = nil
}
if line != "" || nowInCode {
lastGroup = append(lastGroup, line)
}
}
if len(lastGroup) > 0 {
groups = append(groups, lastGroup)
}
// Classify groups of lines as individual blocks.
var blks []block
var lastBlk block
for i, group := range groups {
willParagraph := i+1 < len(groups) && indentLength(groups[i+1][0]) == 0
for len(group) > 0 && group[len(group)-1] == "" {
group = group[:len(group)-1] // remove trailing empty lines
}
_, wasHeading := lastBlk.(*heading)
switch {
case indentLength(group[0]) > 0:
blks = append(blks, &preformat{unindent(group)})
case i != 0 && !wasHeading && len(group) == 1 && isHeading(group[0]) && willParagraph:
blks = append(blks, &heading{group[0]})
default:
blks = append(blks, ¶graph{group})
}
lastBlk = blks[len(blks)-1]
}
return blks
}