class _BBCode:
def __getattr__(self, name):
method = _Virtual(name)
setattr(self, name, method)
return method
class _Virtual:
def __init__(self, name):
self.__name = name.upper()
def __call__(self, string, *args):
return '[{0}{1}]{2}[/{0}]'.format(self.__name, ('=' + ','.join(map(str, args))) if args else '', string)
BBCode = _BBCode()
################################################################################
# EXAMPLE FOLLOWS
BBCode.b('A bold sentence')
'[B]A bold sentence[/B]'
>>> BBCode.i('Italics')
'[I]Italics[/I]'
>>> BBCode.u('underline')
'[U]underline[/U]'
>>> 'I want one ' + BBCode.s('million') + ' billion dollars'
'I want one [S]million[/S] billion dollars'
>>> BBCode.sub('sub') + 'marine'
'[SUB]sub[/SUB]marine'
>>> 'x' + BBCode.sup(2)
'x[SUP]2[/SUP]'
>>> BBCode.big('big')
'[BIG]big[/BIG]'
>>> BBCode.big(BBCode.big('bigger'))
'[BIG][BIG]bigger[/BIG][/BIG]'
>>> BBCode.small('smaller text')
'[SMALL]smaller text[/SMALL]'
>>> BBCode.color('Green text', 'green')
'[COLOR=green]Green text[/COLOR]'
>>> BBCode.bgcolor('A background for text', 'lightgreen')
'[BGCOLOR=lightgreen]A background for text[/BGCOLOR]'
>>> BBCode.border('bordered', 'red')
'[BORDER=red]bordered[/BORDER]'
>>> BBCode.border('bordered', 'blue', 3)
'[BORDER=blue,3]bordered[/BORDER]'
>>> BBCode.border('bordered', 'green', 1, 'dotted')
'[BORDER=green,1,dotted]bordered[/BORDER]'
>>> BBCode.center('centered')
'[CENTER]centered[/CENTER]'
>>> BBCode.right('right aligned')
'[RIGHT]right aligned[/RIGHT]'
>>> BBCode.font('A different font', 'verdana')
'[FONT=verdana]A different font[/FONT]'
>>> BBCode.quote('Party time', 'Joe')
'[QUOTE=Joe]Party time[/QUOTE]'
>>> BBCode.quote('Party time')
'[QUOTE]Party time[/QUOTE]'
>>> print(BBCode.html('''<html>
<head>
<title>Steel Headquarters</title>
</head>
<body>
<p class="intro">Welcome</p>
</body>
</html>'''))
[HTML]<html>
<head>
<title>Steel Headquarters</title>
</head>
<body>
<p class="intro">Welcome</p>
</body>
</html>[/HTML]
>>> BBCode.nocode('lets show someone how to make text bigger ' + BBCode.big('bigger text'))
'[NOCODE]lets show someone how to make text bigger [BIG]bigger text[/BIG][/NOCODE]'
>>> BBCode.code('''int x = y;
x++;''')
'[CODE]int x = y;\nx++;[/CODE]'
>>> BBCode.url('Google', 'http://www.google.com/')
'[URL=http://www.google.com/]Google[/URL]'
>>> BBCode.url('http://www.google.com/')
'[URL]http://www.google.com/[/URL]'
>>> BBCode.img('http://www.google.com/logos/july4th09.gif')
'[IMG]http://www.google.com/logos/july4th09.gif[/IMG]'
>>> BBCode.email('Email me', 'user@example.com')
'[EMAIL=user@example.com]Email me[/EMAIL]'
>>> BBCode.email('user@example.com')
'[EMAIL]user@example.com[/EMAIL]'
>>> BBCode.flash('http://www.youtube.com/v/z7SeHqxOVYc', 250, 210)
'[FLASH=250,210]http://www.youtube.com/v/z7SeHqxOVYc[/FLASH]'
>>> BBCode.list(''.join(map(lambda item: '[*]' + item, ('Item 1', 'Item 2', 'Item 3'))))
'[LIST][*]Item 1[*]Item 2[*]Item 3[/LIST]'
>>> BBCode.list(''.join(map(lambda item: '[*]' + item, ('Item 1', 'Item 2', 'Item 3'))), 1)
'[LIST=1][*]Item 1[*]Item 2[*]Item 3[/LIST]'
>>> 'You may want to hide something from accidental viewing:' + BBCode.spoiler('or the secret may be spoiled')
'You may want to hide something from accidental viewing:[SPOILER]or the secret may be spoiled[/SPOILER]'
>>>
################################################################################
# EXAMPLE PATCH
class _Patch(_BBCode):
def __init__(self, **kwargs):
for key in kwargs:
setattr(self, key, kwargs[key])
def bulleted(self, *items):
return '[LIST]' + ''.join(map(lambda item: '[*]' + item, items)) + '[/LIST]'
def numbered(self, *items):
return '[LIST=1]' + ''.join(map(lambda item: '[*]' + item, items)) + '[/LIST]'
#############################################
>>> BBCode = _Patch(SELF='[me]', RULE='[hr]')
>>> BBCode.bulleted('Item 1', 'Item 2', 'Item 3')
'[LIST][*]Item 1[*]Item 2[*]Item 3[/LIST]'
>>> BBCode.numbered('Item 1', 'Item 2', 'Item 3')
'[LIST=1][*]Item 1[*]Item 2[*]Item 3[/LIST]'
>>> BBCode.SELF
'[me]'
>>> BBCode.RULE
'[hr]'
>>>