Commit 211ec907 authored by Ulf Jasper's avatar Ulf Jasper
Browse files

Applied icalendar patches from Niels Giesen.

lisp/ChangeLog:

2011-04-27  Niels Giesen <niels.giesen@gmail.com>

	* calendar/icalendar.el (diary-lib): Added require statement.
	(icalendar--create-uid): Read out a uid from a text-property on
	the first character in the entry. This allows for code to add its
	own uid to the entry.
	(icalendar--convert-float-to-ical): Add export of
	`diary-float'-entries save for those with the optional DAY
parent 2a782793
2011-04-27 Niels Giesen <niels.giesen@gmail.com>
* calendar/icalendar.el (diary-lib): Added require statement.
(icalendar--create-uid): Read out a uid from a text-property on
the first character in the entry. This allows for code to add its
own uid to the entry.
(icalendar--convert-float-to-ical): Add export of
`diary-float'-entries save for those with the optional DAY
argument.
2011-04-27 Daniel Colascione <dan.colascione@gmail.com> 2011-04-27 Daniel Colascione <dan.colascione@gmail.com>
* subr.el (shell-quote-argument): Use alternate escaping strategy * subr.el (shell-quote-argument): Use alternate escaping strategy
......
...@@ -34,6 +34,8 @@ ...@@ -34,6 +34,8 @@
;; week of the year 2000 when they are exported. ;; week of the year 2000 when they are exported.
;; - Yearly diary entries are assumed to occur the first time in the year ;; - Yearly diary entries are assumed to occur the first time in the year
;; 1900 when they are exported. ;; 1900 when they are exported.
;; - Float diary entries are assumed to occur the first time on the
;; day when they are exported.
;;; History: ;;; History:
...@@ -241,6 +243,7 @@ code for the event, and your personal domain name." ...@@ -241,6 +243,7 @@ code for the event, and your personal domain name."
;; all the other libs we need ;; all the other libs we need
;; ====================================================================== ;; ======================================================================
(require 'calendar) (require 'calendar)
(require 'diary-lib)
;; ====================================================================== ;; ======================================================================
;; misc ;; misc
...@@ -925,27 +928,30 @@ ENTRY-FULL is the full diary entry string. CONTENTS is the ...@@ -925,27 +928,30 @@ ENTRY-FULL is the full diary entry string. CONTENTS is the
current iCalendar object, as a string. Increase current iCalendar object, as a string. Increase
`icalendar--uid-count'. Returns the UID string." `icalendar--uid-count'. Returns the UID string."
(let ((uid icalendar-uid-format)) (let ((uid icalendar-uid-format))
(if
(setq uid (replace-regexp-in-string ;; Allow other apps (such as org-mode) to create its own uid
"%c" (get-text-property 0 'uid entry-full)
(format "%d" icalendar--uid-count) (setq uid (get-text-property 0 'uid entry-full))
uid t t)) (setq uid (replace-regexp-in-string
(setq icalendar--uid-count (1+ icalendar--uid-count)) "%c"
(setq uid (replace-regexp-in-string (format "%d" icalendar--uid-count)
"%t" uid t t))
(format "%d%d%d" (car (current-time)) (setq icalendar--uid-count (1+ icalendar--uid-count))
(cadr (current-time)) (setq uid (replace-regexp-in-string
(car (cddr (current-time)))) "%t"
uid t t)) (format "%d%d%d" (car (current-time))
(setq uid (replace-regexp-in-string (cadr (current-time))
"%h" (car (cddr (current-time))))
(format "%d" (abs (sxhash entry-full))) uid t t)) uid t t))
(setq uid (replace-regexp-in-string (setq uid (replace-regexp-in-string
"%u" (or user-login-name "UNKNOWN_USER") uid t t)) "%h"
(let ((dtstart (if (string-match "^DTSTART[^:]*:\\([0-9]*\\)" contents) (format "%d" (abs (sxhash entry-full))) uid t t))
(substring contents (match-beginning 1) (match-end 1)) (setq uid (replace-regexp-in-string
"DTSTART"))) "%u" (or user-login-name "UNKNOWN_USER") uid t t))
(setq uid (replace-regexp-in-string "%s" dtstart uid t t))) (let ((dtstart (if (string-match "^DTSTART[^:]*:\\([0-9]*\\)" contents)
(substring contents (match-beginning 1) (match-end 1))
"DTSTART")))
(setq uid (replace-regexp-in-string "%s" dtstart uid t t))))
;; Return the UID string ;; Return the UID string
uid)) uid))
...@@ -1545,18 +1551,65 @@ entries. ENTRY-MAIN is the first line of the diary entry." ...@@ -1545,18 +1551,65 @@ entries. ENTRY-MAIN is the first line of the diary entry."
nil)) nil))
(defun icalendar--convert-float-to-ical (nonmarker entry-main) (defun icalendar--convert-float-to-ical (nonmarker entry-main)
"Convert float diary entry to icalendar format -- unsupported! "Convert float diary entry to icalendar format -- partially unsupported!
FIXME! FIXME! DAY from diary-float yet unimplemented.
NONMARKER is a regular expression matching the start of non-marking NONMARKER is a regular expression matching the start of non-marking
entries. ENTRY-MAIN is the first line of the diary entry." entries. ENTRY-MAIN is the first line of the diary entry."
(if (string-match (concat nonmarker (if (string-match (concat nonmarker "%%\\((diary-float .+\\) ?$") entry-main)
"%%(diary-float \\([^)]+\\))\\s-*\\(.*?\\) ?$") (with-temp-buffer
entry-main) (insert (match-string 1 entry-main))
(progn (goto-char (point-min))
(icalendar--dmsg "diary-float %s" entry-main) (let* ((sexp (read (current-buffer))) ;using `read' here
(error "`diary-float' is not supported yet")) ;easier than regexp
;matching, esp. with
;different forms of
;MONTH
(month (nth 1 sexp))
(dayname (nth 2 sexp))
(n (nth 3 sexp))
(day (nth 4 sexp))
(summary
(replace-regexp-in-string
"\\(^\s+\\|\s+$\\)" ""
(buffer-substring (point) (point-max)))))
(when day
(progn
(icalendar--dmsg "diary-float %s" entry-main)
(error "Don't know if or how to implement day in `diary-float'")))
(list (concat
;;Start today (yes this is an arbitrary choice):
"\nDTSTART;VALUE=DATE:"
(format-time-string "%Y%m%d" (current-time))
;;BUT remove today if `diary-float'
;;expression does not hold true for today:
(when
(null (let ((date (calendar-current-date))
(entry entry-main))
(diary-float month dayname n)))
(concat
"\nEXDATE;VALUE=DATE:"
(format-time-string "%Y%m%d" (current-time))))
"\nRRULE:"
(if (or (numberp month) (listp month))
"FREQ=YEARLY;BYMONTH="
"FREQ=MONTHLY")
(when
(listp month)
(mapconcat
(lambda (m)
(number-to-string m))
(cadr month) ","))
(when
(numberp month)
(number-to-string month))
";BYDAY="
(number-to-string n)
(aref icalendar--weekday-array dayname))
summary)))
;; no match ;; no match
nil)) nil))
......
Markdown is supported
0% or .
You are about to add 0 people to the discussion. Proceed with caution.
Finish editing this message first!
Please register or to comment