Shrubbery intends to be the world's easiest template language. It has two major advantages: 1. The user doesn't need to learn a new syntax. Templates are simply structural, and contain no code at all. Logic is dictated by the data following an implicit -- though intuitive! -- algorithm. 2. Templates don't have to be valid HTML/XHTML. Shrubbery uses the wonderful BeautifulSoup module for the heavy lifting, and can handle templates with broken HTML. So how does it work? Well, here's a simple template:: <html> <head><title>{title}</title></head> <body> <ul> <li>{todo.description} [{todo.category}]</li> </ul> </body> </html> Let's apply some trivial data to this template:: >>> data = {"title": "Things I have to do", ... "todo": {"category": "Work", ... "description": "Mow the lawn"}} >>> from shrubbery.template import Template >>> template = Template(THE_TEMPLATE_CODE_UP_THERE).process(data) Here, ``template`` is a typical BeautifulSoup tree. We can generate HTML from it:: >>> print template.prettify() And the result will be:: <html> <head> <title> Things I have to do </title> </head> <body> <ul> <li> Mow the lawn [Work] </li> </ul> </body> </html> Hmmm... that was not very interesting, was it? The flexibility of Shrubbery comes from the fact that we can pass values as lists anywhere we want. Suppose we have more tasks, of different categories:: >>> data['todo'] = [ ... {"category": "Work", "description": ["Mow the lawn", "Buy food"]}, ... {"category": "Fun", "description": ["Program in Python", "Scuba dive", "Watch Heroes"]}] The result now will be something like this (I formatted it for clarity):: <html> <head><title>Things I have to do</title></head> <body> <ul> <li>Mow the lawn [Work]</li> <li>Buy food [Work]</li> <li>Program in Python [Fun]</li> <li>Scuba dive [Fun]</li> <li>Watch Heroes [Fun]</li> </ul> </body> </html> There are a couple of examples on the ``examples/`` directory, you can see more applications there.