changelog shortlog graph tags branches changeset files revisions annotate raw help

Mercurial > core / lisp/lib/organ/element/lesser/planning.lisp

changeset 698: 96958d3eb5b0
parent: b7183bfd7107
author: Richard Westhaver <ellis@rwest.io>
date: Fri, 04 Oct 2024 22:04:59 -0400
permissions: -rw-r--r--
description: fixes
1 ;;; lib/organ/element/lesser/planning.lisp --- Org Planning Elements
2 
3 ;; A planning element matches the pattern:
4 
5 #|
6 HEADING
7 PLANNING
8 |#
9 
10 ;; HEADING is just a heading.
11 
12 ;; PLANNING matches the pattern: 'KEYWORD: TIMESTAMP'.
13 
14 ;; KEYWORD is one of DEADLINE, SCHEDULED, CLOSED.
15 
16 ;;; Code:
17 (in-package :organ)
18 
19 (sb-int:defconstant-eqx +org-planning-keywords+ '("DEADLINE" "SCHEDULED" "CLOSED") #'equal)
20 
21 ;; helper object, not public API
22 (define-org-object planning-line ((keyword "" :type string) (timestamp "" :type string)))
23 
24 ;; always consume the string
25 (define-org-parser (planning-line :from string)
26  (multiple-value-bind (match subs)
27  (scan-to-strings org-planning-rx input)
28  (when match
29  (let ((kw (aref subs 0))
30  (ts (aref subs 1)))
31  (when (and kw ts)
32  (let ((pl (org-create :planning-line)))
33  (setf (org-planning-line-keyword pl) kw
34  (org-planning-line-timestamp pl) ts)
35  pl))))))
36 
37 (define-org-element planning ((contents :initarg :contents :accessor org-contents :type (vector org-planning-line) :initform (make-array 0 :element-type 'org-planning-line :adjustable t :fill-pointer 0)))
38  :lesser t)
39 
40 (define-org-parser (planning :from stream)
41  (let ((first (read-line input nil))
42  (p (org-create :planning)))
43  (when-let ((pl1 (org-parse :planning-line first)))
44  (vector-push-extend pl1 (org-contents p))
45  (loop for l = (read-line input) ;; FIXME: peek-line no work
46  until (not l)
47  with pl = (org-parse :planning-line (read-line input))
48  until (not pl)
49  do (vector-push-extend pl (org-contents p)))
50  p)))
51 
52 (define-org-parser (planning :from string)
53  (with-input-from-string (s input)
54  (org-parse :planning s)))