package textimport ()var (nl = []byte{'\n'}sp = []byte{' '})constdefaultPenalty = 1e5// Wrap wraps s into a paragraph of lines of length lim, with minimal// raggedness.func ( string, int) string {returnstring(WrapBytes([]byte(), ))}// WrapBytes wraps b into a paragraph of lines of length lim, with minimal// raggedness.func ( []byte, int) []byte { := bytes.Split(bytes.Replace(bytes.TrimSpace(), nl, sp, -1), sp)var [][]bytefor , := rangeWrapWords(, 1, , defaultPenalty) { = append(, bytes.Join(, sp)) }returnbytes.Join(, nl)}// WrapWords is the low-level line-breaking algorithm, useful if you need more// control over the details of the text wrapping process. For most uses, either// Wrap or WrapBytes will be sufficient and more convenient.//// WrapWords splits a list of words into lines with minimal "raggedness",// treating each byte as one unit, accounting for spc units between adjacent// words on each line, and attempting to limit lines to lim units. Raggedness// is the total error over all lines, where error is the square of the// difference of the length of the line and lim. Too-long lines (which only// happen when a single word is longer than lim units) have pen penalty units// added to the error.func ( [][]byte, , , int) [][][]byte { := len() := make([][]int, )for := 0; < ; ++ { [] = make([]int, ) [][] = len([])for := + 1; < ; ++ { [][] = [][-1] + + len([]) } } := make([]int, ) := make([]int, )for := range { [] = math.MaxInt32 }for := - 1; >= 0; -- {if [][-1] <= || == -1 { [] = 0 [] = } else {for := + 1; < ; ++ { := - [][-1] := * + []if [][-1] > { += // too-long lines get a worse penalty }if < [] { [] = [] = } } } }var [][][]byte := 0for < { = append(, [:[]]) = [] }return}
The pages are generated with Goldsv0.4.9. (GOOS=linux GOARCH=amd64)