changeset 698: | 96958d3eb5b0 |
parent: | a5ae5a58c4cd |
author: | Richard Westhaver <ellis@rwest.io> |
date: | Fri, 04 Oct 2024 22:04:59 -0400 |
permissions: | -rw-r--r-- |
description: | fixes |
132 | 1 | ;;; Code: |
128 | 2 | (in-package :organ) |
3 | ||
132 | 4 | ;; the logic will be a bit weird here - we store 2 numbers (completed |
5 | ;; vs remaining) but sometimes need to parse a percentage without |
|
6 | ;; actually knowing the counts of completed vs remaining. To get |
|
7 | ;; around this, we'll allow a float to be stored in the N1 slot, which |
|
8 | ;; indicated that we parsed a percentage without knowing our counts. |
|
133
a5ae5a58c4cd
org element comments and type definitions
ellis <ellis@rwest.io>
parents:
132
diff
changeset
|
9 | (define-org-object stat-cookie ((n1 0 :type number) (n2 0 :type fixnum))) |
132 | 10 | |
11 | (defmacro matches (name) |
|
12 | `(make-matcher ,name)) |
|
13 | ||
14 | (define-matcher stat-cookie-percent (is #\%)) |
|
15 | ||
16 | (define-matcher stat-cookie-ratio (is #\/)) |
|
17 | ||
133
a5ae5a58c4cd
org element comments and type definitions
ellis <ellis@rwest.io>
parents:
132
diff
changeset
|
18 | (define-matcher int (in #\0 #\9)) |
a5ae5a58c4cd
org element comments and type definitions
ellis <ellis@rwest.io>
parents:
132
diff
changeset
|
19 | |
a5ae5a58c4cd
org element comments and type definitions
ellis <ellis@rwest.io>
parents:
132
diff
changeset
|
20 | (define-matcher stat-cookie-start |
a5ae5a58c4cd
org element comments and type definitions
ellis <ellis@rwest.io>
parents:
132
diff
changeset
|
21 | (and (is #\[) |
a5ae5a58c4cd
org element comments and type definitions
ellis <ellis@rwest.io>
parents:
132
diff
changeset
|
22 | (next (matches (or :int |
a5ae5a58c4cd
org element comments and type definitions
ellis <ellis@rwest.io>
parents:
132
diff
changeset
|
23 | :stat-cookie-ratio |
a5ae5a58c4cd
org element comments and type definitions
ellis <ellis@rwest.io>
parents:
132
diff
changeset
|
24 | :stat-cookie-percent))))) |
a5ae5a58c4cd
org element comments and type definitions
ellis <ellis@rwest.io>
parents:
132
diff
changeset
|
25 | |
a5ae5a58c4cd
org element comments and type definitions
ellis <ellis@rwest.io>
parents:
132
diff
changeset
|
26 | (define-matcher stat-cookie-end (is #\])) |
a5ae5a58c4cd
org element comments and type definitions
ellis <ellis@rwest.io>
parents:
132
diff
changeset
|
27 | |
a5ae5a58c4cd
org element comments and type definitions
ellis <ellis@rwest.io>
parents:
132
diff
changeset
|
28 | ;; this feels slow |
132 | 29 | (define-org-parser (stat-cookie :from string) |
30 | ;; either X/Y or X% |
|
31 | (with-lexer-environment (input) |
|
133
a5ae5a58c4cd
org element comments and type definitions
ellis <ellis@rwest.io>
parents:
132
diff
changeset
|
32 | (when (char= #\[ (consume)) |
132 | 33 | (let ((res (org-create :stat-cookie))) |
34 | (setf (org-stat-cookie-n1 res) |
|
35 | (parse-number |
|
133
a5ae5a58c4cd
org element comments and type definitions
ellis <ellis@rwest.io>
parents:
132
diff
changeset
|
36 | (consume-until (matches (not :int))))) |
a5ae5a58c4cd
org element comments and type definitions
ellis <ellis@rwest.io>
parents:
132
diff
changeset
|
37 | (case (consume) |
a5ae5a58c4cd
org element comments and type definitions
ellis <ellis@rwest.io>
parents:
132
diff
changeset
|
38 | (#\/ (setf (org-stat-cookie-n2 res) (parse-number (consume-until (matches :stat-cookie-end))))) |
a5ae5a58c4cd
org element comments and type definitions
ellis <ellis@rwest.io>
parents:
132
diff
changeset
|
39 | (#\% (setf (org-stat-cookie-n1 res) (/ (org-stat-cookie-n1 res) 100)))) |
132 | 40 | res)))) |
41 |