4. API - Styles¶
The colorzero library also includes a series of classes which act a bit like
stylesheets for formatting large strings. Different classes are used to produce
different types of output, such as HTMLStyles
for HTML (and CSS)
output, or TermStyles
for ANSI terminal output.
4.1. Style Class¶
- class colorzero.Style(fg, bg=<Color Default>)[source]¶
Represents a named “style” with a foreground (
fg
) and background (bg
)Color
(orDefault
).If fg is an instance of
Color
it is accepted verbatim. Otherwise, aColor
will be constructed with its value. Likewise for bg, which defaults toDefault
if not specified.
4.2. Stylesheets¶
Stylesheets are constructed with an initial mapping of names to suitable style values, or can be constructed with a set of keyword arguments which will be used to create the initial mapping:
>>> style = TermStyles({
... 'info': Style(Color('blue'), Default),
... 'warn': Style(Color('white'), Color('red')),
... })
The style values can either be a Style
instance, or anything that
could be used to construct a Style
instance, including a
Color
instance, or valid arguments that could be used to construct a
Color
instance, or a tuple of two such values (representing the “fg”
and “bg” components respectively). The value None
can also be
specified, which will be converted to a Style
with Default
as
both foreground and background:
>>> style2 = TermStyles({
... 'info': 'blue',
... 'warn': ('white', 'red'),
... })
>>> style == style2
True
Style mappings are mutable (like an ordinary dict
), but keys must be
strings, and values will be converted in the same manner as during
construction:
>>> style['error'] = 'red'
>>> style
TermStyles({'info': Style(fg=<Color html='#0000ff' rgb=(0, 0, 1)>,
bg=<Color Default>), 'warn': Style(fg=<Color html='#ffffff'
rgb=(1, 1, 1)>, bg=<Color html='#ff0000' rgb=(1, 0, 0)>), 'error':
Style(fg=<Color html='#ff0000' rgb=(1, 0, 0)>, bg=<Color Default>)})
Style mappings can be used with format strings to generate output in a variety of styles. The format spec for each template must be the name of an entry within the mapping. For example:
>>> from colorzero import *
>>> s = TermStyles(warn='red', reset=None)
>>> f'{s:warn}Warning{s:reset}: Do not push the button!'
'\x1b[1;31m\x1b[49mWarning\x1b[0m: Do not push the button!'
It is important to bear in mind that the formatting behaviour is stateful.
In other words, as the styles are substituted into a string, the instance
is keeping track of the current style. This permits descendants like
HTMLStyles
to determine when tags need closing or for
TermStyles
to determine when to reset foreground or background
colors:
>>> s = HTMLStyles(warn='red', reset=None)
>>> print(f'{s:warn}This is red ')
<span class="warn">This is red
>>> print('and this will still be red ')
and this will still be red
>>> print(f'because the span has not closed yet{s:reset}')
because the span has not closed yet</span>
If the current foreground and background style is not Default
once
formatting is complete, you may need to call reset()
before
continuing to format the next string to ensure correct behaviour. The
reset()
method will return whatever string would be needed to reset the
current style to the default (if any):
>>> print(f'{s:warn}This is red')
<span class="warn">This is red
>>> print(s.reset())
</span>
4.3. BaseStyles Class¶
- class colorzero.BaseStyles(styles=None, **kwargs)[source]¶
Represents a mapping of (arbitrary) names to
Style
instances. This is an abstract base class; most users will be more interested in the concrete descendants:HTMLStyles
orTermStyles
which can be used with format strings to produce styled output.
4.4. StripStyles Class¶
4.5. HTMLStyles Class¶
- class colorzero.HTMLStyles(styles=None, *, tag='span', **kwargs)[source]¶
A stylesheet that outputs HTML elements when formatting strings.
The name of the elements produced is specified by the tag argument, which defaults to “span”. Style names must be valid CSS identifiers, or escapable to valid CSS identifiers (in practice, this means no spaces, and no empty strings). A
ValueError
will be raised if you attempt to assign such a key.The
stylesheet()
method can be used to output a valid CSS stylesheet to be used with the generated HTML.- stylesheet(prefix='')[source]¶
A generator method that yields rules of a CSS stylesheet for all defined styles. The prefix, if given, specifies anything that should be output before each rule such as any parent CSS selectors.
For example:
>>> from colorzero import * >>> styles = HTMLStyles(warn='red', info='blue', reset=None) >>> print('\n'.join(styles.stylesheet('div.body '))) div.body span.warn { color: rgb(255, 0, 0); background-color: inherit; } div.body span.info { color: rgb(0, 0, 255); background-color: inherit; } div.body span.reset { color: inherit; background-color: inherit; }
4.6. TermStyles Class¶
- class colorzero.TermStyles(styles=None, *, term_colors='8', **kwargs)[source]¶
A stylesheet that outputs ANSI escape codes.
The term_colors argument specifies the sorts of codes produced. This can be:
“8” - the default, indicating only the original 8 DOS colors (black, red, green, yellow, blue, magenta, cyan, and white) are supported. Technically, 16 foreground colors are supported via use of the “bold” style for “intense” colors, if the terminal supports this.
“256” - indicates the terminal supports 256 colors via 8-bit color ANSI codes
“16m” - indicating the terminal supports ~16 million colors via 24-bit color ANSI codes