A collection of (ANSI-sequence aware) text reflow operations & algorithms
A collection of ANSI-aware methods and
io.Writershelping you to transform blocks of text. This means you can still style your terminal output with ANSI escape sequences without them affecting the reflow operations & algorithms.
The
wordwrappackage lets you word-wrap strings or entire blocks of text.
import "github.com/muesli/reflow/wordwrap"s := wordwrap.String("Hello World!", 5) fmt.Println(s)
Result:
Hello World!
The word-wrapping Writer is compatible with the
io.Writer/
io.WriteCloserinterfaces:
f := wordwrap.NewWriter(limit) f.Write(b) f.Close()fmt.Println(f.String())
Customize word-wrapping behavior:
f := wordwrap.NewWriter(limit) f.Breakpoints = []rune{':', ','} f.Newline = []rune{'\r'}
The
wrappackage lets you unconditionally wrap strings or entire blocks of text.
import "github.com/muesli/reflow/wrap"s := wrap.String("Hello World!", 7) fmt.Println(s)
Result:
Hello W orld!
The unconditional wrapping Writer is compatible with the
io.Writerinterfaces:
f := wrap.NewWriter(limit) f.Write(b)fmt.Println(f.String())
Customize word-wrapping behavior:
f := wrap.NewWriter(limit) f.Newline = []rune{'\r'} f.KeepNewlines = false f.reserveSpace = true f.TabWidth = 2
Tip: This wrapping method can be used in conjunction with word-wrapping when word-wrapping is preferred but a line limit has to be enforced:
wrapped := wrap.String(wordwrap.String("Just an example", 5), 5) fmt.Println(wrapped)
Result:
Just an examp le
s := wordwrap.String("I really \x1B[38;2;249;38;114mlove\x1B[0m Go!", 8) fmt.Println(s)
Result:
The
indentpackage lets you indent strings or entire blocks of text.
import "github.com/muesli/reflow/indent"s := indent.String("Hello World!", 4) fmt.Println(s)
Result:
Hello World!
There is also an indenting Writer, which is compatible with the
io.Writerinterface:
// indent uses spaces per default: f := indent.NewWriter(width, nil)// but you can also use a custom indentation function: f = indent.NewWriter(width, func(w io.Writer) { w.Write([]byte(".")) })
f.Write(b) f.Close()
fmt.Println(f.String())
The
dedentpackage lets you dedent strings or entire blocks of text.
import "github.com/muesli/reflow/dedent"input :=
Hello World! Hello World!
s := dedent.String(input) fmt.Println(s)
Result:
Hello World! Hello World!
The
paddingpackage lets you pad strings or entire blocks of text.
import "github.com/muesli/reflow/padding"s := padding.String("Hello", 8) fmt.Println(s)
Result:
Hello___(the underlined portion represents 3 spaces)
There is also a padding Writer, which is compatible with the
io.WriteCloserinterface:
// padding uses spaces per default: f := padding.NewWriter(width, nil)// but you can also use a custom padding function: f = padding.NewWriter(width, func(w io.Writer) { w.Write([]byte(".")) })
f.Write(b) f.Close()
fmt.Println(f.String())