With template mappings, the one thing I've been struggling with is how to supply a context for the mappings. I've decided the smart thing to do is not to try and parse the Python expression used to create a template mapping, but instead to write mappings in an expression format that makes it possible to supply contexts manually.
Here's an example of what I mean. Let's say we want to do a simple year/month type of archive. For that we need two contexts: one that's based off the year component of the page's publication date, and the other its month. So we could create a mapping like this:
The first item in the expression, the tuple, is a list of contexts to be applied, from left to right. The second item is the string expression that's generated from the page in context.
$i is a macro that expands to the index file name for the blog.)
For tags, things get a little more complicated. Since it's possible for more than one tag to be assigned to a page, we need to have a mapping like this:
) for x in page.tags_public
The context is derived from each tag, not the page as a whole, since we have to evaluate it for multiple tags in a page.
This looks a little complex at first glance, but I think it can be smoothed over by providing plenty of common examples.
A major advantage of this approach is it frees me from having to write some kind of parsing logic like I have now to determine what the context is for each template mapping. The context can be derived directly from a Python expression, which in turn points unambiguously to objects that return contexts.
Another really nice advantage of this approach is that it gives us a built-in way to allow templates to specify their own context handlers, by way of the mechanism I'm working out to allow code blocks in templates to function like plugins.
[Edit: This is something I plan to do eventually, probably not before 1.0 is out. Right now, the tokenization system we have now does work; it's just not where I want to stay forever.]