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:
parent
b6f8a315e9
commit
f97a13a130
1 changed files with 23 additions and 15 deletions
30
org-ql.el
30
org-ql.el
|
|
@ -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)))
|
||||||
|
|
|
||||||
Loading…
Add table
Add a link
Reference in a new issue