| 
					
				 | 
			
			
				@@ -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-05-24 12:13:14 fred> 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				+;; Time-stamp: <2024-06-14 10:04:32 fred> 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				  
			 | 
		
	
		
			
				 | 
				 | 
			
			
				 ;; Author: Zacalot 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				 ;; Fixes and modifications by Fred Gilham 
			 | 
		
	
	
		
			
				| 
					
				 | 
			
			
				@@ -106,17 +106,27 @@ 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				   :group 'bible-mode) 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				  
			 | 
		
	
		
			
				 | 
				 | 
			
			
				  
			 | 
		
	
		
			
				 | 
				 | 
			
			
				-;; This determines whether or not to use the Abbott Smith lexicon. 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				-;; There is special-case code for this. 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				-(defcustom bm-use-abbott 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				-  t 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				-  "Use the Abbott Smith `Manual Greek Lexicon' for Greek definitions." 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				+(defcustom bm-use-index-for-lexicon nil 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				+  "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." 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				   :type 'boolean 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				   :local nil 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				   :group 'bible-mode) 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				  
			 | 
		
	
		
			
				 | 
				 | 
			
			
				+(defcustom bm-lexicon-index "AbbottSmithStrongs" 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				+  "A module that consists of an index mapping Strong's numbers to Greek 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				+lemmas. The code is written to use the entries in AbbottSmithStrongs 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				+which are of the form 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				+ 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				+<strong's number>: @LINK <greek lemma>" 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				+  :type '(string :tag "Lexicon index.") 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				+  :local nil 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				+  :group 'bible-mode) 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				+ 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				  
			 | 
		
	
		
			
				 | 
				 | 
			
			
				-(defcustom bm-short-greek-lexicon 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				+(defcustom bm-greek-lexicon-short 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				   "StrongsRealGreek" 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				   "Lexicon used for displaying definitions of Greek words in tooltips." 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				   :type '(string :tag "Lexicon module (e.g. \"StrongsRealGreek\").") 
			 | 
		
	
	
		
			
				| 
					
				 | 
			
			
				@@ -130,7 +140,7 @@ 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				   :local nil 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				   :group 'bible-mode) 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				  
			 | 
		
	
		
			
				 | 
				 | 
			
			
				-(defcustom bm-short-hebrew-lexicon 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				+(defcustom bm-hebrew-lexicon-short 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				   "BDBGlosses_Strongs" ; This seems to work 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				   "Lexicon used for displaying definitions of Hebrew words in tooltips." 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				   :type '(string :tag "Lexicon module (e.g. \"StrongsRealHebrew\")") 
			 | 
		
	
	
		
			
				| 
					
				 | 
			
			
				@@ -547,7 +557,7 @@ search." 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				   (interactive "sBible Search: ") 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				   (when (> (length query) 0) 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				     (let* ((searchmode (completing-read "Search Mode: " '("lucene" "phrase") nil t "lucene"))) 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				-      (bm--open-search query searchmode)))) 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				+      (bm--open-search query searchmode bm-module)))) 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				  
			 | 
		
	
		
			
				 | 
				 | 
			
			
				 ;;;###autoload 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				 (defun bible-search-mode-follow-verse () 
			 | 
		
	
	
		
			
				| 
					
				 | 
			
			
				@@ -652,19 +662,20 @@ like `Of David' or the like.") 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				  
			 | 
		
	
		
			
				 | 
				 | 
			
			
				 ;;; Hash tables for Lexical definitions. 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				 (defvar greek-hash (make-hash-table :test 'equal)) 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				-(defvar greek-short-hash (make-hash-table :test 'equal))  ; Hash table for ``short'' lexical lookup 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				+(defvar greek-hash-short (make-hash-table :test 'equal)) 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				 (defvar hebrew-hash (make-hash-table :test 'equal)) 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				-(defvar hebrew-short-hash (make-hash-table :test 'equal)) 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				+(defvar hebrew-hash-short (make-hash-table :test 'equal)) 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				  
			 | 
		
	
		
			
				 | 
				 | 
			
			
				-;; Do lookups using AbbottSmith_Strongs as index to AbbottSmith lexicon. 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				-(defvar abbott-index-hash (make-hash-table :test 'equal)) 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				-(defvar abbott-lex-hash (make-hash-table :test 'equal))  
			 | 
		
	
		
			
				 | 
				 | 
			
			
				+;; Do lookups using index to lexicon with lookups by lemma. 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				+(defvar lemma-index-hash (make-hash-table :test 'equal)) 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				+(defvar lemma-lex-hash (make-hash-table :test 'equal))  
			 | 
		
	
		
			
				 | 
				 | 
			
			
				  
			 | 
		
	
		
			
				 | 
				 | 
			
			
				 ;;; Hash tables for Morphologies. Three at present. 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				 (defvar robinson-hash (make-hash-table :test 'equal)) 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				 (defvar packard-hash (make-hash-table :test 'equal)) 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				 (defvar oshm-hash (make-hash-table :test 'equal)) 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				  
			 | 
		
	
		
			
				 | 
				 | 
			
			
				+ 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				 ;;; Use HTMLHREF format with diatheke, post-process to render html. 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				 (defun bm--morph-query (query module) 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				   "Executes `diatheke' to do morph query, renders HTML, returns string. 
			 | 
		
	
	
		
			
				| 
					
				 | 
			
			
				@@ -687,37 +698,28 @@ Does some tweaking specific to morphology." 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				   ;; Get rid of query ID at front of string: ?????: 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				   (bm--exec-diatheke query nil "plain" nil module)) 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				  
			 | 
		
	
		
			
				 | 
				 | 
			
			
				- 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				-(defun bm--lookup-strongs-greek (window object pos) 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				-  "Look up Greek lexical data for object at point. If not found in hash table, 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				-get it from sword database, stash in hash table, and return data." 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				-  (let* ((query (get-text-property pos 'strong object)) 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				-	 (match (string-match "[0-9]+" query)) 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				-	 (lookup-key (match-string 0 query))) 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				-    (and lookup-key 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				-	 (or (gethash lookup-key greek-hash) 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				-	     (puthash lookup-key (bm--lex-query lookup-key bible-mode-short-greek-lexicon) greek-hash))))) 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				- 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				- 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				-(defun bm--lookup-lemma-abbott (key) 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				-  "Given a strong's number, return the Greek lemma from AbbottSmithStrongs." 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				-  (or (gethash key abbott-index-hash) 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				+(defun bm--lookup-lemma-index (key) 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				+  "Given a strong's number, return the Greek lemma from lemma index." 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				+  (or (gethash key lemma-index-hash) 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				       (puthash key  
			 | 
		
	
		
			
				 | 
				 | 
			
			
				 	       (string-trim  
			 | 
		
	
		
			
				 | 
				 | 
			
			
				 		(replace-regexp-in-string 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				-		 "(AbbottSmithStrongs)" ""  
			 | 
		
	
		
			
				 | 
				 | 
			
			
				-		 (bm--lex-query key "AbbottSmithStrongs"))) 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				-	       abbott-index-hash))) 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				+		 (concat "(" bm-lexicon-index ")") ""  
			 | 
		
	
		
			
				 | 
				 | 
			
			
				+		 (bm--lex-query key bm-lexicon-index))) 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				+	       lemma-index-hash))) 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				  
			 | 
		
	
		
			
				 | 
				 | 
			
			
				  
			 | 
		
	
		
			
				 | 
				 | 
			
			
				-(defun bm--lookup-def-abbott (lemma) 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				-  "Executes `diatheke' to do abbott query, renders HTML, sets text 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				-properties to allow verse cross references. Returns string." 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				+(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" "AbbottSmith" "-o" "m" "-f" "plain" "-k" lemma))) 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				+    (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. 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				+      ;; 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.") 
			 | 
		
	
	
		
			
				| 
					
				 | 
			
			
				@@ -731,6 +733,9 @@ properties to allow verse cross references. Returns string." 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				       (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) 
			 | 
		
	
	
		
			
				| 
					
				 | 
			
			
				@@ -738,37 +743,60 @@ properties to allow verse cross references. Returns string." 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				 	)) 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				     (buffer-string))) 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				  
			 | 
		
	
		
			
				 | 
				 | 
			
			
				-(defun bm--lookup-lex-def-abbott (key) 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				-  (let* ((abbott-lemma (bm--lookup-lemma-abbott key)) 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				-	 ;; Get the lemma which is after the `@LINK' string. 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				-	 (lemma (caddr (split-string abbott-lemma))) 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				-	 ;; Use the lemma to lookup the definition. 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				-	 (lex-def (bm--lookup-def-abbott lemma))) 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				-    lex-def)) 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				  
			 | 
		
	
		
			
				 | 
				 | 
			
			
				+(defun bm--lookup-lex-greek-indexed (key) 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				+  (let ((lemma-entry (bm--lookup-lemma-index key))) ; Get lemma from Strong's number 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				+    (when lemma-entry 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				+      (let ((lemma (caddr (split-string lemma-entry " ")))) 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				+	(bm--lookup-def-by-greek-lemma lemma))))) 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				  
			 | 
		
	
		
			
				 | 
				 | 
			
			
				-(defun bm--lookup-strongs-greek-abbott (window object pos) 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				-  "To use Abbott's Lexicon we extract the Strong's key from the text in the 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				-buffer. Given the Strong's number, get the lemma for that number. Use 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				-that lemma to lookup the definition in the AbbottStrongs lexicon." 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				-  (let* ((query (get-text-property pos 'strong object)) 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				+ 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				+(defun bm--lookup-lex-greek (key) 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				+  "Lookup lexical definition using Strong's number. Check hash table first. 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				+Then, if a lexicon is accessed by lemmas, do lookup using index method; 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				+otherwise just use the Strong's number method." 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				+  (or (gethash key greek-hash) 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				+      (puthash key  
			 | 
		
	
		
			
				 | 
				 | 
			
			
				+	       (if bm-use-index-for-lexicon 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				+		   (bm--lookup-lex-greek-indexed key) 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				+		 (bm--lex-query key bible-mode-greek-lexicon)) 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				+	       greek-hash))) 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				+ 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				+(defun bm--lookup-strongs-greek (window object pos) 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				+  "Look up Greek lexical string from Greek lexicon for object 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				+at point. If not found in hash table, get it from sword database. 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				+stash in hash table, and return string. 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				+Note: compiler warns about unused `window' argument." 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				+  (let* ((query (get-text-property pos 'strong object))  ; Get Strong's number from text property 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				+	 (match (string-match "[0-9]+" query)) ; Compiler warns about unused match variable. 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				+	 (lookup-key (match-string 0 query))) 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				+    (bm--lookup-lex-greek lookup-key))) 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				+ 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				+ 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				+(defun bm--lookup-strongs-greek-short (window object pos) 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				+  "Look up Greek lexical string from short Greek lexicon for object 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				+at point. If not found in hash table, get it from sword database,  
			 | 
		
	
		
			
				 | 
				 | 
			
			
				+stash in hash table, and return string. 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				+Note: compiler warns about unused `window' argument." 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				+  (let* ((query (get-text-property pos 'strong object))  ; Get Strong's number from text property 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				 	 (match (string-match "[0-9]+" query)) ; Compiler warns about unused match variable. 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				 	 (lookup-key (match-string 0 query))) 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				+    ;; Easier to debug longer version. 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				+;;; (when lookup-key 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				+;;;   (or (gethash lookup-key greek-hash-short) 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				+;;;	  (puthash lookup-key (bm--lex-query lookup-key bm-greek-lexicon-short) greek-hash-short))) 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				     (when lookup-key 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				-      (bm--lookup-lex-def-abbott lookup-key)))) 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				+      (let ((data (gethash lookup-key greek-hash-short))) 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				+	(if data data 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				+	  (let ((raw-text (bm--lex-query lookup-key bm-greek-lexicon-short))) 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				+	    (puthash lookup-key raw-text greek-hash-short))))))) 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				+       
			 | 
		
	
		
			
				 | 
				 | 
			
			
				  
			 | 
		
	
		
			
				 | 
				 | 
			
			
				-;;; Not used. 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				-;;;;  (defun bm--hebrew-lex-query (query module) 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				-;;;;    "Executes `diatheke' to do hebrew query, renders HTML, returns string.  
			 | 
		
	
		
			
				 | 
				 | 
			
			
				-;;;;  XXX directionality problems." 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				-;;;;    (with-temp-buffer 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				-;;;;      (let ((args (list "diatheke" nil (current-buffer) t "-b" module "-o" "m" "-f" "HTMLHREF" "-k" query))) 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				-;;;;        (apply 'call-process args) 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				-;;;;        (shr-render-region (point-min) (point-max))))) 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				  
			 | 
		
	
		
			
				 | 
				 | 
			
			
				 (defun bm--lookup-strongs-hebrew (window object pos) 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				-  "Look up Hebrew lexical string for object at point. If not found in hash table, 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				-get it from sword database, stash in hash table, and return string. 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				+  "Look up Hebrew lexical string for object at point.  
			 | 
		
	
		
			
				 | 
				 | 
			
			
				+If not found in hash table, get it from sword database,  
			 | 
		
	
		
			
				 | 
				 | 
			
			
				+stash in hash table, and return string. 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				 Note: compiler warns about unused `window' argument." 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				   (let* ((query (get-text-property pos 'strong object)) 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				 	 (match (string-match "[0-9]+" query))         ; Compiler warns about match. 
			 | 
		
	
	
		
			
				| 
					
				 | 
			
			
				@@ -777,10 +805,26 @@ Note: compiler warns about unused `window' argument." 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				       (let ((lookup-key (concat "H" (match-string 0 query)))) 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				 	(or (gethash lookup-key hebrew-hash) 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				 	    ;; Use PLAIN format for lookup. XXX directionality problems. 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				-	    (let ((raw-text (bm--lex-query lookup-key bm-short-hebrew-lexicon))) 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				+	    (let ((raw-text (bm--lex-query lookup-key bm-hebrew-lexicon))) 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				 	      ;; XXX massage this text to handle outline formatting a bit better. 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				 	      (puthash lookup-key raw-text hebrew-hash))))))) 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				  
			 | 
		
	
		
			
				 | 
				 | 
			
			
				+(defun bm--lookup-strongs-hebrew-short (window object pos) 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				+  "Look up Hebrew lexical string from short Hebrew lexicon for object 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				+at point. If not found in hash table, get it from sword database,  
			 | 
		
	
		
			
				 | 
				 | 
			
			
				+stash in hash table, and return string. 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				+Note: compiler warns about unused `window' argument." 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				+  (let* ((query (get-text-property pos 'strong object)) 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				+	 (match (string-match "[0-9]+" query))         ; Compiler warns about match. 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				+	 (match-string (match-string 0 query))) 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				+    (when match-string 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				+      (let ((lookup-key (concat "H" (match-string 0 query)))) 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				+	(or (gethash lookup-key hebrew-hash-short) 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				+	    ;; Use PLAIN format for lookup. XXX directionality problems. 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				+	    (let ((raw-text (bm--lex-query lookup-key bm-hebrew-lexicon-short))) 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				+	      ;; XXX massage this text to handle outline formatting a bit better. 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				+	      (puthash lookup-key raw-text hebrew-hash-short))))))) 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				+ 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				 (defun bm--morph-database-lookup (query database hash) 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				   (or (gethash query hash) 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				       (puthash query (bm--morph-query query database) hash))) 
			 | 
		
	
	
		
			
				| 
					
				 | 
			
			
				@@ -805,16 +849,17 @@ Note: compiler warns about unused `window' argument." 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				 ;;; Get string for tooltip display 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				 ;;; 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				 (defun bm--show-lex-morph (window object pos) 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				+  "Get text for tooltip display. Includes both lex and morph  
			 | 
		
	
		
			
				 | 
				 | 
			
			
				+definitions if text module has both tags, otherwise just get  
			 | 
		
	
		
			
				 | 
				 | 
			
			
				+lex definition." 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				   (let* ((lex-morph-text "") 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				 	 (lex (get-text-property pos 'strong object)) 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				 	 (lex-module nil) 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				 	 (lex-text 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				 	  (cond ((string-match "strong:G" lex) 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				-		 (setq lex-module bm-short-greek-lexicon) 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				-	   	 (bm--lookup-strongs-greek window object pos)) 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				+		 (bm--lookup-strongs-greek-short window object pos)) 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				 		((string-match "strong:H" lex) 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				-		 (setq lex-module bm-short-hebrew-lexicon) 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				-		 (bm--lookup-strongs-hebrew window object pos))))) 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				+		 (bm--lookup-strongs-hebrew-short window object pos))))) 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				     (setq lex-text (string-replace (concat "(" lex-module ")") "" lex-text)) 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				     (let* ((morph (get-text-property pos 'morph object)) 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				 	   (morph-module nil) 
			 | 
		
	
	
		
			
				| 
					
				 | 
			
			
				@@ -915,7 +960,7 @@ Insert lemmas in buffer. Must be done after item is inserted in buffer." 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				  
			 | 
		
	
		
			
				 | 
				 | 
			
			
				  
			 | 
		
	
		
			
				 | 
				 | 
			
			
				 (defun bm-new-line () 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				-  "Ensure beginning of line. Avoid redundant blank lines." 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				+  "Ensure beginning of line. Try to avoid redundant blank lines." 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				   (unless (= (current-column) 0) 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				     (insert "\n"))) 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				  
			 | 
		
	
	
		
			
				| 
					
				 | 
			
			
				@@ -1034,7 +1079,7 @@ In processing subnodes, each case will prepend a space if it needs it." 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				   (let ((text (bm--exec-diatheke "modulelist" nil nil nil "system")) 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				 	modules) 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				     (catch 'done 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				-      (dolist (line (split-string text "\n")) 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				+      (dolist (line (split-string text "[\n\r]+")) 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				 	(when (equal line "Commentaries:") 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				           (throw 'done nil)) 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				 	(when (not (equal "Biblical Texts:" line)) 
			 | 
		
	
	
		
			
				| 
					
				 | 
			
			
				@@ -1060,15 +1105,18 @@ In processing subnodes, each case will prepend a space if it needs it." 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				     (module-select-mode) 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				     (setq buffer-read-only nil) 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				     (erase-buffer) 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				+    (setq-local tab-stop-list '(25)) 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				     (dolist (mod mods) 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				-      (insert  
			 | 
		
	
		
			
				 | 
				 | 
			
			
				-       (propertize (car mod)  
			 | 
		
	
		
			
				 | 
				 | 
			
			
				-		   'face 'bold  
			 | 
		
	
		
			
				 | 
				 | 
			
			
				-		   'module (car mod) 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				-		   'help-echo (concat "Select " (car mod)) 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				-		   'keymap bm-module-map) 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				-       "\t\t" 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				-       (format "%s\n" (cadr mod)))) 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				+      (let ((name (string-trim (car mod))) 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				+	    (description (string-trim-left (cadr mod)))) 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				+	(insert  
			 | 
		
	
		
			
				 | 
				 | 
			
			
				+	 (propertize (string-trim name) 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				+		     'face 'bold  
			 | 
		
	
		
			
				 | 
				 | 
			
			
				+		     'module name 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				+		     'help-echo (concat "Select " name) 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				+		     'keymap bm-module-map)) 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				+	(move-to-tab-stop) 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				+	(insert (format "%s\n" description)))) 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				     (setq buffer-read-only t) 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				     (goto-char (point-min)) 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				     (pop-to-buffer buf nil t))) 
			 | 
		
	
	
		
			
				| 
					
				 | 
			
			
				@@ -1076,12 +1124,12 @@ In processing subnodes, each case will prepend a space if it needs it." 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				  
			 | 
		
	
		
			
				 | 
				 | 
			
			
				 ;;;;; Bible Searching 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				  
			 | 
		
	
		
			
				 | 
				 | 
			
			
				-(defun bm--open-search (query searchmode) 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				+(defun bm--open-search (query searchmode module) 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				   "Opens a search buffer of QUERY using SEARCHMODE." 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				-  (let ((buf (get-buffer-create (concat "*bible-search-" (downcase bm-module) "-" query "*")))) 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				+  (let ((buf (get-buffer-create (concat "*bible-search-" (downcase module) "-" query "*")))) 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				     (set-buffer buf) 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				     (bible-search-mode) 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				-    (bm--display-search query searchmode bm-module) 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				+    (bm--display-search query searchmode module) 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				     (pop-to-buffer buf nil t))) 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				  
			 | 
		
	
		
			
				 | 
				 | 
			
			
				 (defun bm--display-search (query searchmode mod) 
			 | 
		
	
	
		
			
				| 
					
				 | 
			
			
				@@ -1097,7 +1145,7 @@ In processing subnodes, each case will prepend a space if it needs it." 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				 	 (verses nil) 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				 	 (query-verses "") 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				 	 fullverses) 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				-    (if (equal result (concat "none (" bm-module ")")) 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				+    (if (equal result (concat "none (" mod ")")) 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				 	(insert "No results found." (when (equal searchmode "lucene") " Verify index has been build with mkfastmod.")) 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				       (progn 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				 	(while match 
			 | 
		
	
	
		
			
				| 
					
				 | 
			
			
				@@ -1121,7 +1169,7 @@ In processing subnodes, each case will prepend a space if it needs it." 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				 	  (if query-verses 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				 	      (setq query-verses (concat query-verses ";" verse)) 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				 	    (setq query-verses verse))) 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				-	(setq fullverses (bm--exec-diatheke query-verses)) 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				+	(setq fullverses (bm--exec-diatheke query-verses nil nil nil mod)) 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				  
			 | 
		
	
		
			
				 | 
				 | 
			
			
				 	(insert fullverses) 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				 	     
			 | 
		
	
	
		
			
				| 
					
				 | 
			
			
				@@ -1129,10 +1177,10 @@ In processing subnodes, each case will prepend a space if it needs it." 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				 	  (erase-buffer) 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				 	  (bm--insert-domnode-recursive (dom-by-tag html-dom-tree 'body) nil nil) 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				 	  (goto-char (point-min)) 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				-	  (while (search-forward (concat "(" bm-module ")") nil t) 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				+	  (while (search-forward (concat "(" mod ")") nil t) 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				 	    (replace-match ""))))) 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				  
			 | 
		
	
		
			
				 | 
				 | 
			
			
				-    (setq mode-name (concat "Bible Search (" bm-module ")")) 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				+    (setq mode-name (concat "Bible Search (" mod ")")) 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				     (setq buffer-read-only t) 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				     (setq-local bm-search-query query) 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				     (setq-local bm-search-mode searchmode) 
			 | 
		
	
	
		
			
				| 
					
				 | 
			
			
				@@ -1148,7 +1196,7 @@ In processing subnodes, each case will prepend a space if it needs it." 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				 (defun bm--display-term (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)))) 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				+	   (match (string-match "[0-9]+" text) (string-match "[0-9]+" text (match-end 0)))) 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				       ((not match)) 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				     (let* ((matchstr (match-string 0 text)) 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				 	   (matchstrlen (length matchstr)) 
			 | 
		
	
	
		
			
				| 
					
				 | 
			
			
				@@ -1159,7 +1207,7 @@ In processing subnodes, each case will prepend a space if it needs it." 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				 	     (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"))) 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				-	    ((and (not bm-use-abbott) (eq termtype 'greek)) ; Abbott entries don't have Strong's numbers  
			 | 
		
	
		
			
				 | 
				 | 
			
			
				+	    ((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")))))) 
			 | 
		
	
	
		
			
				| 
					
				 | 
			
			
				@@ -1213,14 +1261,13 @@ left-to-right. XXX Why doesn't this work for the tooltips?" 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				   "Render the definition of the Strong's Greek TERM." 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				   (setq buffer-read-only nil) 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				   (erase-buffer) 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				-  (if bm-use-abbott 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				-      (insert (replace-regexp-in-string "\(AbbottSmith\)" "" (bm--lookup-lex-def-abbott term))) 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				-    (insert (replace-regexp-in-string 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				+  (insert (replace-regexp-in-string 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				 	     (regexp-opt `(,bm-greek-lexicon)) 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				 	     "" 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				-	     (bm--exec-diatheke term nil "plain" nil bm-greek-lexicon) 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				+	     ;;	     (bm--exec-diatheke term nil "plain" nil bm-greek-lexicon) 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				+	     (bm--lookup-lex-greek term) 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				 	     nil nil nil 7 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				-	     ))) 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				+	     )) 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				   (bm--display-term 'greek)) 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				  
			 | 
		
	
		
			
				 | 
				 | 
			
			
				  
			 |