|  | @@ -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-15 19:27:13 fred>
 | 
	
		
			
				|  |  | +;; Time-stamp: <2024-05-22 09:00:30 fred>
 | 
	
		
			
				|  |  |  
 | 
	
		
			
				|  |  |  ;; Author: Zacalot
 | 
	
		
			
				|  |  |  ;; Fixes and modifications by Fred Gilham
 | 
	
	
		
			
				|  | @@ -86,6 +86,8 @@
 | 
	
		
			
				|  |  |    :local t
 | 
	
		
			
				|  |  |    :group 'bible-mode)
 | 
	
		
			
				|  |  |  
 | 
	
		
			
				|  |  | +;;;
 | 
	
		
			
				|  |  | +;;; XXX Not implememted yet
 | 
	
		
			
				|  |  |  (defcustom bm-font
 | 
	
		
			
				|  |  |    "Ezra SIL"
 | 
	
		
			
				|  |  |    "Default font for bible-mode."
 | 
	
	
		
			
				|  | @@ -101,6 +103,17 @@
 | 
	
		
			
				|  |  |    :local nil
 | 
	
		
			
				|  |  |    :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."
 | 
	
		
			
				|  |  | +  :type 'boolean
 | 
	
		
			
				|  |  | +  :local nil
 | 
	
		
			
				|  |  | +  :group 'bible-mode)
 | 
	
		
			
				|  |  | +
 | 
	
		
			
				|  |  | +
 | 
	
		
			
				|  |  |  (defcustom bm-short-greek-lexicon
 | 
	
		
			
				|  |  |    "StrongsRealGreek"
 | 
	
		
			
				|  |  |    "Lexicon used for displaying definitions of Greek words in tooltips."
 | 
	
	
		
			
				|  | @@ -109,14 +122,14 @@
 | 
	
		
			
				|  |  |    :group 'bible-mode)
 | 
	
		
			
				|  |  |  
 | 
	
		
			
				|  |  |  (defcustom bm-hebrew-lexicon
 | 
	
		
			
				|  |  | -  "StrongsRealHebrew"  ; Nice to use BDBGlosses_Strongs but it needs to be special-cased
 | 
	
		
			
				|  |  | +  "StrongsRealHebrew"
 | 
	
		
			
				|  |  |    "Lexicon used for displaying definitions of Hebrew words using Strong's codes."
 | 
	
		
			
				|  |  |    :type '(string :tag "Lexicon module (e.g. \"StrongsRealHebrew\")")
 | 
	
		
			
				|  |  |    :local nil
 | 
	
		
			
				|  |  |    :group 'bible-mode)
 | 
	
		
			
				|  |  |  
 | 
	
		
			
				|  |  |  (defcustom bm-short-hebrew-lexicon
 | 
	
		
			
				|  |  | -  "StrongsRealHebrew"
 | 
	
		
			
				|  |  | +  "BDBGlosses_Strongs" ; This seems to work
 | 
	
		
			
				|  |  |    "Lexicon used for displaying definitions of Hebrew words in tooltips."
 | 
	
		
			
				|  |  |    :type '(string :tag "Lexicon module (e.g. \"StrongsRealHebrew\")")
 | 
	
		
			
				|  |  |    :local nil
 | 
	
	
		
			
				|  | @@ -139,7 +152,13 @@
 | 
	
		
			
				|  |  |  
 | 
	
		
			
				|  |  |  ;;; defvars
 | 
	
		
			
				|  |  |  
 | 
	
		
			
				|  |  | -(defvar bm-modules (lazy-completion-table bm-modules bm-list-biblical-modules))
 | 
	
		
			
				|  |  | +;;(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]*")
 | 
	
		
			
				|  |  | +(setq bm-verse-regexp "\\(I?I \\)*[a-zA-Z]* [0-9]*:[0-9]*")
 | 
	
		
			
				|  |  | +
 | 
	
		
			
				|  |  | +
 | 
	
		
			
				|  |  | +(defvar bm-modules (lazy-completion-table bm-modules bm--list-biblical-modules))
 | 
	
		
			
				|  |  |  
 | 
	
		
			
				|  |  |  ;; XXX I believe these chapter counts aren't the same for all modules, e.g. JPS.
 | 
	
		
			
				|  |  |  (defvar bm-books
 | 
	
	
		
			
				|  | @@ -164,6 +183,28 @@
 | 
	
		
			
				|  |  |      ("III John"		. 1)    ("Jude"			. 1)	("Revelation of John"	. 22))
 | 
	
		
			
				|  |  |    "A-list of name / chapter count for Bible books.")
 | 
	
		
			
				|  |  |  
 | 
	
		
			
				|  |  | +(defvar bm-book-name-abbreviations-alist
 | 
	
		
			
				|  |  | +  '(;; Old Testament
 | 
	
		
			
				|  |  | +    ("Ge"     . "Genesis")         ("Ex"    . "Exodus")           ("Le"   . "Leviticus")     ("Nu"    . "Numbers")
 | 
	
		
			
				|  |  | +    ("De"     . "Deuteronomy")     ("Js"    . "Joshua")           ("Jg"   . "Judges")        ("Ru"    . "Ruth")
 | 
	
		
			
				|  |  | +    ("I Sa"   . "I Samuel")        ("II Sa" . "II Samuel")        ("I Ki" . "I Kings")       ("II Ki" . "II Kings") 
 | 
	
		
			
				|  |  | +    ("I Ch"   . "I Chronicles")    ("II Ch" . "II Chronicles")    ("Ezr"  . "Ezra")          ("Ne"    . "Nehemiah")
 | 
	
		
			
				|  |  | +    ("Es"     . "Esther")          ("Jb"    . "Job")              ("Ps"   . "Psalms")        ("Pr"    . "Proverbs")
 | 
	
		
			
				|  |  | +    ("Ec"     . "Ecclesiastes")    ("So"    . "Song of Solomon")  ("Is"   . "Isaiah")        ("Je"    . "Jeremiah")
 | 
	
		
			
				|  |  | +    ("La"     . "Lamentations")    ("Ez"    . "Ezekiel")          ("Da"   . "Daniel")        ("Ho"    . "Hosea") 
 | 
	
		
			
				|  |  | +    ("Joe"    . "Joel")	           ("Am"    . "Amos")             ("Ob"   . "Obadiah")       ("Jon"   . "Jonah")
 | 
	
		
			
				|  |  | +    ("Mi"     . "Micah")           ("Na"    . "Nahum")            ("Ha"   . "Habakkuk")      ("Zep"   . "Zephaniah")     
 | 
	
		
			
				|  |  | +    ("Hag"    . "Haggai")          ("Ze"    . "Zechariah")        ("Mal"  . "Malachi")
 | 
	
		
			
				|  |  | +    ;; New Testament
 | 
	
		
			
				|  |  | +    ("Mt"     . "Matthew")         ("Mk"    . "Mark")             ("Lk"   . "Luke")          ("Jo"    . "John")
 | 
	
		
			
				|  |  | +    ("Ac"     . "Acts")            ("Ro"    . "Romans")           ("I Co" . "I Corinthians") ("II Co" . "II Corinthians")
 | 
	
		
			
				|  |  | +    ("Ga"     . "Galatians")       ("Eph"   . "Ephesians")	  ("Phl"  . "Philippians")   ("Col"   . "Colossians")
 | 
	
		
			
				|  |  | +    ("I Th"   . "I Thessalonians") ("II Th" . "II Thessalonians") ("I Ti" . "I Timothy")     ("II Ti" . "II Timothy")
 | 
	
		
			
				|  |  | +    ("Tit"    . "Titus")           ("Phm"   . "Philemon")	  ("He"   . "Hebrews")       ("Ja"    . "James")
 | 
	
		
			
				|  |  | +    ("I Pe"   . "I Peter")         ("II Pe" . "II Peter")	  ("I Jo" . "I John")        ("II Jo" . "II John")
 | 
	
		
			
				|  |  | +    ("III Jo" . "III John")        ("Ju"    . "Jude")             ("Re"   . "Revelation of John"))
 | 
	
		
			
				|  |  | +  "A-list of abbreviations for Bible books.")
 | 
	
		
			
				|  |  | +
 | 
	
		
			
				|  |  |  ;;;; Book / chapter
 | 
	
		
			
				|  |  |  
 | 
	
		
			
				|  |  |  (defvar-local bm-current-book (assoc "Genesis" bm-books)
 | 
	
	
		
			
				|  | @@ -217,47 +258,49 @@
 | 
	
		
			
				|  |  |  (define-key bible-search-mode-map "s" 'bible-search)
 | 
	
		
			
				|  |  |  (define-key bible-search-mode-map "w" 'bm-toggle-word-study)
 | 
	
		
			
				|  |  |  (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-morph-mode-map (make-keymap))
 | 
	
		
			
				|  |  | -
 | 
	
		
			
				|  |  | +;; (defconst bible-term-morph-mode-map (make-keymap))
 | 
	
		
			
				|  |  |  
 | 
	
		
			
				|  |  |  ;;;
 | 
	
		
			
				|  |  |  ;;; Menu bar items
 | 
	
		
			
				|  |  |  ;;;
 | 
	
		
			
				|  |  | -;;; Right now just convenience items. More as I think of them.
 | 
	
		
			
				|  |  | -;;;
 | 
	
		
			
				|  |  | +
 | 
	
		
			
				|  |  |  (define-key global-map [menu-bar bible-mode]
 | 
	
		
			
				|  |  |  	    (cons "Bible Mode" (make-sparse-keymap "Bible Mode")))
 | 
	
		
			
				|  |  |  
 | 
	
		
			
				|  |  | -(defun bm-set-left-to-right ()
 | 
	
		
			
				|  |  | +(defun bible-set-left-to-right ()
 | 
	
		
			
				|  |  |    (interactive)
 | 
	
		
			
				|  |  |    (setq-local bidi-paragraph-direction 'left-to-right))
 | 
	
		
			
				|  |  |  
 | 
	
		
			
				|  |  | -(defun bm-set-right-to-left ()
 | 
	
		
			
				|  |  | +(defun bible-set-right-to-left ()
 | 
	
		
			
				|  |  |    (interactive)
 | 
	
		
			
				|  |  |    (setq-local bidi-paragraph-direction 'right-to-left))
 | 
	
		
			
				|  |  |  
 | 
	
		
			
				|  |  |  (define-key global-map
 | 
	
		
			
				|  |  |  	    [menu-bar bible-mode left-to-right]
 | 
	
		
			
				|  |  | -	    '("Left-to-right" . bm-set-left-to-right))
 | 
	
		
			
				|  |  | +	    '("Left-to-right" . bible-set-left-to-right))
 | 
	
		
			
				|  |  |  
 | 
	
		
			
				|  |  |  (define-key global-map 
 | 
	
		
			
				|  |  |  	    [menu-bar bible-mode right-to-left]
 | 
	
		
			
				|  |  | -	    '("Right-to-left" . bm-set-right-to-left))
 | 
	
		
			
				|  |  | +	    '("Right-to-left" . bible-set-right-to-left))
 | 
	
		
			
				|  |  |  
 | 
	
		
			
				|  |  | -(defvar-local bm-debugme nil)
 | 
	
		
			
				|  |  | +(defvar-local bm-debugme nil
 | 
	
		
			
				|  |  | +  "Make text show up as XML when set.")
 | 
	
		
			
				|  |  |  
 | 
	
		
			
				|  |  | -(defun bm-set-display-xml ()
 | 
	
		
			
				|  |  | +(defun bible-set-display-xml ()
 | 
	
		
			
				|  |  | +  "Turn on XML display."
 | 
	
		
			
				|  |  |    (interactive)
 | 
	
		
			
				|  |  |    (setq-local bm-debugme t)
 | 
	
		
			
				|  |  | -  (bm-display))
 | 
	
		
			
				|  |  | +  (bm--display))
 | 
	
		
			
				|  |  |  
 | 
	
		
			
				|  |  |  (defun bm-set-display-text ()
 | 
	
		
			
				|  |  | +  "Turn off XML display."
 | 
	
		
			
				|  |  |    (interactive)
 | 
	
		
			
				|  |  |    (setq-local bm-debugme nil)
 | 
	
		
			
				|  |  | -  (bm-display))
 | 
	
		
			
				|  |  | +  (bm--display))
 | 
	
		
			
				|  |  |  
 | 
	
		
			
				|  |  |  
 | 
	
		
			
				|  |  |  (define-key global-map 
 | 
	
	
		
			
				|  | @@ -271,11 +314,16 @@
 | 
	
		
			
				|  |  |  
 | 
	
		
			
				|  |  |  (define-key global-map
 | 
	
		
			
				|  |  |  	    [menu-bar bible-mode select-biblical-text]
 | 
	
		
			
				|  |  | -	    '("Select Module" . bm-display-available-modules))
 | 
	
		
			
				|  |  | +	    '("Select Module" . bm--display-available-modules))
 | 
	
		
			
				|  |  |  
 | 
	
		
			
				|  |  |  
 | 
	
		
			
				|  |  | +(define-key global-map
 | 
	
		
			
				|  |  | +	    [menu-bar bible-mode select-biblical-text]
 | 
	
		
			
				|  |  | +	    '("Toggle debug-on-error" . toggle-debug-on-error))
 | 
	
		
			
				|  |  | +
 | 
	
		
			
				|  |  |  
 | 
	
		
			
				|  |  |  (defun bm-display-greek ()
 | 
	
		
			
				|  |  | +  "This command is run by clicking on text, not directly by the user."
 | 
	
		
			
				|  |  |    (interactive)
 | 
	
		
			
				|  |  |    (let ((item (car (split-string (get-text-property (point) 'strong)))))
 | 
	
		
			
				|  |  |      ;; Remove "strong:G" prefix
 | 
	
	
		
			
				|  | @@ -286,10 +334,11 @@
 | 
	
		
			
				|  |  |  (define-key bm-greek-keymap [mouse-1] 'bm-display-greek)
 | 
	
		
			
				|  |  |  
 | 
	
		
			
				|  |  |  (defun bm-display-hebrew () 
 | 
	
		
			
				|  |  | +  "This command is run by clicking on text, not directly by the user."
 | 
	
		
			
				|  |  |    (interactive)
 | 
	
		
			
				|  |  |    (let ((item (car (split-string (get-text-property (point) 'strong)))))
 | 
	
		
			
				|  |  |      ;; Remove "strong:H" prefix and any alphabetic suffixes.
 | 
	
		
			
				|  |  | -    (bible-term-hebrew (replace-regexp-in-string "[a-zA-Z]" "" item nil nil nil 8))))
 | 
	
		
			
				|  |  | +    (bible-term-hebrew (replace-regexp-in-string "strong:H" "" item))))
 | 
	
		
			
				|  |  |  
 | 
	
		
			
				|  |  |  (defconst bm-hebrew-keymap (make-sparse-keymap))
 | 
	
		
			
				|  |  |  (define-key bm-hebrew-keymap (kbd "RET") 'bm-display-hebrew)
 | 
	
	
		
			
				|  | @@ -346,7 +395,7 @@
 | 
	
		
			
				|  |  |  \\{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))
 | 
	
		
			
				|  |  |  
 | 
	
	
		
			
				|  | @@ -367,7 +416,7 @@
 | 
	
		
			
				|  |  |    (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 (assoc (or book-name "Genesis") bm-books) (or chapter 1) verse)
 | 
	
		
			
				|  |  |      (set-window-buffer (get-buffer-window (current-buffer)) buf)))
 | 
	
		
			
				|  |  |  
 | 
	
		
			
				|  |  |  ;;;###autoload
 | 
	
	
		
			
				|  | @@ -376,13 +425,13 @@
 | 
	
		
			
				|  |  |    (interactive)
 | 
	
		
			
				|  |  |    (let* ((book-chapters (cdr bm-current-book))
 | 
	
		
			
				|  |  |  	 (chapter (min book-chapters (+ bm-current-chapter 1))))
 | 
	
		
			
				|  |  | -    (bm-set-location bm-current-book chapter)))
 | 
	
		
			
				|  |  | +    (bm--set-location bm-current-book chapter)))
 | 
	
		
			
				|  |  |  
 | 
	
		
			
				|  |  |  ;;;###autoload
 | 
	
		
			
				|  |  |  (defun bm-previous-chapter ()
 | 
	
		
			
				|  |  |    "Pages to the previous chapter for the active `bible-mode' buffer."
 | 
	
		
			
				|  |  |    (interactive)
 | 
	
		
			
				|  |  | -  (bm-set-location bm-current-book (max 1 (- bm-current-chapter 1))))
 | 
	
		
			
				|  |  | +  (bm--set-location bm-current-book (max 1 (- bm-current-chapter 1))))
 | 
	
		
			
				|  |  |  
 | 
	
		
			
				|  |  |  
 | 
	
		
			
				|  |  |  (defun bm-forward-word ()
 | 
	
	
		
			
				|  | @@ -400,11 +449,11 @@ XXX Doesn't work yet."
 | 
	
		
			
				|  |  |    (interactive)
 | 
	
		
			
				|  |  |    (let* ((completion-ignore-case t)
 | 
	
		
			
				|  |  |  	 (book-data (assoc (completing-read "Book: " bm-books nil t) bm-books))
 | 
	
		
			
				|  |  | -         (chapter (string-to-number (completing-read "Chapter: " (bm-list-number-range 1 (cdr book-data)) nil t))))
 | 
	
		
			
				|  |  | +         (chapter (string-to-number (completing-read "Chapter: " (bm--list-number-range 1 (cdr book-data)) nil t))))
 | 
	
		
			
				|  |  |      (setq-local bm-current-book book-data)
 | 
	
		
			
				|  |  |      (setq-local bm-current-book-name (car book-data))
 | 
	
		
			
				|  |  |      (setq-local bm-current-chapter chapter)
 | 
	
		
			
				|  |  | -    (bm-display)))
 | 
	
		
			
				|  |  | +    (bm--display)))
 | 
	
		
			
				|  |  |  
 | 
	
		
			
				|  |  |  
 | 
	
		
			
				|  |  |  ;;;###autoload
 | 
	
	
		
			
				|  | @@ -412,9 +461,9 @@ XXX Doesn't work yet."
 | 
	
		
			
				|  |  |    "Queries user to select a new chapter for the current `bible-mode' buffer."
 | 
	
		
			
				|  |  |    (interactive)
 | 
	
		
			
				|  |  |    (let* ((book-chapters (cdr bm-current-book))
 | 
	
		
			
				|  |  | -	 (chapter (string-to-number (completing-read "Chapter: " (bm-list-number-range 1 book-chapters) nil t))))
 | 
	
		
			
				|  |  | +	 (chapter (string-to-number (completing-read "Chapter: " (bm--list-number-range 1 book-chapters) nil t))))
 | 
	
		
			
				|  |  |      (when chapter
 | 
	
		
			
				|  |  | -      (bm-set-location bm-current-book chapter))))
 | 
	
		
			
				|  |  | +      (bm--set-location bm-current-book chapter))))
 | 
	
		
			
				|  |  |  
 | 
	
		
			
				|  |  |  ;;;###autoload
 | 
	
		
			
				|  |  |  (defun bm-select-module ()
 | 
	
	
		
			
				|  | @@ -422,7 +471,7 @@ XXX Doesn't work yet."
 | 
	
		
			
				|  |  |    (interactive)
 | 
	
		
			
				|  |  |    (let ((module (completing-read "Module: " bm-modules)))
 | 
	
		
			
				|  |  |      (setq-local bm-module module)
 | 
	
		
			
				|  |  | -    (bm-display)))
 | 
	
		
			
				|  |  | +    (bm--display)))
 | 
	
		
			
				|  |  |  
 | 
	
		
			
				|  |  |  ;;;###autoload
 | 
	
		
			
				|  |  |  (defun bm-toggle-word-study()
 | 
	
	
		
			
				|  | @@ -430,8 +479,8 @@ XXX Doesn't work yet."
 | 
	
		
			
				|  |  |    (interactive)
 | 
	
		
			
				|  |  |    (setq bm-word-study-enabled (not bm-word-study-enabled))
 | 
	
		
			
				|  |  |    (if (equal major-mode 'bible-search-mode)
 | 
	
		
			
				|  |  | -      (bm-display-search bm-search-query bm-search-mode bm-module)
 | 
	
		
			
				|  |  | -    (bm-display)))
 | 
	
		
			
				|  |  | +      (bm--display-search bm-search-query bm-search-mode bm-module)
 | 
	
		
			
				|  |  | +    (bm--display)))
 | 
	
		
			
				|  |  |  
 | 
	
		
			
				|  |  |  ;;;###autoload
 | 
	
		
			
				|  |  |  (defun bm-split-display ()
 | 
	
	
		
			
				|  | @@ -451,7 +500,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))))
 | 
	
		
			
				|  |  |  
 | 
	
		
			
				|  |  |  ;;;###autoload
 | 
	
		
			
				|  |  |  (defun bible-search-mode-follow-verse ()
 | 
	
	
		
			
				|  | @@ -469,26 +518,45 @@ creating a new `bible-mode' buffer positioned at the specified verse."
 | 
	
		
			
				|  |  |      (string-match ":[0-9]?[0-9]?[0-9]?" text)
 | 
	
		
			
				|  |  |      (setq verse (replace-regexp-in-string "[^0-9]" "" (match-string 0 text)))
 | 
	
		
			
				|  |  |      (setq book (replace-regexp-in-string "[ ][0-9]?[0-9]?[0-9]?:[0-9]?[0-9]?[0-9]?:$" "" text))
 | 
	
		
			
				|  |  | -    (bible-open book (string-to-number chapter) (string-to-number verse))))
 | 
	
		
			
				|  |  | +    (bible-open (string-trim book) (string-to-number chapter) (string-to-number verse))))
 | 
	
		
			
				|  |  | +
 | 
	
		
			
				|  |  | +(defun bible-search-mode-follow-xref ()
 | 
	
		
			
				|  |  | +  "Follows the hovered verse in a `bible-search-mode' buffer,
 | 
	
		
			
				|  |  | +creating a new `bible-mode' buffer positioned at the specified verse.
 | 
	
		
			
				|  |  | +N.B. We use the default module to avoid opening cans of worms regarding
 | 
	
		
			
				|  |  | +OT/NT etc."
 | 
	
		
			
				|  |  | +  (interactive)
 | 
	
		
			
				|  |  | +  (let* ((xref (get-text-property (point) 'xref))
 | 
	
		
			
				|  |  | +	 (verse-ref (string-split xref))
 | 
	
		
			
				|  |  | +	 book-abbrev
 | 
	
		
			
				|  |  | +	 book
 | 
	
		
			
				|  |  | +	 chapter-verse
 | 
	
		
			
				|  |  | +	 chapter
 | 
	
		
			
				|  |  | +	 verse)
 | 
	
		
			
				|  |  | +    (if (= (length verse-ref) 3) ; II Cor 3:17 or the like
 | 
	
		
			
				|  |  | +	(progn
 | 
	
		
			
				|  |  | +	  (setq book-abbrev (concat (car verse-ref) " " (cadr verse-ref)))
 | 
	
		
			
				|  |  | +	  (setq chapter-verse (split-string (caddr verse-ref) ":")))
 | 
	
		
			
				|  |  | +      (progn  ; Mat 5 or the like
 | 
	
		
			
				|  |  | +	(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 chapter (car chapter-verse)
 | 
	
		
			
				|  |  | +	  verse (cadr chapter-verse))
 | 
	
		
			
				|  |  | +    (bible-open (string-trim book) (string-to-number chapter) (string-to-number verse))))
 | 
	
		
			
				|  |  |  
 | 
	
		
			
				|  |  |  ;;;###autoload
 | 
	
		
			
				|  |  |  (defun bible-term-hebrew (term)
 | 
	
		
			
				|  |  |    "Queries user for a Strong's Hebrew Lexicon term."
 | 
	
		
			
				|  |  |    (interactive "sTerm: ")
 | 
	
		
			
				|  |  | -  (bm-open-term-hebrew term))
 | 
	
		
			
				|  |  | +  (bm--open-term-hebrew term))
 | 
	
		
			
				|  |  |  
 | 
	
		
			
				|  |  |  ;;;###autoload
 | 
	
		
			
				|  |  |  (defun bible-term-greek (term)
 | 
	
		
			
				|  |  |    "Queries user for a Strong's Greek Lexicon term."
 | 
	
		
			
				|  |  |    (interactive "sTerm: ")
 | 
	
		
			
				|  |  | -  (bm-open-term-greek term))
 | 
	
		
			
				|  |  | -
 | 
	
		
			
				|  |  | -;; (defun bible-term-morph (term morph-type)
 | 
	
		
			
				|  |  | -;;   "Queries user for a Strong's Greek Lexicon term."
 | 
	
		
			
				|  |  | -;;   (interactive "sTerm: ")
 | 
	
		
			
				|  |  | -;; ;;;  (message "bible-term-morph: %s:%s" term morph-type)
 | 
	
		
			
				|  |  | -;; ;;;  (bm-open-term-greek term)
 | 
	
		
			
				|  |  | -;;   )
 | 
	
		
			
				|  |  | +  (bm--open-term-greek term))
 | 
	
		
			
				|  |  |  
 | 
	
		
			
				|  |  |  ;;;###autoload
 | 
	
		
			
				|  |  |  (defun bible-insert ()
 | 
	
	
		
			
				|  | @@ -496,21 +564,21 @@ creating a new `bible-mode' buffer positioned at the specified verse."
 | 
	
		
			
				|  |  |    (interactive)
 | 
	
		
			
				|  |  |    (let* ((completion-ignore-case t)
 | 
	
		
			
				|  |  |  	 (book-data (assoc (completing-read "Book: " bm-books nil t) bm-books))
 | 
	
		
			
				|  |  | -         (chapter (when book-data (completing-read "Chapter: " (bm-list-number-range 1 (cdr book-data)) nil t)))
 | 
	
		
			
				|  |  | +         (chapter (when book-data (completing-read "Chapter: " (bm--list-number-range 1 (cdr book-data)) nil t)))
 | 
	
		
			
				|  |  |           (verse (when chapter (read-from-minibuffer "Verse: "))))
 | 
	
		
			
				|  |  |      (when verse
 | 
	
		
			
				|  |  |        (insert (string-trim
 | 
	
		
			
				|  |  |  	       (replace-regexp-in-string 
 | 
	
		
			
				|  |  |  		(regexp-opt `(,(concat "(" bm-module ")")))
 | 
	
		
			
				|  |  |  		"" 
 | 
	
		
			
				|  |  | -		(bm-exec-diatheke (concat (car book-data) " " chapter ":" verse) nil "plain")))))))
 | 
	
		
			
				|  |  | +		(bm--exec-diatheke (concat (car book-data) " " chapter ":" verse) nil "plain")))))))
 | 
	
		
			
				|  |  |  
 | 
	
		
			
				|  |  |  ;;;;; Support
 | 
	
		
			
				|  |  |  
 | 
	
		
			
				|  |  |  ;;;
 | 
	
		
			
				|  |  |  ;;; XXX I've magled this in an ad-hoc manner. It needs to be
 | 
	
		
			
				|  |  |  ;;; re-written so it is clearer (and correct, for that matter).
 | 
	
		
			
				|  |  | -(defun bm-exec-diatheke (query &optional filter format searchtype module)
 | 
	
		
			
				|  |  | +(defun bm--exec-diatheke (query &optional filter format searchtype module)
 | 
	
		
			
				|  |  |    "Executes `diatheke' with specified query options, returning the output."
 | 
	
		
			
				|  |  |    (let ((module (or module bm-module)))
 | 
	
		
			
				|  |  |      (with-temp-buffer
 | 
	
	
		
			
				|  | @@ -535,105 +603,179 @@ like `Of David' or the like.")
 | 
	
		
			
				|  |  |  ;;; Greek and Hebrew lexicon and morphology tooltip rendering.
 | 
	
		
			
				|  |  |  ;;;
 | 
	
		
			
				|  |  |  
 | 
	
		
			
				|  |  | -;;; Hash tables for STRONGS definitions.
 | 
	
		
			
				|  |  | +;;; 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 hebrew-hash (make-hash-table :test 'equal))
 | 
	
		
			
				|  |  | +(defvar hebrew-short-hash (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)) 
 | 
	
		
			
				|  |  |  
 | 
	
		
			
				|  |  | -;;; Hash tables for morphologies. Three at present.
 | 
	
		
			
				|  |  | +;;; 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)
 | 
	
		
			
				|  |  | +(defun bm--morph-query (query module)
 | 
	
		
			
				|  |  |    "Executes `diatheke' to do morph query, renders HTML, returns string.
 | 
	
		
			
				|  |  |  Does some tweaking specific to morphology."
 | 
	
		
			
				|  |  |    (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))
 | 
	
		
			
				|  |  | -      (replace-regexp-in-string
 | 
	
		
			
				|  |  | -       "\n:" ""                   ; This makes the Packard morphology display look better.
 | 
	
		
			
				|  |  | -       (replace-regexp-in-string 
 | 
	
		
			
				|  |  | -	"Part of Speech" ""       ; This helps the Robinson display look better.
 | 
	
		
			
				|  |  | -	(substring (buffer-string) (+ (length query) 1)) ; This tries to get rid of unnecessary query identifier.
 | 
	
		
			
				|  |  | -	)))))
 | 
	
		
			
				|  |  | +      (format-replace-strings 
 | 
	
		
			
				|  |  | +       '(("\n:" . "")              ; This makes the Packard morphology display look better.
 | 
	
		
			
				|  |  | +	 ("Part of Speech" . ""))     ; This helps the Robinson display look better.
 | 
	
		
			
				|  |  | +	 nil (point-min) (point-max))
 | 
	
		
			
				|  |  | +      (substring (buffer-string) (+ (length query) 1))) ; This tries to get rid of unnecessary query identifier.
 | 
	
		
			
				|  |  | +    ))
 | 
	
		
			
				|  |  |  
 | 
	
		
			
				|  |  |  
 | 
	
		
			
				|  |  |  ;;; Use "plain" format with diatheke.
 | 
	
		
			
				|  |  | -(defun bm-lex-query (query module)
 | 
	
		
			
				|  |  | +(defun bm--lex-query (query module)
 | 
	
		
			
				|  |  |    "Executes `diatheke' for query, plain format, returns string."
 | 
	
		
			
				|  |  |    ;; Get rid of query ID at front of string: ?????:
 | 
	
		
			
				|  |  | -  (bm-exec-diatheke query nil "plain" nil module))
 | 
	
		
			
				|  |  | +  (bm--exec-diatheke query nil "plain" nil module))
 | 
	
		
			
				|  |  | +
 | 
	
		
			
				|  |  |  
 | 
	
		
			
				|  |  | -(defun bm-lookup-strongs-greek (window object pos)
 | 
	
		
			
				|  |  | +(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.
 | 
	
		
			
				|  |  | -Note: compiler warns about unused argument `window'."
 | 
	
		
			
				|  |  | +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))           ; Compiler warns about match.
 | 
	
		
			
				|  |  | +	 (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 bm-short-greek-lexicon) 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)
 | 
	
		
			
				|  |  | +      (puthash key 
 | 
	
		
			
				|  |  | +	       (string-trim 
 | 
	
		
			
				|  |  | +		(replace-regexp-in-string
 | 
	
		
			
				|  |  | +		 "(AbbottSmithStrongs)" "" 
 | 
	
		
			
				|  |  | +		 (bm--lex-query key "AbbottSmithStrongs")))
 | 
	
		
			
				|  |  | +	       abbott-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."
 | 
	
		
			
				|  |  | +  (with-temp-buffer
 | 
	
		
			
				|  |  | +    (let ((args (list "diatheke" nil (current-buffer) t "-b" "AbbottSmith" "-o" "m" "-f" "plain" "-k" lemma)))
 | 
	
		
			
				|  |  | +      (apply 'call-process args)
 | 
	
		
			
				|  |  | +      (format-replace-strings
 | 
	
		
			
				|  |  | +       '((" I." . "\n    I.")
 | 
	
		
			
				|  |  | +	 (" 1." . "\n    1.")
 | 
	
		
			
				|  |  | +	 ("      (a)" . "\n       (a)")
 | 
	
		
			
				|  |  | +	 (". ." . ".")
 | 
	
		
			
				|  |  | +	 (" . " . ". ")))
 | 
	
		
			
				|  |  | +      (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)
 | 
	
		
			
				|  |  | +	(add-face-text-property (match-beginning 0) (match-end 0) '(:foreground "blue"))
 | 
	
		
			
				|  |  | +	))
 | 
	
		
			
				|  |  | +    (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-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.
 | 
	
		
			
				|  |  | +
 | 
	
		
			
				|  |  | +Compiler warns about unused Window argument."
 | 
	
		
			
				|  |  | +  (let* ((query (get-text-property pos 'strong object))
 | 
	
		
			
				|  |  | +	 (match (string-match "[0-9]+" query)) ; Compiler warns about unused match variable.
 | 
	
		
			
				|  |  | +	 (lookup-key (match-string 0 query)))
 | 
	
		
			
				|  |  | +    (when lookup-key
 | 
	
		
			
				|  |  | +      (bm--lookup-lex-def-abbott lookup-key))))
 | 
	
		
			
				|  |  |  
 | 
	
		
			
				|  |  |  
 | 
	
		
			
				|  |  | -(defun bm-hebrew-lex-query (query module)
 | 
	
		
			
				|  |  | -  "Executes `diatheke' to do hebrew query, renders HTML, returns string."
 | 
	
		
			
				|  |  | +
 | 
	
		
			
				|  |  | +;;; 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)
 | 
	
		
			
				|  |  | +(defun bm--lookup-strongs-hebrew (window object pos)
 | 
	
		
			
				|  |  |    "Look up Hebrew lexical data for object at point. If not found in hash table,
 | 
	
		
			
				|  |  |  get it from sword database, stash in hash table, and return data.
 | 
	
		
			
				|  |  |  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.
 | 
	
		
			
				|  |  | -	 (lookup-key (match-string 0 query)))
 | 
	
		
			
				|  |  | -    (and lookup-key
 | 
	
		
			
				|  |  | -	 (or (gethash lookup-key hebrew-hash)
 | 
	
		
			
				|  |  | -	     ;; Use PLAIN format for lookup. XXX directionality problems.
 | 
	
		
			
				|  |  | -	     (puthash lookup-key (bm-lex-query lookup-key bm-short-hebrew-lexicon) hebrew-hash)))))
 | 
	
		
			
				|  |  | -
 | 
	
		
			
				|  |  | -(defun bm-morph-database-lookup (query database hash)
 | 
	
		
			
				|  |  | +	 (match-string (match-string 0 query)))
 | 
	
		
			
				|  |  | +    (when match-string
 | 
	
		
			
				|  |  | +      (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)))
 | 
	
		
			
				|  |  | +	      ;; XXX massage this text to handle outline formatting a bit better.
 | 
	
		
			
				|  |  | +	      (puthash lookup-key raw-text hebrew-hash)))))))
 | 
	
		
			
				|  |  | +
 | 
	
		
			
				|  |  | +(defun bm--morph-database-lookup (query database hash)
 | 
	
		
			
				|  |  |    (or (gethash query hash)
 | 
	
		
			
				|  |  | -      (puthash query (bm-morph-query query database) hash)))
 | 
	
		
			
				|  |  | -
 | 
	
		
			
				|  |  | -(defun substitute-key-definition (olddef newdef keymap)
 | 
	
		
			
				|  |  | -  (message "calling me")
 | 
	
		
			
				|  |  | -  nil)
 | 
	
		
			
				|  |  | -			   
 | 
	
		
			
				|  |  | +      (puthash query (bm--morph-query query database) hash)))
 | 
	
		
			
				|  |  |  
 | 
	
		
			
				|  |  | -(defun bm-show-lex-morph (window object pos)
 | 
	
		
			
				|  |  | +;;;
 | 
	
		
			
				|  |  | +;;; Get string for tooltip display
 | 
	
		
			
				|  |  | +;;;
 | 
	
		
			
				|  |  | +(defun bm--show-lex-morph (window object pos)
 | 
	
		
			
				|  |  |    (let* ((lex-morph-text "")
 | 
	
		
			
				|  |  |  	 (lex (get-text-property pos 'strong object))
 | 
	
		
			
				|  |  | +	 (lex-module nil)
 | 
	
		
			
				|  |  |  	 (lex-text
 | 
	
		
			
				|  |  |  	  (cond ((string-match "strong:G" lex)
 | 
	
		
			
				|  |  | -	   	 (bm-lookup-strongs-greek window object pos))
 | 
	
		
			
				|  |  | +		 (setq lex-module bm-short-greek-lexicon)
 | 
	
		
			
				|  |  | +	   	 (bm--lookup-strongs-greek window object pos))
 | 
	
		
			
				|  |  |  		((string-match "strong:H" lex)
 | 
	
		
			
				|  |  | -		 (bm-lookup-strongs-hebrew window object pos)))))
 | 
	
		
			
				|  |  | +		 (setq lex-module bm-short-hebrew-lexicon)
 | 
	
		
			
				|  |  | +		 (bm--lookup-strongs-hebrew window object pos)))))
 | 
	
		
			
				|  |  | +    (setq lex-text (string-replace (concat "(" lex-module ")") "" lex-text))
 | 
	
		
			
				|  |  |      (let* ((morph (get-text-property pos 'morph object))
 | 
	
		
			
				|  |  | +	   (morph-module nil)
 | 
	
		
			
				|  |  |  	   (morph-text
 | 
	
		
			
				|  |  | -	    (cond ((null morph) "")
 | 
	
		
			
				|  |  | +	    (cond ((null morph) nil)
 | 
	
		
			
				|  |  |  		  ((string-match "robinson:" morph)
 | 
	
		
			
				|  |  | -	   	   (bm-morph-database-lookup (replace-regexp-in-string "robinson:" "" morph) "Robinson" robinson-hash))
 | 
	
		
			
				|  |  | +		   (setq morph-module "Robinson")
 | 
	
		
			
				|  |  | +	   	   (bm--morph-database-lookup (replace-regexp-in-string "robinson:" "" morph) morph-module robinson-hash))
 | 
	
		
			
				|  |  |  		  ((string-match "packard:" morph)
 | 
	
		
			
				|  |  | -		   (bm-morph-database-lookup (replace-regexp-in-string "packard:" "" morph) "Packard" packard-hash))
 | 
	
		
			
				|  |  | +		   (setq morph-module "Packard")
 | 
	
		
			
				|  |  | +		   (bm--morph-database-lookup (replace-regexp-in-string "packard:" "" morph) morph-module packard-hash))
 | 
	
		
			
				|  |  |  		  ((string-match "oshm:" morph)
 | 
	
		
			
				|  |  | -	   	   (bm-morph-database-lookup (replace-regexp-in-string "oshm:" "" morph) "OSHM" oshm-hash)))))
 | 
	
		
			
				|  |  | +		   (setq morph-module "OSHM")
 | 
	
		
			
				|  |  | +	   	   (bm--morph-database-lookup (replace-regexp-in-string "oshm:" "" morph) morph-module oshm-hash)))))
 | 
	
		
			
				|  |  |        (when lex-text
 | 
	
		
			
				|  |  | -	(setq lex-morph-text lex-text))
 | 
	
		
			
				|  |  | +	(setq lex-morph-text (string-trim (string-fill lex-text 75))))
 | 
	
		
			
				|  |  |        (when morph-text
 | 
	
		
			
				|  |  | -	(setq lex-morph-text (concat lex-morph-text "\n" morph-text)))
 | 
	
		
			
				|  |  | +	(setq lex-morph-text 
 | 
	
		
			
				|  |  | +	      (concat lex-morph-text "\n\n"
 | 
	
		
			
				|  |  | +		      (string-trim (string-replace (concat "(" morph-module ")") "" morph-text)))))
 | 
	
		
			
				|  |  |        ;; This prevents bogus command substitutions in the tooltip by
 | 
	
		
			
				|  |  | -      ;; removing backslashes.
 | 
	
		
			
				|  |  | -      (setq lex-morph-text (replace-regexp-in-string "\\\\" "" lex-morph-text))
 | 
	
		
			
				|  |  | -      lex-morph-text)))
 | 
	
		
			
				|  |  | +      ;; removing backslashes. XXX I couldn't figure out a better way
 | 
	
		
			
				|  |  | +      ;; to bypass command substitution in the tooltips.
 | 
	
		
			
				|  |  | +      (setq lex-morph-text (replace-regexp-in-string "\\\\" "" lex-morph-text)))))
 | 
	
		
			
				|  |  |  
 | 
	
		
			
				|  |  |  
 | 
	
		
			
				|  |  | -(defun bm-process-word (item iproperties)
 | 
	
		
			
				|  |  | +
 | 
	
		
			
				|  |  | +(defun bm--process-word (item iproperties)
 | 
	
		
			
				|  |  |    "Word study. Add tooltips for definitions and morphologyl. 
 | 
	
		
			
				|  |  |  Insert lemmas in buffer. Must be done after item is inserted in buffer."
 | 
	
		
			
				|  |  |  
 | 
	
	
		
			
				|  | @@ -661,7 +803,7 @@ Insert lemmas in buffer. Must be done after item is inserted in buffer."
 | 
	
		
			
				|  |  |  	  (let ((strongs-ref (match-string 0 strongs)))
 | 
	
		
			
				|  |  |  	    (add-face-text-property refstart refend 'bold)
 | 
	
		
			
				|  |  |        	    (put-text-property refstart refend 'keymap bm-hebrew-keymap)
 | 
	
		
			
				|  |  | -	    (put-text-property refstart refend 'help-echo 'bm-show-lex-morph)
 | 
	
		
			
				|  |  | +	    (put-text-property refstart refend 'help-echo 'bm--show-lex-morph)
 | 
	
		
			
				|  |  |  	    (put-text-property refstart refend 'strong strongs-ref))))
 | 
	
		
			
				|  |  |  
 | 
	
		
			
				|  |  |        ;; lexical definitions
 | 
	
	
		
			
				|  | @@ -676,7 +818,7 @@ Insert lemmas in buffer. Must be done after item is inserted in buffer."
 | 
	
		
			
				|  |  |  	  ;; Add help-echo, strongs reference for tooltips if match.
 | 
	
		
			
				|  |  |  	  (when matched
 | 
	
		
			
				|  |  |  	    (setq-local bm-has-strongs t)
 | 
	
		
			
				|  |  | -	    (put-text-property refstart refend 'help-echo 'bm-show-lex-morph)
 | 
	
		
			
				|  |  | +	    (put-text-property refstart refend 'help-echo 'bm--show-lex-morph)
 | 
	
		
			
				|  |  |  	    (put-text-property refstart refend 'strong matched))))
 | 
	
		
			
				|  |  |  
 | 
	
		
			
				|  |  |        ;; morphology
 | 
	
	
		
			
				|  | @@ -694,7 +836,7 @@ Insert lemmas in buffer. Must be done after item is inserted in buffer."
 | 
	
		
			
				|  |  |  	  (when matched
 | 
	
		
			
				|  |  |  	    (setq-local bm-has-morphology t)
 | 
	
		
			
				|  |  |  	    (put-text-property refstart refend 'morph matched)
 | 
	
		
			
				|  |  | -	    (put-text-property refstart refend 'help-echo 'bm-show-lex-morph))))
 | 
	
		
			
				|  |  | +	    (put-text-property refstart refend 'help-echo 'bm--show-lex-morph))))
 | 
	
		
			
				|  |  |  
 | 
	
		
			
				|  |  |        ;; Insert lemma into buffer. Lemma tag will be part of savlm item.
 | 
	
		
			
				|  |  |        (when (and bm-word-study-enabled savlm (string-match "lemma.*:.*" savlm))
 | 
	
	
		
			
				|  | @@ -707,9 +849,9 @@ Insert lemmas in buffer. Must be done after item is inserted in buffer."
 | 
	
		
			
				|  |  |  	    (put-text-property refstart refend 'keymap bm-lemma-keymap)))))))
 | 
	
		
			
				|  |  |  
 | 
	
		
			
				|  |  |  
 | 
	
		
			
				|  |  | -(defun bm-insert-domnode-recursive (node &optional iproperties notitle)
 | 
	
		
			
				|  |  | +(defun bm--insert-domnode-recursive (node &optional iproperties notitle)
 | 
	
		
			
				|  |  |    "Recursively parses a domnode from `libxml-parse-html-region's usage on text
 | 
	
		
			
				|  |  | -produced by `bm-exec-diatheke'. Outputs text to active buffer 
 | 
	
		
			
				|  |  | +produced by `bm--exec-diatheke'. Outputs text to active buffer 
 | 
	
		
			
				|  |  |  with properties.
 | 
	
		
			
				|  |  |  In processing subnodes, each case will prepend a space if it needs it."
 | 
	
		
			
				|  |  |  
 | 
	
	
		
			
				|  | @@ -728,23 +870,22 @@ In processing subnodes, each case will prepend a space if it needs it."
 | 
	
		
			
				|  |  |  	   ;; Insert the subnode. Highlight the verse references.
 | 
	
		
			
				|  |  |  	   (insert subnode)
 | 
	
		
			
				|  |  |  	   ;; XXX this is still not quite right
 | 
	
		
			
				|  |  | -	   (let ((verse-start (string-match ".+?:[0-9]?[0-9]?[0-9]?:" subnode)))
 | 
	
		
			
				|  |  | +	   (let ((verse-start (string-match bm-verse-regexp subnode)))
 | 
	
		
			
				|  |  |  	     (when verse-start
 | 
	
		
			
				|  |  |  	       (let* ((verse-match (string-trim (match-string 0 subnode)))
 | 
	
		
			
				|  |  |  		      (verse-start-text (string-trim-left (substring subnode verse-start (length subnode))))
 | 
	
		
			
				|  |  | -;;		      (subnode (concat (substring subnode 0 verse-start) verse-start-text))
 | 
	
		
			
				|  |  |  		      (start (- (point) 1 (length (string-trim-right verse-start-text)))))
 | 
	
		
			
				|  |  |  		 (add-face-text-property start (+ start (length (string-trim-right verse-match))) '(:foreground "purple"))))))
 | 
	
		
			
				|  |  |  	  ((eq (dom-tag subnode) 'title)
 | 
	
		
			
				|  |  |  	   (if notitle nil
 | 
	
		
			
				|  |  |  	     (progn
 | 
	
		
			
				|  |  |  	       (setq bm-chapter-title subnode))))
 | 
	
		
			
				|  |  | -	  ((eq (dom-tag subnode) 'body) (bm-insert-domnode-recursive subnode iproperties notitle))
 | 
	
		
			
				|  |  | +	  ((eq (dom-tag subnode) 'body) (bm--insert-domnode-recursive subnode iproperties notitle))
 | 
	
		
			
				|  |  |  	  ((eq (dom-tag subnode) 'seg) ; NASB Module uses this to indicate OT quotations (and others?).
 | 
	
		
			
				|  |  | -	   (bm-insert-domnode-recursive subnode iproperties notitle))
 | 
	
		
			
				|  |  | -	  ((eq (dom-tag subnode) 'q) (bm-insert-domnode-recursive subnode iproperties notitle))
 | 
	
		
			
				|  |  | -	  ((eq (dom-tag subnode) 'p) (bm-insert-domnode-recursive subnode iproperties notitle))
 | 
	
		
			
				|  |  | -	  ((eq (dom-tag subnode) 'w) (insert " ") (bm-process-word subnode iproperties))
 | 
	
		
			
				|  |  | +	   (bm--insert-domnode-recursive subnode iproperties notitle))
 | 
	
		
			
				|  |  | +	  ((eq (dom-tag subnode) 'q) (bm--insert-domnode-recursive subnode iproperties notitle))
 | 
	
		
			
				|  |  | +	  ((eq (dom-tag subnode) 'p) (bm--insert-domnode-recursive subnode iproperties notitle))
 | 
	
		
			
				|  |  | +	  ((eq (dom-tag subnode) 'w) (insert " ") (bm--process-word subnode iproperties))
 | 
	
		
			
				|  |  |  	  ((eq (dom-tag subnode) 'milestone) (insert "\n"))
 | 
	
		
			
				|  |  |  	  ((eq (dom-tag subnode) 'transchange) ; Word inserted by translation, not in original, give visual indication.
 | 
	
		
			
				|  |  |  	   (let ((word (dom-text subnode)))
 | 
	
	
		
			
				|  | @@ -755,16 +896,16 @@ In processing subnodes, each case will prepend a space if it needs it."
 | 
	
		
			
				|  |  |  (defvar bm-debugme nil)
 | 
	
		
			
				|  |  |  (setf bm-debugme nil)
 | 
	
		
			
				|  |  |  
 | 
	
		
			
				|  |  | -(defun bm-display (&optional verse)
 | 
	
		
			
				|  |  | +(defun bm--display (&optional verse)
 | 
	
		
			
				|  |  |    "Renders text for `bible-mode'"
 | 
	
		
			
				|  |  |  
 | 
	
		
			
				|  |  | -  ;; Clear buffer and insert the result of calling bm-exec-diatheke.
 | 
	
		
			
				|  |  | +  ;; Clear buffer and insert the result of calling bm--exec-diatheke.
 | 
	
		
			
				|  |  |    (setq buffer-read-only nil)
 | 
	
		
			
				|  |  |    (erase-buffer)
 | 
	
		
			
				|  |  |    (setq bm-chapter-title nil
 | 
	
		
			
				|  |  |  	bm-has-strongs nil
 | 
	
		
			
				|  |  |  	bm-has-morphology nil)
 | 
	
		
			
				|  |  | -  (insert (bm-exec-diatheke (concat bm-current-book-name ":" (number-to-string bm-current-chapter))))
 | 
	
		
			
				|  |  | +  (insert (bm--exec-diatheke (concat bm-current-book-name ":" (number-to-string bm-current-chapter))))
 | 
	
		
			
				|  |  |  
 | 
	
		
			
				|  |  |    ;; Parse the xml in the buffer into a DOM tree.
 | 
	
		
			
				|  |  |    (let ((html-dom-tree (libxml-parse-html-region (point-min) (point-max))))
 | 
	
	
		
			
				|  | @@ -773,7 +914,7 @@ In processing subnodes, each case will prepend a space if it needs it."
 | 
	
		
			
				|  |  |  	(progn
 | 
	
		
			
				|  |  |  	  (erase-buffer)
 | 
	
		
			
				|  |  |  	  ;; Looking for the "body" tag in the DOM node.
 | 
	
		
			
				|  |  | -	  (bm-insert-domnode-recursive (dom-by-tag html-dom-tree 'body) nil nil)
 | 
	
		
			
				|  |  | +	  (bm--insert-domnode-recursive (dom-by-tag html-dom-tree 'body) nil nil)
 | 
	
		
			
				|  |  |  	  (goto-char (point-min)))
 | 
	
		
			
				|  |  |  ;;;      (shr-render-region (point-min) (point-max))
 | 
	
		
			
				|  |  |        ))
 | 
	
	
		
			
				|  | @@ -813,9 +954,9 @@ In processing subnodes, each case will prepend a space if it needs it."
 | 
	
		
			
				|  |  |      (beginning-of-line)))
 | 
	
		
			
				|  |  |  
 | 
	
		
			
				|  |  |  
 | 
	
		
			
				|  |  | -(defun bm-list-biblical-modules ()
 | 
	
		
			
				|  |  | +(defun bm--list-biblical-modules ()
 | 
	
		
			
				|  |  |    "Returns a list of accessible Biblical Text modules."
 | 
	
		
			
				|  |  | -  (let ((text (bm-exec-diatheke "modulelist" nil nil nil "system"))
 | 
	
		
			
				|  |  | +  (let ((text (bm--exec-diatheke "modulelist" nil nil nil "system"))
 | 
	
		
			
				|  |  |  	modules)
 | 
	
		
			
				|  |  |      (catch 'done
 | 
	
		
			
				|  |  |        (dolist (line (split-string text "\n"))
 | 
	
	
		
			
				|  | @@ -827,7 +968,6 @@ In processing subnodes, each case will prepend a space if it needs it."
 | 
	
		
			
				|  |  |  
 | 
	
		
			
				|  |  |  (defun bm-pick-module ()
 | 
	
		
			
				|  |  |    (interactive)
 | 
	
		
			
				|  |  | -  (message "Picking module at %s" (point))
 | 
	
		
			
				|  |  |    (let ((item (get-text-property (point) 'module)))
 | 
	
		
			
				|  |  |      (setq-default bm-module item)
 | 
	
		
			
				|  |  |      (bible-open)))
 | 
	
	
		
			
				|  | @@ -840,7 +980,7 @@ In processing subnodes, each case will prepend a space if it needs it."
 | 
	
		
			
				|  |  |  (defun bm-display-available-modules ()
 | 
	
		
			
				|  |  |    (interactive)
 | 
	
		
			
				|  |  |    (let ((buf (get-buffer-create "Modules"))
 | 
	
		
			
				|  |  | -	(mods (bm-list-biblical-modules)))
 | 
	
		
			
				|  |  | +	(mods (bm--list-biblical-modules)))
 | 
	
		
			
				|  |  |      (set-buffer buf)
 | 
	
		
			
				|  |  |      (module-select-mode)
 | 
	
		
			
				|  |  |      (setq buffer-read-only nil)
 | 
	
	
		
			
				|  | @@ -859,28 +999,28 @@ In processing subnodes, each case will prepend a space if it needs it."
 | 
	
		
			
				|  |  |      (pop-to-buffer buf nil t)))
 | 
	
		
			
				|  |  |  
 | 
	
		
			
				|  |  |  
 | 
	
		
			
				|  |  | -
 | 
	
		
			
				|  |  |  ;;;;; Bible Searching
 | 
	
		
			
				|  |  |  
 | 
	
		
			
				|  |  | -(defun bm-open-search (query searchmode)
 | 
	
		
			
				|  |  | +(defun bm--open-search (query searchmode)
 | 
	
		
			
				|  |  |    "Opens a search buffer of QUERY using SEARCHMODE."
 | 
	
		
			
				|  |  |    (let ((buf (get-buffer-create (concat "*bible-search-" (downcase bm-module) "-" query "*"))))
 | 
	
		
			
				|  |  |      (set-buffer buf)
 | 
	
		
			
				|  |  |      (bible-search-mode)
 | 
	
		
			
				|  |  | -    (bm-display-search query searchmode bm-module)
 | 
	
		
			
				|  |  | +    (bm--display-search query searchmode bm-module)
 | 
	
		
			
				|  |  |      (pop-to-buffer buf nil t)))
 | 
	
		
			
				|  |  |  
 | 
	
		
			
				|  |  | -(defun bm-display-search (query searchmode mod)
 | 
	
		
			
				|  |  | +(defun bm--display-search (query searchmode mod)
 | 
	
		
			
				|  |  |    "Renders results of search QUERY from SEARHCMODE"
 | 
	
		
			
				|  |  |    (setq buffer-read-only nil)
 | 
	
		
			
				|  |  |    (erase-buffer)
 | 
	
		
			
				|  |  |    
 | 
	
		
			
				|  |  |    (let* ((result (string-trim (replace-regexp-in-string 
 | 
	
		
			
				|  |  |  			       "Entries .+?--" "" 
 | 
	
		
			
				|  |  | -			       (bm-exec-diatheke query nil "plain" searchmode mod))))
 | 
	
		
			
				|  |  | +			       (bm--exec-diatheke query nil "plain" searchmode mod))))
 | 
	
		
			
				|  |  |  	 (match 0)
 | 
	
		
			
				|  |  |  	 (matchstr "")
 | 
	
		
			
				|  |  | -	 (verses "")
 | 
	
		
			
				|  |  | +	 (verses nil)
 | 
	
		
			
				|  |  | +	 (query-verses "")
 | 
	
		
			
				|  |  |  	 fullverses)
 | 
	
		
			
				|  |  |      (if (equal result (concat "none (" bm-module ")"))
 | 
	
		
			
				|  |  |  	(insert "No results found." (when (equal searchmode "lucene") " Verify index has been build with mkfastmod."))
 | 
	
	
		
			
				|  | @@ -888,18 +1028,31 @@ In processing subnodes, each case will prepend a space if it needs it."
 | 
	
		
			
				|  |  |  	(while match
 | 
	
		
			
				|  |  |  	  (setq match (string-match ".+?:[0-9]?[0-9]?" result (+ match (length matchstr)))
 | 
	
		
			
				|  |  |  		matchstr (match-string 0 result))
 | 
	
		
			
				|  |  | +
 | 
	
		
			
				|  |  |  	  (when match
 | 
	
		
			
				|  |  | -            (setq verses (concat verses (replace-regexp-in-string ".+; " "" matchstr) ";"))))
 | 
	
		
			
				|  |  | +	    (push
 | 
	
		
			
				|  |  | +	     ;; Massage match to make it more sortable, get rid of
 | 
	
		
			
				|  |  | +	     ;; some characters.
 | 
	
		
			
				|  |  | +	     (replace-regexp-in-string 
 | 
	
		
			
				|  |  | +	      "I " "1"
 | 
	
		
			
				|  |  | +	      (replace-regexp-in-string
 | 
	
		
			
				|  |  | +	       "II " "2"
 | 
	
		
			
				|  |  | +	       (replace-regexp-in-string ".+; " "" matchstr)))
 | 
	
		
			
				|  |  | +	     verses)))
 | 
	
		
			
				|  |  |  
 | 
	
		
			
				|  |  |  	(setq match 0)
 | 
	
		
			
				|  |  | -	(setq fullverses (bm-exec-diatheke verses))
 | 
	
		
			
				|  |  | +	(setq verses (sort verses))
 | 
	
		
			
				|  |  | +	(dolist (verse verses)
 | 
	
		
			
				|  |  | +	  (if query-verses
 | 
	
		
			
				|  |  | +	      (setq query-verses (concat query-verses ";" verse))
 | 
	
		
			
				|  |  | +	    (setq query-verses verse)))
 | 
	
		
			
				|  |  | +	(setq fullverses (bm--exec-diatheke query-verses))
 | 
	
		
			
				|  |  |  
 | 
	
		
			
				|  |  |  	(insert fullverses)
 | 
	
		
			
				|  |  | -	(sort-lines nil (point-min) (point-max))
 | 
	
		
			
				|  |  |  	    
 | 
	
		
			
				|  |  |  	(let* ((html-dom-tree (libxml-parse-html-region (point-min) (point-max))))
 | 
	
		
			
				|  |  |  	  (erase-buffer)
 | 
	
		
			
				|  |  | -	  (bm-insert-domnode-recursive (dom-by-tag html-dom-tree 'body) nil nil)
 | 
	
		
			
				|  |  | +	  (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)
 | 
	
		
			
				|  |  |  	    (replace-match "")))))
 | 
	
	
		
			
				|  | @@ -917,7 +1070,8 @@ In processing subnodes, each case will prepend a space if it needs it."
 | 
	
		
			
				|  |  |  ;; ;; xxx Do something here?
 | 
	
		
			
				|  |  |  ;;  )
 | 
	
		
			
				|  |  |  
 | 
	
		
			
				|  |  | -(defun bm-display-term (termtype)
 | 
	
		
			
				|  |  | +(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))))
 | 
	
		
			
				|  |  |        ((not match))
 | 
	
	
		
			
				|  | @@ -926,43 +1080,45 @@ In processing subnodes, each case will prepend a space if it needs it."
 | 
	
		
			
				|  |  |             (refstart (+ match 1))
 | 
	
		
			
				|  |  |             (refend (+ match 1 matchstrlen)))
 | 
	
		
			
				|  |  |        ;; This enables clicking on the Strong's numbers inside the term display.
 | 
	
		
			
				|  |  | -      (add-face-text-property refstart refend `(:foreground "blue"))
 | 
	
		
			
				|  |  |        (cond ((eq termtype 'hebrew)
 | 
	
		
			
				|  |  |  	     (put-text-property refstart refend 'strong (concat "strong:H" matchstr))
 | 
	
		
			
				|  |  | -	     (put-text-property refstart refend 'keymap bm-hebrew-keymap))
 | 
	
		
			
				|  |  | -	    ((eq termtype 'greek)
 | 
	
		
			
				|  |  | +	     (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 
 | 
	
		
			
				|  |  |  	     (put-text-property refstart refend 'strong (concat "strong:G" matchstr))
 | 
	
		
			
				|  |  | -	     (put-text-property refstart refend 'keymap bm-greek-keymap)))))
 | 
	
		
			
				|  |  | +	     (put-text-property refstart refend 'keymap bm-greek-keymap)
 | 
	
		
			
				|  |  | +	     (add-face-text-property refstart refend `(:foreground "blue"))))))
 | 
	
		
			
				|  |  | +    
 | 
	
		
			
				|  |  |    (goto-char (point-min))
 | 
	
		
			
				|  |  | -  (while (search-forward (concat "(" bm-module ")") nil t)
 | 
	
		
			
				|  |  | -    (replace-match ""))
 | 
	
		
			
				|  |  | +;;  (while (search-forward (concat "(" bm-module ")") nil t)
 | 
	
		
			
				|  |  | +;;    (replace-match ""))
 | 
	
		
			
				|  |  |    (while (search-forward "()" nil t)
 | 
	
		
			
				|  |  |      (replace-match ""))
 | 
	
		
			
				|  |  |    (goto-char (point-min))
 | 
	
		
			
				|  |  |    (setq buffer-read-only t))
 | 
	
		
			
				|  |  |  
 | 
	
		
			
				|  |  | -(defun bm-open-term-hebrew (term)
 | 
	
		
			
				|  |  | +(defun bm--open-term-hebrew (term)
 | 
	
		
			
				|  |  |    "Opens a buffer of the Strong's Hebrew TERM's definition"
 | 
	
		
			
				|  |  |    (let ((buf (get-buffer-create (concat "*bible-term-hebrew-" term "*"))))
 | 
	
		
			
				|  |  |      (set-buffer buf)
 | 
	
		
			
				|  |  |      (bible-term-hebrew-mode)
 | 
	
		
			
				|  |  | -    (bm-display-term-hebrew term)
 | 
	
		
			
				|  |  | +    (bm--display-term-hebrew term)
 | 
	
		
			
				|  |  |      (pop-to-buffer buf nil t)
 | 
	
		
			
				|  |  |      (fit-window-to-buffer)))
 | 
	
		
			
				|  |  |  
 | 
	
		
			
				|  |  | -(defun bm-open-term-greek (term)
 | 
	
		
			
				|  |  | +(defun bm--open-term-greek (term)
 | 
	
		
			
				|  |  |    "Opens a buffer of the Strong's Greek TERM's definition"
 | 
	
		
			
				|  |  |    (let ((buf (get-buffer-create (concat "*bible-term-greek-" term "*"))))
 | 
	
		
			
				|  |  |      (set-buffer buf)
 | 
	
		
			
				|  |  |      (bible-term-greek-mode)
 | 
	
		
			
				|  |  | -    (bm-display-term-greek term)
 | 
	
		
			
				|  |  | +    (bm--display-term-greek term)
 | 
	
		
			
				|  |  |      (pop-to-buffer buf nil t)
 | 
	
		
			
				|  |  |      (fit-window-to-buffer)))
 | 
	
		
			
				|  |  |  
 | 
	
		
			
				|  |  |  ;;;
 | 
	
		
			
				|  |  |  ;;; Note: Hebrew display of terms is backwards; set bidi direction to
 | 
	
		
			
				|  |  |  ;;; 'left-to-right.
 | 
	
		
			
				|  |  | -(defun bm-display-term-hebrew (term)
 | 
	
		
			
				|  |  | +(defun bm--display-term-hebrew (term)
 | 
	
		
			
				|  |  |    "Render the definition of the Strong's Hebrew TERM. Use
 | 
	
		
			
				|  |  |  bidi-paragraph-direction so the English text will render
 | 
	
		
			
				|  |  |  left-to-right. XXX Why doesn't this work for the tooltips?"
 | 
	
	
		
			
				|  | @@ -971,37 +1127,38 @@ left-to-right. XXX Why doesn't this work for the tooltips?"
 | 
	
		
			
				|  |  |    (insert (replace-regexp-in-string
 | 
	
		
			
				|  |  |  	   (regexp-opt `(,bm-hebrew-lexicon))
 | 
	
		
			
				|  |  |  	   ""
 | 
	
		
			
				|  |  | -	   (bm-exec-diatheke term nil "plain" nil bm-hebrew-lexicon)
 | 
	
		
			
				|  |  | +	   (bm--exec-diatheke term nil "plain" nil bm-hebrew-lexicon)
 | 
	
		
			
				|  |  |  	   nil nil nil 7
 | 
	
		
			
				|  |  |  	   ))
 | 
	
		
			
				|  |  | -  (bm-display-term 'hebrew)
 | 
	
		
			
				|  |  | +  (bm--display-term 'hebrew)
 | 
	
		
			
				|  |  |    (setq bidi-paragraph-direction 'left-to-right))
 | 
	
		
			
				|  |  |  
 | 
	
		
			
				|  |  |  
 | 
	
		
			
				|  |  | -(defun bm-display-term-greek (term)
 | 
	
		
			
				|  |  | +(defun bm--display-term-greek (term)
 | 
	
		
			
				|  |  |    "Render the definition of the Strong's Greek TERM."
 | 
	
		
			
				|  |  |    (setq buffer-read-only nil)
 | 
	
		
			
				|  |  |    (erase-buffer)
 | 
	
		
			
				|  |  | -  (insert (replace-regexp-in-string
 | 
	
		
			
				|  |  | -	   (regexp-opt `(,bm-greek-lexicon))
 | 
	
		
			
				|  |  | -	   "" 
 | 
	
		
			
				|  |  | -	   (bm-exec-diatheke term nil "plain" nil bm-greek-lexicon)
 | 
	
		
			
				|  |  | -	   nil nil nil 7
 | 
	
		
			
				|  |  | -	   ))
 | 
	
		
			
				|  |  | -  ;;  (insert "\n")
 | 
	
		
			
				|  |  | -  (bm-display-term 'greek))
 | 
	
		
			
				|  |  | -
 | 
	
		
			
				|  |  | -
 | 
	
		
			
				|  |  | -(defun bm-set-location (book chapter &optional verse)
 | 
	
		
			
				|  |  | +  (if bm-use-abbott
 | 
	
		
			
				|  |  | +      (insert (replace-regexp-in-string "\(AbbottSmith\)" "" (bm--lookup-lex-def-abbott term)))
 | 
	
		
			
				|  |  | +    (insert (replace-regexp-in-string
 | 
	
		
			
				|  |  | +	     (regexp-opt `(,bm-greek-lexicon))
 | 
	
		
			
				|  |  | +	     ""
 | 
	
		
			
				|  |  | +	     (bm--exec-diatheke term nil "plain" nil bm-greek-lexicon)
 | 
	
		
			
				|  |  | +	     nil nil nil 7
 | 
	
		
			
				|  |  | +	     )))
 | 
	
		
			
				|  |  | +  (bm--display-term 'greek))
 | 
	
		
			
				|  |  | +
 | 
	
		
			
				|  |  | +
 | 
	
		
			
				|  |  | +(defun bm--set-location (book chapter &optional verse)
 | 
	
		
			
				|  |  |    "Sets the global chapter of the active `bible-mode' buffer."
 | 
	
		
			
				|  |  |    (setq-local bm-current-book book)
 | 
	
		
			
				|  |  |    (setq-local bm-current-book-name (car book))
 | 
	
		
			
				|  |  |    (setq-local bm-current-chapter chapter)
 | 
	
		
			
				|  |  | -  (bm-display verse))
 | 
	
		
			
				|  |  | +  (bm--display verse))
 | 
	
		
			
				|  |  |  
 | 
	
		
			
				|  |  |  ;;;;; Utilities
 | 
	
		
			
				|  |  |  
 | 
	
		
			
				|  |  | -(defun bm-list-number-range (min max &optional prefix)
 | 
	
		
			
				|  |  | +(defun bm--list-number-range (min max &optional prefix)
 | 
	
		
			
				|  |  |    "Returns a list containing entries for each integer between min and max.
 | 
	
		
			
				|  |  |  Used in tandem with `completing-read' for chapter selection."
 | 
	
		
			
				|  |  |    (let ((range-list nil))
 |