aboutsummaryrefslogtreecommitdiffstats
path: root/vendor/github.com/awesome-gocui/gocui/escape.go
diff options
context:
space:
mode:
authorMichael Muré <batolettre@gmail.com>2020-02-05 22:03:19 +0100
committerMichael Muré <batolettre@gmail.com>2020-02-05 22:33:03 +0100
commit1d4bb7ceb0cef79d68df0bacc913b01e40e6ddd6 (patch)
treee088b0fa43058afde1db71541d8fcb4b94905d6e /vendor/github.com/awesome-gocui/gocui/escape.go
parentf093be96e98284580d61664adecd0a2ff8b354e4 (diff)
downloadgit-bug-1d4bb7ceb0cef79d68df0bacc913b01e40e6ddd6.tar.gz
migrate to go modules
Diffstat (limited to 'vendor/github.com/awesome-gocui/gocui/escape.go')
-rw-r--r--vendor/github.com/awesome-gocui/gocui/escape.go259
1 files changed, 0 insertions, 259 deletions
diff --git a/vendor/github.com/awesome-gocui/gocui/escape.go b/vendor/github.com/awesome-gocui/gocui/escape.go
deleted file mode 100644
index 64360802..00000000
--- a/vendor/github.com/awesome-gocui/gocui/escape.go
+++ /dev/null
@@ -1,259 +0,0 @@
-// Copyright 2014 The gocui Authors. All rights reserved.
-// Use of this source code is governed by a BSD-style
-// license that can be found in the LICENSE file.
-
-package gocui
-
-import (
- "strconv"
-
- "github.com/go-errors/errors"
-)
-
-type escapeInterpreter struct {
- state escapeState
- curch rune
- csiParam []string
- curFgColor, curBgColor Attribute
- mode OutputMode
-}
-
-type (
- escapeState int
- fontEffect int
-)
-
-const (
- stateNone escapeState = iota
- stateEscape
- stateCSI
- stateParams
-
- bold fontEffect = 1
- underline fontEffect = 4
- reverse fontEffect = 7
- setForegroundColor fontEffect = 38
- setBackgroundColor fontEffect = 48
-)
-
-var (
- errNotCSI = errors.New("Not a CSI escape sequence")
- errCSIParseError = errors.New("CSI escape sequence parsing error")
- errCSITooLong = errors.New("CSI escape sequence is too long")
-)
-
-// runes in case of error will output the non-parsed runes as a string.
-func (ei *escapeInterpreter) runes() []rune {
- switch ei.state {
- case stateNone:
- return []rune{0x1b}
- case stateEscape:
- return []rune{0x1b, ei.curch}
- case stateCSI:
- return []rune{0x1b, '[', ei.curch}
- case stateParams:
- ret := []rune{0x1b, '['}
- for _, s := range ei.csiParam {
- ret = append(ret, []rune(s)...)
- ret = append(ret, ';')
- }
- return append(ret, ei.curch)
- }
- return nil
-}
-
-// newEscapeInterpreter returns an escapeInterpreter that will be able to parse
-// terminal escape sequences.
-func newEscapeInterpreter(mode OutputMode) *escapeInterpreter {
- ei := &escapeInterpreter{
- state: stateNone,
- curFgColor: ColorDefault,
- curBgColor: ColorDefault,
- mode: mode,
- }
- return ei
-}
-
-// reset sets the escapeInterpreter in initial state.
-func (ei *escapeInterpreter) reset() {
- ei.state = stateNone
- ei.curFgColor = ColorDefault
- ei.curBgColor = ColorDefault
- ei.csiParam = nil
-}
-
-// parseOne parses a rune. If isEscape is true, it means that the rune is part
-// of an escape sequence, and as such should not be printed verbatim. Otherwise,
-// it's not an escape sequence.
-func (ei *escapeInterpreter) parseOne(ch rune) (isEscape bool, err error) {
- // Sanity checks
- if len(ei.csiParam) > 20 {
- return false, errCSITooLong
- }
- if len(ei.csiParam) > 0 && len(ei.csiParam[len(ei.csiParam)-1]) > 255 {
- return false, errCSITooLong
- }
-
- ei.curch = ch
-
- switch ei.state {
- case stateNone:
- if ch == 0x1b {
- ei.state = stateEscape
- return true, nil
- }
- return false, nil
- case stateEscape:
- if ch == '[' {
- ei.state = stateCSI
- return true, nil
- }
- return false, errNotCSI
- case stateCSI:
- switch {
- case ch >= '0' && ch <= '9':
- ei.csiParam = append(ei.csiParam, "")
- case ch == 'm':
- ei.csiParam = append(ei.csiParam, "0")
- default:
- return false, errCSIParseError
- }
- ei.state = stateParams
- fallthrough
- case stateParams:
- switch {
- case ch >= '0' && ch <= '9':
- ei.csiParam[len(ei.csiParam)-1] += string(ch)
- return true, nil
- case ch == ';':
- ei.csiParam = append(ei.csiParam, "")
- return true, nil
- case ch == 'm':
- var err error
- switch ei.mode {
- case OutputNormal:
- err = ei.outputNormal()
- case Output256:
- err = ei.output256()
- }
- if err != nil {
- return false, errCSIParseError
- }
-
- ei.state = stateNone
- ei.csiParam = nil
- return true, nil
- default:
- return false, errCSIParseError
- }
- }
- return false, nil
-}
-
-// outputNormal provides 8 different colors:
-// black, red, green, yellow, blue, magenta, cyan, white
-func (ei *escapeInterpreter) outputNormal() error {
- for _, param := range ei.csiParam {
- p, err := strconv.Atoi(param)
- if err != nil {
- return errCSIParseError
- }
-
- switch {
- case p >= 30 && p <= 37:
- ei.curFgColor = Attribute(p - 30 + 1)
- case p == 39:
- ei.curFgColor = ColorDefault
- case p >= 40 && p <= 47:
- ei.curBgColor = Attribute(p - 40 + 1)
- case p == 49:
- ei.curBgColor = ColorDefault
- case p == 1:
- ei.curFgColor |= AttrBold
- case p == 4:
- ei.curFgColor |= AttrUnderline
- case p == 7:
- ei.curFgColor |= AttrReverse
- case p == 0:
- ei.curFgColor = ColorDefault
- ei.curBgColor = ColorDefault
- }
- }
-
- return nil
-}
-
-// output256 allows you to leverage the 256-colors terminal mode:
-// 0x01 - 0x08: the 8 colors as in OutputNormal
-// 0x09 - 0x10: Color* | AttrBold
-// 0x11 - 0xe8: 216 different colors
-// 0xe9 - 0x1ff: 24 different shades of grey
-func (ei *escapeInterpreter) output256() error {
- if len(ei.csiParam) < 3 {
- return ei.outputNormal()
- }
-
- mode, err := strconv.Atoi(ei.csiParam[1])
- if err != nil {
- return errCSIParseError
- }
- if mode != 5 {
- return ei.outputNormal()
- }
-
- for _, param := range splitFgBg(ei.csiParam) {
- fgbg, err := strconv.Atoi(param[0])
- if err != nil {
- return errCSIParseError
- }
- color, err := strconv.Atoi(param[2])
- if err != nil {
- return errCSIParseError
- }
-
- switch fontEffect(fgbg) {
- case setForegroundColor:
- ei.curFgColor = Attribute(color + 1)
-
- for _, s := range param[3:] {
- p, err := strconv.Atoi(s)
- if err != nil {
- return errCSIParseError
- }
-
- switch fontEffect(p) {
- case bold:
- ei.curFgColor |= AttrBold
- case underline:
- ei.curFgColor |= AttrUnderline
- case reverse:
- ei.curFgColor |= AttrReverse
-
- }
- }
- case setBackgroundColor:
- ei.curBgColor = Attribute(color + 1)
- default:
- return errCSIParseError
- }
- }
- return nil
-}
-
-func splitFgBg(params []string) [][]string {
- var out [][]string
- var current []string
- for _, p := range params {
- if len(current) == 3 && (p == "48" || p == "38") {
- out = append(out, current)
- current = []string{}
- }
- current = append(current, p)
- }
-
- if len(current) > 0 {
- out = append(out, current)
- }
-
- return out
-}