2023-09-23 19:42:21 +00:00
|
|
|
|
package format
|
|
|
|
|
|
|
|
|
|
import (
|
|
|
|
|
"fmt"
|
|
|
|
|
|
2024-02-25 17:03:01 +00:00
|
|
|
|
"gitea.zaclys.com/bvaudour/gob/option"
|
2023-09-23 19:42:21 +00:00
|
|
|
|
)
|
|
|
|
|
|
|
|
|
|
// Style permet de définir un style à une chaîne dans un terminal de type UNIX.
|
|
|
|
|
type Style struct {
|
2024-02-25 17:03:01 +00:00
|
|
|
|
option.Option[int]
|
2023-09-23 19:42:21 +00:00
|
|
|
|
}
|
|
|
|
|
|
|
|
|
|
const (
|
|
|
|
|
normal int = 0
|
|
|
|
|
bold int = 1
|
|
|
|
|
italic int = 3
|
|
|
|
|
underline int = 4
|
|
|
|
|
blink int = 5
|
|
|
|
|
inverted int = 7
|
|
|
|
|
crossed int = 9
|
|
|
|
|
cancel int = 20
|
|
|
|
|
)
|
|
|
|
|
|
|
|
|
|
var styles = map[string]int{
|
|
|
|
|
"normal": normal,
|
|
|
|
|
"bold": bold,
|
|
|
|
|
"italic": italic,
|
|
|
|
|
"underline": underline,
|
|
|
|
|
"blink": blink,
|
|
|
|
|
"inverted": inverted,
|
|
|
|
|
"crossed": crossed,
|
|
|
|
|
"!bold": cancel + bold,
|
|
|
|
|
"!italic": cancel + italic,
|
|
|
|
|
"!underline": cancel + underline,
|
|
|
|
|
"!blink": cancel + blink,
|
|
|
|
|
"!inverted": cancel + inverted,
|
|
|
|
|
"!crossed": cancel + crossed,
|
|
|
|
|
}
|
|
|
|
|
|
|
|
|
|
// IsCancel retourne vrai si le style est une annulation de style.
|
|
|
|
|
func (st Style) IsCancel() bool {
|
|
|
|
|
v, ok := st.Get()
|
|
|
|
|
return ok && v >= 20
|
|
|
|
|
}
|
|
|
|
|
|
|
|
|
|
// IsBold retourne vrai si le style de de type gras.
|
|
|
|
|
func (st Style) IsBold() bool {
|
|
|
|
|
v, ok := st.Get()
|
|
|
|
|
return ok && v|bold != 0
|
|
|
|
|
}
|
|
|
|
|
|
|
|
|
|
// IsNormal retourne vrai si aucun style n’est appliqué.
|
|
|
|
|
func (st Style) IsNormal() bool {
|
|
|
|
|
v, ok := st.Get()
|
|
|
|
|
return ok && v == normal
|
|
|
|
|
}
|
|
|
|
|
|
|
|
|
|
// Base retourne la liste des styles.
|
2024-02-25 17:03:01 +00:00
|
|
|
|
func (st Style) Base() option.Option[int] {
|
2023-09-23 19:42:21 +00:00
|
|
|
|
return st.Option
|
|
|
|
|
}
|
|
|
|
|
|
|
|
|
|
// String retourne la chaine d’échappement ASCII du style.
|
|
|
|
|
func (st Style) String() string {
|
|
|
|
|
if v, ok := st.Get(); ok {
|
|
|
|
|
return fmt.Sprintf("%d", v)
|
|
|
|
|
}
|
|
|
|
|
return ""
|
|
|
|
|
}
|
|
|
|
|
|
2023-09-24 19:57:05 +00:00
|
|
|
|
// Esc retourne l’échappement ASCII complet.
|
|
|
|
|
func (st Style) Esc() string {
|
|
|
|
|
return fmt.Sprintf(escTpl, st.String())
|
|
|
|
|
}
|
|
|
|
|
|
2023-09-23 19:42:21 +00:00
|
|
|
|
// Format formate le texte donné selon le style.
|
|
|
|
|
func (st Style) Format(text string) string {
|
|
|
|
|
if !st.IsDefined() {
|
|
|
|
|
return text
|
|
|
|
|
}
|
|
|
|
|
return fmt.Sprintf(formatTpl, st.String(), text)
|
|
|
|
|
}
|
|
|
|
|
|
|
|
|
|
// StyleOf retourne le style selon son nom.
|
|
|
|
|
// Les noms possibles sont :
|
|
|
|
|
// - normal : pas de style particulier
|
|
|
|
|
// - bold : chaîne en gras
|
|
|
|
|
// - italic : chaîne en italique
|
|
|
|
|
// - underline : chaîne soulignée
|
|
|
|
|
// - blink : chaîne clignotante
|
|
|
|
|
// - inverted : switch entre les couleurs de police et d’arrière-plan
|
|
|
|
|
// - crossed : chaîne rayée
|
|
|
|
|
// Le préfixe ! peut être ajouté pour annuler le style.
|
|
|
|
|
func StyleOf(name string) (st Style) {
|
|
|
|
|
if v, ok := styles[name]; ok {
|
2024-02-25 17:03:01 +00:00
|
|
|
|
return Style{option.Some(v)}
|
2023-09-23 19:42:21 +00:00
|
|
|
|
}
|
|
|
|
|
return
|
|
|
|
|
}
|