93 lines
3.3 KiB
EmacsLisp
93 lines
3.3 KiB
EmacsLisp
;;; calibre-util.el --- Utilities with no better place -*- lexical-binding: t; -*-
|
|
|
|
;; Copyright (C) 2023 Free Software Foundation, Inc.
|
|
|
|
;; This file is part of calibre.el.
|
|
|
|
;; calibre.el is free software: you can redistribute it and/or modify
|
|
;; it under the terms of the GNU General Public License as published by
|
|
;; the Free Software Foundation, either version 3 of the License, or
|
|
;; (at your option) any later version.
|
|
|
|
;; calibre.el is distributed in the hope that it will be useful,
|
|
;; but WITHOUT ANY WARRANTY; without even the implied warranty of
|
|
;; MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
|
|
;; GNU General Public License for more details.
|
|
|
|
;; You should have received a copy of the GNU General Public License
|
|
;; along with calibre.el. If not, see <http://www.gnu.org/licenses/>.
|
|
|
|
;;; Commentary:
|
|
;; This file contains utility functions that either don't have a
|
|
;; better place, or can to be in their more logical place due to
|
|
;; circular dependency issues.
|
|
|
|
;;; Code:
|
|
(require 'calibre)
|
|
(require 'calibre-book)
|
|
|
|
(defun calibre-util-find-book (book seq)
|
|
"Find BOOK in SEQ."
|
|
(seq-find (lambda (b)
|
|
(= (calibre-book-id b)
|
|
(calibre-book-id book)))
|
|
seq))
|
|
|
|
(defun calibre-library--find-book (book)
|
|
"Move point to the line representing BOOK."
|
|
(goto-char (point-min))
|
|
(while (not (or (eobp)
|
|
(and (tabulated-list-get-id)
|
|
(= (calibre-book-id (tabulated-list-get-id))
|
|
(calibre-book-id book)))))
|
|
(forward-line)))
|
|
|
|
(defun calibre-library--preserve-marks (&optional dont-preserve-modifications)
|
|
"Return an alist mapping books to applied marks.
|
|
If DONT-PRESERVE-MODIFICATIONS is non-nil modification marks are not
|
|
preserved."
|
|
(save-excursion
|
|
(let (marks)
|
|
(goto-char (point-min))
|
|
(while (not (eobp))
|
|
(unless (or (char-equal (char-after) 32)
|
|
(and dont-preserve-modifications (char-equal (char-after) ?M)))
|
|
(push (cons (tabulated-list-get-id) (char-after)) marks))
|
|
(forward-line))
|
|
marks)))
|
|
|
|
(defun calibre-library--restore-marks (marks)
|
|
"Restore previously stored marks.
|
|
MARKS should be the return value of `calibre-library--preserve-marks'"
|
|
(save-excursion
|
|
(dolist (mark marks)
|
|
(let ((book (car mark))
|
|
(mark (cdr mark)))
|
|
(calibre-library--find-book book)
|
|
(tabulated-list-put-tag (format "%c" mark))))))
|
|
|
|
(defmacro calibre-with-preserved-marks (preserve-modifications &rest body)
|
|
"Save Library Marks, execute BODY, restore marks.
|
|
If PRESERVE-MODIFICATIONS is non-nil modification marks are
|
|
preserved. If PRESERVE-MODIFICATIONS is nil modification marks
|
|
are not preserved. This is primarily useful when BODY will
|
|
discard any modifications."
|
|
(declare (indent 1))
|
|
`(let ((marks (calibre-library--preserve-marks (not ,preserve-modifications))))
|
|
(unwind-protect (progn ,@body)
|
|
(calibre-library--restore-marks marks))))
|
|
|
|
(defvar calibre--library nil
|
|
"The active library.")
|
|
|
|
(declare-function calibre-select-library "calibre-core.el")
|
|
(defun calibre--library ()
|
|
"Return the active library.
|
|
If no library is active, prompt the user to select one."
|
|
(unless calibre--library
|
|
(calibre-select-library))
|
|
(alist-get calibre--library calibre-libraries nil nil #'string=))
|
|
|
|
(provide 'calibre-util)
|
|
;;; calibre-util.el ends here
|