Skip to content

Commit a1cd7eb

Browse files
committed
else in ifchanged
See: #98
1 parent 646ae90 commit a1cd7eb

File tree

1 file changed

+20
-9
lines changed

1 file changed

+20
-9
lines changed

src/tags.lisp

+20-9
Original file line numberDiff line numberDiff line change
@@ -322,7 +322,7 @@ Library user can extend this generic function, add methods for types to iterate
322322
(let ((fs (mapcar #'compile-token clause))
323323
(phrase (parse-variable-phrase (string %listvar%))))
324324
(lambda (stream)
325-
(check-template-variable-boundp (first phrase))
325+
(check-template-variable-boundp (first phrase))
326326
(multiple-value-bind (iterable error-string)
327327
(resolve-variable-phrase phrase)
328328
(if error-string
@@ -461,10 +461,16 @@ The {% if %} tag evaluates a variable, and if that variable is “true” (i.e.
461461
else))
462462
(funcall f stream)))))))))
463463

464-
(def-delimited-tag :ifchanged :endifchanged :parsed-ifchanged)
464+
(def-delimited-tag :ifchanged :endifchanged :semi-parsed-ifchanged)
465465

466-
(def-token-compiler :parsed-ifchanged (%keywords% . clause)
467-
(let ((fs (mapcar #'compile-token clause))
466+
(def-token-processor :semi-parsed-ifchanged (%keywords% . clauses) unprocessed
467+
(multiple-value-bind (before-else after-else)
468+
(split-if-clause clauses)
469+
(process-tokens `((:parsed-ifchanged ,%keywords% ,before-else ,after-else) ,@unprocessed))))
470+
471+
(def-token-compiler :parsed-ifchanged (%keywords% then else)
472+
(let ((fs-then (mapcar #'compile-token then))
473+
(fs-else (mapcar #'compile-token else))
468474
(phrases (mapcar #'parse-variable-phrase (mapcar 'string %keywords%))))
469475
(lambda (stream)
470476
(block <f0>
@@ -483,11 +489,16 @@ The {% if %} tag evaluates a variable, and if that variable is “true” (i.e.
483489
(error error-string))
484490
ret)))
485491
phrases)))
486-
(unless (every #'equalp memory new)
487-
(dolist (f fs)
488-
(funcall f stream))
489-
(setf (cdr (assoc :if-changed (getf *template-arguments* :forloop)))
490-
new)))))))
492+
(if (not (every #'equalp memory new))
493+
(progn
494+
(dolist (f fs-then)
495+
(funcall f stream))
496+
(setf (cdr (assoc :if-changed (getf *template-arguments* :forloop)))
497+
new))
498+
;; else
499+
(dolist (f fs-else)
500+
(funcall f stream))
501+
))))))
491502

492503
(defun process-ifequal-args (unparsed-string)
493504
(flet ((% (start)

0 commit comments

Comments
 (0)