Prefixes and Suffixes

Every line can be given a prefix or suffix, if desired. For example:

with say.settings(prefix='> '):
    say('this')
    say('that')

Will give what text email and Markdown consider a quoted block look:

> this
> that

Or if you’d like some text to be line-quoted with blue marks:

say(text, prefix=styled('> ', 'blue'))

Or if you’d like output numbered:

say.set(prefix=numberer())
say('this\nand\nthat')

yields:

1: this
2: and
3: that

You can instantiate different numberers for different files, and if you like, use the start keyword argument to start a numberer on a designated value.

Aother common prefixing scenario is needing to use one prefix on the first line, but a second prefix on the remainder of lines. The Python REPL uses this scheme, for example, with the prefix strings '>>> ' and '... '. If you’d like that scheme:

say(text, prefix=first_rest('>>> ', '... '))

If you want a prefixer to start and run forever, the above is sufficient. If you want a prefixer to reset itself every time it’s invoked in a say(), initialize it with the kwarg oneshot=False.

For example, to put a blue Unicode square as a hanging indicator of where a paragraph starts:

bluesquare = first_rest(styled('\u25a0 ', 'blue'), '  ', oneshot=False)
say(text, prefix=bluesquare)

Beneath the Covers

Prefixers are essentially generator objects, but with several tweaks. They support len() so that layout code can determine how much space to allot for the prefix, and they can be easily reset to their starting point. If they’re designed multi-shot (e.g. oneshot=False), they’ll be auto-reset on each call of say().