2023-09-23 19:42:21 +00:00
|
|
|
|
package format
|
|
|
|
|
|
|
|
|
|
import (
|
|
|
|
|
"fmt"
|
|
|
|
|
"strings"
|
|
|
|
|
|
|
|
|
|
"gitea.zaclys.com/bvaudour/gob/collection"
|
|
|
|
|
)
|
|
|
|
|
|
2023-09-24 19:57:05 +00:00
|
|
|
|
const (
|
|
|
|
|
formatTpl = "\033[%sm%s\033[m"
|
|
|
|
|
escTpl = "\033[%sm"
|
|
|
|
|
)
|
2023-09-23 19:42:21 +00:00
|
|
|
|
|
|
|
|
|
// Format permet d’appliquer des styles et des couleurs à des chaînes dans un terminal de type UNIX.
|
|
|
|
|
type Format struct {
|
|
|
|
|
fg Color
|
|
|
|
|
bg Color
|
|
|
|
|
styles []Style
|
|
|
|
|
}
|
|
|
|
|
|
|
|
|
|
// Background retourne la couleur d’arrière-plan.
|
|
|
|
|
func (f Format) Background() Color {
|
|
|
|
|
return f.bg
|
|
|
|
|
}
|
|
|
|
|
|
|
|
|
|
// Foreground retourne la couleur de police.
|
|
|
|
|
func (f Format) Foreground() Color {
|
|
|
|
|
return f.fg
|
|
|
|
|
}
|
|
|
|
|
|
|
|
|
|
// Styles retourne les styles appliqués.
|
|
|
|
|
func (f Format) Styles() []Style {
|
|
|
|
|
out := make([]Style, len(f.styles))
|
|
|
|
|
copy(out, f.styles)
|
|
|
|
|
|
|
|
|
|
return out
|
|
|
|
|
}
|
|
|
|
|
|
|
|
|
|
// SetBg définit la couleur d’arrière-plan au formateur.
|
|
|
|
|
func (f *Format) SetBg(c Color) Format {
|
|
|
|
|
if !c.IsForeground() {
|
|
|
|
|
f.bg = c
|
|
|
|
|
}
|
|
|
|
|
|
|
|
|
|
return *f
|
|
|
|
|
}
|
|
|
|
|
|
|
|
|
|
// RemoveBg supprime la couleur d’arrière-plan du formatteur.
|
|
|
|
|
func (f *Format) RemoveBg() Format {
|
|
|
|
|
return f.SetBg(Color{})
|
|
|
|
|
}
|
|
|
|
|
|
|
|
|
|
// SetFg définit la couleur de police du formateur.
|
|
|
|
|
func (f *Format) SetFg(c Color) Format {
|
|
|
|
|
if !c.IsBackground() {
|
|
|
|
|
f.fg = c
|
|
|
|
|
}
|
|
|
|
|
|
|
|
|
|
return *f
|
|
|
|
|
}
|
|
|
|
|
|
|
|
|
|
// RemoveFg supprime la couleur de police du formateur.
|
|
|
|
|
func (f *Format) RemoveFg() Format {
|
|
|
|
|
return f.SetFg(Color{})
|
|
|
|
|
}
|
|
|
|
|
|
|
|
|
|
// SetColor ajoute la couleur au formateur (arrière-plan ou police).
|
|
|
|
|
func (f *Format) SetColor(c Color) Format {
|
|
|
|
|
if c.IsBackground() {
|
|
|
|
|
return f.SetBg(c)
|
|
|
|
|
} else if c.IsForeground() {
|
|
|
|
|
return f.SetFg(c)
|
|
|
|
|
}
|
|
|
|
|
return *f
|
|
|
|
|
}
|
|
|
|
|
|
|
|
|
|
// AddStyles ajoute des styles au formateur.
|
|
|
|
|
func (f *Format) AddStyles(st ...Style) Format {
|
|
|
|
|
for _, s := range st {
|
|
|
|
|
if s.IsDefined() {
|
|
|
|
|
f.styles = append(f.styles, s)
|
|
|
|
|
}
|
|
|
|
|
}
|
|
|
|
|
|
|
|
|
|
return *f
|
|
|
|
|
}
|
|
|
|
|
|
|
|
|
|
// RemoveStyles supprime les styles du formateur.
|
|
|
|
|
func (f *Format) RemoveStyles(st ...Style) Format {
|
|
|
|
|
f.styles = collection.Diff(f.styles, st)
|
|
|
|
|
|
|
|
|
|
return *f
|
|
|
|
|
}
|
|
|
|
|
|
|
|
|
|
// Push ajoute des styles et des couleurs au formateur selon les noms donnés.
|
|
|
|
|
// Pour plus de détail, lire la documentation sur StyleOf et ColorOf.
|
|
|
|
|
func (f *Format) Push(names ...string) Format {
|
|
|
|
|
for _, n := range names {
|
|
|
|
|
if st := StyleOf(n); st.IsDefined() {
|
|
|
|
|
f.AddStyles(st)
|
|
|
|
|
} else if c := ColorOf(n); c.IsDefined() {
|
|
|
|
|
f.SetColor(c)
|
|
|
|
|
}
|
|
|
|
|
}
|
|
|
|
|
|
|
|
|
|
return *f
|
|
|
|
|
}
|
|
|
|
|
|
|
|
|
|
// Pop supprime les styles et les couleurs selon les noms donnés.
|
|
|
|
|
// Pour plus de détail, lire la documentation sur StyleOf et ColorOf.
|
|
|
|
|
func (f *Format) Pop(names ...string) Format {
|
|
|
|
|
for _, n := range names {
|
|
|
|
|
if st := StyleOf(n); st.IsDefined() {
|
|
|
|
|
f.RemoveStyles(st)
|
|
|
|
|
} else if c := ColorOf(n); c.IsDefined() {
|
|
|
|
|
if c.IsBackground() {
|
|
|
|
|
f.RemoveBg()
|
|
|
|
|
} else {
|
|
|
|
|
f.RemoveFg()
|
|
|
|
|
}
|
|
|
|
|
}
|
|
|
|
|
}
|
|
|
|
|
|
|
|
|
|
return *f
|
|
|
|
|
}
|
|
|
|
|
|
|
|
|
|
// Reset réinitialise le formateur.
|
|
|
|
|
func (f *Format) Reset() Format {
|
|
|
|
|
f.fg = Color{}
|
|
|
|
|
f.bg = Color{}
|
|
|
|
|
f.styles = []Style{}
|
|
|
|
|
|
|
|
|
|
return *f
|
|
|
|
|
}
|
|
|
|
|
|
|
|
|
|
// String retourne la chaîne d’échappement ASCII du formateur.
|
|
|
|
|
func (f Format) String() string {
|
|
|
|
|
var args []string
|
|
|
|
|
var is_bold bool
|
|
|
|
|
|
|
|
|
|
for _, s := range f.styles {
|
|
|
|
|
args = append(args, s.String())
|
|
|
|
|
if s.IsNormal() || (s.IsBold() && s.IsCancel()) {
|
|
|
|
|
is_bold = false
|
|
|
|
|
} else if s.IsBold() {
|
|
|
|
|
is_bold = true
|
|
|
|
|
}
|
|
|
|
|
}
|
|
|
|
|
if f.fg.IsDefined() {
|
|
|
|
|
args = append(args, f.fg.String(is_bold))
|
|
|
|
|
}
|
|
|
|
|
if f.bg.IsDefined() {
|
|
|
|
|
args = append(args, f.bg.String())
|
|
|
|
|
}
|
|
|
|
|
|
|
|
|
|
return strings.Join(args, ";")
|
|
|
|
|
}
|
|
|
|
|
|
2023-09-24 19:57:05 +00:00
|
|
|
|
// Esc retourne l’échappement complet
|
|
|
|
|
func (f Format) Esc() string {
|
|
|
|
|
return fmt.Sprintf(escTpl, f.String())
|
|
|
|
|
}
|
|
|
|
|
|
2023-09-23 19:42:21 +00:00
|
|
|
|
// Format formate le texte selon la configuration du formateur.
|
|
|
|
|
func (f Format) Format(text string) string {
|
|
|
|
|
return fmt.Sprintf(formatTpl, f, text)
|
|
|
|
|
}
|
|
|
|
|
|
|
|
|
|
// FormatOf retourne un formateur selon les noms de styles et de couleurs à appliquer.
|
|
|
|
|
func FormatOf(formats ...string) (f Format) {
|
|
|
|
|
return f.Push(formats...)
|
|
|
|
|
}
|
|
|
|
|
|
|
|
|
|
// Apply formate le texte donné avec les styles/couleurs donnés (par nom).
|
|
|
|
|
func Apply(text string, formats ...string) string {
|
|
|
|
|
return FormatOf(formats...).Format(text)
|
|
|
|
|
}
|