Browse Source

fix spinner

master v0.0.62
RealXLFD 1 month ago
parent
commit
c10381d3a3
  1. 9
      cli/spinner/index.go
  2. 20
      cli/spinner/internal.go
  3. 1
      go.mod
  4. 2
      go.sum
  5. 30
      utils/str/calc.go
  6. 8
      utils/str/template.go

9
cli/spinner/index.go

@ -32,6 +32,13 @@ func (s *Spinner) Stop() {
}
stop(s)
}
func (s *Spinner) StopClear() {
if !s.running {
return
}
stop(s)
clearLine(s)
}
func (s *Spinner) Success(msg string) {
if !s.running {
@ -82,6 +89,6 @@ func New(msg string, config ...Config) *Spinner {
0,
&sync.Mutex{},
}
spinner.length = str.C(tick(spinner, 0))
tick(spinner, 0)
return spinner
}

20
cli/spinner/internal.go

@ -18,18 +18,27 @@ func stop(s *Spinner) {
s.running = false
s.refresh <- struct{}{}
s.wait.Wait()
}
func clearLine(s *Spinner) {
s.lock.Lock()
defer s.lock.Unlock()
content := str.Join("\r", str.R(" ", s.length))
fmt.Print(content)
}
func notice(s *Spinner, flag, msg string) string {
curLen := str.C(msg) + 2
content := str.Join(flag, " ", msg)
curLen := str.DisplayWidth(content)
gap := upzero(s.length - curLen)
return str.T("\r{} {}{}", flag, msg, str.R(" ", gap))
return str.T("\r", content, str.R(" ", gap))
}
func tick(s *Spinner, offset int) string {
anime := s.Conf.Mode[s.index]
s.index = (s.index + offset) % len(s.Conf.Mode)
curLen := str.C(anime, s.Msg) + 1
curLen := str.DisplayWidth(anime, s.Msg) + 1
gap := upzero(s.length - curLen)
s.length = curLen
return str.T("\r{} {}{}", s.Conf.Render(anime), s.Msg, strings.Repeat(" ", gap))
@ -46,6 +55,7 @@ func render(s *Spinner, content string) {
fmt.Print(str.TrimMiddle(content, s.Conf.MsgMaxLength))
s.lock.Unlock()
}
func launch(s *Spinner) {
s.wait.Add(2)
s.running = true
@ -53,15 +63,15 @@ func launch(s *Spinner) {
for s.running {
select {
case msg := <-s.msgCh:
curLen := str.C(msg)
curLen := str.DisplayWidth(msg)
gap := upzero(s.length - curLen)
render(s, str.Join("\r", msg, str.R(" ", gap), "\n"))
case <-s.refresh:
if !s.running {
break
}
render(s, tick(s, 0))
}
render(s, tick(s, 0))
}
s.wait.Done()
}(s)

1
go.mod

@ -13,6 +13,7 @@ require (
github.com/stretchr/testify v1.8.4
github.com/tebeka/selenium v0.9.9
github.com/valyala/fasttemplate v1.2.2
golang.org/x/text v0.14.0
)
require (

2
go.sum

@ -161,6 +161,8 @@ golang.org/x/text v0.3.3/go.mod h1:5Zoc/QRtKVWzQhOtBMvqHzDpF6irO9z98xDceosuGiQ=
golang.org/x/text v0.3.7/go.mod h1:u+2+/6zg+i71rQMx5EYifcz6MCKuco9NR6JIITiCfzQ=
golang.org/x/text v0.7.0/go.mod h1:mrYo+phRRbMaCq/xk9113O4dZlRixOauAjOtrjsXDZ8=
golang.org/x/text v0.9.0/go.mod h1:e1OnstbJyHTd6l/uOt8jFFHp6TRDWZR/bV3emEE/zU8=
golang.org/x/text v0.14.0 h1:ScX5w1eTa3QqT8oi6+ziP7dTV1S2+ALU0bI+0zXKWiQ=
golang.org/x/text v0.14.0/go.mod h1:18ZOQIKpY8NJVqYksKHtTdi31H5itFRjB5/qKTNYzSU=
golang.org/x/time v0.0.0-20181108054448-85acf8d2951c/go.mod h1:tRJNPiyCQ0inRvYxbN9jk5I+vvW/OXSQhTDSoE431IQ=
golang.org/x/time v0.0.0-20190308202827-9d24e82272b4/go.mod h1:tRJNPiyCQ0inRvYxbN9jk5I+vvW/OXSQhTDSoE431IQ=
golang.org/x/tools v0.0.0-20180917221912-90fa682c2a6e/go.mod h1:n7NCudcB/nEzxVGmLbDWY5pfWTLqBcC2KZ6jyYvM4mQ=

30
utils/str/calc.go

@ -0,0 +1,30 @@
package str
import (
"unicode/utf8"
"golang.org/x/text/width"
)
func C(args ...string) (count int) {
for i := range args {
count += utf8.RuneCountInString(args[i])
}
return count
}
func DisplayWidth(ss ...string) int {
_width := 0
for _, s := range ss {
for _, r := range s {
prop := width.LookupRune(r)
switch prop.Kind() {
case width.EastAsianWide, width.EastAsianFullwidth:
_width += 2
default:
_width += 1
}
}
}
return _width
}

8
utils/str/template.go

@ -5,7 +5,6 @@ import (
"fmt"
"strconv"
"strings"
"unicode/utf8"
)
func T(template string, args ...any) string {
@ -58,10 +57,3 @@ var (
F = fmt.Sprintf
R = strings.Repeat
)
func C(args ...string) (count int) {
for i := range args {
count += utf8.RuneCountInString(args[i])
}
return count
}

Loading…
Cancel
Save