Files
html-jen/üretim.lisp

71 lines
2.3 KiB
Common Lisp
Raw Blame History

This file contains ambiguous Unicode characters
This file contains Unicode characters that might be confused with other characters. If you think that this is intentional, you can safely ignore this warning. Use the Escape button to reveal them.
(in-package :html-jen)
(defparameter *indent* 0)
(defparameter *indent-increment* 2)
(defparameter *yeni-satır* t)
(defgeneric node->html (node &optional stream)
(:method (node &optional (stream *standard-output*))
(write-string node stream))
(:documentation "NODE u STREAM e yazar"))
(defun tag-yeni-satır? (tag)
(case tag
((:html :head :body :div :ol :ul :link) t)
((:title :p :b :i :code :li) nil)))
(defun tag-inline? (tag)
(case tag
((:html :head :body :div :ol :ul :li :p :title) nil)
((:b :i :code) t)))
(defmethod node->html :before ((node node) &optional (stream *standard-output*))
(unless (not *yeni-satır*)
(loop :for i :from 0 :below *indent*
:do (write-char #\Space stream)))
(if (null (props node))
(format stream "<~a>" (tag node))
(loop :initially (format stream "<~a" (tag node))
:for (k v) :on (props node) :by #'cddr
:do (format stream " ~a=\"~a\"" k v)
:finally (write-char #\> stream)))
(setf *yeni-satır* nil)
(when (tag-yeni-satır? (tag node))
(write-char #\Newline stream)
(setf *yeni-satır* t)))
(defmethod node->html ((node node) &optional (stream *standard-output*))
(if (null (children node))
(format stream "~a" (value node))
(let ((*indent* (+ *indent* *indent-increment*)))
(loop :for child :in (children node)
:do (node->html child stream)))))
(defmethod node->html :after ((node node) &optional (stream *standard-output*))
(unless (not *yeni-satır*)
(loop :for i :from 0 :below *indent*
:do (write-char #\Space stream)))
(if (tag-inline? (tag node))
(format stream "</~a>" (tag node))
(progn (format stream "</~a>~%" (tag node))
(setf *yeni-satır* t))))
(defun node->cons (node)
"node u listeye çevirir."
(if (stringp node)
node
(if (null (children node))
(list (tag node) (props node) (value node))
(append (list (tag node) (props node))
(mapcar #'node->cons (children node))))))
(defparameter bir-node
(node! :html (list (node! :head
(list (node! :title nil nil "başlık"))
nil nil)
(node! :body
(list (node! :p nil '(:color "red") "içerik"))
nil nil))
nil nil))