101 lines
2.2 KiB
Go
101 lines
2.2 KiB
Go
package format
|
||
|
||
import (
|
||
"fmt"
|
||
|
||
"gitea.zaclys.com/bvaudour/gob/option"
|
||
)
|
||
|
||
// Style permet de définir un style à une chaîne dans un terminal de type UNIX.
|
||
type Style struct {
|
||
option.Option[int]
|
||
}
|
||
|
||
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.
|
||
func (st Style) Base() option.Option[int] {
|
||
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 ""
|
||
}
|
||
|
||
// Esc retourne l’échappement ASCII complet.
|
||
func (st Style) Esc() string {
|
||
return fmt.Sprintf(escTpl, st.String())
|
||
}
|
||
|
||
// 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 {
|
||
return Style{option.Some(v)}
|
||
}
|
||
return
|
||
}
|