Fix: (heading) Don't match strings as regexps
Reported-by: Alex Popescu <https://github.com/al3xandru>
This commit is contained in:
parent
770e60766a
commit
b6efba9aeb
4 changed files with 61 additions and 73 deletions
|
|
@ -555,7 +555,8 @@ Simple links may also be written manually in either sexp or non-sexp form, like:
|
||||||
|
|
||||||
** 0.8.5-pre
|
** 0.8.5-pre
|
||||||
|
|
||||||
Nothing new yet.
|
*Fixes*
|
||||||
|
+ Predicate ~heading~ incorrectly matched strings as regular expressions, sometimes returning incorrect results. (See [[https://github.com/alphapapa/org-ql/discussions/410][discussion]]. Thanks to [[https://github.com/al3xandru][Alex Popescu]] for reporting.)
|
||||||
|
|
||||||
** 0.8.4
|
** 0.8.4
|
||||||
|
|
||||||
|
|
|
||||||
36
org-ql.el
36
org-ql.el
|
|
@ -1461,40 +1461,16 @@ Org effort string, like \"5\" or \"0:05\"."
|
||||||
(list :regexp (rx bol (0+ space) ":STYLE:" (1+ space) "habit" (0+ space) eol))))
|
(list :regexp (rx bol (0+ space) ":STYLE:" (1+ space) "habit" (0+ space) eol))))
|
||||||
:body (org-is-habit-p))
|
:body (org-is-habit-p))
|
||||||
|
|
||||||
(org-ql-defpred (heading h) (&rest strings)
|
(org-ql-defpred (heading h) (&rest _strings)
|
||||||
"Return non-nil if current entry's heading matches all STRINGS.
|
"Return non-nil if current entry's heading matches all STRINGS.
|
||||||
Matching is done case-insensitively."
|
Matching is done case-insensitively."
|
||||||
:coalesce t
|
:coalesce t
|
||||||
:normalizers ((`(,predicate-names . ,args)
|
:normalizers ((`(,predicate-names . ,args)
|
||||||
;; "h" alias.
|
;; NOTE: Each string argument must be converted to a regexp
|
||||||
`(heading ,@args)))
|
;; for testing by the body, so we just normalize to the
|
||||||
;; TODO: Adjust regexp to avoid matching in tag list.
|
;; `heading-regexp' predicate, leaving this predicate as
|
||||||
:preambles ((`(,predicate-names)
|
;; one that merely regexp-quotes its arguments.
|
||||||
;; This clause protects against the case in which the
|
`(heading-regexp ,@(mapcar #'regexp-quote args)))))
|
||||||
;; arguments are nil, which would cause an error in
|
|
||||||
;; `rx-to-string' in other clauses. This can happen
|
|
||||||
;; with `org-ql-completing-read', e.g. when the input
|
|
||||||
;; is "h:" while the user is typing.
|
|
||||||
(list :regexp (rx bol (1+ "*") (1+ blank) (0+ nonl))
|
|
||||||
:case-fold t :query query))
|
|
||||||
(`(,predicate-names ,string)
|
|
||||||
;; Only one string: match with preamble, then let predicate confirm (because
|
|
||||||
;; the match could be in e.g. the tags rather than the heading text).
|
|
||||||
(list :regexp (rx-to-string `(seq bol (1+ "*") (1+ blank) (0+ nonl)
|
|
||||||
,string)
|
|
||||||
'no-group)
|
|
||||||
:case-fold t :query query))
|
|
||||||
(`(,predicate-names . ,strings)
|
|
||||||
;; Multiple strings: use preamble to match against first
|
|
||||||
;; string, then let the predicate match the rest.
|
|
||||||
(list :regexp (rx-to-string `(seq bol (1+ "*") (1+ blank) (0+ nonl)
|
|
||||||
,(car strings))
|
|
||||||
'no-group)
|
|
||||||
:case-fold t :query query)))
|
|
||||||
;; TODO: In Org 9.2+, `org-get-heading' takes 2 more arguments.
|
|
||||||
:body (let ((heading (org-get-heading 'no-tags 'no-todo))
|
|
||||||
(case-fold-search t))
|
|
||||||
(--all? (string-match it heading) strings)))
|
|
||||||
|
|
||||||
(org-ql-defpred (heading-regexp h*) (&rest regexps)
|
(org-ql-defpred (heading-regexp h*) (&rest regexps)
|
||||||
"Return non-nil if current entry's heading matches all REGEXPS (regexp strings).
|
"Return non-nil if current entry's heading matches all REGEXPS (regexp strings).
|
||||||
|
|
|
||||||
85
org-ql.info
85
org-ql.info
|
|
@ -1076,7 +1076,12 @@ File: README.info, Node: 085-pre, Next: 084, Up: Changelog
|
||||||
5.1 0.8.5-pre
|
5.1 0.8.5-pre
|
||||||
=============
|
=============
|
||||||
|
|
||||||
Nothing new yet.
|
*Fixes*
|
||||||
|
• Predicate ‘heading’ incorrectly matched strings as regular
|
||||||
|
expressions, sometimes returning incorrect results. (See
|
||||||
|
discussion (https://github.com/alphapapa/org-ql/discussions/410).
|
||||||
|
Thanks to Alex Popescu (https://github.com/al3xandru) for
|
||||||
|
reporting.)
|
||||||
|
|
||||||
|
|
||||||
File: README.info, Node: 084, Next: 083, Prev: 085-pre, Up: Changelog
|
File: README.info, Node: 084, Next: 083, Prev: 085-pre, Up: Changelog
|
||||||
|
|
@ -1979,45 +1984,45 @@ Node: Links38883
|
||||||
Node: Tips39570
|
Node: Tips39570
|
||||||
Node: Changelog39894
|
Node: Changelog39894
|
||||||
Node: 085-pre40788
|
Node: 085-pre40788
|
||||||
Node: 08440900
|
Node: 08441175
|
||||||
Node: 08341356
|
Node: 08341631
|
||||||
Node: 08241697
|
Node: 08241972
|
||||||
Node: 08142090
|
Node: 08142365
|
||||||
Node: 0842511
|
Node: 0842786
|
||||||
Node: 07445235
|
Node: 07445510
|
||||||
Node: 07345458
|
Node: 07345733
|
||||||
Node: 07246190
|
Node: 07246465
|
||||||
Node: 07147109
|
Node: 07147384
|
||||||
Node: 0747920
|
Node: 0748195
|
||||||
Node: 06350786
|
Node: 06351061
|
||||||
Node: 06251319
|
Node: 06251594
|
||||||
Node: 06151626
|
Node: 06151901
|
||||||
Node: 0652196
|
Node: 0652471
|
||||||
Node: 05255252
|
Node: 05255527
|
||||||
Node: 05155554
|
Node: 05155829
|
||||||
Node: 0555979
|
Node: 0556254
|
||||||
Node: 04957510
|
Node: 04957785
|
||||||
Node: 04857792
|
Node: 04858067
|
||||||
Node: 04758141
|
Node: 04758416
|
||||||
Node: 04658550
|
Node: 04658825
|
||||||
Node: 04558958
|
Node: 04559233
|
||||||
Node: 04459319
|
Node: 04459594
|
||||||
Node: 04359678
|
Node: 04359953
|
||||||
Node: 04259881
|
Node: 04260156
|
||||||
Node: 04160042
|
Node: 04160317
|
||||||
Node: 0460289
|
Node: 0460564
|
||||||
Node: 03264390
|
Node: 03264665
|
||||||
Node: 03164793
|
Node: 03165068
|
||||||
Node: 0364990
|
Node: 0365265
|
||||||
Node: 02368290
|
Node: 02368565
|
||||||
Node: 02268524
|
Node: 02268799
|
||||||
Node: 02168804
|
Node: 02169079
|
||||||
Node: 0269009
|
Node: 0269284
|
||||||
Node: 0173087
|
Node: 0173362
|
||||||
Node: Notes73188
|
Node: Notes73463
|
||||||
Node: Comparison with Org Agenda searches73350
|
Node: Comparison with Org Agenda searches73625
|
||||||
Node: org-sidebar74239
|
Node: org-sidebar74514
|
||||||
Node: License74518
|
Node: License74793
|
||||||
|
|
||||||
End Tag Table
|
End Tag Table
|
||||||
|
|
||||||
|
|
|
||||||
|
|
@ -218,7 +218,8 @@ with keyword arg NOW in PLIST."
|
||||||
(it "coalesces a single AND clause that uses two predicates (and preserves predicate order)"
|
(it "coalesces a single AND clause that uses two predicates (and preserves predicate order)"
|
||||||
(expect (org-ql--normalize-query '(and (rifle "foo") (rifle "bar")
|
(expect (org-ql--normalize-query '(and (rifle "foo") (rifle "bar")
|
||||||
(heading "baz") (heading "buz")))
|
(heading "baz") (heading "buz")))
|
||||||
:to-equal '(and (rifle :regexps '("foo" "bar")) (heading "baz" "buz"))))
|
;; NOTE: `heading' is normalized to `heading-regexp'.
|
||||||
|
:to-equal '(and (rifle :regexps '("foo" "bar")) (heading-regexp "baz" "buz"))))
|
||||||
(it "preserves independent OR clauses"
|
(it "preserves independent OR clauses"
|
||||||
(expect (org-ql--normalize-query '(and (or (rifle "foo") (rifle "bar"))
|
(expect (org-ql--normalize-query '(and (or (rifle "foo") (rifle "bar"))
|
||||||
(or (rifle "baz") (rifle "buz"))))
|
(or (rifle "baz") (rifle "buz"))))
|
||||||
|
|
@ -1112,7 +1113,12 @@ with keyword arg NOW in PLIST."
|
||||||
'("Take over the world")))
|
'("Take over the world")))
|
||||||
(org-ql-it "with two arguments"
|
(org-ql-it "with two arguments"
|
||||||
(org-ql-expect ('(heading "Take over" "world"))
|
(org-ql-expect ('(heading "Take over" "world"))
|
||||||
'("Take over the world"))))
|
'("Take over the world")))
|
||||||
|
(org-ql-it "does not match strings as regexps"
|
||||||
|
(org-ql-expect ('(heading "over"))
|
||||||
|
'("Take over the universe" "Take over the world" "Take over Mars" "Take over the moon"))
|
||||||
|
(org-ql-expect ('(heading "[over]"))
|
||||||
|
nil)))
|
||||||
|
|
||||||
(describe "(heading-regexp)"
|
(describe "(heading-regexp)"
|
||||||
(org-ql-it "with one argument"
|
(org-ql-it "with one argument"
|
||||||
|
|
|
||||||
Loading…
Add table
Add a link
Reference in a new issue