mirror of
https://codeberg.org/forgejo/forgejo.git
synced 2024-11-01 13:01:15 +00:00
116 lines
1.9 KiB
Go
116 lines
1.9 KiB
Go
|
// Copyright 2023 The Gitea Authors. All rights reserved.
|
||
|
// SPDX-License-Identifier: MIT
|
||
|
|
||
|
package log
|
||
|
|
||
|
import (
|
||
|
"fmt"
|
||
|
"strconv"
|
||
|
)
|
||
|
|
||
|
const escape = "\033"
|
||
|
|
||
|
// ColorAttribute defines a single SGR Code
|
||
|
type ColorAttribute int
|
||
|
|
||
|
// Base ColorAttributes
|
||
|
const (
|
||
|
Reset ColorAttribute = iota
|
||
|
Bold
|
||
|
Faint
|
||
|
Italic
|
||
|
Underline
|
||
|
BlinkSlow
|
||
|
BlinkRapid
|
||
|
ReverseVideo
|
||
|
Concealed
|
||
|
CrossedOut
|
||
|
)
|
||
|
|
||
|
// Foreground text colors
|
||
|
const (
|
||
|
FgBlack ColorAttribute = iota + 30
|
||
|
FgRed
|
||
|
FgGreen
|
||
|
FgYellow
|
||
|
FgBlue
|
||
|
FgMagenta
|
||
|
FgCyan
|
||
|
FgWhite
|
||
|
)
|
||
|
|
||
|
// Foreground Hi-Intensity text colors
|
||
|
const (
|
||
|
FgHiBlack ColorAttribute = iota + 90
|
||
|
FgHiRed
|
||
|
FgHiGreen
|
||
|
FgHiYellow
|
||
|
FgHiBlue
|
||
|
FgHiMagenta
|
||
|
FgHiCyan
|
||
|
FgHiWhite
|
||
|
)
|
||
|
|
||
|
// Background text colors
|
||
|
const (
|
||
|
BgBlack ColorAttribute = iota + 40
|
||
|
BgRed
|
||
|
BgGreen
|
||
|
BgYellow
|
||
|
BgBlue
|
||
|
BgMagenta
|
||
|
BgCyan
|
||
|
BgWhite
|
||
|
)
|
||
|
|
||
|
// Background Hi-Intensity text colors
|
||
|
const (
|
||
|
BgHiBlack ColorAttribute = iota + 100
|
||
|
BgHiRed
|
||
|
BgHiGreen
|
||
|
BgHiYellow
|
||
|
BgHiBlue
|
||
|
BgHiMagenta
|
||
|
BgHiCyan
|
||
|
BgHiWhite
|
||
|
)
|
||
|
|
||
|
var (
|
||
|
resetBytes = ColorBytes(Reset)
|
||
|
fgCyanBytes = ColorBytes(FgCyan)
|
||
|
fgGreenBytes = ColorBytes(FgGreen)
|
||
|
)
|
||
|
|
||
|
type ColoredValue struct {
|
||
|
v any
|
||
|
colors []ColorAttribute
|
||
|
}
|
||
|
|
||
|
func (c *ColoredValue) Format(f fmt.State, verb rune) {
|
||
|
_, _ = f.Write(ColorBytes(c.colors...))
|
||
|
s := fmt.Sprintf(fmt.FormatString(f, verb), c.v)
|
||
|
_, _ = f.Write([]byte(s))
|
||
|
_, _ = f.Write(resetBytes)
|
||
|
}
|
||
|
|
||
|
func NewColoredValue(v any, color ...ColorAttribute) *ColoredValue {
|
||
|
return &ColoredValue{v: v, colors: color}
|
||
|
}
|
||
|
|
||
|
// ColorBytes converts a list of ColorAttributes to a byte array
|
||
|
func ColorBytes(attrs ...ColorAttribute) []byte {
|
||
|
bytes := make([]byte, 0, 20)
|
||
|
bytes = append(bytes, escape[0], '[')
|
||
|
if len(attrs) > 0 {
|
||
|
bytes = append(bytes, strconv.Itoa(int(attrs[0]))...)
|
||
|
for _, a := range attrs[1:] {
|
||
|
bytes = append(bytes, ';')
|
||
|
bytes = append(bytes, strconv.Itoa(int(a))...)
|
||
|
}
|
||
|
} else {
|
||
|
bytes = append(bytes, strconv.Itoa(int(Bold))...)
|
||
|
}
|
||
|
bytes = append(bytes, 'm')
|
||
|
return bytes
|
||
|
}
|