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
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))
|
|
|