From 8374b452719e93105c72f156104be20a7204b749 Mon Sep 17 00:00:00 2001 From: SqrtMinusOne Date: Wed, 16 Mar 2022 11:49:22 +0300 Subject: [PATCH] feat: query the list of feeds --- elfeed-summary.el | 84 +++++++++++++++++++++++++++++++++++++++++++++++ 1 file changed, 84 insertions(+) diff --git a/elfeed-summary.el b/elfeed-summary.el index fa75a1d..5e0d467 100644 --- a/elfeed-summary.el +++ b/elfeed-summary.el @@ -28,6 +28,90 @@ ;;; Code: (require 'elfeed) +(require 'elfeed-db) +(require 'seq) + +(cl-defun elfeed-summary--match-tag (query &key tags title url author title-meta) + (cond + ;; symbol + ((symbolp query) (member query tags)) + ;; (title . "Title") + ;; (title . (rx "Title")) + ((eq (car query) 'title) + (or (and title + (string-match-p + (if (stringp (cdr query)) + (cdr query) + (eval (cdr query))) + title)) + (and title-meta + (string-match-p + (if (stringp (cdr query)) + (cdr query) + (eval (cdr query))) + title-meta)))) + ;; (author . "Author") + ;; (author . (rx "Author")) + ((eq (car query) 'author) + (and author + (string-match-p + (if (stringp (cdr query)) + (cdr query) + (eval (cdr query))) + author))) + ;; (url . "URL") + ;; (url . (rx "URL")) + ((eq (car query) 'url) + (and url + (string-match-p + (if (stringp (cdr query)) + (cdr query) + (eval (cdr query))) + url))) + ;; (and ... ) + ((eq (car query) 'and) + (seq-every-p + (lambda (query-elem) + (elfeed-summary--match-tag + query-elem + :tags tags + :title title + :title-meta title-meta + :url url + :author author)) + (cdr query))) + ;; (or ... ) + ;; ( ... ) + (t (seq-some + (lambda (query-elem) + (elfeed-summary--match-tag + query-elem + :tags tags + :title title + :title-meta title-meta + :url url + :author author)) + (if (eq (car query) 'or) + (cdr query) + query))))) + +(defun elfeed-summary--get-feeds (query) + (cl-loop for feed in elfeed-feeds + for url = (car feed) + for tags = (cdr feed) + for feed = (elfeed-db-get-feed url) + if (elfeed-summary--match-tag + query + :tags tags + :title (elfeed-feed-title feed) + :title-meta (plist-get (elfeed-feed-meta feed) :title) + :url url + :author (plist-get (car (elfeed-feed-author feed)) :name)) + collect feed)) + +(elfeed-summary--get-feeds '(or (title . "Andrea") + (author . "Bozhidar") + (url . (rx "sacha")))) (provide 'elfeed-summary) ;;; elfeed-summary.el ends here