diff options
| author | Lars Ingebrigtsen | 2019-07-31 15:25:46 +0200 |
|---|---|---|
| committer | Lars Ingebrigtsen | 2019-07-31 21:47:29 +0200 |
| commit | c8f1e17e6be1545557f10c3e8039e655ace6ab1c (patch) | |
| tree | ce71b81fb0037a5b2c970976bf2fb73d74348913 | |
| parent | 1ab6445bb3ed7e0ebe771692cbeda557a82b9381 (diff) | |
| download | emacs-c8f1e17e6be1545557f10c3e8039e655ace6ab1c.tar.gz emacs-c8f1e17e6be1545557f10c3e8039e655ace6ab1c.zip | |
Rewrite `url-dav-process-date-property' to use parse-time
* lisp/url/url-dav.el (url-dav-iso8601-regexp): Remove.
(url-dav-process-date-property): Rewrite to use
`parse-iso8601-time-string'.
| -rw-r--r-- | lisp/url/url-dav.el | 67 |
1 files changed, 5 insertions, 62 deletions
diff --git a/lisp/url/url-dav.el b/lisp/url/url-dav.el index a4cf0f0ec01..3159b695c14 100644 --- a/lisp/url/url-dav.el +++ b/lisp/url/url-dav.el | |||
| @@ -33,6 +33,7 @@ | |||
| 33 | (require 'url-util) | 33 | (require 'url-util) |
| 34 | (require 'url-handlers) | 34 | (require 'url-handlers) |
| 35 | (require 'url-http) | 35 | (require 'url-http) |
| 36 | (require 'parse-time) | ||
| 36 | 37 | ||
| 37 | (defvar url-dav-supported-protocols '(1 2) | 38 | (defvar url-dav-supported-protocols '(1 2) |
| 38 | "List of supported DAV versions.") | 39 | "List of supported DAV versions.") |
| @@ -83,72 +84,14 @@ Returns nil if WebDAV is not supported." | |||
| 83 | (defun url-dav-process-number-property (node) | 84 | (defun url-dav-process-number-property (node) |
| 84 | (string-to-number (url-dav-node-text node))) | 85 | (string-to-number (url-dav-node-text node))) |
| 85 | 86 | ||
| 86 | (defconst url-dav-iso8601-regexp | ||
| 87 | (let* ((dash "-?") | ||
| 88 | (colon ":?") | ||
| 89 | (4digit "\\([0-9][0-9][0-9][0-9]\\)") | ||
| 90 | (2digit "\\([0-9][0-9]\\)") | ||
| 91 | (date-fullyear 4digit) | ||
| 92 | (date-month 2digit) | ||
| 93 | (date-mday 2digit) | ||
| 94 | (time-hour 2digit) | ||
| 95 | (time-minute 2digit) | ||
| 96 | (time-second 2digit) | ||
| 97 | (time-secfrac "\\(\\.[0-9]+\\)?") | ||
| 98 | (time-numoffset (concat "[-+]\\(" time-hour "\\):" time-minute)) | ||
| 99 | (time-offset (concat "Z" time-numoffset)) | ||
| 100 | (partial-time (concat time-hour colon time-minute colon time-second | ||
| 101 | time-secfrac)) | ||
| 102 | (full-date (concat date-fullyear dash date-month dash date-mday)) | ||
| 103 | (full-time (concat partial-time time-offset)) | ||
| 104 | (date-time (concat full-date "T" full-time))) | ||
| 105 | (list (concat "^" full-date) | ||
| 106 | (concat "T" partial-time) | ||
| 107 | (concat "Z" time-numoffset))) | ||
| 108 | "List of regular expressions matching ISO 8601 dates. | ||
| 109 | 1st regular expression matches the date. | ||
| 110 | 2nd regular expression matches the time. | ||
| 111 | 3rd regular expression matches the (optional) timezone specification.") | ||
| 112 | |||
| 113 | (defun url-dav-process-date-property (node) | 87 | (defun url-dav-process-date-property (node) |
| 114 | (require 'parse-time) | 88 | (let* ((date-string (url-dav-node-text node)) |
| 115 | (let* ((date-re (nth 0 url-dav-iso8601-regexp)) | 89 | (time (parse-iso8601-time-string date-string))) |
| 116 | (time-re (nth 1 url-dav-iso8601-regexp)) | ||
| 117 | (tz-re (nth 2 url-dav-iso8601-regexp)) | ||
| 118 | (date-string (url-dav-node-text node)) | ||
| 119 | re-start | ||
| 120 | time seconds minute hour fractional-seconds | ||
| 121 | day month year day-of-week dst tz) | ||
| 122 | ;; We need to populate 'time' with | ||
| 123 | ;; (SEC MIN HOUR DAY MON YEAR DOW DST TZ) | ||
| 124 | |||
| 125 | ;; Nobody else handles iso8601 correctly, let's do it ourselves. | ||
| 126 | (when (string-match date-re date-string re-start) | ||
| 127 | (setq year (string-to-number (match-string 1 date-string)) | ||
| 128 | month (string-to-number (match-string 2 date-string)) | ||
| 129 | day (string-to-number (match-string 3 date-string)) | ||
| 130 | re-start (match-end 0)) | ||
| 131 | (when (string-match time-re date-string re-start) | ||
| 132 | (setq hour (string-to-number (match-string 1 date-string)) | ||
| 133 | minute (string-to-number (match-string 2 date-string)) | ||
| 134 | seconds (string-to-number (match-string 3 date-string)) | ||
| 135 | fractional-seconds (string-to-number (or | ||
| 136 | (match-string 4 date-string) | ||
| 137 | "0")) | ||
| 138 | re-start (match-end 0)) | ||
| 139 | (when (string-match tz-re date-string re-start) | ||
| 140 | (setq tz (match-string 1 date-string))) | ||
| 141 | (url-debug 'dav "Parsed iso8601%s date" (if tz "tz" "")) | ||
| 142 | (setq time (list seconds minute hour day month year day-of-week dst tz)))) | ||
| 143 | |||
| 144 | ;; Fall back to having Gnus do fancy things for us. | ||
| 145 | (when (not time) | ||
| 146 | (setq time (parse-time-string date-string))) | ||
| 147 | |||
| 148 | (if time | 90 | (if time |
| 149 | (setq time (encode-time time)) | 91 | (setq time (encode-time time)) |
| 150 | (url-debug 'dav "Unable to decode date (%S) (%s)" | 92 | (url-debug 'dav "Unable to decode date (%S) (%s)" |
| 151 | (xml-node-name node) date-string)) | 93 | (xml-node-name node) |
| 94 | date-string)) | ||
| 152 | time)) | 95 | time)) |
| 153 | 96 | ||
| 154 | (defun url-dav-process-boolean-property (node) | 97 | (defun url-dav-process-boolean-property (node) |