Files
html-jen/html-jen.lisp
2025-03-16 19:26:03 +03:00

73 lines
2.4 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)
(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))