django-lastfm 1.0

Django-lastfm is a small Django app that allows you to embed your charts or recently listened tracks from Last.fm into your website. You can see the widget in action in the sidebar of this website.

I raised its version to 1.0 since there have been no problems for a long time and there are also no features I want to include.

You can find django-lastfm in the Cheese Shop or at Bitbucket.

django-sphinxdoc 1.0

Most Python projects use Sphinx for their documentation. And many (most?) Python powered websites use Django as framework.

So there might be some people who use both Sphinx and Django. If you belong to this group and want to integrate the documentation of your projects into your Django powered website, django-sphinxdoc might be the app you’re searching for.

Django-sphinxdoc can build and import your Sphinxdocumentation and provides views for browsing and searching it. You can see django-sphinxdoc in action be reading its documentation.

What’s new in this version?

  • You can now search the documentation (via Haystack).
  • New management command updatedoc for importing and building JSON files from your documentation and updating Haystack’s search index.
  • New model Document for JSON files.
  • Renamed the App model to Project

What’s planned for the future?

  • Allow users to comment the documentation.

You can find django-sphinxdoc in the Cheese Shop or at Bitbucket.

Tea Timer 1.7.1

Tea Timer 1.7.1 is final now. Thank you for testing. Tea Timer also rembers now if you don’t want to update to a specific version and won’t show the update dialog until the next update.

Download | ChangeLog

Adding sections with folding for CSS in TextMate

In CSS there is no concept of sections or nested blocks. But since CSS files usually become very long, you may want to fold groups of style definitions to get a better overview:

/* start foldme */
p { color: #000 }
/* end foldme */

Since this is not possible with the CSS bundle shiped with Textmate, I added this on myself:

  1. I first added a snipped called section to the CSS bundle:

    /* start ${1:section} */
    $0
    /* end $1 */
    

    It gets activated by the tab trigger sec. The scope selector is source.css.

  2. I then modified the language definition and added |/\* start \w+ \*/ to the foldingStartMarker and |/\* end \w+ \*/ to the foldingStopMarker. They should look like this now:

    foldingStartMarker = '/\*\*(?!\*)|\{\s*($|/\*(?!.*?\*/.*\S))|/\* start \w+ \*/';
    foldingStopMarker = '(?<!\*)\*\*/|^\s*\}|/\* end \w+ \*/';
    

That’s all you need to do.

Tea Timer 1.7.1-RC1

Sorry for that buggy 1.7 release. Thanks to you, who helped me fixing them by giving good error descriptions. Also thanks you, who trolled and thus showed me how much you need this little widget. ;-)

To be sure, I really fixed everything, I’ve decided let you test the new release, before I make it final. Please download the curren tip from the repository at bitbucket.org. If you find anything, please create an issue or just write a comment here. Thanks!

PS: I’ve decided to leave the update message the way it is. Normally, you only have to see it once or twice a year and it takes just one click to get rid of it. :)

Tea Timer 1.7

I just released Tea Timer 1.7 which implements a few wishes from you:

  • There’s now a rewind button for resetting an ongoing countdown to its initial value.
  • The timer will be reset to the initial value, not the last pause value, after the alarm.
  • The current widget’s settings will also be saved as default settings for new widgets.

Unfortunately it was not possible (neither with Python nor with Apple Script) to implement a backlink from Growl to Tea Timer to stop the alarm when you click on the Growl notification.

Anyway, Download Tea Timer 1.7 and enjoy!

Collectors 1.0

It took me nearly three months to fix five small issues with the documentation. But now I finally released Collectors v1.0. :-)

You can read everything important in the RC1 posting.

Collectors 1.0-rc1

Collectors made a huge jump von v0.1 to v1.0 over the last weeks, since we added lots of changes and consider what we’ve done as stable. If we don’t find any bugs, we’ll release the final v1.0 at the end of next week. The changes are:

  • [NEW] Documentation!
  • [NEW] Tests!
  • [NEW] Collectors can use different storage backends now
  • [NEW] Storage backend for PyTables
  • [NEW] Storage backend for MS Excel
  • [NEW] Collector.collect() as alias to Collector.__call__()
  • [CHANGE] Monitor is now called Collector
  • [CHANGE] Shortcut functions moved to shortcuts package

You can download and install Collectors via PyPI. If you find any bugs or have ideas for further enhancement, please let us know.

The Documentation can be found here.

Updates for django-lastfm and django-sphinxdoc

After reading The Hitchhiker’s Guide to Packaging I update my packages for django-lastfm and django-sphinxdoc.

There are no functionional improvements, so you don’t need to update them.

Django: Highlighting with ReST using Pygments

In my last post I wrote about code highlighting in HTML formatted text, but since I’m now using reStructuredText for markup things, I want to share how I added synthax highlighting for this.

Within your project directory (the same that contains the settings.py) create a file called rst_directive.py and fill it with the following code:

# -*- coding: utf-8 -*-
"""
    The Pygments reStructuredText directive
    ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~

    This fragment is a Docutils_ 0.5 directive that renders source code
    (to HTML only, currently) via Pygments.

    To use it, adjust the options below and copy the code into a module
    that you import on initialization.  The code then automatically
    registers a ``sourcecode`` directive that you can use instead of
    normal code blocks like this::

        .. sourcecode:: python

            My code goes here.

    If you want to have different code styles, e.g. one with line numbers
    and one without, add formatters with their names in the VARIANTS dict
    below.  You can invoke them instead of the DEFAULT one by using a
    directive option::

        .. sourcecode:: python
            :linenos:

            My code goes here.

    Look at the `directive documentation`_ to get all the gory details.

    .. _Docutils: http://docutils.sf.net/
    .. _directive documentation:
       http://docutils.sourceforge.net/docs/howto/rst-directives.html

    :copyright: Copyright 2006-2009 by the Pygments team, see AUTHORS.
    :license: BSD, see LICENSE for details.
"""

# Options
# ~~~~~~~

# Set to True if you want inline CSS styles instead of classes
INLINESTYLES = False

from pygments.formatters import HtmlFormatter

# The default formatter
DEFAULT = HtmlFormatter(noclasses=INLINESTYLES)

# Add name -> formatter pairs for every variant you want to use
VARIANTS = {
    # 'linenos': HtmlFormatter(noclasses=INLINESTYLES, linenos=True),
}


from docutils import nodes
from docutils.parsers.rst import directives, Directive

from pygments import highlight
from pygments.lexers import get_lexer_by_name, TextLexer

class Pygments(Directive):
    """ Source code syntax hightlighting.
    """
    required_arguments = 1
    optional_arguments = 0
    final_argument_whitespace = True
    option_spec = dict([(key, directives.flag) for key in VARIANTS])
    has_content = True

    def run(self):
        self.assert_has_content()
        try:
            lexer = get_lexer_by_name(self.arguments[0])
        except ValueError:
            # no lexer found - use the text one instead of an exception
            lexer = TextLexer()
        # take an arbitrary option if more than one is given
        formatter = self.options and VARIANTS[self.options.keys()[0]] or DEFAULT
        parsed = highlight(u'\n'.join(self.content), lexer, formatter)
        return [nodes.raw('', parsed, format='html')]

directives.register_directive('sourcecode', Pygments)

Open the file __init__.py in the same directory and add the following line:

import rst_directive

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()

Now you can highlight code using the sourcecode directive:

*Hello World!* in Python is so easy:

.. sourcecode:: python

    print 'Hello World!'

That’s it! If you have any questions, leave a comment.

« newer posts older posts »