|
""" |
|
pygments.formatters.bbcode |
|
~~~~~~~~~~~~~~~~~~~~~~~~~~ |
|
|
|
BBcode formatter. |
|
|
|
:copyright: Copyright 2006-2025 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=#{}]'.format(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 |
|
|
|
|
|
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') |
|
|