diff --git a/README.org b/README.org index bdc2e99..f468d25 100644 --- a/README.org +++ b/README.org @@ -566,6 +566,11 @@ Simple links may also be written manually in either sexp or non-sexp form, like: + Org v9.7's ~org-element~ API changes required some adjustments. ([[https://github.com/alphapapa/org-ql/issues/364][#364]]. Thanks to several users for reporting, and to [[https://github.com/yantar92][Ihor Radchenko]] for his feedback.) +** 0.7.4 + +*Fixes* ++ Ignore empty quoted strings in plain-string queries ([[https://github.com/alphapapa/org-ql/issues/383][#383]]). + ** 0.7.3 *Fixes* diff --git a/org-ql.el b/org-ql.el index 00f0e8c..17deec8 100644 --- a/org-ql.el +++ b/org-ql.el @@ -285,6 +285,11 @@ Matches with or without time.") :link '(custom-manual "(org-ql)Usage") :link '(url-link "https://github.com/alphapapa/org-ql")) +(defcustom org-ql-signal-peg-failure nil + "Signal an error when parsing a plain-string query fails. +This should only be enabled while debugging." + :type 'boolean) + (defcustom org-ql-ask-unsafe-queries t "Ask before running a query that could run arbitrary code. Org QL queries in sexp form can contain arbitrary expressions. @@ -950,7 +955,7 @@ value of `org-ql-predicates')." (term (or (and negation (list positive-term) ;; This is a bit confusing, but it seems to work. There's probably a better way. `(pred -- (list 'not (car pred)))) - positive-term)) + positive-term empty-quote)) (positive-term (or (and predicate-with-args `(pred args -- (cons (intern pred) args))) (and predicate-without-args `(pred -- (list (intern pred)))) (and plain-string `(s -- (list org-ql-default-predicate s))))) @@ -963,6 +968,12 @@ value of `org-ql-predicates')." (keyword (substring (+ (not (or separator "=" "\"" (syntax-class whitespace))) (any)))) (quoted-arg "\"" (substring (+ (not (or separator "\"")) (any))) "\"") (unquoted-arg (substring (+ (not (or separator "\"" (syntax-class whitespace))) (any)))) + (empty-quote + ;; This avoids aborting parsing or signaling an + ;; error if the user types in two successive + ;; quotation marks while typing a query (e.g. when + ;; using electric-pair-mode). + "\"\"") (negation "!") (separator "," ))) (closure (lambda (input &optional boolean) @@ -983,7 +994,10 @@ value of `org-ql-predicates')." ;; have to borrow some code. It ends up that we only have to ;; borrow this `with-peg-rules' call, which isn't too bad. (eval `(with-peg-rules ,pexs - (peg-run (peg ,(caar pexs)) #'peg-signal-failure)))))) + (peg-run (peg ,(caar pexs)) + (lambda (failures) + (when org-ql-signal-peg-failure + (peg-signal-failure failures))))))))) (pcase parsed-sexp (`(,one-predicate) one-predicate) (`(,_ . ,_) (cons boolean (reverse parsed-sexp))) diff --git a/org-ql.info b/org-ql.info index d187c05..e965a29 100644 --- a/org-ql.info +++ b/org-ql.info @@ -73,6 +73,7 @@ Functions / Macros Changelog * 0.8-pre: 08-pre. +* 0.7.4: 074. * 0.7.3: 073. * 0.7.2: 072. * 0.7.1: 071. @@ -1027,6 +1028,7 @@ releases. * Menu: * 0.8-pre: 08-pre. +* 0.7.4: 074. * 0.7.3: 073. * 0.7.2: 072. * 0.7.1: 071. @@ -1058,7 +1060,7 @@ releases. * 0.1: 01.  -File: README.info, Node: 08-pre, Next: 073, Up: Changelog +File: README.info, Node: 08-pre, Next: 074, Up: Changelog 5.1 0.8-pre =========== @@ -1096,9 +1098,19 @@ File: README.info, Node: 08-pre, Next: 073, Up: Changelog (https://github.com/yantar92) for his feedback.)  -File: README.info, Node: 073, Next: 072, Prev: 08-pre, Up: Changelog +File: README.info, Node: 074, Next: 073, Prev: 08-pre, Up: Changelog -5.2 0.7.3 +5.2 0.7.4 +========= + +*Fixes* + • Ignore empty quoted strings in plain-string queries (#383 + (https://github.com/alphapapa/org-ql/issues/383)). + + +File: README.info, Node: 073, Next: 072, Prev: 074, Up: Changelog + +5.3 0.7.3 ========= *Fixes* @@ -1116,7 +1128,7 @@ File: README.info, Node: 073, Next: 072, Prev: 08-pre, Up: Changelog  File: README.info, Node: 072, Next: 071, Prev: 073, Up: Changelog -5.3 0.7.2 +5.4 0.7.2 ========= *Fixes* @@ -1137,7 +1149,7 @@ File: README.info, Node: 072, Next: 071, Prev: 073, Up: Changelog  File: README.info, Node: 071, Next: 07, Prev: 072, Up: Changelog -5.4 0.7.1 +5.5 0.7.1 ========= *Fixes* @@ -1156,7 +1168,7 @@ File: README.info, Node: 071, Next: 07, Prev: 072, Up: Changelog  File: README.info, Node: 07, Next: 063, Prev: 071, Up: Changelog -5.5 0.7 +5.6 0.7 ======= *Added* @@ -1216,7 +1228,7 @@ File: README.info, Node: 07, Next: 063, Prev: 071, Up: Changelog  File: README.info, Node: 063, Next: 062, Prev: 07, Up: Changelog -5.6 0.6.3 +5.7 0.6.3 ========= *Fixed* @@ -1232,7 +1244,7 @@ File: README.info, Node: 063, Next: 062, Prev: 07, Up: Changelog  File: README.info, Node: 062, Next: 061, Prev: 063, Up: Changelog -5.7 0.6.2 +5.8 0.6.2 ========= *Fixed* @@ -1243,7 +1255,7 @@ File: README.info, Node: 062, Next: 061, Prev: 063, Up: Changelog  File: README.info, Node: 061, Next: 06, Prev: 062, Up: Changelog -5.8 0.6.1 +5.9 0.6.1 ========= *Fixed* @@ -1261,8 +1273,8 @@ File: README.info, Node: 061, Next: 06, Prev: 062, Up: Changelog  File: README.info, Node: 06, Next: 052, Prev: 061, Up: Changelog -5.9 0.6 -======= +5.10 0.6 +======== *Added* • Macro ‘org-ql-defpred’, used to define search predicates. (See @@ -1328,7 +1340,7 @@ File: README.info, Node: 06, Next: 052, Prev: 061, Up: Changelog  File: README.info, Node: 052, Next: 051, Prev: 06, Up: Changelog -5.10 0.5.2 +5.11 0.5.2 ========== *Fixed* @@ -1339,7 +1351,7 @@ File: README.info, Node: 052, Next: 051, Prev: 06, Up: Changelog  File: README.info, Node: 051, Next: 05, Prev: 052, Up: Changelog -5.11 0.5.1 +5.12 0.5.1 ========== *Fixed* @@ -1352,7 +1364,7 @@ File: README.info, Node: 051, Next: 05, Prev: 052, Up: Changelog  File: README.info, Node: 05, Next: 049, Prev: 051, Up: Changelog -5.12 0.5 +5.13 0.5 ======== *Added* @@ -1393,7 +1405,7 @@ File: README.info, Node: 05, Next: 049, Prev: 051, Up: Changelog  File: README.info, Node: 049, Next: 048, Prev: 05, Up: Changelog -5.13 0.4.9 +5.14 0.4.9 ========== *Fixed* @@ -1404,7 +1416,7 @@ File: README.info, Node: 049, Next: 048, Prev: 05, Up: Changelog  File: README.info, Node: 048, Next: 047, Prev: 049, Up: Changelog -5.14 0.4.8 +5.15 0.4.8 ========== *Fixed* @@ -1416,7 +1428,7 @@ File: README.info, Node: 048, Next: 047, Prev: 049, Up: Changelog  File: README.info, Node: 047, Next: 046, Prev: 048, Up: Changelog -5.15 0.4.7 +5.16 0.4.7 ========== *Fixed* @@ -1429,7 +1441,7 @@ File: README.info, Node: 047, Next: 046, Prev: 048, Up: Changelog  File: README.info, Node: 046, Next: 045, Prev: 047, Up: Changelog -5.16 0.4.6 +5.17 0.4.6 ========== *Fixed* @@ -1442,7 +1454,7 @@ File: README.info, Node: 046, Next: 045, Prev: 047, Up: Changelog  File: README.info, Node: 045, Next: 044, Prev: 046, Up: Changelog -5.17 0.4.5 +5.18 0.4.5 ========== *Fixed* @@ -1454,7 +1466,7 @@ File: README.info, Node: 045, Next: 044, Prev: 046, Up: Changelog  File: README.info, Node: 044, Next: 043, Prev: 045, Up: Changelog -5.18 0.4.4 +5.19 0.4.4 ========== *Fixed* @@ -1466,7 +1478,7 @@ File: README.info, Node: 044, Next: 043, Prev: 045, Up: Changelog  File: README.info, Node: 043, Next: 042, Prev: 044, Up: Changelog -5.19 0.4.3 +5.20 0.4.3 ========== *Fixed* @@ -1476,7 +1488,7 @@ File: README.info, Node: 043, Next: 042, Prev: 044, Up: Changelog  File: README.info, Node: 042, Next: 041, Prev: 043, Up: Changelog -5.20 0.4.2 +5.21 0.4.2 ========== *Fixed* @@ -1485,7 +1497,7 @@ File: README.info, Node: 042, Next: 041, Prev: 043, Up: Changelog  File: README.info, Node: 041, Next: 04, Prev: 042, Up: Changelog -5.21 0.4.1 +5.22 0.4.1 ========== *Fixed* @@ -1495,7 +1507,7 @@ File: README.info, Node: 041, Next: 04, Prev: 042, Up: Changelog  File: README.info, Node: 04, Next: 032, Prev: 041, Up: Changelog -5.22 0.4 +5.23 0.4 ======== _Note:_ The next release, 0.5, may include changes which will require @@ -1576,7 +1588,7 @@ automatically, as they will be pushed to the ‘master’ branch when ready.  File: README.info, Node: 032, Next: 031, Prev: 04, Up: Changelog -5.23 0.3.2 +5.24 0.3.2 ========== *Fixed* @@ -1589,7 +1601,7 @@ File: README.info, Node: 032, Next: 031, Prev: 04, Up: Changelog  File: README.info, Node: 031, Next: 03, Prev: 032, Up: Changelog -5.24 0.3.1 +5.25 0.3.1 ========== *Fixed* @@ -1599,7 +1611,7 @@ File: README.info, Node: 031, Next: 03, Prev: 032, Up: Changelog  File: README.info, Node: 03, Next: 023, Prev: 031, Up: Changelog -5.25 0.3 +5.26 0.3 ======== *Added* @@ -1667,7 +1679,7 @@ File: README.info, Node: 03, Next: 023, Prev: 031, Up: Changelog  File: README.info, Node: 023, Next: 022, Prev: 03, Up: Changelog -5.26 0.2.3 +5.27 0.2.3 ========== *Fixed* @@ -1677,7 +1689,7 @@ File: README.info, Node: 023, Next: 022, Prev: 03, Up: Changelog  File: README.info, Node: 022, Next: 021, Prev: 023, Up: Changelog -5.27 0.2.2 +5.28 0.2.2 ========== *Fixed* @@ -1688,7 +1700,7 @@ File: README.info, Node: 022, Next: 021, Prev: 023, Up: Changelog  File: README.info, Node: 021, Next: 02, Prev: 022, Up: Changelog -5.28 0.2.1 +5.29 0.2.1 ========== *Fixed* @@ -1698,7 +1710,7 @@ File: README.info, Node: 021, Next: 02, Prev: 022, Up: Changelog  File: README.info, Node: 02, Next: 01, Prev: 021, Up: Changelog -5.29 0.2 +5.30 0.2 ======== *Added* @@ -1781,7 +1793,7 @@ File: README.info, Node: 02, Next: 01, Prev: 021, Up: Changelog  File: README.info, Node: 01, Prev: 02, Up: Changelog -5.30 0.1 +5.31 0.1 ======== First tagged release. @@ -1839,75 +1851,76 @@ GPLv3  Tag Table: Node: Top225 -Node: Contents1845 -Node: Screenshots1968 -Node: Installation2086 -Node: Quelpa2600 -Node: Helm support3128 -Node: Usage3531 -Node: Commands3929 -Node: org-ql-find4394 -Node: org-ql-open-link5212 -Node: org-ql-refile6067 -Node: org-ql-search6395 -Node: helm-org-ql8326 -Node: org-ql-view8704 -Node: org-ql-view-sidebar9234 -Node: org-ql-view-recent-items9614 -Node: org-ql-sparse-tree10110 -Node: Queries10910 -Node: Non-sexp query syntax12027 -Node: General predicates13786 -Node: Ancestor/descendant predicates20773 -Node: Date/time predicates21901 -Node: Functions / Macros25025 -Node: Agenda-like views25323 -Ref: Function org-ql-block25485 -Node: Listing / acting-on results26746 -Ref: Caching26954 -Ref: Function org-ql-select27867 -Ref: Function org-ql-query30293 -Ref: Macro org-ql (deprecated)32067 -Node: Custom predicates32382 -Ref: Macro org-ql-defpred32606 -Node: Dynamic block36047 -Node: Links38771 -Node: Tips39458 -Node: Changelog39782 -Node: 08-pre40592 -Node: 07342357 -Node: 07243092 -Node: 07144011 -Node: 0744820 -Node: 06347744 -Node: 06248275 -Node: 06148580 -Node: 0649148 -Node: 05252202 -Node: 05152504 -Node: 0552929 -Node: 04954460 -Node: 04854742 -Node: 04755091 -Node: 04655500 -Node: 04555908 -Node: 04456269 -Node: 04356628 -Node: 04256831 -Node: 04156992 -Node: 0457239 -Node: 03261340 -Node: 03161743 -Node: 0361940 -Node: 02365240 -Node: 02265474 -Node: 02165754 -Node: 0265959 -Node: 0170037 -Node: Notes70138 -Node: Comparison with Org Agenda searches70300 -Node: org-sidebar71189 -Node: License71468 +Node: Contents1859 +Node: Screenshots1982 +Node: Installation2100 +Node: Quelpa2614 +Node: Helm support3142 +Node: Usage3545 +Node: Commands3943 +Node: org-ql-find4408 +Node: org-ql-open-link5226 +Node: org-ql-refile6081 +Node: org-ql-search6409 +Node: helm-org-ql8340 +Node: org-ql-view8718 +Node: org-ql-view-sidebar9248 +Node: org-ql-view-recent-items9628 +Node: org-ql-sparse-tree10124 +Node: Queries10924 +Node: Non-sexp query syntax12041 +Node: General predicates13800 +Node: Ancestor/descendant predicates20787 +Node: Date/time predicates21915 +Node: Functions / Macros25039 +Node: Agenda-like views25337 +Ref: Function org-ql-block25499 +Node: Listing / acting-on results26760 +Ref: Caching26968 +Ref: Function org-ql-select27881 +Ref: Function org-ql-query30307 +Ref: Macro org-ql (deprecated)32081 +Node: Custom predicates32396 +Ref: Macro org-ql-defpred32620 +Node: Dynamic block36061 +Node: Links38785 +Node: Tips39472 +Node: Changelog39796 +Node: 08-pre40620 +Node: 07442385 +Node: 07342612 +Node: 07243344 +Node: 07144263 +Node: 0745072 +Node: 06347996 +Node: 06248527 +Node: 06148832 +Node: 0649400 +Node: 05252456 +Node: 05152758 +Node: 0553183 +Node: 04954714 +Node: 04854996 +Node: 04755345 +Node: 04655754 +Node: 04556162 +Node: 04456523 +Node: 04356882 +Node: 04257085 +Node: 04157246 +Node: 0457493 +Node: 03261594 +Node: 03161997 +Node: 0362194 +Node: 02365494 +Node: 02265728 +Node: 02166008 +Node: 0266213 +Node: 0170291 +Node: Notes70392 +Node: Comparison with Org Agenda searches70554 +Node: org-sidebar71443 +Node: License71722  End Tag Table diff --git a/tests/test-org-ql.el b/tests/test-org-ql.el index 9008179..12e8eb0 100644 --- a/tests/test-org-ql.el +++ b/tests/test-org-ql.el @@ -648,6 +648,14 @@ with keyword arg NOW in PLIST." ;; TODO: Other predicates. + (it "Ignores empty quoted strings" + (expect (org-ql--query-string-to-sexp "\"\"") + :to-equal nil) + (expect (org-ql--query-string-to-sexp "foo \"\" bar") + :to-equal '(and (rifle "foo") (rifle "bar"))) + (expect (org-ql--query-string-to-sexp "foo \"baz\" bar") + :to-equal '(and (rifle "foo") (rifle "baz") (rifle "bar")))) + (it "Negated terms" (expect (org-ql--query-string-to-sexp "todo: !todo:CHECK,SOMEDAY") :to-equal '(and (todo) (not (todo "CHECK" "SOMEDAY"))))