|
@@ -1,7 +1,7 @@
|
|
|
;;;; -*- mode: EMACS-LISP; lexical-binding: t -*-
|
|
|
;;
|
|
|
;; bible-mode.el --- A browsing interface for the SWORD Project's Diatheke CLI
|
|
|
-;; Time-stamp: <2024-06-14 10:04:32 fred>
|
|
|
+;; Time-stamp: <2024-06-19 16:02:32 fred>
|
|
|
|
|
|
;; Author: Zacalot
|
|
|
;; Fixes and modifications by Fred Gilham
|
|
@@ -110,7 +110,7 @@
|
|
|
"Some lexicons are accessed by lemmas rather than Strong's numbers. Use
|
|
|
an index to look up lemmas from Strong's numbers so these lexicons can
|
|
|
be used. Examples of this type of lexicon are AbbottSmith and
|
|
|
-LiddellScott."
|
|
|
+LiddellScott. XXX LiddellScott currently doesn't work."
|
|
|
:type 'boolean
|
|
|
:local nil
|
|
|
:group 'bible-mode)
|
|
@@ -166,7 +166,7 @@ which are of the form
|
|
|
|
|
|
;;(defvar bm-verse-regexp "([\d ]*[a-zA-Z]+( \d*:\d*)?)(( - )| )?(((\d* )?[a-zA-Z]+ )?\d*([:-]+\d*)?)")
|
|
|
;; (defvar bm-verse-regexp "/(\d*)\s*([a-z]+)\s*(\d+)(?::(\d+))?(\s*-\s*(\d+)(?:\s*([a-z]+)\s*(\d+))?(?::(\d+))?)?/i")
|
|
|
-(defvar bm-verse-regexp "\\(I?I \\)*[a-zA-Z]* [0-9]*:[0-9]*")
|
|
|
+(defvar bm-verse-regexp "\\(I?I \\)*[a-zA-Z]* [0-9]*[:.][0-9]*")
|
|
|
|
|
|
(defvar bm-modules (lazy-completion-table bm-modules bm--list-biblical-modules))
|
|
|
|
|
@@ -325,10 +325,19 @@ which are of the form
|
|
|
(define-key bible-search-mode-map (kbd "RET") 'bible-search-mode-follow-verse)
|
|
|
(define-key bible-search-mode-map [mouse-1] 'bible-search-mode-follow-xref)
|
|
|
|
|
|
-(defconst bible-term-hebrew-mode-map (make-keymap))
|
|
|
-(defconst bible-term-greek-mode-map (make-keymap))
|
|
|
+(defconst bible-term-hebrew-mode-map (make-sparse-keymap))
|
|
|
+(defconst bible-term-greek-mode-map (make-sparse-keymap))
|
|
|
;; (defconst bible-term-morph-mode-map (make-keymap))
|
|
|
|
|
|
+
|
|
|
+(defun bible-term-mode-follow-xref ()
|
|
|
+ (message "Bible term mode follow xref"))
|
|
|
+
|
|
|
+
|
|
|
+
|
|
|
+(define-key bible-term-greek-mode-map [mouse-1] 'bible-search-mode-follow-xref)
|
|
|
+
|
|
|
+
|
|
|
;;;
|
|
|
;;; Menu bar items
|
|
|
;;;
|
|
@@ -452,7 +461,7 @@ which are of the form
|
|
|
\\{bible-term-greek-mode-map}"
|
|
|
(buffer-disable-undo)
|
|
|
(font-lock-mode t)
|
|
|
-;; (use-local-map bible-term-greek-mode-map)
|
|
|
+ (use-local-map bible-term-greek-mode-map)
|
|
|
(setq buffer-read-only t)
|
|
|
(visual-line-mode t))
|
|
|
|
|
@@ -473,7 +482,7 @@ which are of the form
|
|
|
(let ((buf (get-buffer-create (generate-new-buffer-name (concat "*bible*")))))
|
|
|
(set-buffer buf)
|
|
|
(bible-mode)
|
|
|
- (bm--set-location (assoc (or book-name "Genesis") bm-books) (or chapter 1) verse)
|
|
|
+ (bm--set-location (or (assoc (or book-name "Genesis") bm-books) (list book-name)) (or chapter 1) verse)
|
|
|
(set-window-buffer (get-buffer-window (current-buffer)) buf)))
|
|
|
|
|
|
;;;###autoload
|
|
@@ -590,6 +599,7 @@ OT/NT etc."
|
|
|
chapter-verse
|
|
|
chapter
|
|
|
verse)
|
|
|
+ (message "Following xref %s" xref)
|
|
|
(if (= (length verse-ref) 3) ; II Cor 3:17 or the like
|
|
|
(progn
|
|
|
(setq book-abbrev (concat (car verse-ref) " " (cadr verse-ref)))
|
|
@@ -598,7 +608,9 @@ OT/NT etc."
|
|
|
(setq book-abbrev (car verse-ref))
|
|
|
(setq chapter-verse (split-string (cadr verse-ref) ":"))))
|
|
|
|
|
|
- (setq book (cdr (assoc book-abbrev bm-book-name-abbreviations-alist)))
|
|
|
+ ;; (setq book (cdr (assoc book-abbrev bm-book-name-abbreviations-alist)))
|
|
|
+ (setq book (car verse-ref))
|
|
|
+ (message "Xref is %s %s" book chapter-verse )
|
|
|
(setq chapter (car chapter-verse)
|
|
|
verse (cadr chapter-verse))
|
|
|
(bible-open (string-trim book) (string-to-number chapter) (string-to-number verse))))
|
|
@@ -709,38 +721,144 @@ Does some tweaking specific to morphology."
|
|
|
lemma-index-hash)))
|
|
|
|
|
|
|
|
|
+;;;; (defun bm--lookup-def-by-greek-lemma (lemma)
|
|
|
+;;;; "Executes `diatheke' to do query by lemma, sets text properties to allow
|
|
|
+;;;; verse cross references. Returns string. Note that this looks up by lemmas,
|
|
|
+;;;; not Strong's numbers. The lemmas are retrieved from a Strong's number-to-lemma
|
|
|
+;;;; index (or possibly otherwise)."
|
|
|
+;;;; (with-temp-buffer
|
|
|
+;;;; (let ((args (list "diatheke" nil (current-buffer) t "-b" bm-greek-lexicon "-o" "m" "-f" "plain" "-k" lemma)))
|
|
|
+;;;; (apply 'call-process args)
|
|
|
+;;;; ;; Clean up outlining in the term buffer. Just fix the first
|
|
|
+;;;; ;; level of outline. This is specific to the AbbottSmith module;
|
|
|
+;;;; ;; it may help for other versions.
|
|
|
+;;;; (format-replace-strings
|
|
|
+;;;; '((" I." . "\n I.")
|
|
|
+;;;; (" 1." . "\n 1.")
|
|
|
+;;;; (" (a)" . "\n (a)")
|
|
|
+;;;; (" (α)" . "\n (α)")
|
|
|
+;;;; (" (i)" . "\n (i)")
|
|
|
+;;;; (" (1)" . "\n (1)")
|
|
|
+;;;; (". ." . ".")
|
|
|
+;;;; (" . " . ". ")))
|
|
|
+;;;; (goto-char (point-min))
|
|
|
+;;;; (while (search-forward "\n" nil t)
|
|
|
+;;;; (delete-blank-lines))
|
|
|
+;;;; (goto-char (point-min))
|
|
|
+;;;; ;; Highlight verse references to allow lookup from lexicon
|
|
|
+;;;; ;; entry. XXX This is incomplete and does not handle all the
|
|
|
+;;;; ;; types of cross-reference.
|
|
|
+;;;; (while (search-forward-regexp bm-verse-regexp nil t)
|
|
|
+;;;; (put-text-property (match-beginning 0) (match-end 0) 'xref (match-string 0))
|
|
|
+;;;; (put-text-property (match-beginning 0) (match-end 0) 'keymap bible-search-mode-map)
|
|
|
+;;;; (add-face-text-property (match-beginning 0) (match-end 0) '(:foreground "blue"))
|
|
|
+;;;; ))
|
|
|
+;;;; (buffer-string)))
|
|
|
+
|
|
|
+;;;; (defun bm--process-href ()
|
|
|
+;;;; (cl-do* ((text (buffer-string))
|
|
|
+;;;; (href-match (string-match "<a href=\"passagestudy.*?</a>" text) (string-match "<a href=\"passagestudy.*?</a>" text new-start))
|
|
|
+;;;; (href-string (match-string 0 text) (match-string 0 text))
|
|
|
+;;;; (new-start (match-end 0) (match-end 0)))
|
|
|
+;;;; ((not href-match))
|
|
|
+;;;; (let* ((value-match (string-match "value=.*?&" href-string))
|
|
|
+;;;; (value-string (match-string 0 href-string))
|
|
|
+;;;; (verse-ref-string (substring value-string 6 (1- (length value-string)))))
|
|
|
+;;;; (set-text-properties (match-beginning 0) (match-end 0) nil)
|
|
|
+;;;; (replace-regexp "<a href=\"passagestudy.*?</a>" verse-ref-string t href-match new-start)
|
|
|
+;;;; (message "Replaced %s with %s" href-string verse-ref-string)
|
|
|
+;;;; (put-text-property (match-beginning 0) (length verse-ref-string) 'xref (match-string 0))
|
|
|
+;;;; (put-text-property (match-beginning 0) (length verse-ref-string) 'keymap bible-search-mode-map)
|
|
|
+;;;; (add-face-text-property (match-beginning 0) (length verse-ref-string) '(:foreground "blue")))))
|
|
|
+
|
|
|
+;;; (while (re-search-forward REGEXP nil t)
|
|
|
+;;; (replace-match TO-STRING nil nil))
|
|
|
+
|
|
|
+
|
|
|
+
|
|
|
+(defun bm--process-href ()
|
|
|
+ (goto-char (point-min))
|
|
|
+ (cl-do* ((href-match (re-search-forward "<a href=\"passagestudy.*?</a>" nil t) (re-search-forward "<a href=\"passagestudy.*?</a>" nil t))
|
|
|
+ (match-text (match-string 0) (match-string 0)))
|
|
|
+ ((not href-match))
|
|
|
+ (replace-match "" nil nil)
|
|
|
+ (let* ((value-match (string-match "value=.*?&" match-text))
|
|
|
+ (value-string (match-string 0 match-text))
|
|
|
+ (verse-ref-string (substring value-string 6 (1- (length value-string))))
|
|
|
+ (verse-ref-length (length verse-ref-string))
|
|
|
+ (prefix-1 (seq-position verse-ref-string ?1))
|
|
|
+ (prefix-2 (seq-position verse-ref-string ?2)))
|
|
|
+
|
|
|
+ (aset verse-ref-string (cl-search "." verse-ref-string) 32) ; Substitute first period with space
|
|
|
+ (aset verse-ref-string (cl-search "." verse-ref-string) 58) ; Substitute second period with colon
|
|
|
+
|
|
|
+ ;; Handle leading 1 or 2.
|
|
|
+ (when (and prefix-1 (= prefix-1 0))
|
|
|
+ (setq verse-ref-string (concat "I" (substring verse-ref-string 1))))
|
|
|
+ (when (and prefix-2 (= prefix-2 0))
|
|
|
+ (setq verse-ref-string (concat "II" (substring verse-ref-string 1))))
|
|
|
+
|
|
|
+ (message "verse-ref-string: %s; length %s; point %s" verse-ref-string (length verse-ref-string) (point))
|
|
|
+ (set-text-properties 0 verse-ref-length nil verse-ref-string)
|
|
|
+ (put-text-property 0 verse-ref-length 'xref verse-ref-string verse-ref-string)
|
|
|
+ (put-text-property 0 verse-ref-length 'keymap bible-search-mode-map verse-ref-string)
|
|
|
+ (add-face-text-property 0 (length verse-ref-string) '(:foreground "blue") nil verse-ref-string)
|
|
|
+ (insert verse-ref-string))))
|
|
|
+
|
|
|
+
|
|
|
+
|
|
|
+;;;; (string-match "[0-9]+" text) (string-match "[0-9]+" text (match-end 0))))
|
|
|
+;;;; ((not match))
|
|
|
+;;;; ;; This enables clicking on the Strong's numbers inside the term display.
|
|
|
+;;;; (let* ((matchstr (match-string 0 text))
|
|
|
+;;;; (matchstrlen (length matchstr))
|
|
|
+;;;; (refstart (+ match 1))
|
|
|
+;;;; (refend (+ match 1 matchstrlen)))
|
|
|
+;;;; (cond ((eq termtype 'hebrew)
|
|
|
+;;;; (put-text-property refstart refend 'strong (concat "strong:H" matchstr))
|
|
|
+;;;; (put-text-property refstart refend 'keymap bm-hebrew-keymap)
|
|
|
+;;;; (add-face-text-property refstart refend `(:foreground "blue")))
|
|
|
+;;;; ((eq termtype 'greek)
|
|
|
+;;;; (put-text-property refstart refend 'strong (concat "strong:G" matchstr))
|
|
|
+;;;; (put-text-property refstart refend 'keymap bm-greek-keymap)
|
|
|
+;;;; (add-face-text-property refstart refend `(:foreground "blue"))))))
|
|
|
+
|
|
|
+
|
|
|
+
|
|
|
(defun bm--lookup-def-by-greek-lemma (lemma)
|
|
|
"Executes `diatheke' to do query by lemma, sets text properties to allow
|
|
|
verse cross references. Returns string. Note that this looks up by lemmas,
|
|
|
not Strong's numbers. The lemmas are retrieved from a Strong's number-to-lemma
|
|
|
index (or possibly otherwise)."
|
|
|
(with-temp-buffer
|
|
|
- (let ((args (list "diatheke" nil (current-buffer) t "-b" bm-greek-lexicon "-o" "m" "-f" "plain" "-k" lemma)))
|
|
|
+ (let ((args (list "diatheke" nil (current-buffer) t "-b" bm-greek-lexicon "-o" "m" "-f" "HTMLHREF" "-k" lemma)))
|
|
|
(apply 'call-process args)
|
|
|
- ;; Clean up outlining in the term buffer. Just fix the first
|
|
|
- ;; level of outline. This is specific to the AbbottSmith module;
|
|
|
- ;; it may help for other versions.
|
|
|
- (format-replace-strings
|
|
|
- '((" I." . "\n I.")
|
|
|
- (" 1." . "\n 1.")
|
|
|
- (" (a)" . "\n (a)")
|
|
|
- (" (α)" . "\n (α)")
|
|
|
- (" (i)" . "\n (i)")
|
|
|
- (" (1)" . "\n (1)")
|
|
|
- (". ." . ".")
|
|
|
- (" . " . ". ")))
|
|
|
- (goto-char (point-min))
|
|
|
- (while (search-forward "\n" nil t)
|
|
|
- (delete-blank-lines))
|
|
|
- (goto-char (point-min))
|
|
|
- ;; Highlight verse references to allow lookup from lexicon
|
|
|
- ;; entry. XXX This is incomplete and does not handle all the
|
|
|
- ;; types of cross-reference.
|
|
|
- (while (search-forward-regexp bm-verse-regexp nil t)
|
|
|
- (put-text-property (match-beginning 0) (match-end 0) 'xref (match-string 0))
|
|
|
- (put-text-property (match-beginning 0) (match-end 0) 'keymap bible-search-mode-map)
|
|
|
- (add-face-text-property (match-beginning 0) (match-end 0) '(:foreground "blue"))
|
|
|
- ))
|
|
|
+ ;;;; ;; Clean up outlining in the term buffer. Just fix the first
|
|
|
+ ;;;; ;; level of outline. This is specific to the AbbottSmith module;
|
|
|
+ ;;;; ;; it may help for other versions.
|
|
|
+ ;;;; (format-replace-strings
|
|
|
+ ;;;; '((" I." . "\n I.")
|
|
|
+ ;;;; (" 1." . "\n 1.")
|
|
|
+ ;;;; (" (a)" . "\n (a)")
|
|
|
+ ;;;; (" (α)" . "\n (α)")
|
|
|
+ ;;;; (" (i)" . "\n (i)")
|
|
|
+ ;;;; (" (1)" . "\n (1)")
|
|
|
+ ;;;; (". ." . ".")
|
|
|
+ ;;;; (" . " . ". ")))
|
|
|
+ ;;;; (goto-char (point-min))
|
|
|
+ ;;;; (while (search-forward "\n" nil t)
|
|
|
+ ;;;; (delete-blank-lines))
|
|
|
+ ;;;; (goto-char (point-min))
|
|
|
+ ;;;; ;; Highlight verse references to allow lookup from lexicon
|
|
|
+ ;;;; ;; entry. XXX This is incomplete and does not handle all the
|
|
|
+ ;;;; ;; types of cross-reference.
|
|
|
+ ;;;; (while (search-forward-regexp bm-verse-regexp nil t)
|
|
|
+ ;;;; (put-text-property (match-beginning 0) (match-end 0) 'xref (match-string 0))
|
|
|
+ ;;;; (put-text-property (match-beginning 0) (match-end 0) 'keymap bible-search-mode-map)
|
|
|
+ ;;;; (add-face-text-property (match-beginning 0) (match-end 0) '(:foreground "blue"))
|
|
|
+ ;;;; ))
|
|
|
+ (bm--process-href)
|
|
|
+ (shr-render-region (point-min) (point-max)))
|
|
|
(buffer-string)))
|
|
|
|
|
|
|
|
@@ -1194,27 +1312,40 @@ In processing subnodes, each case will prepend a space if it needs it."
|
|
|
;; )
|
|
|
|
|
|
(defun bm--display-term (termtype)
|
|
|
+ (message "bible-mode--display-term %s" termtype)
|
|
|
+
|
|
|
(setq buffer-read-only nil)
|
|
|
+
|
|
|
(cl-do* ((text (buffer-string))
|
|
|
(match (string-match "[0-9]+" text) (string-match "[0-9]+" text (match-end 0))))
|
|
|
((not match))
|
|
|
+ ;; This enables clicking on the Strong's numbers inside the term display.
|
|
|
(let* ((matchstr (match-string 0 text))
|
|
|
(matchstrlen (length matchstr))
|
|
|
(refstart (+ match 1))
|
|
|
(refend (+ match 1 matchstrlen)))
|
|
|
- ;; This enables clicking on the Strong's numbers inside the term display.
|
|
|
(cond ((eq termtype 'hebrew)
|
|
|
(put-text-property refstart refend 'strong (concat "strong:H" matchstr))
|
|
|
(put-text-property refstart refend 'keymap bm-hebrew-keymap)
|
|
|
(add-face-text-property refstart refend `(:foreground "blue")))
|
|
|
- ((eq termtype 'greek)
|
|
|
+ ((eq termtype 'greek))
|
|
|
(put-text-property refstart refend 'strong (concat "strong:G" matchstr))
|
|
|
(put-text-property refstart refend 'keymap bm-greek-keymap)
|
|
|
- (add-face-text-property refstart refend `(:foreground "blue"))))))
|
|
|
-
|
|
|
+ (add-face-text-property refstart refend `(:foreground "blue")))))
|
|
|
+
|
|
|
+ (goto-char (point-min))
|
|
|
+ (while (search-forward-regexp bm-verse-regexp nil t)
|
|
|
+ (put-text-property (match-beginning 0) (match-end 0) 'xref (match-string 0))
|
|
|
+ (put-text-property (match-beginning 0) (match-end 0) 'keymap bible-search-mode-map)
|
|
|
+ (put-text-property (match-beginning 0) (match-end 0) 'help-echo (concat "Go to " (match-string 0)))
|
|
|
+ (add-face-text-property (match-beginning 0) (match-end 0) '(:foreground "blue"))
|
|
|
+ (message "Found xref %s" (match-string 0))
|
|
|
+ )
|
|
|
(goto-char (point-min))
|
|
|
+
|
|
|
;; (while (search-forward (concat "(" bm-module ")") nil t)
|
|
|
;; (replace-match ""))
|
|
|
+
|
|
|
(while (search-forward "()" nil t)
|
|
|
(replace-match ""))
|
|
|
(goto-char (point-min))
|
|
@@ -1265,9 +1396,7 @@ left-to-right. XXX Why doesn't this work for the tooltips?"
|
|
|
(regexp-opt `(,bm-greek-lexicon))
|
|
|
""
|
|
|
;; (bm--exec-diatheke term nil "plain" nil bm-greek-lexicon)
|
|
|
- (bm--lookup-lex-greek term)
|
|
|
- nil nil nil 7
|
|
|
- ))
|
|
|
+ (bm--lookup-lex-greek term)))
|
|
|
(bm--display-term 'greek))
|
|
|
|
|
|
|