(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 t "~va <~a" nesting-value "" (tag-name element)) (if (classes element) (format buffer " class=\"~{~a~^ ~}\"" (classes element))) (format t ">~%") (if (text element) (format t "~va ~a~%" (+ nesting-value 3) "" (text element))) (when (children element) (dolist (current (children element)) (incf nesting-value) (render current (+ nesting-value 1)))) (format t "~va ~%" nesting-value "" (tag-name element))) (format t "~%") (render root 1)