Hello to all the members of this list.
Recently at Onshore Development, we have started using HTML-TEMPLATE to render web-pages in an application we call Woofie, which provides an alternative interface to Webcheckout.
While working on html templates for Woofie, I found myself wanting some extra abilities currently not available in HTML-TEMPLATE, mainly a foreach style loop with the variable which holds the current value of the list declared inside the tag, and the ability to use certain lisp expressions (format inside tmpl-var's and equality comparisons, boolean comparisons (or, and, etc.) inside of tmpl-if's).
I would like to see if other developers would find such features useful. I currently have implemented both features I described to some degree in the following fashion:
- the for-each style loop is represented in my templates as TMPL_LOOP_FOR and closed with a /TMPL_LOOP. The tag looks for two separate strings, one being the variable and the other being the list (eg. <!-- TMPL_LOOP_FOR author authors -->). In the code, in each iteration of the loop over authors, a (setf (getf values :author) author) is performed (this should probably be changed into something similar to the *value-access-function*, or the perhaps *value-access-function* could be made setf'able?).
- TMPL_IF and TMPL_VAR can take a symbol or a list. The list is deserialized from a string into a list of symbols or string literals delimited by double quotes. A larger expression is built by making a let, then evaluating the list. For example, the format expression in <!-- TMPL_VAR (format nil "Displaying ~d results, displaying ~d through ~d." result-count first-result last-result) --> would get expanded to:
(let ((result-count (funcall *value-access-function* :result-count values)) (first-result (funcall *value-access-function* :first-result values)) (last-result (funcall *value-access-function* :last-result values))) (format nil "Displaying ~d results, displaying ~d through ~d." result-count first-result last-result)), which passed to (eval) and currently evaluated in the common lisp package (though evaluation should probably get done in some user-specified package that can be made to contain helper-functions for displaying data).
I would appreciate any comments, and I will try to answer any questions should there be any (I'm guessing there will). The code can be found at http://kfreedom.onshored.com/html-template-additions.lisp , and should work with the standard html-template 0.7.0 package.
Regards, Andrew Golding andy@onshored.com