From 1996969920a58259439e8a4baa446264008430ce Mon Sep 17 00:00:00 2001 From: Adam Porter Date: Thu, 9 Mar 2023 01:41:01 -0600 Subject: [PATCH] Fix: (src) Rewrite body Fixes #304. Thanks to @johanwk for reporting. --- README.org | 1 + org-ql.el | 36 ++++++++++++++++-------------------- 2 files changed, 17 insertions(+), 20 deletions(-) diff --git a/README.org b/README.org index 2817dcc0..4935af91 100644 --- a/README.org +++ b/README.org @@ -558,6 +558,7 @@ Simple links may also be written manually in either sexp or non-sexp form, like: *Fixed* + Predicate ~src~'s matching of begin/end block lines, normalization of arguments, and handling in non-sexp queries. ++ Predicate ~src~'s behavior with various arguments. *Internal* + Certain query predicates, when called multiple times in an ~and~ sub-expression, are optimized to a single call. diff --git a/org-ql.el b/org-ql.el index 0015f1d2..d602e60a 100644 --- a/org-ql.el +++ b/org-ql.el @@ -1925,26 +1925,22 @@ language. Matching is done case-insensitively." ;; Always check contents with predicate. :query query))) :body - (catch 'return - (save-excursion - (save-match-data - (when (re-search-forward org-babel-src-block-regexp (org-entry-end-position) t) - (when lang - (unless (string= lang (match-string 2)) - (throw 'return nil))) - (if regexps - (let ((contents-beg (progn - (goto-char (match-beginning 0)) - (forward-line 1) - (point))) - (contents-end (progn - (goto-char (match-end 0)) - (point-at-bol)))) - (cl-loop for re in regexps - do (goto-char contents-beg) - always (re-search-forward re contents-end t))) - ;; No regexps to check: return non-nil. - t)))))) + (save-excursion + (save-match-data + (cl-loop while (re-search-forward org-babel-src-block-regexp (org-entry-end-position) t) + thereis (when (or (not lang) (equal lang (match-string 2))) + (or (not regexps) + (save-excursion + (let ((contents-beg (progn + (goto-char (match-beginning 0)) + (forward-line 1) + (point))) + (contents-end (progn + (goto-char (match-end 0)) + (point-at-bol)))) + (cl-loop for re in regexps + do (goto-char contents-beg) + always (re-search-forward re contents-end t)))))))))) (org-ql-defpred (tags) (&rest tags) "Return non-nil if current heading has one or more of TAGS (a list of strings).