[Date Prev][Date Next][Thread Prev][Thread Next][Date Index][Thread Index]
[elpa] master 975da4b 010/135: Improved org-bat-parse-form to handle new
From: |
Ian Dunn |
Subject: |
[elpa] master 975da4b 010/135: Improved org-bat-parse-form to handle new argument types |
Date: |
Mon, 17 Feb 2020 10:52:43 -0500 (EST) |
branch: master
commit 975da4bc12d61cbc8e233c6a1c90d0741d0a4180
Author: Ian D <address@hidden>
Commit: Ian D <address@hidden>
Improved org-bat-parse-form to handle new argument types
Includes quoted arguments, nested parentheses, and arguments with spaces.
* org-bat.el (org-bat-parse-form): Rewrote to use `read-from-string'.
---
org-bat.el | 46 +++++++++++++++++++++++++++++++++++++++-------
1 file changed, 39 insertions(+), 7 deletions(-)
diff --git a/org-bat.el b/org-bat.el
index e3ca976..d360732 100644
--- a/org-bat.el
+++ b/org-bat.el
@@ -13,13 +13,45 @@
(require 'subr-x)
(defun org-bat-parse-form (form)
- "Form should be KEY(ARGS)."
- (when (string-match "^\\([!]\\)?\\([a-zA-Z-]+\\)\\(?:(\\([^)]+\\))\\)?" form)
- (list (intern (match-string 2 form))
- (when-let (args (match-string 3 form))
- (save-match-data (split-string args ",")))
- (match-string 1 form)
- (match-end 0))))
+ (pcase-let* ((`(,token . ,pos) (read-from-string form))
+ (modifier nil)
+ (args nil))
+ (unless token
+ (signal 'invalid-read-syntax (substring form pos)))
+ ;; Check for either end of string or an opening parenthesis
+ (unless (or (equal pos (length form))
+ (equal (string-match-p "(" form pos) pos))
+ (signal 'invalid-read-syntax (substring form pos 1)))
+ ;; Parse arguments if we have any
+ (when (equal (string-match-p "(" form pos) pos)
+ ;; Move past the parenthesis
+ (cl-incf pos)
+ (while (and (< pos (length form))
+ (not (= (string-match-p ")" form pos) pos)))
+ (pcase-let* ((`(,arg . ,new-pos) (read-from-string form pos)))
+ (unless arg
+ (signal 'invalid-read-syntax (substring form pos)))
+ (let ((new-arg (if (stringp arg) arg (symbol-name arg))))
+ (push new-arg args))
+ (setq pos new-pos)
+ ;; Move past whitespace
+ (when (eq (string-match "\\w+" form pos) pos)
+ (setq pos (match-end 0)))
+ ;; The next character should either be a ',' or a ')'
+ (unless (equal (string-match-p "[,)]" form pos) pos)
+ (signal 'invalid-read-syntax (substring form pos 1)))
+ ;; Move past a comma if there is one
+ (when (equal (string-match-p "," form pos) pos)
+ (cl-incf pos))))
+ (unless (equal (string-match-p ")" form pos) pos)
+ (signal 'invalid-read-syntax (substring form pos 1)))
+ (setq args (seq-reverse args))
+ ;; Move past the closing parenthesis
+ (cl-incf pos))
+ (when (string-match "^\\([!]\\)\\(.*\\)" (symbol-name token))
+ (setq modifier (intern (match-string 1 (symbol-name token))))
+ (setq token (intern (match-string 2 (symbol-name token)))))
+ (list token args modifier pos)))
(defconst org-bat--types
'(finder action condition)
- [elpa] master adbff7e 019/135: Remove duplicate targets, (continued)
- [elpa] master adbff7e 019/135: Remove duplicate targets, Ian Dunn, 2020/02/17
- [elpa] master 6886b8a 026/135: Fixed chain-find, Ian Dunn, 2020/02/17
- [elpa] master 55283ff 015/135: Renamed to Org-Edna., Ian Dunn, 2020/02/17
- [elpa] master d348102 025/135: Added file for tests, Ian Dunn, 2020/02/17
- [elpa] master 71cdc0a 027/135: Fixed parsing bug, Ian Dunn, 2020/02/17
- [elpa] master 6b9a676 031/135: Added documentation for each condition, Ian Dunn, 2020/02/17
- [elpa] master 71e00e4 036/135: Fixed consideration handling, Ian Dunn, 2020/02/17
- [elpa] master 9f27779 014/135: Clarified use of case-fold-search in `org-bat--handle-planning', Ian Dunn, 2020/02/17
- [elpa] master 13e752b 021/135: Fix uses of substring, Ian Dunn, 2020/02/17
- [elpa] master 3937f31 009/135: Fixed headings condition, Ian Dunn, 2020/02/17
- [elpa] master 975da4b 010/135: Improved org-bat-parse-form to handle new argument types,
Ian Dunn <=
- [elpa] master 029bc2e 012/135: Cleaned up condition handling, Ian Dunn, 2020/02/17
- [elpa] master 602ad6d 011/135: Added tests for org-bat-parse-form, Ian Dunn, 2020/02/17
- [elpa] master a70f9ac 016/135: Fixed bug in Makefile, Ian Dunn, 2020/02/17
- [elpa] master abb0083 018/135: Fixed up indenting, Ian Dunn, 2020/02/17
- [elpa] master cb1f51f 020/135: Don't assume arguments will be symbols or strings, Ian Dunn, 2020/02/17
- [elpa] master 180d05b 022/135: Added configuration option to use inheritance, Ian Dunn, 2020/02/17
- [elpa] master b38a1ca 024/135: Added tests for ids and match finders, Ian Dunn, 2020/02/17
- [elpa] master 30fc4cd 023/135: Created finders for compatibility with org-depend, Ian Dunn, 2020/02/17
- [elpa] master 9916819 028/135: Added test for parsing multiple forms, Ian Dunn, 2020/02/17
- [elpa] master fc0dcc1 029/135: Added re-search condition, Ian Dunn, 2020/02/17