aboutsummaryrefslogtreecommitdiff
diff options
context:
space:
mode:
-rwxr-xr-xcode.scm19
-rw-r--r--vcalendar.scm16
-rw-r--r--vcalendar/primitive.scm16
3 files changed, 42 insertions, 9 deletions
diff --git a/code.scm b/code.scm
index 44444c3a..625b06fc 100755
--- a/code.scm
+++ b/code.scm
@@ -3,6 +3,7 @@
!#
(add-to-load-path (dirname (current-filename)))
+
(use-modules (srfi srfi-19)
(srfi srfi-26)
(vcalendar))
@@ -14,17 +15,25 @@
(define cal (make-vcomponent path))
+(define (extract field)
+ (cut get-attr <> field))
+
;;; Parse all start times into scheme date objects.
(for-each (cut transform-attr! <> "DTSTART"
(cut string->date <> "~Y~m~dT~H~M~S"))
- (children cal))
+ (children cal 'VEVENT))
+
+;;; This function borrowed from web-ics (calendar util)
+(define* (sort* items comperator #:optional (get identity))
+ "A sort function more in line with how python's sorted works"
+ (sort items (lambda (a b)
+ (comperator (get a)
+ (get b)))))
;;; Sort the events, and print a simple agenda.
(let ((sorted-events
- (sort (children cal)
- (lambda (a b)
- (time<? (date->time-utc (get-attr a "DTSTART"))
- (date->time-utc (get-attr b "DTSTART")))))))
+ (sort* (children cal 'VEVENT)
+ time<? (compose date->time-utc (extract "DTSTART")))))
(for-each (lambda (ev) (format #t "~a | ~a~%"
(date->string (get-attr ev "DTSTART") "~1 ~H:~M")
(get-attr ev "SUMMARY")))
diff --git a/vcalendar.scm b/vcalendar.scm
index c6aee02c..c2228650 100644
--- a/vcalendar.scm
+++ b/vcalendar.scm
@@ -1,12 +1,11 @@
(define-module (vcalendar)
+ #:use-module (vcalendar primitive)
#:use-module (srfi srfi-1)
#:use-module (srfi srfi-26)
#:export (make-vcomponent children set-attr! get-attr type
+ type-filter
transform-attr! push-child!))
-(setenv "LD_LIBRARY_PATH" (dirname (current-filename)))
-(load-extension "libguile-calendar" "init_lib")
-
(define (make-vcomponent path)
(if (string-ci=? ".ics" (string-take-right path 4))
;; == Single ICS file ==
@@ -27,7 +26,16 @@
accum)
'() (%vcomponent-children (%vcomponent-make path)))))
-(define children %vcomponent-children)
+(define (type-filter t lst)
+ (filter (lambda (e) (eqv? t (type e)))
+ lst))
+
+(define* (children component #:optional only-type)
+ (let ((childs (%vcomponent-children component)))
+ (if only-type
+ (type-filter only-type childs)
+ childs)))
+
(define set-attr! %vcomponent-set-attribute!)
(define get-attr %vcomponent-get-attribute)
(define type %vcomponent-type)
diff --git a/vcalendar/primitive.scm b/vcalendar/primitive.scm
new file mode 100644
index 00000000..aa182040
--- /dev/null
+++ b/vcalendar/primitive.scm
@@ -0,0 +1,16 @@
+;;; Primitive export of symbols linked from C binary.
+
+(define-module (vcalendar primitive)
+ #:export (%vcomponent-children
+ %vcomponent-push-child!
+
+ %vcomponent-parent
+
+ %vcomponent-make
+ %vcomponent-type
+
+ %vcomponent-set-attribute!
+ %vcomponent-get-attribute))
+
+(setenv "LD_LIBRARY_PATH" (dirname (dirname (current-filename))))
+(load-extension "libguile-calendar" "init_lib")