diff --git a/scopes-web.asd b/scopes-web.asd index e362b74..74b09ce 100644 --- a/scopes-web.asd +++ b/scopes-web.asd @@ -10,7 +10,8 @@ :lack :lack-component :lack-app-file :quri :scopes-core) :components ((:file "web/client") - (:file "web/response") + (:file "web/dom") + (:file "web/response" :depends-on ("web/dom")) (:file "web/server" :depends-on ("web/response"))) :long-description "scopes/web: Web server and web/API/REST client." :in-order-to ((test-op (test-op "scopes-web/test")))) diff --git a/web/dom.lisp b/web/dom.lisp new file mode 100644 index 0000000..fdc2158 --- /dev/null +++ b/web/dom.lisp @@ -0,0 +1,32 @@ +;;;; cl-scopes/web/dom - "Data Output Model" = simple and dedicated HTML generator + +(defpackage :scopes/web/dom + (:use :common-lisp) + (:local-nicknames (:alx :alexandria)) + (:export #:render #:dl)) + +(in-package :scopes/web/dom) + +(defvar *output* nil) + +(defmacro render (&body body) + `(let ((*output* (make-string-output-stream))) + ,@body + (get-output-stream-string *output*))) + +(defun dl (plist) + (write-string "
" *output*) + (loop for r on plist by #'cddr do + (write-string "
" *output*) + (write-string (string-downcase (car r)) *output*) + (write-string "
" *output*) + (dd (cadr r))) + (write-line "
" *output*)) + +(defun dd (v) + (if (atom v) + (setf v (list v))) + (dolist (el v) + (write-string "
" *output*) + (write-string (string el) *output*) + (write-string "
" *output*))) diff --git a/web/response.lisp b/web/response.lisp index afa643c..698879c 100644 --- a/web/response.lisp +++ b/web/response.lisp @@ -2,7 +2,8 @@ (defpackage :scopes/web/response (:use :common-lisp) - (:local-nicknames (:message :scopes/core/message)) + (:local-nicknames (:dom :scopes/web/dom) + (:message :scopes/core/message)) (:export #:setup #:render #:render-not-found)) @@ -27,7 +28,8 @@ ((ctype :initform "text/html"))) (defmethod render-content ((resp html-response) msg) - (getf (message:data msg) :info)) + (dom:render (dom:dl (message:data msg)))) + ;(getf (message:data msg) :info)) ;;;; common definitions