summaryrefslogtreecommitdiff
path: root/üretim.lisp
diff options
context:
space:
mode:
Diffstat (limited to 'üretim.lisp')
-rw-r--r--üretim.lisp70
1 files changed, 70 insertions, 0 deletions
diff --git a/üretim.lisp b/üretim.lisp
new file mode 100644
index 0000000..6074888
--- /dev/null
+++ b/üretim.lisp
@@ -0,0 +1,70 @@
+(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) t)
+ ((:title :p :b :i :code :li) nil)))
+
+(defun tag-inline? (tag)
+ (case tag
+ ((:html :head :body :div :ol :ul :li :p) nil)
+ ((:title :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))