You can not select more than 25 topics Topics must start with a letter or number, can include dashes ('-') and can be up to 35 characters long.
 

130 lines
4.3 KiB

;;;; search.lisp
(in-package #:cl-bible.verse)
(defclass verse ()
((%bname :initarg :bname
:reader bname)
(%bsname :initarg :bsname
:reader bsname)
(%chapter :initarg :chapter
:reader chapter)
(%number :initarg :number
:reader vnumber)
(%text :initarg :text
:reader text)
(%translations :initarg :translations
:initform '()
:accessor translations)
(%notes :initarg :notes
:initform '()
:accessor notes)))
(defgeneric string-to-verse (string))
(defgeneric verse-to-string (verse))
(defgeneric verse-to-latex (verse &key translation port))
(defgeneric get-text (verse))
(defgeneric %format-notes (notes))
(defgeneric %create-notes-window (verse parent))
(defgeneric show-notes (verse parent))
(defgeneric add-notes (verse parent))
(defgeneric to-sexp (verse))
(defgeneric verse-from-sexp (sexp))
(defgeneric from-sexp (bible))
(defmethod print-object ((verse verse) stream)
(format stream (verse-to-string verse)))
(defmethod string-to-verse ((string string))
(let ((verse (uiop:split-string string :separator '(#\Tab))))
(make-instance 'verse :bname (first verse)
:bsname (second verse)
:chapter (fourth verse)
:number (fifth verse)
:text (sixth verse))))
(defmethod verse-to-string ((verse cons))
(format nil "~A ~A:~A~A~A" (cadr verse)
(nth 3 verse)
(nth 4 verse)
(nth 5 verse)))
(defmethod verse-to-string ((verse verse))
(format nil "~A ~A"
(vnumber verse)
(text verse)))
(defmethod verse-to-latex ((verse verse) &key translation (port t))
(declare (ignore translation))
(format port "~A ~A ^{~A} ~%~{~A~%~} \\\\~%"
(bname verse)
(chapter verse)
(vnumber verse)
(mapcar (lambda (trans) (assoc trans
(translations verse)))
'(:mng :luth1545 :luth1912 :sch1951 :elb1871 :neue))))
(defmethod %format-notes ((notes cons))
(format nil "~{~A~^<br/>~}" notes))
(defmethod %format-notes ((notes (eql nil)))
"No notes found")
(defmethod %create-notes-window ((verse verse) (parent clog:clog-obj))
(let ((win (clog-gui:window-content
(clog-gui:create-gui-window parent
:title "Notes"
:content (%format-notes
(notes verse))))))
(clog:create-br win)
(clog:create-button win
:content "Add notes")))
(defmethod show-notes ((verse verse) (parent clog:clog-obj))
(let ((button (%create-notes-window verse parent)))
(clog:set-on-click button
(lambda (obj)
(declare (ignore obj))
(add-notes verse parent)))))
(defmethod %create-add-notes-window ((parent clog:clog-obj))
(let* ((form (clog:create-form
(clog-gui:window-content
(clog-gui:create-gui-window parent
:title "Add note"))))
(text (clog:create-text-area form :rows 4
:columns 40)))
(clog:create-br form)
(values text
(clog:create-button form :content "submit"))))
(defmethod add-notes ((verse verse) (parent clog:clog-obj))
(multiple-value-bind (text button)
(%create-add-notes-window parent)
(clog:set-on-click button
(lambda (obj)
(declare (ignore obj))
(push (clog:value text) (notes verse))))))
(defmethod to-sexp ((verse verse))
(list (bname verse)
(bsname verse)
(chapter verse)
(vnumber verse)
(translations verse)
(notes verse)))
(defmethod to-sexp ((bible cons))
(mapcar #'to-sexp bible))
(defmethod verse-from-sexp ((sexp cons))
(make-instance 'verse
:bname (first sexp)
:bsname (second sexp)
:chapter (fourth sexp)
:number (fifth sexp)
:text (sixth sexp)
:notes (seventh sexp)))
(defmethod from-sexp ((bible cons))
(mapcar #'verse-from-sexp bible))