dipnot referansları eklendi

This commit is contained in:
riton
2025-04-01 03:10:59 +03:00
parent 369f0d6718
commit e9c7be84dc

View File

@@ -189,9 +189,42 @@
(list :href (metin-parçası okur (- son i) i))) (list :href (metin-parçası okur (- son i) i)))
(setf i (+ 1 son))))))) (setf i (+ 1 son)))))))
(defparameter *dipnot-limit* 36)
(defparameter *dipnotlar*
(make-array *dipnot-limit* :element-type 'bit :initial-element 0))
(defun dipnot-var? (n)
(= 1 (aref *dipnotlar* n)))
(defun dipnot-ata (n)
(setf (aref *dipnotlar* n) #b1))
(defmethod dipnot-ayrıştır ((okur okur))
(declare (optimize (debug 3) (safety 3)))
(with-slots (i metin blok-son) okur
(let* ((son (position #\] metin
:start i
:end blok-son))
(n (parse-integer metin :start i :end son)))
(prog1 (if (dipnot-var? n)
(ebeveyn-node! :li
(list (let ((baş (+ 1 son)))
(assert (char= (char metin baş) #\:))
(setf son (or (position #\Newline metin :start baş :end blok-son) blok-son))
(metin-parçası okur (- son baş 1) (+ baş 1)))
(çocuk-node! :a " ↩" (list :href (format nil "#dipnot-ref-~d" n))))
(list :id (format nil "dipnot-~d" n)))
(progn (dipnot-ata n)
(ebeveyn-node! :sup
(list (çocuk-node! :a (metin-parçası okur (- son i) i)
(list :href (format nil "#dipnot-~d" n)
:id (format nil "dipnot-ref-~d" n)))))))
(setf i (min blok-son (+ son 1)))))))
(defmethod paragraf-ayrıştır ((okur okur)) (defmethod paragraf-ayrıştır ((okur okur))
(with-slots (i blok-son metin) okur (with-slots (i blok-son metin) okur
(let ((elementler (list)) (let ((elementler (list))
(dipnotlar (list))
(baş i)) (baş i))
(labels ((pushla-ve-ayrıştır (tag str) (labels ((pushla-ve-ayrıştır (tag str)
(push (metin-parçası okur (- i baş) baş) elementler) (push (metin-parçası okur (- i baş) baş) elementler)
@@ -200,13 +233,20 @@
(setf baş i))) (setf baş i)))
(loop :while (< i blok-son) (loop :while (< i blok-son)
:do (case (char metin i) :do (case (char metin i)
(#\[ (if (char= #\( (char metin (+ 1 (position #\] metin :start i)))) (#\[ (cond ((char= #\^ (char metin (+ 1 i)))
(progn (push (metin-parçası okur (- i baş) baş) elementler)
(incf i 2)
(let ((dipnot (dipnot-ayrıştır okur)))
(case (tag dipnot)
(:sup (push dipnot elementler))
(:li (push dipnot dipnotlar))))
(setf baş i))
((char= #\( (char metin (+ 1 (position #\] metin :start i))))
(push (metin-parçası okur (- i baş) baş) elementler) (push (metin-parçası okur (- i baş) baş) elementler)
(incf i 1) (incf i 1)
(push (link-ayrıştır okur) elementler) (push (link-ayrıştır okur) elementler)
(setf baş i)) (setf baş i))
(incf i))) (t (incf i))))
(#\` (pushla-ve-ayrıştır :code "`")) (#\` (pushla-ve-ayrıştır :code "`"))
(#\_ (pushla-ve-ayrıştır :i "_")) (#\_ (pushla-ve-ayrıştır :i "_"))
(#\* (if (char= #\* (char metin (+ i 1))) (#\* (if (char= #\* (char metin (+ i 1)))
@@ -228,7 +268,9 @@
:finally (loop :while (char= #\Newline (char metin (- i 1))) :finally (loop :while (char= #\Newline (char metin (- i 1)))
:do (decf i)) :do (decf i))
(when (/= baş i) (when (/= baş i)
(push (metin-parçası okur (- i baş) baş) elementler))) (push (metin-parçası okur (- i baş) baş) elementler))
(when (not (null dipnotlar))
(push (ebeveyn-node! :ol (reverse dipnotlar)) elementler)))
(ebeveyn-node! :p (reverse elementler)))))) (ebeveyn-node! :p (reverse elementler))))))
(defmethod blok-ayrıştır ((okur okur)) (defmethod blok-ayrıştır ((okur okur))