Index: trac/web/modpython_frontend.py
===================================================================
--- trac/web/modpython_frontend.py	(revision 1469)
+++ trac/web/modpython_frontend.py	(working copy)
@@ -33,7 +33,7 @@
 
 from trac.env import open_environment
 from trac.util import TracError, href_join, rstrip
-from trac.web.main import Request, dispatch_request, send_pretty_error
+from trac.web.main import Request, RequestDone, dispatch_request, send_pretty_error
 
 
 class ModPythonRequest(Request):
@@ -142,15 +142,42 @@
         return util.FieldStorage.get(self, key, default)
 
 
-def send_project_index(req, mpr, dir):
-    req.content_type = 'text/html'
-    req.write('<html><head><title>Available Projects</title></head>')
-    req.write('<body><h1>Available Projects</h1><ul>')
-    for project in os.listdir(dir):
-        req.write('<li><a href="%s">%s</a></li>'
-                  % (href_join(mpr.idx_location, project), project))
-    req.write('</ul></body><html>')
+def send_project_index(req, mpr, dir, options):
+    if options.has_key('TracEnvIndexTemplate'):
+        try:
+            tmpl_path,tmpl_idx = os.path.split(options['TracEnvIndexTemplate'])
+ 
+            from trac.web.clearsilver import HDFWrapper
+            mpr.hdf = HDFWrapper(loadpaths=[tmpl_path])
 
+            tmpl_vars = {}
+            if options.has_key('TracTemplateVars'):
+                pairs = options['TracTemplateVars'].split(',')
+                for pair in pairs:
+                    key,val = pair.split('=')
+                    tmpl_vars[key] = val
+            mpr.hdf['template'] = tmpl_vars
+
+            projs = []
+            for project in os.listdir(dir):
+                env = open_environment(os.path.join(dir, project))
+                descr = env.get_config('project', 'descr', '')
+                name = env.get_config('project', 'name', '')
+                uri = href_join(mpr.idx_location, project)
+                projs.append({'name': name, 'descr': descr, 'uri':uri})
+            mpr.hdf['projects'] = projs
+            mpr.display(tmpl_idx, response=200)
+        except RequestDone:
+            pass
+    else:
+        req.content_type = 'text/html'
+        req.write('<html><head><title>Available Projects</title></head>')
+        req.write('<body><h1>Available Projects</h1><ul>')
+        for project in os.listdir(dir):
+            req.write('<li><a href="%s">%s</a></li>'
+                      % (href_join(mpr.idx_location, project), project))
+        req.write('</ul></body><html>')
+
 env_cache = {}
 env_cache_lock = threading.Lock()
 
@@ -164,7 +191,7 @@
         env_name = mpr.cgi_location.split('/')[-1]
         env_path = os.path.join(env_parent_dir, env_name)
         if len(env_name) == 0 or not os.path.exists(env_path):
-            send_project_index(req, mpr, env_parent_dir)
+            send_project_index(req, mpr, env_parent_dir, options)
             return None
     else:
         raise TracError, \

