96 lines
2.1 KiB
Go
96 lines
2.1 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[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[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 ""
|
|||
|
}
|
|||
|
|
|||
|
// 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{Some(v)}
|
|||
|
}
|
|||
|
return
|
|||
|
}
|