diff --git a/guile/mu/part.scm b/guile/mu/part.scm new file mode 100644 index 00000000..686781bc --- /dev/null +++ b/guile/mu/part.scm @@ -0,0 +1,72 @@ +;; +;; Copyright (C) 2011-2012 Dirk-Jan C. Binnema +;; +;; This program is free software; you can redistribute it and/or modify it +;; under the terms of the GNU General Public License as published by the +;; Free Software Foundation; either version 3, or (at your option) any +;; later version. +;; +;; This program is distributed in the hope that it will be useful, +;; but WITHOUT ANY WARRANTY; without even the implied warranty of +;; MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the +;; GNU General Public License for more details. +;; + +;; You should have received a copy of the GNU General Public License +;; along with this program; if not, write to the Free Software Foundation, +;; Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301, USA. + +(define-module (mu part) + :use-module (oop goops) + :use-module (mu) + :use-module (mu message) + :export (;; get-part + ;; classes + + ;; message function + attachments + parts + ;; methods + index + name + mime-type +;; size + save + save-as)) + +(define-class () + (msgpath #:init-value #f #:init-keyword #:msgpath) + (index #:init-value #f #:init-keyword #:index) + (name #:init-value #f #:getter name #:init-keyword #:name) + (mime-type #:init-value #f #:getter mime-type #:init-keyword #:mime-type) + (size #:init-value 0 #:getter size #:init-keyword #:size)) + +(define-method (get-parts (msg ) (files-only )) + "Get the part for MSG as a list of objects; if FILES-ONLY is #t, +only get the part with file names." + (map (lambda (part) + (make + #:msgpath (list-ref part 0) + #:index (list-ref part 1) + #:name (list-ref part 2) + #:mime-type (list-ref part 3) + #:size (list-ref part 4))) + (mu:get-parts (slot-ref msg 'msg) files-only))) + +(define-method (attachments (msg )) + "Get the attachments for MSG as a list of objects." + (get-parts msg #t)) + +(define-method (parts (msg )) + "Get the MIME-parts for MSG as a list of objects." + (get-parts msg #f)) + +(define-method (save (part )) + "Save PART to a temporary file, and return the file name. If the +part had a filename, the temporary file's file name will be just that; +otherwise a name is made up." + (mu:save-part (slot-ref part 'msgpath) (slot-ref part 'index))) + +(define-method (save-as (part ) (filepath )) + "Save message-part PART to file system path PATH." + (copy-file (save part) filepath)) diff --git a/guile/mu/plot.scm b/guile/mu/plot.scm new file mode 100644 index 00000000..94f8b955 --- /dev/null +++ b/guile/mu/plot.scm @@ -0,0 +1,59 @@ +;; +;; Copyright (C) 2011-2012 Dirk-Jan C. Binnema +;; +;; This program is free software; you can redistribute it and/or modify it +;; under the terms of the GNU General Public License as published by the +;; Free Software Foundation; either version 3, or (at your option) any +;; later version. +;; +;; This program is distributed in the hope that it will be useful, +;; but WITHOUT ANY WARRANTY; without even the implied warranty of +;; MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the +;; GNU General Public License for more details. +;; + +;; You should have received a copy of the GNU General Public License +;; along with this program; if not, write to the Free Software Foundation, +;; Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301, USA. + +(define-module (mu plot) + :use-module (mu message) + :use-module (ice-9 popen) + :export ( mu:plot-x11 + mu:plot-ascii)) + +(define (export-pairs pairs) + "Write a temporary file with the list of PAIRS in table format, and +return the file name." + (let* ((datafile (tmpnam)) + (output (open datafile (logior O_CREAT O_WRONLY) #O0600))) + (for-each + (lambda(pair) + (display (format #f "~a ~a\n" (car pair) (cdr pair)) output)) + pairs) + (close output) + datafile)) + +(define (mu:plot data title x-label y-label want-ascii) + "Plot DATA with TITLE, X-LABEL and X-LABEL. If WANT-ASCII is #t, +output in plain-text; otherwise use an X11 window." + (let ((datafile (export-pairs data)) + (gnuplot (open-pipe "gnuplot -p" OPEN_WRITE))) + (display (string-append + "reset\n" + "set term " (if want-ascii "dumb" "x11") "\n" + "set title \"" title "\"\n" + "set xlabel \"" x-label "\"\n" + "set ylabel \"" y-label "\"\n" + "set boxwidth 0.9\n" + "plot \"" datafile "\" using 2:xticlabels(1) with boxes fs solid\n") + gnuplot) + (close-pipe gnuplot))) + +(define* (mu:plot-ascii data #:optional (title "Title") (x-label "X") (y-label "Y")) + "Plot DATA with TITLE, X-LABEL and X-LABEL in plain-text." + (mu:plot data title x-label y-label #t)) + +(define* (mu:plot-x11 data #:optional (title "Title") (x-label "X") (y-label "Y")) + "Plot DATA with TITLE, X-LABEL and X-LABEL in an X11 window." + (mu:plot data title x-label y-label #f))