diff options
author | riton <riton@riton.home> | 2025-03-18 18:37:48 +0300 |
---|---|---|
committer | riton <riton@riton.home> | 2025-03-18 18:37:48 +0300 |
commit | 2b6760e54bf294275d652ab53b91ad90c2809d27 (patch) | |
tree | 38a8c228fff28d86b0d6e9a4fc760f519b555726 | |
parent | 12100ce3e036cd0fdf701b5c56a0810dc4823e84 (diff) |
h, ul, ol ve code için ayrıştırıcı eklendi
-rw-r--r-- | cheat.md | 1 | ||||
-rw-r--r-- | okur.lisp | 103 |
2 files changed, 91 insertions, 13 deletions
@@ -12,6 +12,7 @@ paragraph, **bold** _italic_ ya da *italic* ve `inline code` 2. list footnote [^1] + ``` code block ``` @@ -34,21 +34,98 @@ (defmethod index-reset ((okur okur)) (setf (i oo) 0)) -(defparameter *blok-sonu* (format nil "~%~%")) - -(defmethod blok-oku ((okur okur)) - (unless (son? okur) - (with-slots (i uzunluk metin) okur - (let ((son (or (search *blok-sonu* metin :start2 i) - uzunluk))) - (prog1 (make-array (- son i) - :element-type 'character - :displaced-to metin - :displaced-index-offset i) - (setf i (+ son 2))))))) +(let ((blok-sonu (format nil "~%~%"))) + (defmethod sonraki-blok ((okur okur)) + (unless (son? okur) + (with-slots (i uzunluk metin) okur + (let ((son (or (search blok-sonu metin :start2 i) + uzunluk))) + (prog1 (make-array (- son i) + :element-type 'character + :displaced-to metin + :displaced-index-offset i) + (setf i (+ son 2)))))))) (defmethod okur-blok-listesi ((okur okur)) - (let ((blok (blok-oku okur))) + (let ((blok (sonraki-blok okur))) (if (null blok) nil (cons blok (okur-blok-listesi okur))))) + +(defgeneric ayrıştır (tag blok baş) + (:documentation "Tag'a göre bloktaki elementleri belirler.")) + +(defmethod ayrıştır ((tag (eql :h)) blok baş) + (let ((i baş) + (son (length blok)) + (h-sayı 0)) + (loop :while (char= #\# (char blok i)) + :do (incf i) + (incf h-sayı)) + (assert (char= #\Space (char blok i))) + (assert (< h-sayı 7)) + (incf i) + (values (make-array (- son i) + :element-type 'character + :displaced-to blok + :displaced-index-offset i) + h-sayı))) + +(defmethod ayrıştır ((tag (eql :ul)) blok baş) + (let ((i baş) + (son (length blok))) + (loop :while (< i son) + :do (assert (string= "- " blok :start2 i :end2 (+ i 2))) + (incf i 2) + :collect (let ((yeni (or (position #\Newline blok :start i) + son))) + (prog1 (make-array (- yeni i) + :element-type 'character + :displaced-to blok + :displaced-index-offset i) + (setf i (+ yeni 1))))))) + +(defmethod ayrıştır ((tag (eql :ol)) blok baş) + (let ((i baş) + (son (length blok)) + (item-sayısı 1)) + (loop :while (< i son) + :do (let ((i2 i)) + (loop :while (char<= #\0 (char blok i2) #\9) + :do (incf i2)) + (assert (string= ". " blok :start2 i2 :end2 (+ i2 2))) + (assert (= item-sayısı (parse-integer blok :start i :end i2))) + (incf item-sayısı) + (setf i (+ i2 2))) + :collect (let ((yeni (or (position #\Newline blok :start i) + son))) + (prog1 (make-array (- yeni i) + :element-type 'character + :displaced-to blok + :displaced-index-offset i) + (setf i (+ yeni 1))))))) + +(defmethod ayrıştır ((tag (eql :code)) blok baş) + (let ((son (length blok)) + (kod-baş (+ baş 3)) + (kod-son (- (length blok) 3))) + (assert (string= "```" blok :start2 baş :end2 kod-baş)) + (assert (string= "```" blok :start2 kod-son :end2 son)) + (make-array (- kod-son kod-baş) + :element-type 'character + :displaced-to blok + :displaced-index-offset kod-baş))) + +(defun blok-ayrıştır (blok) + (let ((i 0)) + (loop :while (char= #\Space (char blok i)) + :do (incf i)) + (case (char blok i) + (#\# (ayrıştır :h blok i)) + (#\- (ayrıştır :ul blok i)) + (#\` (ayrıştır :code blok i)) + ;; (#\> :blockquote) + (t (if (char<= #\0 (char blok i) #\9) + (ayrıştır :ol blok i) + :p)) + ))) |