Hi Jan!
On Fri, 09 Jul 2004 23:57:42 -0700, Jan Rychter <jan(a)rychter.com> wrote:
> First of all, I'd like to thank you for the excellent libraries that
> you make available. I particularly appreciate how carefully finished
> and documented they are.
Thanks, you're welcome.
> I would like to ask you a question regarding HTML-template --
> somehow I cannot get to work the way I would like to. I am puzzled
> as to what I'm doing wrong: I have read and reread the
> documentation, and tried a number of things.
>
> The problem I have is that my templates print on the standard output
> (in the REPL) instead of being captured into strings. The absolutely
> narrowed-down example is:
>
> (with-output-to-string (*standard-output*)
> (with-input-from-string (s "test <!-- TMPL_VAR a --> one")
> (html-template:fill-and-print-template s '(:a "1"))))
>
> This prints "test 1 one" in my REPL and returns an empty string.
This happens because FILL-AND-PRINT-TEMPLATE rebinds *STANDARD-OUTPUT*
to the value of *DEFAULT-TEMPLATE-OUTPUT* which is *STANDARD-OUTPUT*
(the original one!) by default.
I admit that this is an unfortunate design decision which happened
mainly because I was too lazy to type. I might chance this in a future
release.
In other words: All statements like
(write-string string)
in CREATE-SIMPLE-PRINTER in 'template.lisp' should rather be
(write-string string *default-template-output*)
instead. That way I wouldn't need the
(let ((*standard-output* stream))
rebinding in 'api.lisp'.
> Adding a :stream *standard-output* argument to
> fill-and-print-template helps in this case. However, it doesn't help
> at all if I call this code from TBNL. In that case, everything still
> ends up in the standard output of my REPL, instead of on the web
> page.
>
> I'm sorry for bothering you with such a trivial problem. Perhaps you
> could add a simple usage example together with TBNL to the
> documentation of one of the packages?
All of these should work:
(with-output-to-string (*default-template-output*)
(with-input-from-string (s "test <!-- TMPL_VAR a --> one")
(html-template:fill-and-print-template s '(:a "1"))))
(with-output-to-string (out)
(with-input-from-string (s "test <!-- TMPL_VAR a --> one")
(html-template:fill-and-print-template s '(:a "1") :stream out)))
(with-output-to-string (out)
(let ((*default-template-output* out))
(with-input-from-string (s "test <!-- TMPL_VAR a --> one")
(html-template:fill-and-print-template s '(:a "1")))))
This is also documented here:
<http://weitz.de/html-template/#default-template-output>
Let me know if this works for you or if you still have problems.
Cheers,
Edi.
PS: I'm sending a copy to the mailing list. Please use the list for
bug reports and questions. Thanks.