diff options
Diffstat (limited to 'lib')
-rw-r--r-- | lib/jao-recoll.el | 76 |
1 files changed, 76 insertions, 0 deletions
diff --git a/lib/jao-recoll.el b/lib/jao-recoll.el new file mode 100644 index 0000000..364dfb5 --- /dev/null +++ b/lib/jao-recoll.el @@ -0,0 +1,76 @@ +;;; jao-recoll.el --- Utilities to use recoll -*- lexical-binding: t; -*- + +;; Copyright (C) 2025 Jose Antonio Ortega Ruiz + +;; Author: Jose Antonio Ortega Ruiz <mail@jao.io> +;; Keywords: mail, text + +;; This program 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. + +;; This program 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 this program. If not, see <https://www.gnu.org/licenses/>. + +;;; Commentary: + +;; Notably, a half-backed backend for Gnus + +;;; Code: + +(require 'gnus-search) + +(defclass gnus-search-recoll (gnus-search-indexed) + ((separator :type string :initform ".") + (program :initform "recoll") + (raw-queries-p :initform t))) + +(cl-defmethod gnus-search-indexed-extract ((_engine gnus-search-recoll)) + (prog1 (and (looking-at "^file://\\(.+\\)$") (list (match-string 1) 100)) + (forward-line 1))) + +(cl-defmethod gnus-search-transform-expression ((_engine gnus-search-recoll) + expr) + expr) + +(cl-defmethod gnus-search-indexed-search-command ((engine gnus-search-recoll) + (qstring string) + query + &optional groups) + (let* ((subdir (slot-value engine 'remove-prefix)) + (sep (slot-value engine 'separator)) + (gdirs (mapcar (lambda (g) + (let ((g (gnus-group-short-name g))) + (replace-regexp-in-string "\\." sep g))) + (or groups + (and (not (string= "" subdir)) (list subdir))))) + (dirsq (and gdirs + (concat "(" + (mapconcat (lambda (d) (format "dir:%s" d)) + gdirs " OR ") + ")"))) + (qstring (if (string-prefix-p "id:" qstring) + (replace-regexp-in-string "<\\|>" "\"" qstring) + qstring)) + (qstring (if (cdr (assoc 'thread query)) + (concat qstring " OR " + (replace-regexp-in-string "id:\"" "ref:\"" + qstring)) + qstring)) + (qstring (replace-regexp-in-string " or " " OR " qstring)) + (qstring (replace-regexp-in-string " and " " AND " qstring)) + (q (format "mime:message %s (%s)" dirsq qstring))) + ;; (message "query is: %s -- %S" q query) + `("-b" "-t" "-q" ,q))) + +(defun jao-recoll-gnus-search-engine (dir) + `(nnml "" (gnus-search-engine gnus-search-recoll (remove-prefix ,dir)))) + +(provide 'jao-recoll) +;;; jao-recoll.el ends here |