type textPrinter … // Text returns a textual formatting of the [Doc]. // See the [Printer] documentation for ways to customize the text output. func (p *Printer) Text(d *Doc) []byte { … } // writeNL calls out.WriteByte('\n') // but first trims trailing spaces on the previous line. func writeNL(out *bytes.Buffer) { … } // block prints the block x to out. func (p *textPrinter) block(out *bytes.Buffer, x Block) { … } // text prints the text sequence x to out. func (p *textPrinter) text(out *bytes.Buffer, indent string, x []Text) { … } // oneLongLine prints the text sequence x to out as one long line, // without worrying about line wrapping. // Explicit links have the [ ] dropped to improve readability. func (p *textPrinter) oneLongLine(out *strings.Builder, x []Text) { … } // wrap wraps words into lines of at most max runes, // minimizing the sum of the squares of the leftover lengths // at the end of each line (except the last, of course), // with a preference for ending lines at punctuation (.,:;). // // The returned slice gives the indexes of the first words // on each line in the wrapped text with a final entry of len(words). // Thus the lines are words[seq[0]:seq[1]], words[seq[1]:seq[2]], // ..., words[seq[len(seq)-2]:seq[len(seq)-1]]. // // The implementation runs in O(n log n) time, where n = len(words), // using the algorithm described in D. S. Hirschberg and L. L. Larmore, // “[The least weight subsequence problem],” FOCS 1985, pp. 137-143. // // [The least weight subsequence problem]: https://doi.org/10.1109/SFCS.1985.60 func wrap(words []string, max int) (seq []int) { … } // wrapPenalty is the penalty for inserting a line break after word s. func wrapPenalty(s string) int64 { … }