update packages
This commit is contained in:
@@ -28,7 +28,7 @@
|
||||
(require 'rx)
|
||||
(require 'cl-lib)
|
||||
|
||||
(defvar ledger-iso-date-regex)
|
||||
(defvar ledger-iso-date-regexp)
|
||||
|
||||
(defconst ledger-amount-decimal-comma-regex
|
||||
"-?[1-9][0-9.]*[,]?[0-9]*")
|
||||
@@ -89,43 +89,49 @@
|
||||
|
||||
(defmacro ledger-define-regexp (name regex docs &rest args)
|
||||
"Simplify the creation of a Ledger regex and helper functions."
|
||||
(let ((defs
|
||||
(list
|
||||
`(defconst
|
||||
,(intern (concat "ledger-" (symbol-name name) "-regexp"))
|
||||
,(eval regex)
|
||||
,docs)))
|
||||
(addend 0) last-group)
|
||||
(if (null args)
|
||||
(progn
|
||||
(nconc
|
||||
defs
|
||||
(let* ((regex (eval regex))
|
||||
(group-count (regexp-opt-depth regex))
|
||||
(defs
|
||||
(list
|
||||
`(defconst
|
||||
,(intern
|
||||
(concat "ledger-regex-" (symbol-name name) "-group"))
|
||||
1)))
|
||||
(nconc
|
||||
defs
|
||||
(list
|
||||
,(intern (concat "ledger-" (symbol-name name) "-regexp"))
|
||||
,regex
|
||||
,docs)
|
||||
`(defconst
|
||||
,(intern (concat "ledger-regex-" (symbol-name name)
|
||||
"-group--count"))
|
||||
1)))
|
||||
(nconc
|
||||
defs
|
||||
(list
|
||||
`(defmacro
|
||||
,(intern (concat "ledger-regex-" (symbol-name name)))
|
||||
(&optional string)
|
||||
,(format "Return the match string for the %s" name)
|
||||
(match-string
|
||||
,(intern (concat "ledger-regex-" (symbol-name name)
|
||||
"-group"))
|
||||
string)))))
|
||||
,group-count)))
|
||||
(addend 0) last-group)
|
||||
(if (null args)
|
||||
(progn
|
||||
(when (cl-plusp group-count)
|
||||
(nconc
|
||||
defs
|
||||
(list
|
||||
`(defconst
|
||||
,(intern
|
||||
(concat "ledger-regex-" (symbol-name name) "-group"))
|
||||
1)))
|
||||
(nconc
|
||||
defs
|
||||
(list
|
||||
`(defmacro
|
||||
,(intern (concat "ledger-regex-" (symbol-name name)))
|
||||
(&optional string)
|
||||
,(format "Return the match string for the %s" name)
|
||||
(match-string
|
||||
,(intern (concat "ledger-regex-" (symbol-name name)
|
||||
"-group"))
|
||||
string))))))
|
||||
|
||||
(while args
|
||||
(let (arg var grouping target force-increment)
|
||||
(setq arg (pop args))
|
||||
|
||||
(when (eq arg :separate)
|
||||
(setq arg (pop args))
|
||||
(setq force-increment t))
|
||||
|
||||
(dolist (arg args)
|
||||
(let (var grouping target)
|
||||
(if (symbolp arg)
|
||||
(setq var arg target arg)
|
||||
(cl-assert (listp arg))
|
||||
@@ -137,7 +143,8 @@
|
||||
target (cl-caddr arg))))
|
||||
|
||||
(if (and last-group
|
||||
(not (eq last-group (or grouping target))))
|
||||
(or (not (eq last-group (or grouping target)))
|
||||
force-increment))
|
||||
(cl-incf addend
|
||||
(symbol-value
|
||||
(intern-soft (concat "ledger-regex-"
|
||||
@@ -171,189 +178,170 @@
|
||||
"-group-" (symbol-name var)))
|
||||
string))))
|
||||
|
||||
(setq last-group (or grouping target))))
|
||||
|
||||
(nconc defs
|
||||
(list
|
||||
`(defconst ,(intern (concat "ledger-regex-" (symbol-name name)
|
||||
"-group--count"))
|
||||
,(length args)))))
|
||||
(setq last-group (or grouping target)))))
|
||||
|
||||
(cons 'eval-and-compile defs)))
|
||||
|
||||
(put 'ledger-define-regexp 'lisp-indent-function 1)
|
||||
|
||||
(ledger-define-regexp iso-date
|
||||
( let ((sep '(or ?- ?/)))
|
||||
(rx (group
|
||||
(and (group (= 4 num))
|
||||
(eval sep)
|
||||
(group (and num (? num)))
|
||||
(eval sep)
|
||||
(group (and num (? num)))))))
|
||||
"Match a single date, in its 'written' form.")
|
||||
(let ((sep '(or ?- ?/)))
|
||||
(rx (group
|
||||
(and (group (= 4 num))
|
||||
(eval sep)
|
||||
(group (and num (? num)))
|
||||
(eval sep)
|
||||
(group (and num (? num)))))))
|
||||
"Match a single date, in its 'written' form.")
|
||||
|
||||
(ledger-define-regexp full-date
|
||||
(macroexpand
|
||||
`(rx (and (regexp ,ledger-iso-date-regexp)
|
||||
(? (and ?= (regexp ,ledger-iso-date-regexp))))))
|
||||
"Match a compound date, of the form ACTUAL=EFFECTIVE"
|
||||
(actual iso-date)
|
||||
(effective iso-date))
|
||||
(macroexpand
|
||||
`(rx (and (regexp ,ledger-iso-date-regexp)
|
||||
(? (and ?= (regexp ,ledger-iso-date-regexp))))))
|
||||
"Match a compound date, of the form ACTUAL=EFFECTIVE"
|
||||
(actual iso-date)
|
||||
:separate
|
||||
(effective iso-date))
|
||||
|
||||
(ledger-define-regexp state
|
||||
(rx (group (any ?! ?*)))
|
||||
"Match a transaction or posting's \"state\" character.")
|
||||
(rx (group (any ?! ?*)))
|
||||
"Match a transaction or posting's \"state\" character.")
|
||||
|
||||
(ledger-define-regexp code
|
||||
(rx (and ?\( (group (+? (not (any ?\))))) ?\)))
|
||||
"Match the transaction code.")
|
||||
(rx (and ?\( (group (+? (not (any ?\))))) ?\)))
|
||||
"Match the transaction code.")
|
||||
|
||||
(ledger-define-regexp long-space
|
||||
(rx (and (*? blank)
|
||||
(or (and ? (or ? ?\t)) ?\t)))
|
||||
"Match a \"long space\".")
|
||||
(rx (and (*? blank)
|
||||
(or (and ? (or ? ?\t)) ?\t)))
|
||||
"Match a \"long space\".")
|
||||
|
||||
(ledger-define-regexp note
|
||||
(rx (group (+ nonl)))
|
||||
"")
|
||||
(rx (group (+ nonl)))
|
||||
"")
|
||||
|
||||
(ledger-define-regexp end-note
|
||||
(macroexpand
|
||||
`(rx (and (regexp ,ledger-long-space-regexp) ?\;
|
||||
(regexp ,ledger-note-regexp))))
|
||||
"")
|
||||
(macroexpand
|
||||
`(rx (and (regexp ,ledger-long-space-regexp) ?\;
|
||||
(regexp ,ledger-note-regexp))))
|
||||
"")
|
||||
|
||||
(ledger-define-regexp full-note
|
||||
(macroexpand
|
||||
`(rx (and line-start (+ blank)
|
||||
?\; (regexp ,ledger-note-regexp))))
|
||||
"")
|
||||
(macroexpand
|
||||
`(rx (and line-start (+ blank)
|
||||
?\; (regexp ,ledger-note-regexp))))
|
||||
"")
|
||||
|
||||
(ledger-define-regexp xact-line
|
||||
(macroexpand
|
||||
`(rx (and line-start
|
||||
(regexp ,ledger-full-date-regexp)
|
||||
(? (and (+ blank) (regexp ,ledger-state-regexp)))
|
||||
(? (and (+ blank) (regexp ,ledger-code-regexp)))
|
||||
(+ blank) (+? nonl)
|
||||
(? (regexp ,ledger-end-note-regexp))
|
||||
line-end)))
|
||||
"Match a transaction's first line (and optional notes)."
|
||||
(actual-date full-date actual)
|
||||
(effective-date full-date effective)
|
||||
state
|
||||
code
|
||||
(note end-note))
|
||||
|
||||
(ledger-define-regexp recurring-line
|
||||
(macroexpand
|
||||
`(rx (and line-start
|
||||
(regexp "\\[.+/.+/.+\\]")
|
||||
(? (and (+ blank) (regexp ,ledger-state-regexp)))
|
||||
(? (and (+ blank) (regexp ,ledger-code-regexp)))
|
||||
(+ blank) (+? nonl)
|
||||
(? (regexp ,ledger-end-note-regexp))
|
||||
line-end)))
|
||||
"Match a transaction's first line (and optional notes)."
|
||||
(actual-date full-date actual)
|
||||
(effective-date full-date effective)
|
||||
state
|
||||
code
|
||||
(note end-note))
|
||||
(macroexpand
|
||||
`(rx (and line-start
|
||||
(regexp ,ledger-full-date-regexp)
|
||||
(? (and (+ blank) (regexp ,ledger-state-regexp)))
|
||||
(? (and (+ blank) (regexp ,ledger-code-regexp)))
|
||||
(+ blank) (+? nonl)
|
||||
(? (regexp ,ledger-end-note-regexp))
|
||||
line-end)))
|
||||
"Match a transaction's first line (and optional notes)."
|
||||
(actual-date full-date actual)
|
||||
(effective-date full-date effective)
|
||||
state
|
||||
code
|
||||
(note end-note))
|
||||
|
||||
(ledger-define-regexp account
|
||||
(rx (group (and (not (any blank ?\[ ?\( ?: ?\;)) (*? nonl))))
|
||||
"")
|
||||
(rx (group (and (not (any blank ?\[ ?\( ?: ?\;)) (*? nonl))))
|
||||
"")
|
||||
|
||||
(ledger-define-regexp account-kind
|
||||
(rx (group (? (any ?\[ ?\())))
|
||||
"")
|
||||
(rx (group (? (any ?\[ ?\())))
|
||||
"")
|
||||
|
||||
(ledger-define-regexp full-account
|
||||
(macroexpand
|
||||
`(rx (and (regexp ,ledger-account-kind-regexp)
|
||||
(regexp ,ledger-account-regexp)
|
||||
(? (any ?\] ?\))))))
|
||||
""
|
||||
(kind account-kind)
|
||||
(name account))
|
||||
(macroexpand
|
||||
`(rx (and (regexp ,ledger-account-kind-regexp)
|
||||
(regexp ,ledger-account-regexp)
|
||||
(? (any ?\] ?\))))))
|
||||
""
|
||||
(kind account-kind)
|
||||
(name account))
|
||||
|
||||
(ledger-define-regexp commodity-no-group
|
||||
(rx (or (and ?\" (+ (not (any ?\"))) ?\")
|
||||
(+ (not (any blank ?\n
|
||||
digit
|
||||
?- ?\[ ?\]
|
||||
?. ?, ?\; ?+ ?* ?/ ?^ ?? ?: ?& ?| ?! ?=
|
||||
?\< ?\> ?\{ ?\} ?\( ?\) ?@)))))
|
||||
"")
|
||||
(rx (or (and ?\" (+ (not (any ?\"))) ?\")
|
||||
(+ (not (any blank ?\n
|
||||
digit
|
||||
?- ?\[ ?\]
|
||||
?. ?, ?\; ?+ ?* ?/ ?^ ?? ?: ?& ?| ?! ?=
|
||||
?\< ?\> ?\{ ?\} ?\( ?\) ?@)))))
|
||||
"")
|
||||
|
||||
(ledger-define-regexp commodity
|
||||
(macroexpand
|
||||
`(rx (group (regexp ,ledger-commodity-no-group-regexp))))
|
||||
"")
|
||||
(macroexpand
|
||||
`(rx (group (regexp ,ledger-commodity-no-group-regexp))))
|
||||
"")
|
||||
|
||||
(ledger-define-regexp amount-no-group
|
||||
(rx (and (? ?-)
|
||||
(+ digit)
|
||||
(*? (and (any ?. ?,) (+ digit)))))
|
||||
"")
|
||||
(rx (and (? ?-)
|
||||
(+ digit)
|
||||
(*? (and (any ?. ?,) (+ digit)))))
|
||||
"")
|
||||
|
||||
(ledger-define-regexp amount
|
||||
(macroexpand
|
||||
`(rx (group (regexp ,ledger-amount-no-group-regexp))))
|
||||
"")
|
||||
(macroexpand
|
||||
`(rx (group (regexp ,ledger-amount-no-group-regexp))))
|
||||
"")
|
||||
|
||||
(ledger-define-regexp commoditized-amount
|
||||
(macroexpand
|
||||
`(rx (group
|
||||
(or (and (regexp ,ledger-commodity-no-group-regexp)
|
||||
(*? blank)
|
||||
(regexp ,ledger-amount-no-group-regexp))
|
||||
(and (regexp ,ledger-amount-no-group-regexp)
|
||||
(*? blank)
|
||||
(regexp ,ledger-commodity-no-group-regexp))))))
|
||||
"")
|
||||
(macroexpand
|
||||
`(rx (group
|
||||
(or (and (regexp ,ledger-commodity-no-group-regexp)
|
||||
(*? blank)
|
||||
(regexp ,ledger-amount-no-group-regexp))
|
||||
(and (regexp ,ledger-amount-no-group-regexp)
|
||||
(*? blank)
|
||||
(regexp ,ledger-commodity-no-group-regexp))))))
|
||||
"")
|
||||
|
||||
(ledger-define-regexp commodity-annotations
|
||||
(macroexpand
|
||||
`(rx (* (+ blank)
|
||||
(or (and ?\{ (regexp ,ledger-commoditized-amount-regexp) ?\})
|
||||
(and ?\[ (regexp ,ledger-iso-date-regexp) ?\])
|
||||
(and ?\( (not (any ?\))) ?\))))))
|
||||
"")
|
||||
(macroexpand
|
||||
`(rx (* (+ blank)
|
||||
(or (and ?\{ (regexp ,ledger-commoditized-amount-regexp) ?\})
|
||||
(and ?\[ (regexp ,ledger-iso-date-regexp) ?\])
|
||||
(and ?\( (not (any ?\))) ?\))))))
|
||||
""
|
||||
commoditized-amount
|
||||
iso-date)
|
||||
|
||||
(ledger-define-regexp cost
|
||||
(macroexpand
|
||||
`(rx (and (or "@" "@@") (+ blank)
|
||||
(regexp ,ledger-commoditized-amount-regexp))))
|
||||
"")
|
||||
(macroexpand
|
||||
`(rx (and (or "@" "@@") (+ blank)
|
||||
(regexp ,ledger-commoditized-amount-regexp))))
|
||||
"")
|
||||
|
||||
(ledger-define-regexp balance-assertion
|
||||
(macroexpand
|
||||
`(rx (and ?= (+ blank)
|
||||
(regexp ,ledger-commoditized-amount-regexp))))
|
||||
"")
|
||||
(macroexpand
|
||||
`(rx (and ?= (+ blank)
|
||||
(regexp ,ledger-commoditized-amount-regexp))))
|
||||
"")
|
||||
|
||||
(ledger-define-regexp full-amount
|
||||
(macroexpand `(rx (group (+? (not (any ?\;))))))
|
||||
"")
|
||||
(rx (group (+? (not (any ?\;)))))
|
||||
"")
|
||||
|
||||
(ledger-define-regexp post-line
|
||||
(macroexpand
|
||||
`(rx (and line-start (+ blank)
|
||||
(? (and (regexp ,ledger-state-regexp) (* blank)))
|
||||
(regexp ,ledger-full-account-regexp)
|
||||
(? (and (regexp ,ledger-long-space-regexp)
|
||||
(regexp ,ledger-full-amount-regexp)))
|
||||
(? (regexp ,ledger-end-note-regexp))
|
||||
line-end)))
|
||||
""
|
||||
state
|
||||
(account-kind full-account kind)
|
||||
(account full-account name)
|
||||
(amount full-amount)
|
||||
(note end-note))
|
||||
(macroexpand
|
||||
`(rx (and line-start (+ blank)
|
||||
(? (and (regexp ,ledger-state-regexp) (* blank)))
|
||||
(regexp ,ledger-full-account-regexp)
|
||||
(? (and (regexp ,ledger-long-space-regexp)
|
||||
(regexp ,ledger-full-amount-regexp)))
|
||||
(? (regexp ,ledger-end-note-regexp))
|
||||
line-end)))
|
||||
""
|
||||
state
|
||||
(account-kind full-account kind)
|
||||
(account full-account name)
|
||||
(amount full-amount)
|
||||
(note end-note))
|
||||
|
||||
(defconst ledger-amount-regex
|
||||
(concat "\\( \\|\t\\| \t\\)[ \t]*-?"
|
||||
@@ -370,13 +358,32 @@
|
||||
"\\([ \t]*[@={]@?[^\n;]+?\\)?"
|
||||
"\\([ \t]+;.+?\\|[ \t]*\\)?$"))
|
||||
|
||||
(defconst ledger-iterate-regex
|
||||
(concat "\\(\\(?:Y\\|year\\)\\s-+\\([0-9]+\\)\\|" ;; Catches a Y/year directive
|
||||
ledger-iso-date-regexp
|
||||
"\\([ *!]+\\)" ;; mark
|
||||
"\\((.*)\\)?" ;; code
|
||||
"\\([[:word:] ]+\\)" ;; desc
|
||||
"\\)"))
|
||||
(ledger-define-regexp year
|
||||
(rx (group (+ (any "0-9"))))
|
||||
"")
|
||||
|
||||
(ledger-define-regexp payee
|
||||
(rx (group (+? nonl)))
|
||||
"")
|
||||
|
||||
(ledger-define-regexp iterate
|
||||
(macroexpand `(rx (or (and (or "Y" "year")
|
||||
(+ (syntax ?-))
|
||||
(regexp ,ledger-year-regexp))
|
||||
(and (regexp ,ledger-full-date-regexp)
|
||||
(? (and (+ blank) (regexp ,ledger-state-regexp)))
|
||||
(? (and (+ blank) (regexp ,ledger-code-regexp)))
|
||||
(+ blank)
|
||||
(regexp ,ledger-payee-regexp)
|
||||
(? (regexp ,ledger-end-note-regexp))))))
|
||||
""
|
||||
year
|
||||
(actual-date full-date actual)
|
||||
(effective-date full-date effective)
|
||||
state
|
||||
code
|
||||
payee
|
||||
(note end-note))
|
||||
|
||||
(defconst ledger-incomplete-date-regexp
|
||||
"\\(?:\\([0-9]\\{1,2\\}\\)[-/]\\)?\\([0-9]\\{1,2\\}\\)")
|
||||
|
||||
Reference in New Issue
Block a user