+ (loop with attrs = (cdar form)
+ while attrs
+ for attr-name = (pop attrs)
+ for attr-test = (when (not (keywordp attr-name))
+ (let ((test attr-name))
+ (setf attr-name (pop attrs))
+ test))
+ for attr-val = (pop attrs)
+ do
+ (if attr-test
+ (push `(if ,attr-test
+ (+ ,(format nil " ~A=\"" (string-downcase (symbol-name attr-name)))
+ ,attr-val
+ "\"")
+ "")
+ res)
+ (progn
+ (push (format nil " ~A=\"" (string-downcase (symbol-name attr-name)))
+ res)
+ (push attr-val res)
+ (push "\"" res))))
+ (push ">" res)
+ (map nil #'handle-form (cdr form))
+ (push (format nil "</~A>" node-name) res)))
+
+ ((consp form)
+ (push form res)))))