summaryrefslogtreecommitdiff
diff options
context:
space:
mode:
authorCraig Earls <enderw88@gmail.com>2013-03-14 11:38:32 -0700
committerCraig Earls <enderw88@gmail.com>2013-03-14 11:38:32 -0700
commit4c9b8cb9906ed86d3301c2fe1c8dbdf1498cd2cf (patch)
tree500d4f6f5c43db5c5eea48e469c771ee828eb135
parentf89665ba44ae50f056363d7e2c79a508060e2d18 (diff)
downloadfork-ledger-4c9b8cb9906ed86d3301c2fe1c8dbdf1498cd2cf.tar.gz
fork-ledger-4c9b8cb9906ed86d3301c2fe1c8dbdf1498cd2cf.tar.bz2
fork-ledger-4c9b8cb9906ed86d3301c2fe1c8dbdf1498cd2cf.zip
Auto is now correctly scanning a ledger-auto buffer and returning useable functions
-rw-r--r--lisp/ldg-auto.el47
1 files changed, 28 insertions, 19 deletions
diff --git a/lisp/ldg-auto.el b/lisp/ldg-auto.el
index 12832a4e..33a2cdba 100644
--- a/lisp/ldg-auto.el
+++ b/lisp/ldg-auto.el
@@ -21,8 +21,8 @@
;;; Commentary:
;;
-;; This module provides or automatically adding transactions to a
-;; ledger buffer on a periodic basis. h Recurrence expressions are
+;; This module provides for automatically adding transactions to a
+;; ledger buffer on a periodic basis. Recurrence expressions are
;; inspired by Martin Fowler's "Recurring Events for Calendars",
;; martinfowler.com/apsupp/recurring.pdf
@@ -92,15 +92,14 @@ of date."
;; of days are ok
(between (eval day) 1 (ledger-auto-days-in-month (eval month) (eval year))))
(between (eval day) 1 31)) ;; no month specified, assume 31 days.
- `#'(lambda (date)
- (and ,(if (eval year)
- `(if (eq (nth 5 (decode-time date)) ,(eval year)) t)
- `t)
- ,(if (eval month)
- `(if (eq (nth 4 (decode-time date)) ,(eval month)) t)
- `t)
- ,(if (eval day)
- `(if (eq (nth 3 (decode-time date)) ,(eval day)) t))))
+ `'(and ,(if (eval year)
+ `(if (eq (nth 5 (decode-time date)) ,(eval year)) t)
+ `t)
+ ,(if (eval month)
+ `(if (eq (nth 4 (decode-time date)) ,(eval month)) t)
+ `t)
+ ,(if (eval day)
+ `(if (eq (nth 3 (decode-time date)) ,(eval day)) t)))
(error "ledger-auto-constraint-numerical-date-macro: date out of range %S %S %S" (eval year) (eval month) (eval day))))
@@ -155,6 +154,15 @@ For example every second Friday, regardless of month."
(setq xact-list (cons transaction xact-list))))
xact-list)))
+(defun ledger-auto-replace-brackets ()
+ "Replace all brackets with parens"
+ (goto-char (point-min))
+ (while (search-forward "]" nil t)
+ (replace-match ")" nil t))
+ (goto-char (point-min))
+ (while (search-forward "[" nil t)
+ (replace-match "(" nil t)))
+
(defun ledger-auto-read-descriptor-tree (descriptor-string)
"Take a date descriptor string and return a function that
returns true if the date meets the requirements"
@@ -163,16 +171,14 @@ returns true if the date meets the requirements"
(let (pos)
;; Replace brackets with parens
(insert descriptor-string)
- (goto-char (point-min))
- (replace-string "[" "(")
- (goto-char (point-min))
- (replace-string "]" ")")
+ (ledger-auto-replace-brackets)
+
(goto-char (point-max))
;; double quote all the descriptors for string processing later
(while (re-search-backward
(concat "\\(20[0-9][0-9]\\|[\*]\\)[/\\-]" ;; Year slot
- "\\([\*EO]\\|[0-9]+\\)[/\\-]" ;; Month slot
- "\\([\*]\\|\\([0-9][0-9]\\)\\|"
+ "\\([\*EO]\\|[01][0-9]\\)[/\\-]" ;; Month slot
+ "\\([\*]\\|\\([0-3][0-9]\\)\\|"
"\\([0-5]"
"\\(\\(Su\\)\\|"
"\\(Mo\\)\\|"
@@ -193,17 +199,20 @@ returns true if the date meets the requirements"
(read (buffer-substring (point-min) (point-max))))))
(defun ledger-transform-auto-tree (tree)
+"Takes a lisp list of date descriptor strings, TREE, and returns a string with a lambda function of date."
+;; use funcall to use the lambda function spit out here
(if (consp tree)
(let (result)
(while (consp tree)
(let ((newcar (car tree)))
- (if (consp (car tree))
+ (if (consp newcar)
(setq newcar (ledger-transform-auto-tree (car tree))))
(if (consp newcar)
(push newcar result)
(push (ledger-auto-parse-date-descriptor newcar) result)) )
(setq tree (cdr tree)))
- (nconc (nreverse result) tree))))
+ `(lambda (date)
+ ,(nconc (list 'or) (nreverse result) tree)))))
(defun ledger-auto-split-constraints (descriptor-string)
"Return a list with the year, month and day fields split"