emacs-diffs
[Top][All Lists]
Advanced

[Date Prev][Date Next][Thread Prev][Thread Next][Date Index][Thread Index]

[Emacs-diffs] Changes to emacs/lisp/calendar/icalendar.el


From: Glenn Morris
Subject: [Emacs-diffs] Changes to emacs/lisp/calendar/icalendar.el
Date: Mon, 24 Oct 2005 03:27:39 -0400

Index: emacs/lisp/calendar/icalendar.el
diff -c emacs/lisp/calendar/icalendar.el:1.13 
emacs/lisp/calendar/icalendar.el:1.14
*** emacs/lisp/calendar/icalendar.el:1.13       Sun Sep 18 12:41:38 2005
--- emacs/lisp/calendar/icalendar.el    Mon Oct 24 07:27:39 2005
***************
*** 97,103 ****
  
  ;;; Code:
  
! (defconst icalendar-version 0.12
    "Version number of icalendar.el.")
  
  ;; ======================================================================
--- 97,103 ----
  
  ;;; Code:
  
! (defconst icalendar-version "0.13"
    "Version number of icalendar.el.")
  
  ;; ======================================================================
***************
*** 113,130 ****
    "Format string for importing events from iCalendar into Emacs diary.
  This string defines how iCalendar events are inserted into diary
  file.  Meaning of the specifiers:
  %d Description, see `icalendar-import-format-description'
  %l Location, see `icalendar-import-format-location'
  %o Organizer, see `icalendar-import-format-organizer'
! %s Subject, see `icalendar-import-format-subject'"
    :type 'string
    :group 'icalendar)
  
! (defcustom icalendar-import-format-subject
    "%s"
!   "Format string defining how the subject element is formatted.
! This applies only if the subject is not empty! `%s' is replaced
! by the subject."
    :type 'string
    :group 'icalendar)
  
--- 113,133 ----
    "Format string for importing events from iCalendar into Emacs diary.
  This string defines how iCalendar events are inserted into diary
  file.  Meaning of the specifiers:
+ %c Class, see `icalendar-import-format-class'
  %d Description, see `icalendar-import-format-description'
  %l Location, see `icalendar-import-format-location'
  %o Organizer, see `icalendar-import-format-organizer'
! %s Summary, see `icalendar-import-format-summary'
! %t Status, see `icalendar-import-format-status'
! %u URL, see `icalendar-import-format-url'"
    :type 'string
    :group 'icalendar)
  
! (defcustom icalendar-import-format-summary
    "%s"
!   "Format string defining how the summary element is formatted.
! This applies only if the summary is not empty! `%s' is replaced
! by the summary."
    :type 'string
    :group 'icalendar)
  
***************
*** 152,157 ****
--- 155,184 ----
    :type 'string
    :group 'icalendar)
  
+ (defcustom icalendar-import-format-url
+   "\n URL: %s"
+   "Format string defining how the URL element is formatted.
+ This applies only if the URL is not empty! `%s' is replaced by
+ the URL."
+   :type 'string
+   :group 'icalendar)
+ 
+ (defcustom icalendar-import-format-status
+   "\n Status: %s"
+   "Format string defining how the status element is formatted.
+ This applies only if the status is not empty! `%s' is replaced by
+ the status."
+   :type 'string
+   :group 'icalendar)
+ 
+ (defcustom icalendar-import-format-class
+   "\n Class: %s"
+   "Format string defining how the class element is formatted.
+ This applies only if the class is not empty! `%s' is replaced by
+ the class."
+   :type 'string
+   :group 'icalendar)
+ 
  (defvar icalendar-debug nil
    "Enable icalendar debug messages.")
  
***************
*** 195,209 ****
          (replace-match "" nil nil)))
      unfolded-buffer))
  
! (defsubst icalendar--rris (re rp st)
!   "Replace regexp RE with RP in string ST and return the new string.
! This is here for compatibility with XEmacs."
    ;; XEmacs:
    (if (fboundp 'replace-in-string)
        (save-match-data ;; apparently XEmacs needs save-match-data
!         (replace-in-string st re rp))
      ;; Emacs:
!     (replace-regexp-in-string re rp st)))
  
  (defun icalendar--read-element (invalue inparams)
    "Recursively read the next iCalendar element in the current buffer.
--- 222,237 ----
          (replace-match "" nil nil)))
      unfolded-buffer))
  
! (defsubst icalendar--rris (&rest args)
!   "Replace regular expression in string.
! Pass ARGS to `replace-regexp-in-string' (Emacs) or to
! `replace-in-string' (XEmacs)."
    ;; XEmacs:
    (if (fboundp 'replace-in-string)
        (save-match-data ;; apparently XEmacs needs save-match-data
!         (apply 'replace-in-string args))
      ;; Emacs:
!     (apply 'replace-regexp-in-string args)))
  
  (defun icalendar--read-element (invalue inparams)
    "Recursively read the next iCalendar element in the current buffer.
***************
*** 609,620 ****
                   (setq month day)
                   (setq day x))))
              ( ;; date contains month names -- european-style
!              (and european-calendar-style
!                   (string-match (concat "\\s-*"
!                                         "0?\\([123]?[0-9]\\)[ \t/]\\s-*"
!                                         "\\([A-Za-z][^ ]+\\)[ \t/]\\s-*"
!                                         "\\([0-9]\\{4\\}\\)")
!                                 datestring))
               (setq day (read (substring datestring (match-beginning 1)
                                          (match-end 1))))
               (setq month (icalendar--get-month-number
--- 637,647 ----
                   (setq month day)
                   (setq day x))))
              ( ;; date contains month names -- european-style
!              (string-match (concat "\\s-*"
!                                    "0?\\([123]?[0-9]\\)[ \t/]\\s-*"
!                                    "\\([A-Za-z][^ ]+\\)[ \t/]\\s-*"
!                                    "\\([0-9]\\{4\\}\\)")
!                            datestring)
               (setq day (read (substring datestring (match-beginning 1)
                                          (match-end 1))))
               (setq month (icalendar--get-month-number
***************
*** 623,634 ****
               (setq year (read (substring datestring (match-beginning 3)
                                           (match-end 3)))))
              ( ;; date contains month names -- non-european-style
!              (and (not european-calendar-style)
!                   (string-match (concat "\\s-*"
!                                         "\\([A-Za-z][^ ]+\\)[ \t/]\\s-*"
!                                         "0?\\([123]?[0-9]\\),?[ \t/]\\s-*"
!                                         "\\([0-9]\\{4\\}\\)")
!                                 datestring))
               (setq day (read (substring datestring (match-beginning 2)
                                          (match-end 2))))
               (setq month (icalendar--get-month-number
--- 650,660 ----
               (setq year (read (substring datestring (match-beginning 3)
                                           (match-end 3)))))
              ( ;; date contains month names -- non-european-style
!              (string-match (concat "\\s-*"
!                                    "\\([A-Za-z][^ ]+\\)[ \t/]\\s-*"
!                                    "0?\\([123]?[0-9]\\),?[ \t/]\\s-*"
!                                    "\\([0-9]\\{4\\}\\)")
!                            datestring)
               (setq day (read (substring datestring (match-beginning 2)
                                          (match-end 2))))
               (setq month (icalendar--get-month-number
***************
*** 704,713 ****
          (entry-main "")
          (entry-rest "")
          (header "")
          (contents)
          (found-error nil)
          (nonmarker (concat "^" (regexp-quote diary-nonmarking-symbol)
!                            "?")))
      ;; prepare buffer with error messages
      (save-current-buffer
        (set-buffer (get-buffer-create "*icalendar-errors*"))
--- 730,741 ----
          (entry-main "")
          (entry-rest "")
          (header "")
+         (contents-n-summary)
          (contents)
          (found-error nil)
          (nonmarker (concat "^" (regexp-quote diary-nonmarking-symbol)
!                            "?"))
!         (other-elements nil))
      ;; prepare buffer with error messages
      (save-current-buffer
        (set-buffer (get-buffer-create "*icalendar-errors*"))
***************
*** 728,763 ****
                               (car (cddr (current-time)))))
          (condition-case error-val
              (progn
!               (setq contents
!                     (or
!                      ;; anniversaries -- %%(diary-anniversary ...)
!                      (icalendar--convert-anniversary-to-ical nonmarker
!                                                              entry-main)
!                      ;; cyclic events -- %%(diary-cyclic ...)
!                      (icalendar--convert-cyclic-to-ical nonmarker entry-main)
!                      ;; diary-date -- %%(diary-date ...)
!                      (icalendar--convert-date-to-ical nonmarker entry-main)
!                      ;; float events -- %%(diary-float ...)
!                      (icalendar--convert-float-to-ical nonmarker entry-main)
!                      ;; block events -- %%(diary-block ...)
!                      (icalendar--convert-block-to-ical nonmarker entry-main)
!                      ;; other sexp diary entries
!                      (icalendar--convert-sexp-to-ical nonmarker entry-main)
!                      ;; weekly by day -- Monday 8:30 Team meeting
!                      (icalendar--convert-weekly-to-ical nonmarker entry-main)
!                      ;; yearly by day -- 1 May Tag der Arbeit
!                      (icalendar--convert-yearly-to-ical nonmarker entry-main)
!                      ;; "ordinary" events, start and end time given
!                      ;; 1 Feb 2003 blah
!                      (icalendar--convert-ordinary-to-ical nonmarker 
entry-main)
!                      ;; everything else
!                      ;; Oops! what's that?
!                      (error "Could not parse entry")))
!               (unless (string= entry-rest "")
!                 (setq contents
!                       (concat contents "\nDESCRIPTION:"
!                               (icalendar--convert-string-for-export
!                                entry-rest))))
                (setq result (concat result header contents "\nEND:VEVENT")))
            ;; handle errors
            (error
--- 756,788 ----
                               (car (cddr (current-time)))))
          (condition-case error-val
              (progn
!               (setq contents-n-summary
!                     (icalendar--convert-to-ical nonmarker entry-main))
!               (setq other-elements (icalendar--parse-summary-and-rest
!                                     (concat entry-main entry-rest)))
!               (setq contents (concat (car contents-n-summary)
!                                      "\nSUMMARY:" (cadr contents-n-summary)))
!               (let ((cla (cdr (assoc 'cla other-elements)))
!                     (des (cdr (assoc 'des other-elements)))
!                     (loc (cdr (assoc 'loc other-elements)))
!                     (org (cdr (assoc 'org other-elements)))
!                     (sta (cdr (assoc 'sta other-elements)))
!                     (sum (cdr (assoc 'sum other-elements)))
!                     (url (cdr (assoc 'url other-elements))))
!                 (if cla
!                     (setq contents (concat contents "\nCLASS:" cla)))
!                 (if des
!                     (setq contents (concat contents "\nDESCRIPTION:" des)))
!                 (if loc
!                     (setq contents (concat contents "\nLOCATION:" loc)))
!                 (if org
!                     (setq contents (concat contents "\nORGANIZER:" org)))
!                 (if sta
!                     (setq contents (concat contents "\nSTATUS:" sta)))
!                 ;;(if sum
!                 ;;    (setq contents (concat contents "\nSUMMARY:" sum)))
!                 (if url
!                     (setq contents (concat contents "\nURL:" url))))
                (setq result (concat result header contents "\nEND:VEVENT")))
            ;; handle errors
            (error
***************
*** 780,792 ****
            (insert result)
            (insert "\nEND:VCALENDAR\n")
            ;; save the diary file
!           (save-buffer))))
      found-error))
  
! ;; subroutines
  (defun icalendar--convert-ordinary-to-ical (nonmarker entry-main)
    "Convert \"ordinary\" diary entry to icalendar format.
- 
  NONMARKER is a regular expression matching the start of non-marking
  entries.  ENTRY-MAIN is the first line of the diary entry."
    (if (string-match (concat nonmarker
--- 805,931 ----
            (insert result)
            (insert "\nEND:VCALENDAR\n")
            ;; save the diary file
!           (save-buffer)
!           (unless found-error
!             (bury-buffer)))))
      found-error))
  
! (defun icalendar--convert-to-ical (nonmarker entry-main)
!   "Convert a diary entry to icalendar format.
! NONMARKER is a regular expression matching the start of non-marking
! entries.  ENTRY-MAIN is the first line of the diary entry."
!   (or
!    ;; anniversaries -- %%(diary-anniversary ...)
!    (icalendar--convert-anniversary-to-ical nonmarker entry-main)
!    ;; cyclic events -- %%(diary-cyclic ...)
!    (icalendar--convert-cyclic-to-ical nonmarker entry-main)
!    ;; diary-date -- %%(diary-date ...)
!    (icalendar--convert-date-to-ical nonmarker entry-main)
!    ;; float events -- %%(diary-float ...)
!    (icalendar--convert-float-to-ical nonmarker entry-main)
!    ;; block events -- %%(diary-block ...)
!    (icalendar--convert-block-to-ical nonmarker entry-main)
!    ;; other sexp diary entries
!    (icalendar--convert-sexp-to-ical nonmarker entry-main)
!    ;; weekly by day -- Monday 8:30 Team meeting
!    (icalendar--convert-weekly-to-ical nonmarker entry-main)
!    ;; yearly by day -- 1 May Tag der Arbeit
!    (icalendar--convert-yearly-to-ical nonmarker entry-main)
!    ;; "ordinary" events, start and end time given
!    ;; 1 Feb 2003 blah
!    (icalendar--convert-ordinary-to-ical nonmarker entry-main)
!    ;; everything else
!    ;; Oops! what's that?
!    (error "Could not parse entry")))
! 
! (defun icalendar--parse-summary-and-rest (summary-and-rest)
!   "Parse SUMMARY-AND-REST from a diary to fill iCalendar properties."
!   (save-match-data
!     (let* ((s icalendar-import-format)
!            (p-cla (or (string-match "%c" icalendar-import-format) -1))
!            (p-des (or (string-match "%d" icalendar-import-format) -1))
!            (p-loc (or (string-match "%l" icalendar-import-format) -1))
!            (p-org (or (string-match "%o" icalendar-import-format) -1))
!            (p-sum (or (string-match "%s" icalendar-import-format) -1))
!            (p-sta (or (string-match "%t" icalendar-import-format) -1))
!            (p-url (or (string-match "%u" icalendar-import-format) -1))
!            (p-list (sort (list p-cla p-des p-loc p-org p-sta p-sum p-url) '<))
!            pos-cla pos-des pos-loc pos-org pos-sta pos-sum pos-url)
!       (dotimes (i (length p-list))
!         (cond ((and (>= p-cla 0) (= (nth i p-list) p-cla))
!                (setq pos-cla (+ 2 (* 2 i))))
!               ((and (>= p-des 0) (= (nth i p-list) p-des))
!                (setq pos-des (+ 2 (* 2 i))))
!               ((and (>= p-loc 0) (= (nth i p-list) p-loc))
!                (setq pos-loc (+ 2 (* 2 i))))
!               ((and (>= p-org 0) (= (nth i p-list) p-org))
!                (setq pos-org (+ 2 (* 2 i))))
!               ((and (>= p-sta 0) (= (nth i p-list) p-sta))
!                (setq pos-sta (+ 2 (* 2 i))))
!               ((and (>= p-sum 0) (= (nth i p-list) p-sum))
!                (setq pos-sum (+ 2 (* 2 i))))
!               ((and (>= p-url 0) (= (nth i p-list) p-url))
!                (setq pos-url (+ 2 (* 2 i))))))
!       (mapc (lambda (ij)
!               (setq s (icalendar--rris (car ij) (cadr ij) s t t)))
!             (list
!              ;; summary must be first! because of %s
!              (list "%s"
!                    (concat "\\(" icalendar-import-format-summary "\\)?"))
!              (list "%c"
!                    (concat "\\(" icalendar-import-format-class "\\)?"))
!              (list "%d"
!                    (concat "\\(" icalendar-import-format-description "\\)?"))
!              (list "%l"
!                    (concat "\\(" icalendar-import-format-location "\\)?"))
!              (list "%o"
!                    (concat "\\(" icalendar-import-format-organizer "\\)?"))
!              (list "%t"
!                    (concat "\\(" icalendar-import-format-status "\\)?"))
!              (list "%u"
!                    (concat "\\(" icalendar-import-format-url "\\)?"))))
!       (setq s (concat (icalendar--rris "%s" "\\(.*\\)" s nil t) " "))
!       (if (string-match s summary-and-rest)
!           (let (cla des loc org sta sum url)
!             (if (and pos-sum (match-beginning pos-sum))
!                 (setq sum (substring summary-and-rest
!                                      (match-beginning pos-sum)
!                                      (match-end pos-sum))))
!             (if (and pos-cla (match-beginning pos-cla))
!                 (setq cla (substring summary-and-rest
!                                      (match-beginning pos-cla)
!                                      (match-end pos-cla))))
!             (if (and pos-des (match-beginning pos-des))
!                 (setq des (substring summary-and-rest
!                                      (match-beginning pos-des)
!                                      (match-end pos-des))))
!             (if (and pos-loc (match-beginning pos-loc))
!                 (setq loc (substring summary-and-rest
!                                      (match-beginning pos-loc)
!                                      (match-end pos-loc))))
!             (if (and pos-org (match-beginning pos-org))
!                 (setq org (substring summary-and-rest
!                                      (match-beginning pos-org)
!                                      (match-end pos-org))))
!             (if (and pos-sta (match-beginning pos-sta))
!                 (setq sta (substring summary-and-rest
!                                      (match-beginning pos-sta)
!                                      (match-end pos-sta))))
!             (if (and pos-url (match-beginning pos-url))
!                 (setq url (substring summary-and-rest
!                                      (match-beginning pos-url)
!                                      (match-end pos-url))))
!             (list (if cla (cons 'cla cla) nil)
!                   (if des (cons 'des des) nil)
!                   (if loc (cons 'loc loc) nil)
!                   (if org (cons 'org org) nil)
!                   (if sta (cons 'sta sta) nil)
!                   ;;(if sum (cons 'sum sum) nil)
!                   (if url (cons 'url url) nil)))))))
! 
! ;; subroutines for icalendar-export-region
  (defun icalendar--convert-ordinary-to-ical (nonmarker entry-main)
    "Convert \"ordinary\" diary entry to icalendar format.
  NONMARKER is a regular expression matching the start of non-marking
  entries.  ENTRY-MAIN is the first line of the diary entry."
    (if (string-match (concat nonmarker
***************
*** 795,801 ****
                              "\\("
                              "-0?\\([1-9][0-9]?:[0-9][0-9]\\)\\([ap]m\\)?\\)?"
                              "\\)?"
!                             "\\s-*\\(.*\\)")
                      entry-main)
        (let* ((datetime (substring entry-main (match-beginning 1)
                                    (match-end 1)))
--- 934,940 ----
                              "\\("
                              "-0?\\([1-9][0-9]?:[0-9][0-9]\\)\\([ap]m\\)?\\)?"
                              "\\)?"
!                             "\\s-*\\(.*?\\) ?$")
                      entry-main)
        (let* ((datetime (substring entry-main (match-beginning 1)
                                    (match-end 1)))
***************
*** 839,864 ****
                                            starttimestring))))
                (setq endtimestring (format "T%06d"
                                            (+ 10000 time))))))
!         (concat "\nDTSTART;"
!                 (if starttimestring "VALUE=DATE-TIME:"
!                   "VALUE=DATE:")
!                 startisostring
!                 (or starttimestring "")
!                 "\nDTEND;"
!                 (if endtimestring "VALUE=DATE-TIME:"
!                   "VALUE=DATE:")
!                 (if starttimestring
!                     startisostring
!                   endisostring)
!                 (or endtimestring "")
!                 "\nSUMMARY:"
!                 summary))
      ;; no match
      nil))
  
  (defun icalendar--convert-weekly-to-ical (nonmarker entry-main)
    "Convert weekly diary entry to icalendar format.
- 
  NONMARKER is a regular expression matching the start of non-marking
  entries.  ENTRY-MAIN is the first line of the diary entry."
    (if (and (string-match (concat nonmarker
--- 978,1001 ----
                                            starttimestring))))
                (setq endtimestring (format "T%06d"
                                            (+ 10000 time))))))
!         (list (concat "\nDTSTART;"
!                       (if starttimestring "VALUE=DATE-TIME:"
!                         "VALUE=DATE:")
!                       startisostring
!                       (or starttimestring "")
!                       "\nDTEND;"
!                       (if endtimestring "VALUE=DATE-TIME:"
!                         "VALUE=DATE:")
!                       (if starttimestring
!                           startisostring
!                         endisostring)
!                       (or endtimestring ""))
!               summary))
      ;; no match
      nil))
  
  (defun icalendar--convert-weekly-to-ical (nonmarker entry-main)
    "Convert weekly diary entry to icalendar format.
  NONMARKER is a regular expression matching the start of non-marking
  entries.  ENTRY-MAIN is the first line of the diary entry."
    (if (and (string-match (concat nonmarker
***************
*** 869,875 ****
                                   "\\([1-9][0-9]?:[0-9][0-9]\\)"
                                   "\\([ap]m\\)?\\)?"
                                   "\\)?"
!                                  "\\s-*\\(.*\\)$")
                           entry-main)
             (icalendar--get-weekday-abbrev
              (substring entry-main (match-beginning 1)
--- 1006,1012 ----
                                   "\\([1-9][0-9]?:[0-9][0-9]\\)"
                                   "\\([ap]m\\)?\\)?"
                                   "\\)?"
!                                  "\\s-*\\(.*?\\) ?$")
                           entry-main)
             (icalendar--get-weekday-abbrev
              (substring entry-main (match-beginning 1)
***************
*** 911,945 ****
                                            starttimestring))))
                (setq endtimestring (format "T%06d"
                                            (+ 10000 time))))))
!         (concat "\nDTSTART;"
!                 (if starttimestring
!                     "VALUE=DATE-TIME:"
!                   "VALUE=DATE:")
!                 ;; find the correct week day,
!                 ;; 1st january 2000 was a saturday
!                 (format
!                  "200001%02d"
!                  (+ (icalendar--get-weekday-number day) 2))
!                 (or starttimestring "")
!                 "\nDTEND;"
!                 (if endtimestring
!                     "VALUE=DATE-TIME:"
!                   "VALUE=DATE:")
!                 (format
!                  "200001%02d"
!                  ;; end is non-inclusive!
!                  (+ (icalendar--get-weekday-number day)
!                     (if endtimestring 2 3)))
!                 (or endtimestring "")
!                 "\nSUMMARY:" summary
!                 "\nRRULE:FREQ=WEEKLY;INTERVAL=1;BYDAY="
!                 day))
      ;; no match
      nil))
  
  (defun icalendar--convert-yearly-to-ical (nonmarker entry-main)
    "Convert yearly diary entry to icalendar format.
- 
  NONMARKER is a regular expression matching the start of non-marking
  entries.  ENTRY-MAIN is the first line of the diary entry."
    (if (string-match (concat nonmarker
--- 1048,1081 ----
                                            starttimestring))))
                (setq endtimestring (format "T%06d"
                                            (+ 10000 time))))))
!         (list (concat "\nDTSTART;"
!                       (if starttimestring
!                           "VALUE=DATE-TIME:"
!                         "VALUE=DATE:")
!                       ;; find the correct week day,
!                       ;; 1st january 2000 was a saturday
!                       (format
!                        "200001%02d"
!                        (+ (icalendar--get-weekday-number day) 2))
!                       (or starttimestring "")
!                       "\nDTEND;"
!                       (if endtimestring
!                           "VALUE=DATE-TIME:"
!                         "VALUE=DATE:")
!                       (format
!                        "200001%02d"
!                        ;; end is non-inclusive!
!                        (+ (icalendar--get-weekday-number day)
!                           (if endtimestring 2 3)))
!                       (or endtimestring "")
!                       "\nRRULE:FREQ=WEEKLY;INTERVAL=1;BYDAY="
!                       day)
!               summary))
      ;; no match
      nil))
  
  (defun icalendar--convert-yearly-to-ical (nonmarker entry-main)
    "Convert yearly diary entry to icalendar format.
  NONMARKER is a regular expression matching the start of non-marking
  entries.  ENTRY-MAIN is the first line of the diary entry."
    (if (string-match (concat nonmarker
***************
*** 951,957 ****
                              "\\("
                              "-0?\\([1-9][0-9]?:[0-9][0-9]\\)\\([ap]m\\)?\\)?"
                              "\\)?"
!                             "\\s-*\\([^0-9]+.*\\)$" ; must not match years
                              )
                      entry-main)
        (let* ((daypos (if european-calendar-style 1 2))
--- 1087,1093 ----
                              "\\("
                              "-0?\\([1-9][0-9]?:[0-9][0-9]\\)\\([ap]m\\)?\\)?"
                              "\\)?"
!                             "\\s-*\\([^0-9]+.*?\\) ?$" ; must not match years
                              )
                      entry-main)
        (let* ((daypos (if european-calendar-style 1 2))
***************
*** 997,1021 ****
                                            starttimestring))))
                (setq endtimestring (format "T%06d"
                                            (+ 10000 time))))))
!         (concat "\nDTSTART;"
!                 (if starttimestring "VALUE=DATE-TIME:"
!                   "VALUE=DATE:")
!                 (format "1900%02d%02d" month day)
!                 (or starttimestring "")
!                 "\nDTEND;"
!                 (if endtimestring "VALUE=DATE-TIME:"
!                   "VALUE=DATE:")
!                 ;; end is not included! shift by one day
!                 (icalendar--date-to-isodate
!                  (list month day 1900)
!                  (if endtimestring 0 1))
!                 (or endtimestring "")
!                 "\nSUMMARY:"
!                 summary
!                 "\nRRULE:FREQ=YEARLY;INTERVAL=1;BYMONTH="
!                 (format "%2d" month)
!                 ";BYMONTHDAY="
!                 (format "%2d" day)))
      ;; no match
      nil))
  
--- 1133,1156 ----
                                            starttimestring))))
                (setq endtimestring (format "T%06d"
                                            (+ 10000 time))))))
!         (list (concat "\nDTSTART;"
!                       (if starttimestring "VALUE=DATE-TIME:"
!                         "VALUE=DATE:")
!                       (format "1900%02d%02d" month day)
!                       (or starttimestring "")
!                       "\nDTEND;"
!                       (if endtimestring "VALUE=DATE-TIME:"
!                         "VALUE=DATE:")
!                       ;; end is not included! shift by one day
!                       (icalendar--date-to-isodate
!                        (list month day 1900)
!                        (if endtimestring 0 1))
!                       (or endtimestring "")
!                       "\nRRULE:FREQ=YEARLY;INTERVAL=1;BYMONTH="
!                       (format "%2d" month)
!                       ";BYMONTHDAY="
!                       (format "%2d" day))
!               summary))
      ;; no match
      nil))
  
***************
*** 1026,1043 ****
  
  NONMARKER is a regular expression matching the start of non-marking
  entries.  ENTRY-MAIN is the first line of the diary entry."
!   (if (string-match (concat nonmarker
!                             "%%(\\([^)]+\\))\\s-*\\(.*\\)")
!                     entry-main)
!       (progn
!         (icalendar--dmsg "diary-sexp %s" entry-main)
!         (error "Sexp-entries are not supported yet"))
!     ;; no match
!     nil))
  
  (defun icalendar--convert-block-to-ical (nonmarker entry-main)
    "Convert block diary entry to icalendar format.
- 
  NONMARKER is a regular expression matching the start of non-marking
  entries.  ENTRY-MAIN is the first line of the diary entry."
    (if (string-match (concat nonmarker
--- 1161,1188 ----
  
  NONMARKER is a regular expression matching the start of non-marking
  entries.  ENTRY-MAIN is the first line of the diary entry."
!   (cond ((string-match (concat nonmarker
!                                "%%(and \\(([^)]+)\\))\\(\\s-*.*?\\) ?$")
!                        entry-main)
!          ;; simple sexp entry as generated by icalendar.el: strip off the
!          ;; unnecessary (and)
!          (icalendar--dmsg "diary-sexp from icalendar.el %s" entry-main)
!          (icalendar--convert-to-ical
!           nonmarker
!           (concat "%%"
!                   (substring entry-main (match-beginning 1) (match-end 1))
!                   (substring entry-main (match-beginning 2) (match-end 2)))))
!         ((string-match (concat nonmarker
!                                "%%([^)]+)\\s-*.*")
!                        entry-main)
!          (icalendar--dmsg "diary-sexp %s" entry-main)
!          (error "Sexp-entries are not supported yet"))
!         (t
!          ;; no match
!          nil)))
  
  (defun icalendar--convert-block-to-ical (nonmarker entry-main)
    "Convert block diary entry to icalendar format.
  NONMARKER is a regular expression matching the start of non-marking
  entries.  ENTRY-MAIN is the first line of the diary entry."
    (if (string-match (concat nonmarker
***************
*** 1047,1053 ****
                              "\\("
                              "-0?\\([1-9][0-9]?:[0-9][0-9]\\)\\([ap]m\\)?\\)?"
                              "\\)?"
!                             "\\s-*\\(.*\\)")
                      entry-main)
        (let* ((startstring (substring entry-main
                                       (match-beginning 1)
--- 1192,1198 ----
                              "\\("
                              "-0?\\([1-9][0-9]?:[0-9][0-9]\\)\\([ap]m\\)?\\)?"
                              "\\)?"
!                             "\\s-*\\(.*?\\) ?$")
                      entry-main)
        (let* ((startstring (substring entry-main
                                       (match-beginning 1)
***************
*** 1096,1115 ****
                                            (+ 10000 time))))))
          (if starttimestring
              ;; with time -> write rrule
!             (concat "\nDTSTART;VALUE=DATE-TIME:"
!                     startisostring
!                     starttimestring
!                     "\nDTEND;VALUE=DATE-TIME:"
!                     startisostring
!                     endtimestring
!                     "\nSUMMARY:"
!                     summary
!                     "\nRRULE:FREQ=DAILY;INTERVAL=1;UNTIL="
!                     endisostring)
            ;; no time -> write long event
!           (concat "\nDTSTART;VALUE=DATE:" startisostring
!                   "\nDTEND;VALUE=DATE:" endisostring+1
!                   "\nSUMMARY:" summary)))
      ;; no match
      nil))
  
--- 1241,1259 ----
                                            (+ 10000 time))))))
          (if starttimestring
              ;; with time -> write rrule
!             (list (concat "\nDTSTART;VALUE=DATE-TIME:"
!                           startisostring
!                           starttimestring
!                           "\nDTEND;VALUE=DATE-TIME:"
!                           startisostring
!                           endtimestring
!                           "\nRRULE:FREQ=DAILY;INTERVAL=1;UNTIL="
!                           endisostring)
!                   summary)
            ;; no time -> write long event
!           (list (concat "\nDTSTART;VALUE=DATE:" startisostring
!                         "\nDTEND;VALUE=DATE:" endisostring+1)
!                 summary)))
      ;; no match
      nil))
  
***************
*** 1121,1127 ****
  NONMARKER is a regular expression matching the start of non-marking
  entries.  ENTRY-MAIN is the first line of the diary entry."
    (if (string-match (concat nonmarker
!                             "%%(diary-float \\([^)]+\\))\\s-*\\(.*\\)")
                      entry-main)
        (progn
          (icalendar--dmsg "diary-float %s" entry-main)
--- 1265,1271 ----
  NONMARKER is a regular expression matching the start of non-marking
  entries.  ENTRY-MAIN is the first line of the diary entry."
    (if (string-match (concat nonmarker
!                             "%%(diary-float \\([^)]+\\))\\s-*\\(.*?\\) ?$")
                      entry-main)
        (progn
          (icalendar--dmsg "diary-float %s" entry-main)
***************
*** 1137,1143 ****
  NONMARKER is a regular expression matching the start of non-marking
  entries.  ENTRY-MAIN is the first line of the diary entry."
    (if (string-match (concat nonmarker
!                             "%%(diary-date \\([^)]+\\))\\s-*\\(.*\\)")
                      entry-main)
        (progn
          (icalendar--dmsg "diary-date %s" entry-main)
--- 1281,1287 ----
  NONMARKER is a regular expression matching the start of non-marking
  entries.  ENTRY-MAIN is the first line of the diary entry."
    (if (string-match (concat nonmarker
!                             "%%(diary-date \\([^)]+\\))\\s-*\\(.*?\\) ?$")
                      entry-main)
        (progn
          (icalendar--dmsg "diary-date %s" entry-main)
***************
*** 1147,1153 ****
  
  (defun icalendar--convert-cyclic-to-ical (nonmarker entry-main)
    "Convert `diary-cyclic' diary entry to icalendar format.
- 
  NONMARKER is a regular expression matching the start of non-marking
  entries.  ENTRY-MAIN is the first line of the diary entry."
    (if (string-match (concat nonmarker
--- 1291,1296 ----
***************
*** 1157,1163 ****
                              "\\("
                              "-0?\\([1-9][0-9]?:[0-9][0-9]\\)\\([ap]m\\)?\\)?"
                              "\\)?"
!                             "\\s-*\\(.*\\)")
                      entry-main)
        (let* ((frequency (substring entry-main (match-beginning 1)
                                     (match-end 1)))
--- 1300,1306 ----
                              "\\("
                              "-0?\\([1-9][0-9]?:[0-9][0-9]\\)\\([ap]m\\)?\\)?"
                              "\\)?"
!                             "\\s-*\\(.*?\\) ?$")
                      entry-main)
        (let* ((frequency (substring entry-main (match-beginning 1)
                                     (match-end 1)))
***************
*** 1202,1228 ****
                                            starttimestring))))
                (setq endtimestring (format "T%06d"
                                            (+ 10000 time))))))
!         (concat "\nDTSTART;"
!                 (if starttimestring "VALUE=DATE-TIME:"
!                   "VALUE=DATE:")
!                 startisostring
!                 (or starttimestring "")
!                 "\nDTEND;"
!                 (if endtimestring "VALUE=DATE-TIME:"
!                   "VALUE=DATE:")
!                 (if endtimestring endisostring endisostring+1)
!                 (or endtimestring "")
!                 "\nSUMMARY:" summary
!                 "\nRRULE:FREQ=DAILY;INTERVAL=" frequency
!                 ;; strange: korganizer does not expect
!                 ;; BYSOMETHING here...
!                 ))
      ;; no match
      nil))
  
  (defun icalendar--convert-anniversary-to-ical (nonmarker entry-main)
    "Convert `diary-anniversary' diary entry to icalendar format.
- 
  NONMARKER is a regular expression matching the start of non-marking
  entries.  ENTRY-MAIN is the first line of the diary entry."
    (if (string-match (concat nonmarker
--- 1345,1370 ----
                                            starttimestring))))
                (setq endtimestring (format "T%06d"
                                            (+ 10000 time))))))
!         (list (concat "\nDTSTART;"
!                       (if starttimestring "VALUE=DATE-TIME:"
!                         "VALUE=DATE:")
!                       startisostring
!                       (or starttimestring "")
!                       "\nDTEND;"
!                       (if endtimestring "VALUE=DATE-TIME:"
!                         "VALUE=DATE:")
!                       (if endtimestring endisostring endisostring+1)
!                       (or endtimestring "")
!                       "\nRRULE:FREQ=DAILY;INTERVAL=" frequency
!                       ;; strange: korganizer does not expect
!                       ;; BYSOMETHING here...
!                       )
!               summary))
      ;; no match
      nil))
  
  (defun icalendar--convert-anniversary-to-ical (nonmarker entry-main)
    "Convert `diary-anniversary' diary entry to icalendar format.
  NONMARKER is a regular expression matching the start of non-marking
  entries.  ENTRY-MAIN is the first line of the diary entry."
    (if (string-match (concat nonmarker
***************
*** 1231,1237 ****
                              "\\("
                              "-0?\\([1-9][0-9]?:[0-9][0-9]\\)\\([ap]m\\)?\\)?"
                              "\\)?"
!                             "\\s-*\\(.*\\)")
                      entry-main)
        (let* ((datetime (substring entry-main (match-beginning 1)
                                    (match-end 1)))
--- 1373,1379 ----
                              "\\("
                              "-0?\\([1-9][0-9]?:[0-9][0-9]\\)\\([ap]m\\)?\\)?"
                              "\\)?"
!                             "\\s-*\\(.*?\\) ?$")
                      entry-main)
        (let* ((datetime (substring entry-main (match-beginning 1)
                                    (match-end 1)))
***************
*** 1272,1297 ****
                                            starttimestring))))
                (setq endtimestring (format "T%06d"
                                            (+ 10000 time))))))
!         (concat "\nDTSTART;"
!                 (if starttimestring "VALUE=DATE-TIME:"
!                   "VALUE=DATE:")
!                 startisostring
!                 (or starttimestring "")
!                 "\nDTEND;"
!                 (if endtimestring "VALUE=DATE-TIME:"
!                   "VALUE=DATE:")
!                 endisostring
!                 (or endtimestring "")
!                 "\nSUMMARY:" summary
!                 "\nRRULE:FREQ=YEARLY;INTERVAL=1"
!                 ;; the following is redundant,
!                 ;; but korganizer seems to expect this... ;(
!                 ;; and evolution doesn't understand it... :(
!                 ;; so... who is wrong?!
!                 ";BYMONTH="
!                 (substring startisostring 4 6)
!                 ";BYMONTHDAY="
!                 (substring startisostring 6 8)))
      ;; no match
      nil))
  
--- 1414,1439 ----
                                            starttimestring))))
                (setq endtimestring (format "T%06d"
                                            (+ 10000 time))))))
!         (list (concat "\nDTSTART;"
!                       (if starttimestring "VALUE=DATE-TIME:"
!                         "VALUE=DATE:")
!                       startisostring
!                       (or starttimestring "")
!                       "\nDTEND;"
!                       (if endtimestring "VALUE=DATE-TIME:"
!                         "VALUE=DATE:")
!                       endisostring
!                       (or endtimestring "")
!                       "\nRRULE:FREQ=YEARLY;INTERVAL=1"
!                       ;; the following is redundant,
!                       ;; but korganizer seems to expect this... ;(
!                       ;; and evolution doesn't understand it... :(
!                       ;; so... who is wrong?!
!                       ";BYMONTH="
!                       (substring startisostring 4 6)
!                       ";BYMONTHDAY="
!                       (substring startisostring 6 8))
!               summary))
      ;; no match
      nil))
  
***************
*** 1302,1308 ****
  ;;;###autoload
  (defun icalendar-import-file (ical-filename diary-filename
                                              &optional non-marking)
!   "Import a iCalendar file and append to a diary file.
  Argument ICAL-FILENAME output iCalendar file.
  Argument DIARY-FILENAME input `diary-file'.
  Optional argument NON-MARKING determines whether events are created as
--- 1444,1450 ----
  ;;;###autoload
  (defun icalendar-import-file (ical-filename diary-filename
                                              &optional non-marking)
!   "Import an iCalendar file and append to a diary file.
  Argument ICAL-FILENAME output iCalendar file.
  Argument DIARY-FILENAME input `diary-file'.
  Optional argument NON-MARKING determines whether events are created as
***************
*** 1376,1385 ****
    "Create a string representation of an iCalendar EVENT."
    (let ((string icalendar-import-format)
          (conversion-list
!          '(("%d" DESCRIPTION icalendar-import-format-description)
!            ("%s" SUMMARY     icalendar-import-format-subject)
             ("%l" LOCATION    icalendar-import-format-location)
!            ("%o" ORGANIZER   icalendar-import-format-organizer))))
      ;; convert the specifiers in the format string
      (mapcar (lambda (i)
                (let* ((spec (car i))
--- 1518,1530 ----
    "Create a string representation of an iCalendar EVENT."
    (let ((string icalendar-import-format)
          (conversion-list
!          '(("%c" CLASS       icalendar-import-format-class)
!            ("%d" DESCRIPTION icalendar-import-format-description)
             ("%l" LOCATION    icalendar-import-format-location)
!            ("%o" ORGANIZER   icalendar-import-format-organizer)
!            ("%s" SUMMARY     icalendar-import-format-summary)
!            ("%t" STATUS      icalendar-import-format-status)
!            ("%u" URL         icalendar-import-format-url))))
      ;; convert the specifiers in the format string
      (mapcar (lambda (i)
                (let* ((spec (car i))
***************
*** 1392,1408 ****
                          (icalendar--rris "%s"
                                           (icalendar--convert-string-for-import
                                            contents)
!                                          (symbol-value format))))
                  (setq string (icalendar--rris spec
                                                formatted-contents
!                                               string))))
              conversion-list)
      string))
  
  (defun icalendar--convert-ical-to-diary (ical-list diary-file
                                                     &optional do-not-ask
                                                     non-marking)
!   "Convert an iCalendar file to an Emacs diary file.
  Import VEVENTS from the iCalendar object ICAL-LIST and saves them to a
  DIARY-FILE.  If DO-NOT-ASK is nil the user is asked for each event
  whether to actually import it.  NON-MARKING determines whether diary
--- 1537,1555 ----
                          (icalendar--rris "%s"
                                           (icalendar--convert-string-for-import
                                            contents)
!                                          (symbol-value format)
!                                          t t)))
                  (setq string (icalendar--rris spec
                                                formatted-contents
!                                               string
!                                               t t))))
              conversion-list)
      string))
  
  (defun icalendar--convert-ical-to-diary (ical-list diary-file
                                                     &optional do-not-ask
                                                     non-marking)
!   "Convert Calendar data to an Emacs diary file.
  Import VEVENTS from the iCalendar object ICAL-LIST and saves them to a
  DIARY-FILE.  If DO-NOT-ASK is nil the user is asked for each event
  whether to actually import it.  NON-MARKING determines whether diary
***************
*** 1432,1444 ****
                   end-d
                   end-1-d
                   end-t
!                  (subject (icalendar--convert-string-for-import
                             (or (icalendar--get-event-property e 'SUMMARY)
!                                "No Subject")))
                   (rrule (icalendar--get-event-property e 'RRULE))
                   (rdate (icalendar--get-event-property e 'RDATE))
                   (duration (icalendar--get-event-property e 'DURATION)))
!             (icalendar--dmsg "%s: `%s'" start-d subject)
              ;; check whether start-time is missing
              (if  (and dtstart
                        (string=
--- 1579,1591 ----
                   end-d
                   end-1-d
                   end-t
!                  (summary (icalendar--convert-string-for-import
                             (or (icalendar--get-event-property e 'SUMMARY)
!                                "No summary")))
                   (rrule (icalendar--get-event-property e 'RRULE))
                   (rdate (icalendar--get-event-property e 'RDATE))
                   (duration (icalendar--get-event-property e 'DURATION)))
!             (icalendar--dmsg "%s: `%s'" start-d summary)
              ;; check whether start-time is missing
              (if  (and dtstart
                        (string=
***************
*** 1456,1462 ****
                                                                     t))))
                  (if (and dtend-dec (not (eq dtend-dec dtend-dec-d)))
                      (message "Inconsistent endtime and duration for %s"
!                              subject))
                  (setq dtend-dec dtend-dec-d)
                  (setq dtend-1-dec dtend-1-dec-d)))
              (setq end-d (if dtend-dec
--- 1603,1609 ----
                                                                     t))))
                  (if (and dtend-dec (not (eq dtend-dec dtend-dec-d)))
                      (message "Inconsistent endtime and duration for %s"
!                              summary))
                  (setq dtend-dec dtend-dec-d)
                  (setq dtend-1-dec dtend-1-dec-d)))
              (setq end-d (if dtend-dec
***************
*** 1517,1525 ****
                    (setq diary-string
                          (concat diary-string " "
                                  (icalendar--format-ical-event e)))
!                   (if do-not-ask (setq subject nil))
                    (icalendar--add-diary-entry diary-string diary-file
!                                               non-marking subject))
                ;; event was not ok
                (setq found-error t)
                (setq error-string
--- 1664,1672 ----
                    (setq diary-string
                          (concat diary-string " "
                                  (icalendar--format-ical-event e)))
!                   (if do-not-ask (setq summary nil))
                    (icalendar--add-diary-entry diary-string diary-file
!                                               non-marking summary))
                ;; event was not ok
                (setq found-error t)
                (setq error-string
***************
*** 1570,1576 ****
          (let ((until-1 0))
            (cond ((string-equal frequency "DAILY")
                   (setq until (icalendar--add-decoded-times
!                               dtstart-dec 
                                (list 0 0 0 (* (read count) interval) 0 0)))
                   (setq until-1 (icalendar--add-decoded-times
                                  dtstart-dec
--- 1717,1723 ----
          (let ((until-1 0))
            (cond ((string-equal frequency "DAILY")
                   (setq until (icalendar--add-decoded-times
!                               dtstart-dec
                                (list 0 0 0 (* (read count) interval) 0 0)))
                   (setq until-1 (icalendar--add-decoded-times
                                  dtstart-dec
***************
*** 1767,1789 ****
                   start-t))))
  
  (defun icalendar--add-diary-entry (string diary-file non-marking
!                                           &optional subject)
    "Add STRING to the diary file DIARY-FILE.
  STRING must be a properly formatted valid diary entry.  NON-MARKING
  determines whether diary events are created as non-marking.  If
! SUBJECT is not nil it must be a string that gives the subject of the
  entry.  In this case the user will be asked whether he wants to insert
  the entry."
!   (when (or (not subject)
              (y-or-n-p (format "Add appointment for `%s' to diary? "
!                               subject)))
!     (when subject
        (setq non-marking
              (y-or-n-p (format "Make appointment non-marking? "))))
      (save-window-excursion
        (unless diary-file
          (setq diary-file
                (read-file-name "Add appointment to this diary file: ")))
        (make-diary-entry string non-marking diary-file))))
  
  (provide 'icalendar)
--- 1914,1937 ----
                   start-t))))
  
  (defun icalendar--add-diary-entry (string diary-file non-marking
!                                           &optional summary)
    "Add STRING to the diary file DIARY-FILE.
  STRING must be a properly formatted valid diary entry.  NON-MARKING
  determines whether diary events are created as non-marking.  If
! SUMMARY is not nil it must be a string that gives the summary of the
  entry.  In this case the user will be asked whether he wants to insert
  the entry."
!   (when (or (not summary)
              (y-or-n-p (format "Add appointment for `%s' to diary? "
!                               summary)))
!     (when summary
        (setq non-marking
              (y-or-n-p (format "Make appointment non-marking? "))))
      (save-window-excursion
        (unless diary-file
          (setq diary-file
                (read-file-name "Add appointment to this diary file: ")))
+       ;; Note: make-diary-entry will add a trailing blank char.... :(
        (make-diary-entry string non-marking diary-file))))
  
  (provide 'icalendar)




reply via email to

[Prev in Thread] Current Thread [Next in Thread]