BBCode Python Module II

March 22nd, 2007

It's good to see a few people using my BBCode module. I have since made some small fixes and added a feature. I've added a PygmentsCodeTag that uses the excellent Pygments module to syntax highlight code within a [code][/code] tag. It supports all the languages that Pygments supports, simply specify the language in the tag (i.e. [code python][/code]). You can still use the code tag that generates <pre></pre>, if you have another syntax highlighting solution.

I have also simplified usage a little. Previously you had to add tags individually to the markup object, which was only a cut and paste from the sample code - but I don't like boiler-plate code when it can be moved to a function. So I added a Create function that creates a markup object with all the tags. Here's an example of how to use it, see the code for details.

import postmarkup
markup = postmarkup.Create()
bbcode = "[b] Hello, World! [/b]"
print markup.render_to_html(bbcode)

Being a lazy programmer I also implemented the __call__ function in the postmarkup object and had it call render_to_html, so the last line can be written as print markup(bbcode).

Something I forgot to mention in the earlier post is that in addition to this form [url], postmarkup also supports the more usual BBCode syntax of [url=""]. I prefer the former, because it's easier to type and I think it looks better.

You can download from the usual place. The zip also contains code.css, which you will need if you use the Pygments code tag. I will eventualy put this and my other Python projects on Sourceforge or Google code when I have the time. But I've got another more urgent project I'll be working on.


BBCode Python Module

March 10th, 2007

In the last few weeks I have been tinkering with a dynamic website created with Turbogears, but that's not what this blog entry is about. The website I have in mind is similar to a forum in that most of the content come from the users (can't tell you exactly what it is just yet). I wanted a way for users to post comments with simple formatting, but I didn't want to let them enter straight html - for all the problems that would cause. No doubt, some wise-guy would figure out that he could enter the <blink> tag! So I decided to implement something like BBCode, which I dubbed 'Post Markup'.

But once I came close to finishing Post Markup, I realised it was so much like BBCode, it was BBCode (which doesn't seem to have any strict definition anyway). My BBCode parser is deliberately quite relaxed, it will try to make sense of the BBCode rather than throwing errors. It will close open tags as well as handle overlapping tags so that it always produces valid XHTML snippets.

You can download here. This code is 'politeware', you may use it for any purpose you want as long as you say 'thank you' and you promise not to sue me if it breaks! Let me know if you have any suggestions or bug-fixes.

Here's a quick example of basic use.

import postmarkup

markup = postmarkup.PostMarkup().default_tags()
bbcode = "[b]Hello, World![/b]"

print markup.render_to_html(bbcode)

There are comments in the module. If you have any questions, please email or (better) post a comment here so I can build up documentation.

The following is a cut and paste of the test output. It shows the basic tags (bold, italic etc) and more advanced tags.

[s]Strike through[/s]
Strike through
[b]bold [i]bold and italic[/b] italic[/i]
bold bold and italic italic
[google]Will McGugan[/google]
Will McGugan [Google]
[wiki Will McGugan]Look up my name in Wikipedia[/wiki]
Look up my name in Wikipedia [Wikipedia]
[link]My homepage[/link]
My homepage []
[link][/link] []
[quote Will said...]BBCode is very cool[/quote]
Will said...

BBCode is very cool

[b]Long test[/b]

New lines characters are converted to breaks. Tags my be [b]ove[i]rl[/b]apped[/i].

[i]Open tags will be closed.
Long test

New lines characters are converted to breaks. Tags my be overlapped.

Open tags will be closed.
Search for Posts
© 2008 Will McGugan.

A technoblog blog, design by Will McGugan