1 /// A style is a collection of properties that can format a string
2 /// using ANSI escape codes.
3 #[derive(PartialEq, Clone, Copy)]
4 pub struct Style {
5 
6     /// The style's foreground colour, if it has one.
7     pub foreground: Option<Colour>,
8 
9     /// The style's background colour, if it has one.
10     pub background: Option<Colour>,
11 
12     /// Whether this style is bold.
13     pub is_bold: bool,
14 
15     /// Whether this style is dimmed.
16     pub is_dimmed: bool,
17 
18     /// Whether this style is italic.
19     pub is_italic: bool,
20 
21     /// Whether this style is underlined.
22     pub is_underline: bool,
23 
24     /// Whether this style is blinking.
25     pub is_blink: bool,
26 
27     /// Whether this style has reverse colours.
28     pub is_reverse: bool,
29 
30     /// Whether this style is hidden.
31     pub is_hidden: bool,
32 
33     /// Whether this style is struckthrough.
34     pub is_strikethrough: bool
35 }
36 
37 impl Style {
38     /// Creates a new Style with no differences.
new() -> Style39     pub fn new() -> Style {
40         Style::default()
41     }
42 
43     /// Returns a `Style` with the bold property set.
bold(&self) -> Style44     pub fn bold(&self) -> Style {
45         Style { is_bold: true, .. *self }
46     }
47 
48     /// Returns a `Style` with the dimmed property set.
dimmed(&self) -> Style49     pub fn dimmed(&self) -> Style {
50         Style { is_dimmed: true, .. *self }
51     }
52 
53     /// Returns a `Style` with the italic property set.
italic(&self) -> Style54     pub fn italic(&self) -> Style {
55         Style { is_italic: true, .. *self }
56     }
57 
58     /// Returns a `Style` with the underline property set.
underline(&self) -> Style59     pub fn underline(&self) -> Style {
60         Style { is_underline: true, .. *self }
61     }
62 
63     /// Returns a `Style` with the blink property set.
blink(&self) -> Style64     pub fn blink(&self) -> Style {
65         Style { is_blink: true, .. *self }
66     }
67 
68     /// Returns a `Style` with the reverse property set.
reverse(&self) -> Style69     pub fn reverse(&self) -> Style {
70         Style { is_reverse: true, .. *self }
71     }
72 
73     /// Returns a `Style` with the hidden property set.
hidden(&self) -> Style74     pub fn hidden(&self) -> Style {
75         Style { is_hidden: true, .. *self }
76     }
77 
78     /// Returns a `Style` with the hidden property set.
strikethrough(&self) -> Style79     pub fn strikethrough(&self) -> Style {
80         Style { is_strikethrough: true, .. *self }
81     }
82 
83     /// Returns a `Style` with the foreground colour property set.
fg(&self, foreground: Colour) -> Style84     pub fn fg(&self, foreground: Colour) -> Style {
85         Style { foreground: Some(foreground), .. *self }
86     }
87 
88     /// Returns a `Style` with the background colour property set.
on(&self, background: Colour) -> Style89     pub fn on(&self, background: Colour) -> Style {
90         Style { background: Some(background), .. *self }
91     }
92 
93     /// Return true if this `Style` has no actual styles, and can be written
94     /// without any control characters.
is_plain(self) -> bool95     pub fn is_plain(self) -> bool {
96         self == Style::default()
97     }
98 }
99 
100 impl Default for Style {
101 
102     /// Returns a style with *no* properties set. Formatting text using this
103     /// style returns the exact same text.
104     ///
105     /// ```
106     /// use ansi_term::Style;
107     /// assert_eq!(None,  Style::default().foreground);
108     /// assert_eq!(None,  Style::default().background);
109     /// assert_eq!(false, Style::default().is_bold);
110     /// assert_eq!("txt", Style::default().paint("txt").to_string());
111     /// ```
default() -> Style112     fn default() -> Style {
113         Style {
114             foreground: None,
115             background: None,
116             is_bold: false,
117             is_dimmed: false,
118             is_italic: false,
119             is_underline: false,
120             is_blink: false,
121             is_reverse: false,
122             is_hidden: false,
123             is_strikethrough: false,
124         }
125     }
126 }
127 
128 
129 // ---- colours ----
130 
131 /// A colour is one specific type of ANSI escape code, and can refer
132 /// to either the foreground or background colour.
133 ///
134 /// These use the standard numeric sequences.
135 /// See <http://invisible-island.net/xterm/ctlseqs/ctlseqs.html>
136 #[derive(PartialEq, Clone, Copy, Debug)]
137 pub enum Colour {
138 
139     /// Colour #0 (foreground code `30`, background code `40`).
140     ///
141     /// This is not necessarily the background colour, and using it as one may
142     /// render the text hard to read on terminals with dark backgrounds.
143     Black,
144 
145     /// Colour #1 (foreground code `31`, background code `41`).
146     Red,
147 
148     /// Colour #2 (foreground code `32`, background code `42`).
149     Green,
150 
151     /// Colour #3 (foreground code `33`, background code `43`).
152     Yellow,
153 
154     /// Colour #4 (foreground code `34`, background code `44`).
155     Blue,
156 
157     /// Colour #5 (foreground code `35`, background code `45`).
158     Purple,
159 
160     /// Colour #6 (foreground code `36`, background code `46`).
161     Cyan,
162 
163     /// Colour #7 (foreground code `37`, background code `47`).
164     ///
165     /// As above, this is not necessarily the foreground colour, and may be
166     /// hard to read on terminals with light backgrounds.
167     White,
168 
169     /// A colour number from 0 to 255, for use in 256-colour terminal
170     /// environments.
171     ///
172     /// - Colours 0 to 7 are the `Black` to `White` variants respectively.
173     ///   These colours can usually be changed in the terminal emulator.
174     /// - Colours 8 to 15 are brighter versions of the eight colours above.
175     ///   These can also usually be changed in the terminal emulator, or it
176     ///   could be configured to use the original colours and show the text in
177     ///   bold instead. It varies depending on the program.
178     /// - Colours 16 to 231 contain several palettes of bright colours,
179     ///   arranged in six squares measuring six by six each.
180     /// - Colours 232 to 255 are shades of grey from black to white.
181     ///
182     /// It might make more sense to look at a [colour chart][cc].
183     ///
184     /// [cc]: https://upload.wikimedia.org/wikipedia/en/1/15/Xterm_256color_chart.svg
185     Fixed(u8),
186 
187     /// A 24-bit RGB color, as specified by ISO-8613-3.
188     RGB(u8, u8, u8),
189 }
190 
191 
192 impl Colour {
193     /// Return a `Style` with the foreground colour set to this colour.
normal(self) -> Style194     pub fn normal(self) -> Style {
195         Style { foreground: Some(self), .. Style::default() }
196     }
197 
198     /// Returns a `Style` with the bold property set.
bold(self) -> Style199     pub fn bold(self) -> Style {
200         Style { foreground: Some(self), is_bold: true, .. Style::default() }
201     }
202 
203     /// Returns a `Style` with the dimmed property set.
dimmed(self) -> Style204     pub fn dimmed(self) -> Style {
205         Style { foreground: Some(self), is_dimmed: true, .. Style::default() }
206     }
207 
208     /// Returns a `Style` with the italic property set.
italic(self) -> Style209     pub fn italic(self) -> Style {
210         Style { foreground: Some(self), is_italic: true, .. Style::default() }
211     }
212 
213     /// Returns a `Style` with the underline property set.
underline(self) -> Style214     pub fn underline(self) -> Style {
215         Style { foreground: Some(self), is_underline: true, .. Style::default() }
216     }
217 
218     /// Returns a `Style` with the blink property set.
blink(self) -> Style219     pub fn blink(self) -> Style {
220         Style { foreground: Some(self), is_blink: true, .. Style::default() }
221     }
222 
223     /// Returns a `Style` with the reverse property set.
reverse(self) -> Style224     pub fn reverse(self) -> Style {
225         Style { foreground: Some(self), is_reverse: true, .. Style::default() }
226     }
227 
228     /// Returns a `Style` with the hidden property set.
hidden(self) -> Style229     pub fn hidden(self) -> Style {
230         Style { foreground: Some(self), is_hidden: true, .. Style::default() }
231     }
232 
233     /// Returns a `Style` with the strikethrough property set.
strikethrough(self) -> Style234     pub fn strikethrough(self) -> Style {
235         Style { foreground: Some(self), is_strikethrough: true, .. Style::default() }
236     }
237 
238     /// Returns a `Style` with the background colour property set.
on(self, background: Colour) -> Style239     pub fn on(self, background: Colour) -> Style {
240         Style { foreground: Some(self), background: Some(background), .. Style::default() }
241     }
242 }
243 
244 impl From<Colour> for Style {
245 
246     /// You can turn a `Colour` into a `Style` with the foreground colour set
247     /// with the `From` trait.
248     ///
249     /// ```
250     /// use ansi_term::{Style, Colour};
251     /// let green_foreground = Style::default().fg(Colour::Green);
252     /// assert_eq!(green_foreground, Colour::Green.normal());
253     /// assert_eq!(green_foreground, Colour::Green.into());
254     /// assert_eq!(green_foreground, Style::from(Colour::Green));
255     /// ```
from(colour: Colour) -> Style256     fn from(colour: Colour) -> Style {
257         colour.normal()
258     }
259 }
260