diff options
Diffstat (limited to '')
-rwxr-xr-x | code.scm | 19 | ||||
-rw-r--r-- | vcalendar.scm | 16 | ||||
-rw-r--r-- | vcalendar/primitive.scm | 16 |
3 files changed, 42 insertions, 9 deletions
@@ -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") |