(setf *print-case* :downcase)
(defparameter *html* (make-array 0 :adjustable t :fill-pointer t :element-type 'character))
(defclass dom-element ()
((tag-name :initarg :tag-name :accessor tag-name :initform nil)
(text :initarg :text :accessor text :initform nil)
(classes :initarg :classes :accessor classes :initform nil)
(children :initarg :children :accessor children :initform nil)
(father :initarg :father :accessor father :initform nil)))
(defun father-child (father child)
(setf (father child) father)
(push child (children father)))
(defparameter root (make-instance 'dom-element :tag-name 'html))
(defparameter body (make-instance 'dom-element :tag-name 'body))
(father-child root body)
(defparameter head (make-instance 'dom-element :tag-name 'div))
(father-child body div)
(setf (classes body) `(red shit))
(setf (classes div) `(red button))
(setf (text div) "oh my cat is nice")
(defun render (element nesting-value &optional (buffer *html*))
(format buffer "~va <~a" nesting-value "" (tag-name element))
(if (classes element)
(format buffer " class=\"~{~a~^ ~}\"" (classes element)))
(format buffer ">~%")
(if (text element)
(format buffer "~va ~a~%" (+ nesting-value 3) "" (text element)))
(when (children element)
(dolist (current (children element))
(incf nesting-value)
(render current (+ nesting-value 1))))
(format buffer "~va ~a>~%" nesting-value "" (tag-name element)))
(format *html* "~%")
(render root 1)
(format t *html*)