package term
import (
)
type BufferBuilder struct {
Width, Col, Indent int
EagerWrap bool
Lines Lines
Dot Pos
}
func ( int) *BufferBuilder {
return &BufferBuilder{Width: , Lines: [][]Cell{make([]Cell, 0, )}}
}
func ( *BufferBuilder) () Pos {
return Pos{len(.Lines) - 1, .Col}
}
func ( *BufferBuilder) () *Buffer {
return &Buffer{.Width, .Lines, .Dot}
}
func ( *BufferBuilder) ( int) *BufferBuilder {
.Indent =
return
}
func ( *BufferBuilder) ( bool) *BufferBuilder {
.EagerWrap =
return
}
func ( *BufferBuilder) ( Pos) *BufferBuilder {
.Dot =
return
}
func ( *BufferBuilder) () *BufferBuilder {
return .setDot(.Cursor())
}
func ( *BufferBuilder) () {
.Lines = append(.Lines, make([]Cell, 0, .Width))
.Col = 0
}
func ( *BufferBuilder) ( Cell) {
:= len(.Lines)
.Lines[-1] = append(.Lines[-1], )
.Col += wcwidth.Of(.Text)
}
func ( *BufferBuilder) () *BufferBuilder {
.appendLine()
if .Indent > 0 {
for := 0; < .Indent; ++ {
.appendCell(Cell{Text: " "})
}
}
return
}
func ( *BufferBuilder) ( rune, string) *BufferBuilder {
if == '\n' {
.Newline()
return
}
:= Cell{string(), }
if < 0x20 || == 0x7f {
if != "" {
= + ";7"
} else {
= "7"
}
= Cell{"^" + string(^0x40), }
}
if .Col+wcwidth.Of(.Text) > .Width {
.Newline()
.appendCell()
} else {
.appendCell()
if .Col == .Width && .EagerWrap {
.Newline()
}
}
return
}
func ( *BufferBuilder) ( string, ...ui.Styling) *BufferBuilder {
return .WriteStyled(ui.T(, ...))
}
func ( *BufferBuilder) ( int, ...ui.Styling) *BufferBuilder {
return .Write(strings.Repeat(" ", ), ...)
}
var DotHere = struct{ x struct{} }{}
func ( *BufferBuilder) ( ...interface{}) *BufferBuilder {
for , := range {
if == DotHere {
return .WriteStyled(ui.MarkLines([:]...)).
SetDotHere().WriteStyled(ui.MarkLines([+1:]...))
}
}
return .WriteStyled(ui.MarkLines(...))
}
func ( *BufferBuilder) (, string) *BufferBuilder {
for , := range {
.WriteRuneSGR(, )
}
return
}
func ( *BufferBuilder) ( ui.Text) *BufferBuilder {
for , := range {
.WriteStringSGR(.Text, .Style.SGR())
}
return
}
func ( int) []Cell {
:= make([]Cell, )
for := 0; < ; ++ {
[].Text = " "
}
return
}