Django: Highlighting in HTML using Pygments and Beautiful Soup

Two months ago I wrote about Django, Pygments and Beautiful Soup.

A few days after the post I switched from HTML markup to reStructuredText and thus didn’t need my filter anymore and forgot to post more about it.

Today I received a comment asking me to publish the source code of the template filter—so here it is:

# encoding: utf-8

"""
A filter to highlight code blocks in html with Pygments and BeautifulSoup.

    {% load highlight_code %}

    {{ var_with_code|highlight|safe }}
"""

from BeautifulSoup  import BeautifulSoup
from django import template
from django.template.defaultfilters import stringfilter
import pygments
import pygments.formatters
import pygments.lexers


register = template.Library()

@register.filter
@stringfilter
def highlight(html):
    soup = BeautifulSoup(html)
    codeblocks = soup.findAll('pre')
    for block in codeblocks:
        if block.has_key('class'):
            try:
                code = ''.join([unicode(item) for item in block.contents])
                lexer = pygments.lexers.get_lexer_by_name(block['class'])
                formatter = pygments.formatters.HtmlFormatter()
                code_hl = pygments.highlight(code, lexer, formatter)
                block.contents = [BeautifulSoup(code_hl)]
                block.name = 'code'
            except:
                raise
    return unicode(soup)

Copy the code into a file called templatetags/highlight_code.py within a new or an existing Django app.

highlight() searches the passed HTML code for <pre>-tags with a class denoting the lexer to be used, e.g.:

<p><em>Hello World!</em> in Python:</p>
<pre class="python">
print 'Hello World'
</pre>

Furthermore you might want to create a CSS file containing all the style definitions in your static media directory. The following python script will do the job:

# Call it this way:
# python gen_css.py pygments.css
import sys

from pygments.formatters import HtmlFormatter

f = open(sys.argv[1], 'w')

# You can change style and the html class here:
f.write(HtmlFormatter(style='colorful').get_style_defs('.highlight'))

f.close()

I hope I explained all this well enough—if not, leave a comment and I’ll update this post. :-)

Django-sphinxdoc 0.2 now with documentation!

Just released version 0.2 of django-sphinxdoc. It can now display the documentation itself, the general index and the module index. The source and static views as well as the search functionality is not implemented yet.

I’m still pondering whether to use a Google custom search or the Sphinx JavaScript search. Maybe it would be even better if I used Haystack

You can find a quick guide as well as some other guides in django-sphinxdoc’s documentation section (which is of course powered by django-sphinxdoc ;-)).

The download can be found at bitbucket.org.

Tea Timer 1.6

A new version of Tea Timer has just been released. It fixes as a few bugs and has two small new features:

  1. It now displays the current version number on the website.
  2. It can handle multiple instances of the widget, each with different settings. One side effect of this is, that each new instance starts with its built-in default settings. If you don’t close and reopen your widget every hour, this should not be a problem. ;-)

Download Tea Timer 1.6

One feature I did not add, was a way to easily add more background colors. Since each background has its own image, you can’t easily add a box for a hex color code. But if you realy want more or different colors, here is a quick guide to achive this.

  1. Clone the Tea Timer repository or just download the latest version.
  2. Open the bundle TemplateWidget.djproj with Dashcode.
  3. You can find the image unter TemplateWidget/front/frontImg. Adjust its size to 320×120px and color it as you want.
  4. Copy the image to clipboard, pasted in your favourite editor and save it in the Widgets image folder (Tea Timer.wdgt/Images/) as Front_mycolor.png.
  5. Open Tea Timer.wdgt/TeaTimer.html in a text editor. Around line 65 you’ll find the options for all colors. Add your color there:
...
<option value="silver">Silver</option>
<option value="mycolor">My Color</option>
  1. Save and exit the editor.
  2. Install the new version by double clicking on it.
  3. That’s it. Ask if you have any questions. :-)

[Update] Tea Timer does not run under Mac OS X 10.4. I forgot to change this at my last submission to Apple and now I have to wait until I release the next version.

Documentation for django-lastfm with django-sphinxdoc

Yesterday I finished a first version of django-sphinxdoc that integrates Sphinx documentation into a Django powered website. Its based on Django’s documentation app, but can manage the documenation for more then one app. I’ll post more on this later.

What’s more important is, that I have put the documentation for django-lastfm online with it. :-)

django-lastfm

On my old Wordpress blog I had a widget that let me display some of my last.fm stats. Since there was no such widget for Django powered sites (or I didn’t search well enough), I created my own as you can see in the right column.

You currently can choose between your recently listened tracks, your weekly artist chart and your top artists. I’ve created a bitbucket project for its further development. So go clone it and give some feedback.

PS: I’ll update/write the documentation within the next few days … ;-)

A BeautifulSoup with Django and Pygments

Just added syntax highlighting using BeautifulSoup and Pygments. I took the SaltyCrane Blog for inspiration, but in contrast to it, I implemented it as a template filter in a separate application. This is surely not the most performant way, but I’m planning to use memcache, so I think this is ok.

Here an example how to use the filter:

{% load highlight_code %}
{{ my_var_with_code|highlight|safe }}

More Feeds

Just added Atom Feeds for post categories and post comments. They are available in the category detail and post detail views.

Comments and an Atom Feed

Small update for this site: Comments are now working and there is an Atom Feed for the latest posts in this blog.

The behaviour and the style of the comments is not very polished yet, but I’ll work on that later. I’ll also add more feeds, e.g. for post comments, categories and tags.

Magic! Python! Django! Whee!

This blog is now run by Django. I didn’t really like Wordpress which I used before. And also I don’t like PHP anymore (I really liked it some years ago, but everything changed, when I learned Python …).

When I told a friend that I wanted to switch from Wordpress to something else, he just said: «Use Django.» So I took a look at the Tutorial and was instantly thrilled.

At first, I wanted to use an existing weblog app, but I also wanted to code an app for my own and since I din’t find a weblog app that I 100% liked, I just decided to write my own. So here it is (far from finished though)!

Features so far:

  • Basic post model (title, slug, pub date, modify date, status, category, HTML body)
  • Post manager for post counts (per year, month, category (and tag))
  • Hierarchical category model – imho, this is the highlight of my app.
  • Archive and Categories
  • Some special template tags.
  • Usage of a recursive template tag for the categories
  • Unit- and doctests for the models and template tags

Features to come:

  • Comments
  • Atom feeds
  • Sidebar
  • Static pages
  • Trac integration for my projects
  • Search
  • Last.fm sidebar widget
  • Tags for posts (via django-tagging?)
  • CKEditor integration
  • Pygments integration
  • Improved image/media support for posts
  • Admin actions for posts (e.g. change status and category)
  • Preview function for new posts

That’s it so far. When I have Trac running, I’ll also publish the source of my applications. :-)

Magic! Python! Django! Whee!

Oh noes! Tea Timer 1.5.1 hot fix

There were two bugs in Tea Timer 1.5 (one minor and one major – try to change the alarm settings while »keep alarming« is activated :-D).

So I just released version 1.5.1 that fixes both issues. Thanks to Lakestone for the heads-up!

Download Tea Timer 1.5.1

« newer posts older posts »