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 }