Permalink
Cannot retrieve contributors at this time
Fetching contributors…
| # -*- coding: utf-8 -*- | |
| """ | |
| pygments.formatters.bbcode | |
| ~~~~~~~~~~~~~~~~~~~~~~~~~~ | |
| BBcode formatter. | |
| :copyright: Copyright 2006-2013 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') |