Sample Plugins

Here are some sample plugins to get a taste for how the plugin architecture works:

Paragrapher. This simple plugin converts double-newlines into </p><p>.

def start(state):
    return Paragrapher()
class Paragrapher:
    def story(self, state):
        state['body'] = state['body'].replace('\n\n', '</p><p>')

Pyinterpolate. This plugin allows Python to be imbedded in templates via a special %|python code| syntax. The particular syntax could be changed simply by changing the regular expression.

import re
def start(state):
    return PyInterpolator()
pattern = re.compile(r'%\|(.*?)\|')
def better_interpolate(state, data):
    m = pattern.search(data)
    while m:
        data = data[:m.start()] + str(eval(data[m.start(1):m.end(1)])) + data[m.end():]
        m = pattern.search(data)
    return data % state
class PyInterpolator:
    def interpolate(self, state):
        return better_interpolate

Skipstatic. This plugin prevents the inclusion of particular subdirectories in index pages. This version only works for dynamic mode, but a more fleshed-out version I have works for static mode as well (but is a lot more hacky). It is similar to the hide plugin for Blosxom.

from os.path import join
# Configuration parameter for which directories to hide
static_dirs = ['static', 'constrictor']
def start(state):
    return StaticSkipper()
class StaticSkipper:
    def filter(self, state):
        if not state['static']:
            # If this is an index file, meaning it's the root or not a specific page
            if len(state['category']) == 0 or not state['category'][-1].endswith(state['file_extension']):
                for f in state['files']:
                    for static_dir in static_dirs:
                        # The final '' ensures a trailing slash, so we don't match a prefix
                        if f.startswith(join(state['datadir'], static_dir, '')):
                            del state['files'][f]