109 lines
3.2 KiB
Python
109 lines
3.2 KiB
Python
"""
|
|
pygments.formatters.bbcode
|
|
~~~~~~~~~~~~~~~~~~~~~~~~~~
|
|
|
|
BBcode formatter.
|
|
|
|
:copyright: Copyright 2006-2022 by the Pygments team, see AUTHORS.
|
|
:license: BSD, see LICENSE for details.
|
|
"""
|
|
|
|
|
|
from pygments.formatter import Formatter
|
|
from pygments.util import get_bool_opt
|
|
|
|
__all__ = ['BBCodeFormatter']
|
|
|
|
|
|
class BBCodeFormatter(Formatter):
|
|
"""
|
|
Format tokens with BBcodes. These formatting codes are used by many
|
|
bulletin boards, so you can highlight your sourcecode with pygments before
|
|
posting it there.
|
|
|
|
This formatter has no support for background colors and borders, as there
|
|
are no common BBcode tags for that.
|
|
|
|
Some board systems (e.g. phpBB) don't support colors in their [code] tag,
|
|
so you can't use the highlighting together with that tag.
|
|
Text in a [code] tag usually is shown with a monospace font (which this
|
|
formatter can do with the ``monofont`` option) and no spaces (which you
|
|
need for indentation) are removed.
|
|
|
|
Additional options accepted:
|
|
|
|
`style`
|
|
The style to use, can be a string or a Style subclass (default:
|
|
``'default'``).
|
|
|
|
`codetag`
|
|
If set to true, put the output into ``[code]`` tags (default:
|
|
``false``)
|
|
|
|
`monofont`
|
|
If set to true, add a tag to show the code with a monospace font
|
|
(default: ``false``).
|
|
"""
|
|
name = 'BBCode'
|
|
aliases = ['bbcode', 'bb']
|
|
filenames = []
|
|
|
|
def __init__(self, **options):
|
|
Formatter.__init__(self, **options)
|
|
self._code = get_bool_opt(options, 'codetag', False)
|
|
self._mono = get_bool_opt(options, 'monofont', False)
|
|
|
|
self.styles = {}
|
|
self._make_styles()
|
|
|
|
def _make_styles(self):
|
|
for ttype, ndef in self.style:
|
|
start = end = ''
|
|
if ndef['color']:
|
|
start += '[color=#%s]' % ndef['color']
|
|
end = '[/color]' + end
|
|
if ndef['bold']:
|
|
start += '[b]'
|
|
end = '[/b]' + end
|
|
if ndef['italic']:
|
|
start += '[i]'
|
|
end = '[/i]' + end
|
|
if ndef['underline']:
|
|
start += '[u]'
|
|
end = '[/u]' + end
|
|
# there are no common BBcodes for background-color and border
|
|
|
|
self.styles[ttype] = start, end
|
|
|
|
def format_unencoded(self, tokensource, outfile):
|
|
if self._code:
|
|
outfile.write('[code]')
|
|
if self._mono:
|
|
outfile.write('[font=monospace]')
|
|
|
|
lastval = ''
|
|
lasttype = None
|
|
|
|
for ttype, value in tokensource:
|
|
while ttype not in self.styles:
|
|
ttype = ttype.parent
|
|
if ttype == lasttype:
|
|
lastval += value
|
|
else:
|
|
if lastval:
|
|
start, end = self.styles[lasttype]
|
|
outfile.write(''.join((start, lastval, end)))
|
|
lastval = value
|
|
lasttype = ttype
|
|
|
|
if lastval:
|
|
start, end = self.styles[lasttype]
|
|
outfile.write(''.join((start, lastval, end)))
|
|
|
|
if self._mono:
|
|
outfile.write('[/font]')
|
|
if self._code:
|
|
outfile.write('[/code]')
|
|
if self._code or self._mono:
|
|
outfile.write('\n')
|