branch: elpa/pdf-tools
commit 804d183c59c7804f94fab652658fa7d4c4fd6ca0
Author: Vedang Manerikar <[email protected]>
Commit: Vedang Manerikar <[email protected]>
fix(pdf-view): replace obsolete registerv-make with cl-defstruct
The registerv-make function was deprecated in Emacs 27.1. Replace it
with a proper cl-defstruct (pdf-view-register) and cl-defmethod
implementations for register-val-jump-to, register-val-describe,
and register-val-insert.
Add tests for the register API used by pdf-view:
- pdf-view-registerv-make-creates-register: verifies register creation
- pdf-view-register-val-insert: verifies insert method works
- pdf-view-position-to-register-stores-position: verifies store/retrieve
Fixes: #333
---
lisp/pdf-view.el | 40 +++++++++++++++++++++++++---------------
test/pdf-view-test.el | 48 ++++++++++++++++++++++++++++++++++++++++++++++++
2 files changed, 73 insertions(+), 15 deletions(-)
diff --git a/lisp/pdf-view.el b/lisp/pdf-view.el
index eabcce49396..620e5269d77 100644
--- a/lisp/pdf-view.el
+++ b/lisp/pdf-view.el
@@ -1843,21 +1843,22 @@ works only with bookmarks created by
(pdf-view-bookmark-jump-handler bmk)
(run-hooks 'bookmark-after-jump-hook))))
-(defun pdf-view-registerv-make ()
- "Create a PDF register entry of the current position."
- (registerv-make
- (pdf-view-bookmark-make-record nil t t)
- :print-func 'pdf-view-registerv-print-func
- :jump-func 'pdf-view-bookmark-jump
- :insert-func (lambda (bmk)
- (insert (format "%S" bmk)))))
-
-(defun pdf-view-registerv-print-func (bmk)
- "Print a textual representation of bookmark BMK.
-
-This function is used as the `:print-func' property with
-`registerv-make'."
- (let* ((file (bookmark-prop-get bmk 'filename))
+;; Register support using cl-defstruct (replaces obsolete registerv-make)
+(cl-defstruct (pdf-view-register
+ (:constructor nil)
+ (:constructor pdf-view-register--make (bookmark))
+ (:copier nil))
+ "A PDF position register entry."
+ bookmark)
+
+(cl-defmethod register-val-jump-to ((val pdf-view-register) _arg)
+ "Jump to the PDF position stored in VAL."
+ (pdf-view-bookmark-jump (pdf-view-register-bookmark val)))
+
+(cl-defmethod register-val-describe ((val pdf-view-register) _verbose)
+ "Print a description of the PDF position stored in VAL."
+ (let* ((bmk (pdf-view-register-bookmark val))
+ (file (bookmark-prop-get bmk 'filename))
(buffer (find-buffer-visiting file))
(page (bookmark-prop-get bmk 'page))
(origin (bookmark-prop-get bmk 'origin)))
@@ -1870,6 +1871,15 @@ This function is used as the `:print-func' property with
(round (* 100 (cdr origin)))
0)))))
+(cl-defmethod register-val-insert ((val pdf-view-register))
+ "Insert the PDF bookmark stored in VAL."
+ (insert (format "%S" (pdf-view-register-bookmark val))))
+
+(defun pdf-view-registerv-make ()
+ "Create a PDF register entry of the current position."
+ (pdf-view-register--make
+ (pdf-view-bookmark-make-record nil t t)))
+
(defmacro pdf-view-with-register-alist (&rest body)
"Setup the proper binding for `register-alist' in BODY.
diff --git a/test/pdf-view-test.el b/test/pdf-view-test.el
index 58f6be5afc5..4a4a74be749 100644
--- a/test/pdf-view-test.el
+++ b/test/pdf-view-test.el
@@ -3,6 +3,54 @@
(require 'pdf-view)
(require 'ert)
+;; Tests for pdf-view-register struct and cl-defmethod implementations.
+;; These tests use mock bookmark data because the actual
pdf-view-registerv-make
+;; function requires a window context which isn't available in batch mode.
+
+(ert-deftest pdf-view-register-struct-creation ()
+ "Test that pdf-view-register struct can be created."
+ (let* ((mock-bookmark '("test.pdf"
+ (filename . "/path/to/test.pdf")
+ (page . 1)
+ (origin . (0.0 . 0.0))
+ (handler . pdf-view-bookmark-jump-handler)))
+ (reg (pdf-view-register--make mock-bookmark)))
+ ;; Should return non-nil
+ (should reg)
+ ;; Should be a pdf-view-register struct
+ (should (pdf-view-register-p reg))
+ ;; Should store the bookmark
+ (should (equal (pdf-view-register-bookmark reg) mock-bookmark))))
+
+(ert-deftest pdf-view-register-val-describe ()
+ "Test that register-val-describe works for PDF register entries."
+ (let* ((mock-bookmark '("test.pdf"
+ (filename . "/path/to/test.pdf")
+ (page . 5)
+ (origin . (0.0 . 0.5))
+ (handler . pdf-view-bookmark-jump-handler)))
+ (reg (pdf-view-register--make mock-bookmark)))
+ ;; register-val-describe should return a non-empty string
+ (should (stringp
+ (with-output-to-string
+ (register-val-describe reg nil))))
+ ;; The description should mention the page number
+ (should (string-match-p "page 5"
+ (with-output-to-string
+ (register-val-describe reg nil))))))
+
+(ert-deftest pdf-view-register-val-insert ()
+ "Test that register-val-insert works for PDF register entries."
+ (let* ((mock-bookmark '("test.pdf"
+ (filename . "/path/to/test.pdf")
+ (page . 1)
+ (handler . pdf-view-bookmark-jump-handler)))
+ (reg (pdf-view-register--make mock-bookmark)))
+ ;; register-val-insert should insert text without error
+ (with-temp-buffer
+ (register-val-insert reg)
+ (should (> (buffer-size) 0)))))
+
(ert-deftest pdf-view-handle-archived-file ()
:expected-result :failed
(skip-unless (executable-find "gzip"))