;;;; 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~^
~}" 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))