diff options
| author | Glenn Morris | 2004-04-30 18:50:08 +0000 |
|---|---|---|
| committer | Glenn Morris | 2004-04-30 18:50:08 +0000 |
| commit | cb7c17beccf8d8f444ab17febf9309ecf16853c7 (patch) | |
| tree | e1fe065e952d92dbaeb8a5da9f42d9dfba6fc179 | |
| parent | 2c2cd44fdde84131fb094aa1bd851398b1f9ebef (diff) | |
| download | emacs-cb7c17beccf8d8f444ab17febf9309ecf16853c7.tar.gz emacs-cb7c17beccf8d8f444ab17febf9309ecf16853c7.zip | |
From Dave Love <fx@gnu.org>:
(diary-outlook-formats): New variable.
(diary-from-outlook-internal, diary-from-outlook)
(diary-from-outlook-gnus, diary-from-outlook-rmail): New functions to
import diary entries from Outlook-format appointments in mail
messages.
| -rw-r--r-- | lisp/calendar/diary-lib.el | 149 |
1 files changed, 149 insertions, 0 deletions
diff --git a/lisp/calendar/diary-lib.el b/lisp/calendar/diary-lib.el index eba932847c0..b8a1d958e0d 100644 --- a/lisp/calendar/diary-lib.el +++ b/lisp/calendar/diary-lib.el | |||
| @@ -1859,6 +1859,155 @@ names." | |||
| 1859 | "Forms to highlight in diary-mode") | 1859 | "Forms to highlight in diary-mode") |
| 1860 | 1860 | ||
| 1861 | 1861 | ||
| 1862 | ;; Following code from Dave Love <fx@gnu.org>. | ||
| 1863 | ;; Import Outlook-format appointments from mail messages in Gnus or | ||
| 1864 | ;; Rmail using command `diary-from-outlook'. This, or the specialized | ||
| 1865 | ;; functions `diary-from-outlook-gnus' and `diary-from-outlook-rmail', | ||
| 1866 | ;; could be run from hooks to notice appointments automatically (in | ||
| 1867 | ;; which case they will prompt about adding to the diary). The | ||
| 1868 | ;; message formats recognized are customizable through | ||
| 1869 | ;; `diary-outlook-formats'. | ||
| 1870 | |||
| 1871 | (defcustom diary-outlook-formats | ||
| 1872 | '( | ||
| 1873 | ;; When: 11 October 2001 12:00-14:00 (GMT) Greenwich Mean Time : Dublin, ... | ||
| 1874 | ;; [Current UK format? The timezone is meaningless. Sometimes the | ||
| 1875 | ;; Where is missing.] | ||
| 1876 | ("When: \\([0-9]+ [[:alpha:]]+ [0-9]+\\) \ | ||
| 1877 | \\([^ ]+\\) [^\n]+ | ||
| 1878 | \[^\n]+ | ||
| 1879 | \\(?:Where: \\([^\n]+\\)\n+\\)? | ||
| 1880 | \\*~\\*~\\*~\\*~\\*~\\*~\\*~\\*~\\*~\\*" | ||
| 1881 | . "\\1\n \\2 %s, \\3") | ||
| 1882 | ;; When: Tuesday, April 30, 2002 03:00 PM-03:30 PM (GMT) Greenwich Mean ... | ||
| 1883 | ;; [Old UK format?] | ||
| 1884 | ("^When: [[:alpha:]]+, \\([[:alpha:]]+\\) \\([0-9][0-9]*\\), \\([0-9]\\{4\\}\\) \ | ||
| 1885 | \\([^ ]+\\) [^\n]+ | ||
| 1886 | \[^\n]+ | ||
| 1887 | \\(?:Where: \\([^\n]+\\)\\)?\n+" | ||
| 1888 | . "\\2 \\1 \\3\n \\4 %s, \\5") | ||
| 1889 | ( | ||
| 1890 | ;; German format, apparently. | ||
| 1891 | "^Zeit: [^ ]+, +\\([0-9]+\\)\. +\\([[:upper:]][[:lower:]][[:lower:]]\\)[^ ]* +\\([0-9]+\\) +\\([^ ]+\\).*$" | ||
| 1892 | . "\\1 \\2 \\3\n \\4 %s")) | ||
| 1893 | "Alist of regexps matching message text and replacement text. | ||
| 1894 | |||
| 1895 | The regexp must match the start of the message text containing an | ||
| 1896 | appointment, but need not include a leading `^'. If it matches the | ||
| 1897 | current message, a diary entry is made from the corresponding | ||
| 1898 | template. If the template is a string, it should be suitable for | ||
| 1899 | passing to `replace-match', and so will have occurrences of `\\D' to | ||
| 1900 | substitute the match for the Dth subexpression. It must also contain | ||
| 1901 | a single `%s' which will be replaced with the text of the message's | ||
| 1902 | Subject field. Any other `%' characters must be doubled, so that the | ||
| 1903 | template can be passed to `format'. | ||
| 1904 | |||
| 1905 | If the template is actually a function, it is called with the message | ||
| 1906 | body text as argument, and may use `match-string' etc. to make a | ||
| 1907 | template following the rules above." | ||
| 1908 | :type '(alist :key-type (regexp :tag "Regexp matching time/place") | ||
| 1909 | :value-type (choice | ||
| 1910 | (string :tag "Template for entry") | ||
| 1911 | (function :tag "Unary function providing template"))) | ||
| 1912 | :version "21.4" | ||
| 1913 | :group 'diary) | ||
| 1914 | |||
| 1915 | |||
| 1916 | ;; Dynamically bound. | ||
| 1917 | (defvar body) | ||
| 1918 | (defvar subject) | ||
| 1919 | |||
| 1920 | (defun diary-from-outlook-internal (&optional test-only) | ||
| 1921 | "Snarf a diary entry from a message assumed to be from MS Outlook. | ||
| 1922 | Assumes `body' is bound to a string comprising the body of the message and | ||
| 1923 | `subject' is bound to a string comprising its subject. | ||
| 1924 | Arg TEST-ONLY non-nil means return non-nil if and only if the | ||
| 1925 | message contains an appointment, don't make a diary entry." | ||
| 1926 | (catch 'finished | ||
| 1927 | (let (format-string) | ||
| 1928 | (dotimes (i (length diary-outlook-formats)) | ||
| 1929 | (when (eq 0 (string-match (car (nth i diary-outlook-formats)) | ||
| 1930 | body)) | ||
| 1931 | (unless test-only | ||
| 1932 | (setq format-string (cdr (nth i diary-outlook-formats))) | ||
| 1933 | (save-excursion | ||
| 1934 | (save-window-excursion | ||
| 1935 | ;; Fixme: References to optional fields in the format | ||
| 1936 | ;; are treated literally, not replaced by the empty | ||
| 1937 | ;; string. I think this is an Emacs bug. | ||
| 1938 | (make-diary-entry | ||
| 1939 | (format (replace-match (if (functionp format-string) | ||
| 1940 | (funcall format-string body) | ||
| 1941 | format-string) | ||
| 1942 | t nil (match-string 0 body)) | ||
| 1943 | subject)) | ||
| 1944 | (save-buffer)))) | ||
| 1945 | (throw 'finished t)))) | ||
| 1946 | nil)) | ||
| 1947 | |||
| 1948 | (defun diary-from-outlook () | ||
| 1949 | "Maybe snarf diary entry from current Outlook-generated message. | ||
| 1950 | Currently knows about Gnus and Rmail modes." | ||
| 1951 | (interactive) | ||
| 1952 | (let ((func (cond | ||
| 1953 | ((eq major-mode 'rmail-mode) | ||
| 1954 | #'diary-from-outlook-rmail) | ||
| 1955 | ((memq major-mode '(gnus-summary-mode gnus-article-mode)) | ||
| 1956 | #'diary-from-outlook-gnus) | ||
| 1957 | (t (error "Don't know how to snarf in `%s'" major-mode))))) | ||
| 1958 | (if (interactive-p) | ||
| 1959 | (call-interactively func) | ||
| 1960 | (funcall func)))) | ||
| 1961 | |||
| 1962 | |||
| 1963 | (defvar gnus-article-mime-handles) | ||
| 1964 | (defvar gnus-article-buffer) | ||
| 1965 | |||
| 1966 | (autoload 'gnus-fetch-field "gnus-util") | ||
| 1967 | (autoload 'gnus-narrow-to-body "gnus") | ||
| 1968 | (autoload 'mm-get-part "mm-decode") | ||
| 1969 | |||
| 1970 | (defun diary-from-outlook-gnus () | ||
| 1971 | "Maybe snarf diary entry from Outlook-generated message in Gnus. | ||
| 1972 | Add this to `gnus-article-prepare-hook' to notice appointments | ||
| 1973 | automatically." | ||
| 1974 | (interactive) | ||
| 1975 | (with-current-buffer gnus-article-buffer | ||
| 1976 | (let ((subject (gnus-fetch-field "subject")) | ||
| 1977 | (body (if gnus-article-mime-handles | ||
| 1978 | ;; We're multipart. Don't get confused by part | ||
| 1979 | ;; buttons &c. Assume info is in first part. | ||
| 1980 | (mm-get-part (nth 1 gnus-article-mime-handles)) | ||
| 1981 | (save-restriction | ||
| 1982 | (gnus-narrow-to-body) | ||
| 1983 | (buffer-string))))) | ||
| 1984 | (when (diary-from-outlook-internal t) | ||
| 1985 | (when (or (interactive-p) | ||
| 1986 | (y-or-n-p "Snarf diary entry? ")) | ||
| 1987 | (diary-from-outlook-internal) | ||
| 1988 | (message "Diary entry added")))))) | ||
| 1989 | |||
| 1990 | (custom-add-option 'gnus-article-prepare-hook 'diary-from-outlook-gnus) | ||
| 1991 | |||
| 1992 | |||
| 1993 | (defvar rmail-buffer) | ||
| 1994 | |||
| 1995 | (defun diary-from-outlook-rmail () | ||
| 1996 | "Maybe snarf diary entry from Outlook-generated message in Rmail." | ||
| 1997 | (interactive) | ||
| 1998 | (with-current-buffer rmail-buffer | ||
| 1999 | (let ((subject (mail-fetch-field "subject")) | ||
| 2000 | (body (buffer-substring (save-excursion | ||
| 2001 | (rfc822-goto-eoh) | ||
| 2002 | (point)) | ||
| 2003 | (point-max)))) | ||
| 2004 | (when (diary-from-outlook-internal t) | ||
| 2005 | (when (or (interactive-p) | ||
| 2006 | (y-or-n-p "Snarf diary entry? ")) | ||
| 2007 | (diary-from-outlook-internal) | ||
| 2008 | (message "Diary entry added")))))) | ||
| 2009 | |||
| 2010 | |||
| 1862 | (provide 'diary-lib) | 2011 | (provide 'diary-lib) |
| 1863 | 2012 | ||
| 1864 | ;;; arch-tag: 22dd506e-2e33-410d-9ae1-095a0c1b2010 | 2013 | ;;; arch-tag: 22dd506e-2e33-410d-9ae1-095a0c1b2010 |