bbcode.py
109 lines
| 3.2 KiB
| text/x-python
|
PythonLexer
Jeandet Alexis
|
r0 | # -*- coding: utf-8 -*- | ||
""" | ||||
pygments.formatters.bbcode | ||||
~~~~~~~~~~~~~~~~~~~~~~~~~~ | ||||
BBcode formatter. | ||||
:copyright: Copyright 2006-2012 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') | ||||