h, ul, ol ve code için ayrıştırıcı eklendi
This commit is contained in:
1
cheat.md
1
cheat.md
@@ -12,6 +12,7 @@ paragraph, **bold** _italic_ ya da *italic* ve `inline code`
|
||||
2. list
|
||||
|
||||
footnote [^1]
|
||||
|
||||
```
|
||||
code block
|
||||
```
|
||||
|
||||
103
okur.lisp
103
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))
|
||||
)))
|
||||
|
||||
Reference in New Issue
Block a user