catch KeyError and use Acrylamid's logging
fix issues with empty/None content
env. in front of protocol to make Disqus work again
add Tagcloud helper

currenlty not directly available, but it's a working prototype.
new cache.memoize method to persist some infos

it's simply a pickle defaulting to cache_dir/info and can
store any abitary python object. To retrieve a value do
memoize(mykey), to set a value do memoize(mykey, myvalue).

It raises a KeyError if this particular key does not exist.
view index can now continue as earlier using memoize
add md5 property to FileEntry and removed hash property

Reworked hash function so that actually it returns a fixed-length
hash (MD5 of filename + iter(filter stuff)) and also adapted cache
method and calls.
MD5-sum helper and easier pagination

utils.md5 is a  function that lets you create an MD5-hash with every
object which has the __str__ property or another property you can
use with attr=lambda o: o.property.

utils.paginate is a major refactoring of the original function and now
replaces enumerate(pages) stuff in index.py and tag.py. It also yields
a third value `has_changed` and stores a hash internally to check wether
paginated entries have changed.

>>> for i, entries, has_changed in paginate(entrylist):
    ... pass
rework view API

This required a lot of changes including change to the core compiler
routine and many little bugfixes:

- using utils.paginate and has_changed property which fixes some issues when
  a view should re-render pages

- should improve performance since it must no longer evaluate the whole page
  but can just pass this page if neither the template, nor the file entry or
  entry list has changed.

- include Tagcloud into global environment object and update default settings.

New API is defined as followed:

- `def init(self, foo=bar): pass` is the same as pelican's context and can be
  used to initialize some config variables and so on. This is evaluated even
  if no entry gets actually rendered.

- `def context(self, env, request): return env` is a new callback that lets you
  modify the context before any view gets rendered. This should be used to include
  helper objects usable in every view.

- `def generate(self, request): yield html, path (, optional message)` is completely
  reworked so you don't repeat yourself every time. Just return the HTML and a path
  and acrylamid will create a file if necessary and also does time measurements.
pyflakes unused variables
more tests
remove core.py and move it's function to utils

core.py is the last file that remained from the PyBlosxom project,
now it's also gone. This commit breaks everything, currently.
close #8 using a tree views -> filters

With this optimization re-generation of the whole blog without
cache is 4-5 times faster (3.66 secs vs. 15.21 secs on my machine).

It results in a few more files in .cache/ and should change in some
way, later. Previously there have been around 2.7 cache files per
entry, now it slighty grows to around 2.9/3.0 (tested with 147
and five different views).

This commit also introduces a new API for custom filters and is not
finished yet. First, `__init__` and `__call__` moved to `init` and
`transform`, which should reflect their purpose. Furthermore, `init`
is now invoked before the actual Filter object is created. When the
filter is actually created it receives the function name and arguments
hence, init should be used to initialize only acrylamid independend
things.
refactor of feed view

It now uses the API like all other views. The template of RSS and Atom
feeds are now written into layouts/ to be transparent to the user.

Other minor changes

- VERSION is now __version, VERSION_SPLIT is gone
- add __author__ and __url__ in acrylamid.__init__
- env now contains version, author and env (used in feed view)
- add email-property to FileEntry (also used in feed view)

To add RSS/Atom feeds, just invoke `acrylamid init -f layouts/atom.xml`
and `rss.xml` respectively.
fix Tagcloud when there are no tags