123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176177178179180181182183184185186187188189190191192193194195196197198199200201202203204205206207208209210211212213214215216217218219220221222223224225226227228229230231232233234235236237238239240241242243244245 |
- package door
- import (
- "bytes"
- "log"
- "strings"
- "unicode"
- )
- type Line struct {
- Text *bytes.Buffer
- update *bytes.Buffer
- DefaultColor string
- RenderF ColorRender
- render *bytes.Buffer
- UpdateF Updater
- Width int
- }
- func NewLine(text string) *Line {
- return &Line{Text: bytes.NewBuffer([]byte(text))}
- }
- func (l *Line) Update() bool {
- if l.Text == nil {
- l.Text = &bytes.Buffer{}
- }
- if l.UpdateF == nil {
- return false
- }
- if l.update == nil {
- l.update = &bytes.Buffer{}
- }
- l.update.Reset()
- l.UpdateF(l.update)
- l.LineLength(l.update)
-
- if bytes.Compare(l.update.Bytes(), l.Text.Bytes()) != 0 {
-
- l.Text.Reset()
- l.Text.Write(l.update.Bytes())
- return true
- }
- return false
- }
- func (l *Line) LineLength(text *bytes.Buffer) {
- if l.Width == 0 {
- return
- }
- var length int
- if Unicode {
- var ubuff *bytes.Buffer = bytes.NewBuffer(text.Bytes())
- var e error
- var r rune
- for {
- r, _, e = ubuff.ReadRune()
- if e != nil {
- break
- }
- length += UnicodeWidth(r)
- }
- } else {
- length = text.Len()
- }
- if length > l.Width {
- log.Printf("ERROR: Line Width %d: Have %d\n", l.Width, length)
- } else {
- for length < l.Width {
- text.WriteByte(' ')
- length++
- }
-
- }
- }
- func (l *Line) Output() []byte {
- if l.UpdateF == nil {
- l.LineLength(l.Text)
- }
- if l.render == nil {
- l.render = &bytes.Buffer{}
- }
- if l.RenderF == nil {
- l.render.Reset()
- l.render.WriteString(l.DefaultColor)
- l.render.Write(l.Text.Bytes())
- return l.render.Bytes()
-
- } else {
- l.RenderF(l.render, l.Text.Bytes())
- return l.render.Bytes()
- }
- }
- func RenderUppercase(Upper string, NonUpper string) ColorRender {
- var UpperColor, NonUpperColor []byte
- if strings.HasPrefix(Upper, "\x1b") {
- UpperColor = []byte(Upper)
- } else {
- UpperColor = []byte(ColorText(Upper))
- }
- if strings.HasPrefix(NonUpper, "\x1b") {
- NonUpperColor = []byte(NonUpper)
- } else {
- NonUpperColor = []byte(ColorText(NonUpper))
- }
- return func(output *bytes.Buffer, text []byte) {
- var lastColor *[]byte
- output.Reset()
- for _, letter := range text {
- if unicode.IsUpper(rune(letter)) {
- if lastColor != &UpperColor {
- output.Write(UpperColor)
- lastColor = &UpperColor
- }
- } else {
- if lastColor != &NonUpperColor {
- output.Write(NonUpperColor)
- lastColor = &UpperColor
- }
- }
- output.WriteByte(letter)
- }
- }
- }
- func RenderBlueYellow(output *bytes.Buffer, text []byte) {
- output.Reset()
-
-
- var blue string = ColorText("BOLD BLUE")
- var yellow string = ColorText("BOLD YELLOW")
- var last *string
- for _, letter := range text {
- if unicode.IsUpper(rune(letter)) {
- if last != &blue {
- output.WriteString(blue)
- last = &blue
- }
- } else {
- if last != &yellow {
- output.WriteString(yellow)
- last = &yellow
- }
- }
- output.WriteByte(letter)
- }
-
-
-
- }
|