Feat: Enable all valid priority values

Expand recognised priority values from A-C to current org-mode
standard of A-Z and 0-64.
This commit is contained in:
Tommy Jollyboat 2024-10-11 00:19:29 +01:00
parent b6f8a315e9
commit f97a13a130

View file

@ -1735,29 +1735,28 @@ priority B)."
`(priority ',comparator ,letter))) `(priority ',comparator ,letter)))
:preambles :preambles
(;; NOTE: This only accepts A, B, or C. I haven't seen ((`(,predicate-names)
;; other priorities in the wild, so this will do for now.
(`(,predicate-names)
;; Any priority cookie. ;; Any priority cookie.
(list :regexp (rx-to-string `(seq bol (1+ "*") (1+ blank) (0+ nonl) "[#" (in "ABC") "]") t))) (list :regexp (rx-to-string `(seq bol (1+ "*") (1+ blank) (0+ nonl) "[#" (or (in "A-Z") (1+ (in "0-9"))) "]") t)))
(`(,predicate-names ,(and (or ''= ''< ''> ''<= ''>=) comparator) ,letter) (`(,predicate-names ,(and (or ''= ''< ''> ''<= ''>=) comparator) ,letter)
;; Comparator and priority letter. ;; Comparator and priority letter.
;; NOTE: The double-quoted comparators. See below. ;; NOTE: The double-quoted comparators. See below.
(let* ((priority-letters '("A" "B" "C")) (let* ((priority-letters (append (mapcar #'number-to-string (number-sequence 0 64))
(mapcar #'string (number-sequence ?A ?Z))))
(index (-elem-index letter priority-letters)) (index (-elem-index letter priority-letters))
;; NOTE: Higher priority == lower number. ;; NOTE: Higher priority == lower number.
;; NOTE: Because we need to support both preamble-based queries and ;; NOTE: Because we need to support both preamble-based queries and
;; regular predicate ones, we work around an idiosyncrasy of query ;; regular predicate ones, we work around an idiosyncrasy of query
;; pre-processing by accepting both quoted and double-quoted comparator ;; pre-processing by accepting both quoted and double-quoted comparator
;; function symbols. Not the most elegant solution, but it works. ;; function symbols. Not the most elegant solution, but it works.
(priorities (s-join "" (pcase comparator (priorities (pcase comparator
((or '= ''=) (list letter)) ((or '= ''=) (list letter))
((or '> ''>) (cl-subseq priority-letters 0 index)) ((or '> ''>) (cl-subseq priority-letters 0 index))
((or '>= ''>=) (cl-subseq priority-letters 0 (1+ index))) ((or '>= ''>=) (cl-subseq priority-letters 0 (1+ index)))
((or '< ''<) (cl-subseq priority-letters (1+ index))) ((or '< ''<) (cl-subseq priority-letters (1+ index)))
((or '<= ''<=) (cl-subseq priority-letters index)))))) ((or '<= ''<=) (cl-subseq priority-letters index)))))
(list :regexp (rx-to-string `(seq bol (1+ "*") (1+ blank) (optional (1+ upper) (1+ blank)) (list :regexp (rx-to-string `(seq bol (1+ "*") (1+ blank) (optional (1+ upper) (1+ blank))
"[#" (in ,priorities) "]") t)))) "[#" (or ,@priorities) "]") t))))
(`(,predicate-names . ,letters) (`(,predicate-names . ,letters)
;; One or more priorities. ;; One or more priorities.
;; MAYBE: Disable case-folding. ;; MAYBE: Disable case-folding.
@ -1780,11 +1779,11 @@ priority B)."
(`(,(and (or '= '< '> '<= '>=) comparator) ,priority-arg) (`(,(and (or '= '< '> '<= '>=) comparator) ,priority-arg)
;; Comparator and priority arguments given: compare item priority using them. ;; Comparator and priority arguments given: compare item priority using them.
(funcall comparator item-priority (funcall comparator item-priority
(* 1000 (- org-lowest-priority (string-to-char priority-arg))))) (org-get-priority (format "[#%s]" priority-arg))))
(_ (_
;; List of priorities given as arguments: compare each of them to item priority using =. ;; List of priorities given as arguments: compare each of them to item priority using =.
(cl-loop for priority-arg in args (cl-loop for priority-arg in args
thereis (= item-priority (* 1000 (- org-lowest-priority (string-to-char priority-arg))))))))) thereis (= item-priority (org-get-priority (format "[#%s]" priority-arg))))))))
(org-ql-defpred property (property &optional value &key inherit) (org-ql-defpred property (property &optional value &key inherit)
"Return non-nil if current entry has PROPERTY, and optionally VALUE. "Return non-nil if current entry has PROPERTY, and optionally VALUE.
@ -2501,11 +2500,20 @@ A and B are Org timestamp elements."
(a-ts t) (a-ts t)
(b-ts nil))))) (b-ts nil)))))
(defun org-ql--priority-to-value (el)
"Return an integer suitable for sorting priorities."
(let ((prio (org-element-property :priority el)))
(cond
((not prio) (org-priority-to-value (org-element-property :raw-value el)))
((not (integerp prio)) nil)
((<= ?0 prio ?9) (- prio ?0))
(t prio))))
(defun org-ql--priority< (a b) (defun org-ql--priority< (a b)
"Return non-nil if A's priority is higher than B's. "Return non-nil if A's priority is higher than B's.
A and B are Org headline elements." A and B are Org headline elements."
(cl-macrolet ((priority (item) (cl-macrolet ((priority (item)
`(org-element-property :priority ,item))) `(org-ql--priority-to-value ,item)))
;; NOTE: Priorities are numbers in Org elements. This might differ from the priority selector logic. ;; NOTE: Priorities are numbers in Org elements. This might differ from the priority selector logic.
(let ((a-priority (priority a)) (let ((a-priority (priority a))
(b-priority (priority b))) (b-priority (priority b)))