gob/format/style.go

101 lines
2.2 KiB
Go
Raw Permalink Normal View History

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 nest 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 darriè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
}