1 ;;; Macros for generating HTML from ParenScript code.
3 (in-package :parenscript
)
5 (defun optimize-string-list (list)
10 (setf node
(format nil
"~A" node
)))
11 (cond ((null cur
) (setf cur node
))
14 (setf cur
(concatenate 'string cur node
)))
20 (defun process-html-forms (forms)
22 (labels ((handle-form (form)
23 (cond ((keywordp form
)
24 (push (format nil
"<~A/>"
25 (string-downcase (symbol-name form
))) res
))
31 (keywordp (first form
)))
32 (let ((node-name (string-downcase (symbol-name (first form
)))))
33 (push (format nil
"<~A>" node-name
) res
)
34 (map nil
#'handle-form
(cdr form
))
35 (push (format nil
"</~A>" node-name
) res
)))
39 (keywordp (caar form
)))
40 (let ((node-name (string-downcase (symbol-name (caar form
)))))
41 (push (format nil
"<~A" node-name
) res
)
43 (loop with attrs
= (cdar form
)
45 for attr-name
= (pop attrs
)
46 for attr-test
= (when (not (keywordp attr-name
))
47 (let ((test attr-name
))
48 (setf attr-name
(pop attrs
))
50 for attr-val
= (pop attrs
)
54 (+ ,(format nil
" ~A=\"" (string-downcase (symbol-name attr-name
)))
60 (push (format nil
" ~A=\"" (string-downcase (symbol-name attr-name
)))
65 (map nil
#'handle-form
(cdr form
))
66 (push (format nil
"</~A>" node-name
) res
)))
70 (map nil
#'handle-form forms
))
71 (cons '+ (optimize-string-list (nreverse res
)))))
73 (define-ps-special-form ps-html
(expecting &rest forms
)
74 (compile-parenscript-form (process-html-forms forms
)))
76 (defun process-css-forms (proplist)
77 (optimize-string-list (butlast
78 (loop for propval on proplist by
#'cddr appending
79 (list (string-downcase (symbol-name (first propval
)))
85 (define-ps-special-form css-inline
(expecting &rest forms
)
86 (compile-parenscript-form (cons '+ (process-css-forms forms
))))