Monkeylib HTML
https://github.com/gigamonkey/monkeylib-html
monleylib-html is a library from Peter Seibel of Practical Common Lisp fame. It seems to be an implementation of HTML generation library described in the last two chapters of "Practical Common Lisp".
(ql:quickload '(:monkeylib-html :parenscript)) (defpackage monkeylib-examples (:use :cl :monkeylib-html))
Emit HTML to standard output:
(with-html-output (*standard-output*) (html ((:body :id "a" :onclick "javascript: alert(1)") (:h1 "Hello"))))
<body id='a' onclick='javascript: alert(1)'> <h1>Hello</h1> </body>
Helpers for standard output and string:
(defmacro htmlout (&body body) `(with-html-output (*standard-output* :pretty t) (html ,@body))) (defmacro htmlstr (&body body) `(with-output-to-string (out) (with-html-output (out :pretty t) (html ,@body))))
HTML5 preamble
(define-html-macro :html5 (&attributes attrs &body body) `(:progn (:noescape (:format "<!DOCTYPE html>")) (:newline) ((:html ,@attrs) ,@body))) (htmlout ((:html5 :lang "en") (:h1 "Yay! HTML5")))
<!DOCTYPE html> <html lang='en'> <h1>Yay! HTML5</h1> </html>
Parenscript
(define-html-macro :ps (&body body) `(:noescape (:print (ps:ps ,@body)))) (htmlout (:html5 (:head (:script (:ps (defun greet () (alert "Hello, world!"))))) (:body ((:button :onclick (:ps (greet))) "Click me!"))))
<!DOCTYPE html> <html> <head> <script>function greet() { __PS_MV_REG = []; return alert('Hello, world!'); };</script> </head> <body> <button onclick='greet();'>Click me!</button> </body> </html>
Components
TODO.