diff options
-rw-r--r-- | src/okur.lisp | 58 |
1 files changed, 50 insertions, 8 deletions
diff --git a/src/okur.lisp b/src/okur.lisp index 8b4b902..33ad8a8 100644 --- a/src/okur.lisp +++ b/src/okur.lisp @@ -189,9 +189,42 @@ (list :href (metin-parçası okur (- son i) i))) (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)) (with-slots (i blok-son metin) okur (let ((elementler (list)) + (dipnotlar (list)) (baş i)) (labels ((pushla-ve-ayrıştır (tag str) (push (metin-parçası okur (- i baş) baş) elementler) @@ -200,13 +233,20 @@ (setf baş i))) (loop :while (< i blok-son) :do (case (char metin i) - (#\[ (if (char= #\( (char metin (+ 1 (position #\] metin :start i)))) - (progn - (push (metin-parçası okur (- i baş) baş) elementler) - (incf i 1) - (push (link-ayrıştır okur) elementler) - (setf baş i)) - (incf i))) + (#\[ (cond ((char= #\^ (char metin (+ 1 i))) + (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) + (incf i 1) + (push (link-ayrıştır okur) elementler) + (setf baş i)) + (t (incf i)))) (#\` (pushla-ve-ayrıştır :code "`")) (#\_ (pushla-ve-ayrıştır :i "_")) (#\* (if (char= #\* (char metin (+ i 1))) @@ -228,7 +268,9 @@ :finally (loop :while (char= #\Newline (char metin (- i 1))) :do (decf 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)))))) (defmethod blok-ayrıştır ((okur okur)) |