;;;; -*- lisp -*- (in-package #:ucw-standard) (defmethod render-template ((context request-context) template-name environment) (let ((*print-pretty* nil)) (ucw-log:ucw.component.render.dribble "Rendering template ~S in environment ~S" template-name environment)) (if-bind generator (application.tal-generator (context.application context)) (if-bind truename (template-truename generator template-name) (%render-template context generator truename environment) (progn (cerror "Retry rendering the template." "Can't find a template named ~S." template-name) (render-template context template-name environment))) (error "No known generator for the current application."))) (defun %render-template (context generator truename environment) (let ((yaclml:*uri-to-package* (cons (cons "http://common-lisp.net/project/ucw/core" (find-package :ucw-tags)) yaclml:*uri-to-package*))) (restart-case (funcall (load-tal generator truename) environment generator) (retry () :report (lambda (stream) (format stream "Retry rendering ~A." truename)) (return-from %render-template (%render-template context generator truename environment))))) (ucw-log:ucw.component.render.dribble "Template rendered.")) (defmethod preprocess-template (template-name environment &optional (application *default-application*)) (aif (application.tal-generator application) (if-bind truename (template-truename it template-name) (let ((yaclml:*uri-to-package* (cons (cons "http://common-lisp.net/project/ucw/core" (find-package :it.bese.ucw.tags)) yaclml:*uri-to-package*))) (yaclml::preprocess-tal it truename)) (progn (cerror "Retry rendering the template." "Can't find a template named ~S." template-name) (render-template *context* template-name environment))) (error "No known generator for the current application."))) ;;;; ** UCW Extensions to tal (defmacro with-attribute-value ((var attribute-name tag &key implicit-progn-p) &body body) (rebinding (attribute-name tag) (with-unique-names (value-string) `(let ((,value-string (getf (cdar ,tag) ,attribute-name))) (unless ,value-string (error "~S not found in ~S." ,attribute-name ',tag)) (let ((,var (read-tal-expression-from-string ,value-string ,implicit-progn-p))) (remf (cdar ,tag) ,attribute-name) ,@body))))) (def-tag-handler