summaryrefslogtreecommitdiff
diff options
context:
space:
mode:
-rw-r--r--src/okur.lisp58
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))