Jörg Höhle also liked the idea of a clear and complete separation between HTML (written by designers) and code. He came up with a variant of Edi's approach to HTML template. It uses Edi's parsing code (thanks!), no more, but the programmer view on it feels very different.
Consider Edi's 7x7 chess board example on his documentation page and how my code would look like:
Jörg Höhle's design goals:
- Separate HTML design from code as much as possible, the key
idea in the template approach.
- Verifiable specification of the interface between
both, never see "$foo" in a user's browser as an indication that
some variable was not substituted.
- Designer and programmer work concurrently early
on. The programmer may use a default template automatically derived
from the specification, the web-designer a random-content template
delivering web-server based on this specification.
- Efficiently deliver data, which should be no
slower than frameworks based on direct embedding of code in HTML or
vice-versa. That's why I rejected intermediate structures (Edi's template
structure) and produce compilable code. A parsed template
becomes Lisp code, which can be either compiled and loaded as such
from the file system, or compiled on the fly at load-time.
- Incrementally deliver results as produced (useful
for huge data or HTTP 1.1 chunked encoding) which is incompatible
with non-lazy intermediate structures.
- Provide for lexical scoping in templates,
unlike Perl's HTML::Template. That is, a TMPL_VAR occuring
inside TMPL_LOOP may refererence variables defined in an
outer (e.g. global) level. There's no need to repeat definitions at
- Deliver data in pieces as large as posible: i.e. no individual
calls to PRINC or FORMAT for each HTML tag, coalesce these
- Early HTML validation of the templates
- some more I forgot...
[This next section confuses me a bit. I think a list entry refers to Edi's version, but I can't really tell.[ Some differences between Edi and Jörg's work include:
TMPL_INCLUDEand is left to the application.
TMPL_VARmay have content, which is valuable for the web designer's GUI: s/he sees this content up to a closing
- The above specification is not all about the interface between programmer and designer. URL structure, form names etc. need also be agreed upon.
- The template approach is very useable for applications with small or medium demand for variable appearance. Or you'd need too many templates.
- I generated pages using templates featuring highly dynamic content (e.g. variable numbers of both rows and colums of a table, selectable and variable order) which some people initially thought not usable with a strict templates approach. It was, in fact, clean and easy.
- TMPL_LOOP and TMPL_VAR are really general and could even emulate TMPL_IF.
- I generated my templates from Lisp code via SXML, instead of having a designer. This aids consistency among templates. For a all-by-one-person job, the separation is clear overhead, even if there's potential for code reuse. You'd probably prefer a HTML-from-sexpr approach in such a case and bypass templates.
- HTML validation of the templates is hindered by
TMPL_IF with an ELSE part, substitutions
inside attributes and obviously only possible when the
substitutions done by TMPL_VAR affect the HTML
structure. The most dynamic template is TMPL_VAR
- As an enhancement, there could be a mechanism for global substitutions which would remain outside of the specification. E.g. some pages like to display calendars, the current date or use a mapping from month names to numbers etc. Such substitutions could always be present, across all pages of the application.