node sınıfı ve pretty print prototip
This commit is contained in:
72
html-jen.lisp
Normal file
72
html-jen.lisp
Normal file
@@ -0,0 +1,72 @@
|
||||
(in-package :html-jen)
|
||||
|
||||
(defun dosya-metni-oku (dosya)
|
||||
(let* ((uzunluk 0)
|
||||
(metin
|
||||
(with-output-to-string (out)
|
||||
(with-open-file (in dosya :external-format :utf-8)
|
||||
(loop :with arabellek := (make-array 8192 :element-type 'character)
|
||||
:for n := (read-sequence arabellek in)
|
||||
:while (< 0 n)
|
||||
:do (incf uzunluk n)
|
||||
(write-sequence arabellek out :start 0 :end n))))))
|
||||
(values metin uzunluk)))
|
||||
|
||||
(defclass node ()
|
||||
((tag :initarg :tag :accessor tag :initform nil)
|
||||
(children :initarg :children :accessor children :initform nil)
|
||||
(props :initarg :props :accessor props :initform nil)
|
||||
(value :initarg :value :accessor value :initform nil)))
|
||||
|
||||
(defun node! (tag children props value)
|
||||
(make-instance 'node :tag tag :children children :props props :value value))
|
||||
|
||||
(defparameter *indent* 0)
|
||||
(defparameter *indent-increment* 2)
|
||||
(defparameter *yeni-satır* t)
|
||||
|
||||
(defgeneric node->html (node stream)
|
||||
(:documentation "NODE u STREAM e yazar"))
|
||||
|
||||
(defun tag-yeni-satır? (tag)
|
||||
(case tag
|
||||
((:html :head :body) t)
|
||||
((:title :p) nil)))
|
||||
|
||||
(defmethod node->html :before (node stream)
|
||||
(loop :for i :from 0 :below *indent*
|
||||
:do (write-char #\Space stream))
|
||||
(setf *yeni-satır* nil)
|
||||
(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)))
|
||||
(when (tag-yeni-satır? (tag node))
|
||||
(write-char #\Newline stream)
|
||||
(setf *yeni-satır* t)))
|
||||
|
||||
(defmethod node->html (node stream)
|
||||
(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 stream)
|
||||
(unless (null *yeni-satır*)
|
||||
(loop :for i :from 0 :below *indent*
|
||||
:do (write-char #\Space stream)))
|
||||
(format stream "</~a>~%" (tag node))
|
||||
(setf *yeni-satır* t))
|
||||
|
||||
|
||||
(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))
|
||||
Reference in New Issue
Block a user