Last week I needed to add looping to the template system, so I patched it to sort of understand arrays of data, which aren't quite loops but it worked for the moment. I can foresee needing to add conditionals which would make the code (not to mention the template language) even more crufty.
I decided that if I'm going to solve this problem, I should solve it the right way. I remembered reading somewhere that "S-expressions make better XML than XML", so I thought I'd see whether I can apply that in practice. S-expressions were introduced about 50 years ago for the Lisp programming language and haven't changed since. If I'm going to use S-expressions to represent HTML, then I might as well implement the Lisp (or a Lisp-like) programming language to work with them.
To make what could be a long story shorter, I've now got an implementation of a subset of Lisp written in Python. Somehow, I managed to get this implemented before I found PyScheme, pylisp, Psyche, lython, and A simple scheme interpreter. Clearly I wasn't the first to think of this.
My plan is to integrate this Lisp-ish subset closely with Python so I can call back and forth between them. I've taken some liberties, for example I haven't implemented Lisp lists as linked lists, but instead as Python lists. I might regret this choice but I think it will make common things easier. Fortunately, I've been using the excellent doctest module to build unit tests which will make it a whole lot easier to change things when I need to.
Oh yeah, I called this project "Psil", which might stand for Python S-expression Intermediate Language, or it might be Lisp spelled backwards.
I'm currently reading up on Scheme because it's a much smaller language than the full Common Lisp and is better suited for embedding into other systems. I think I'll probably switch to a Scheme-based dialect.