summaryrefslogtreecommitdiff
diff options
context:
space:
mode:
authorriton <riton@riton.home>2025-03-18 18:37:48 +0300
committerriton <riton@riton.home>2025-03-18 18:37:48 +0300
commit2b6760e54bf294275d652ab53b91ad90c2809d27 (patch)
tree38a8c228fff28d86b0d6e9a4fc760f519b555726
parent12100ce3e036cd0fdf701b5c56a0810dc4823e84 (diff)
h, ul, ol ve code için ayrıştırıcı eklendi
-rw-r--r--cheat.md1
-rw-r--r--okur.lisp103
2 files changed, 91 insertions, 13 deletions
diff --git a/cheat.md b/cheat.md
index 2da595e..c605b85 100644
--- a/cheat.md
+++ b/cheat.md
@@ -12,6 +12,7 @@ paragraph, **bold** _italic_ ya da *italic* ve `inline code`
2. list
footnote [^1]
+
```
code block
```
diff --git a/okur.lisp b/okur.lisp
index 6c865a4..db19f84 100644
--- a/okur.lisp
+++ b/okur.lisp
@@ -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))
+ )))