|
""" |
|
pygments.formatter |
|
~~~~~~~~~~~~~~~~~~ |
|
|
|
Base formatter class. |
|
|
|
:copyright: Copyright 2006-2025 by the Pygments team, see AUTHORS. |
|
:license: BSD, see LICENSE for details. |
|
""" |
|
|
|
import codecs |
|
|
|
from pygments.util import get_bool_opt |
|
from pygments.styles import get_style_by_name |
|
|
|
__all__ = ['Formatter'] |
|
|
|
|
|
def _lookup_style(style): |
|
if isinstance(style, str): |
|
return get_style_by_name(style) |
|
return style |
|
|
|
|
|
class Formatter: |
|
""" |
|
Converts a token stream to text. |
|
|
|
Formatters should have attributes to help selecting them. These |
|
are similar to the corresponding :class:`~pygments.lexer.Lexer` |
|
attributes. |
|
|
|
.. autoattribute:: name |
|
:no-value: |
|
|
|
.. autoattribute:: aliases |
|
:no-value: |
|
|
|
.. autoattribute:: filenames |
|
:no-value: |
|
|
|
You can pass options as keyword arguments to the constructor. |
|
All formatters accept these basic options: |
|
|
|
``style`` |
|
The style to use, can be a string or a Style subclass |
|
(default: "default"). Not used by e.g. the |
|
TerminalFormatter. |
|
``full`` |
|
Tells the formatter to output a "full" document, i.e. |
|
a complete self-contained document. This doesn't have |
|
any effect for some formatters (default: false). |
|
``title`` |
|
If ``full`` is true, the title that should be used to |
|
caption the document (default: ''). |
|
``encoding`` |
|
If given, must be an encoding name. This will be used to |
|
convert the Unicode token strings to byte strings in the |
|
output. If it is "" or None, Unicode strings will be written |
|
to the output file, which most file-like objects do not |
|
support (default: None). |
|
``outencoding`` |
|
Overrides ``encoding`` if given. |
|
|
|
""" |
|
|
|
|
|
name = None |
|
|
|
|
|
|
|
aliases = [] |
|
|
|
|
|
|
|
|
|
filenames = [] |
|
|
|
|
|
|
|
unicodeoutput = True |
|
|
|
def __init__(self, **options): |
|
""" |
|
As with lexers, this constructor takes arbitrary optional arguments, |
|
and if you override it, you should first process your own options, then |
|
call the base class implementation. |
|
""" |
|
self.style = _lookup_style(options.get('style', 'default')) |
|
self.full = get_bool_opt(options, 'full', False) |
|
self.title = options.get('title', '') |
|
self.encoding = options.get('encoding', None) or None |
|
if self.encoding in ('guess', 'chardet'): |
|
|
|
self.encoding = 'utf-8' |
|
self.encoding = options.get('outencoding') or self.encoding |
|
self.options = options |
|
|
|
def get_style_defs(self, arg=''): |
|
""" |
|
This method must return statements or declarations suitable to define |
|
the current style for subsequent highlighted text (e.g. CSS classes |
|
in the `HTMLFormatter`). |
|
|
|
The optional argument `arg` can be used to modify the generation and |
|
is formatter dependent (it is standardized because it can be given on |
|
the command line). |
|
|
|
This method is called by the ``-S`` :doc:`command-line option <cmdline>`, |
|
the `arg` is then given by the ``-a`` option. |
|
""" |
|
return '' |
|
|
|
def format(self, tokensource, outfile): |
|
""" |
|
This method must format the tokens from the `tokensource` iterable and |
|
write the formatted version to the file object `outfile`. |
|
|
|
Formatter options can control how exactly the tokens are converted. |
|
""" |
|
if self.encoding: |
|
|
|
outfile = codecs.lookup(self.encoding)[3](outfile) |
|
return self.format_unencoded(tokensource, outfile) |
|
|
|
|
|
|
|
def __class_getitem__(cls, name): |
|
return cls |
|
|