2 ;; Javascript html generator
6 (defun optimize-string-list (list)
11 (setf node
(format nil
"~A" node
)))
12 (cond ((null cur
) (setf cur node
))
15 (setf cur
(concatenate 'string cur node
)))
21 (defun process-html-forms (forms)
23 (labels ((handle-form (form)
24 (cond ((keywordp form
)
25 (push (format nil
"<~A/>"
26 (string-downcase (symbol-name form
))) res
))
32 (keywordp (first form
)))
33 (let ((node-name (string-downcase (symbol-name (first form
)))))
34 (push (format nil
"<~A>" node-name
) res
)
35 (map nil
#'handle-form
(cdr form
))
36 (push (format nil
"</~A>" node-name
) res
)))
40 (keywordp (caar form
)))
41 (let ((node-name (string-downcase (symbol-name (caar form
)))))
42 (push (format nil
"<~A" node-name
) res
)
43 (loop for
(attr-name attr-val
) on
(cdar form
) by
#'cddr
44 do
(unless (keywordp attr-name
)
45 (error "~A is not a node attribute" attr-name
))
46 (push (format nil
" ~A=\"" (string-downcase (symbol-name attr-name
)))
51 (map nil
#'handle-form
(cdr form
))
52 (push (format nil
"</~A>" node-name
) res
)))
56 (map nil
#'handle-form forms
))
57 (cons '+ (optimize-string-list (nreverse res
)))))
59 (define-js-compiler-macro html
(&rest forms
)
60 (js-compile (process-html-forms forms
)))
62 (defun process-css-forms(proplist)
63 (optimize-string-list (butlast
64 (loop for propval on proplist by
#'cddr appending
65 (list (string-downcase ( symbol-name
(first propval
)))
71 (define-js-compiler-macro css-inline
(&rest forms
)
72 (js-compile (cons '+ (process-css-forms forms
))))