]> git.eshelyaron.com Git - emacs.git/commitdiff
Make rfc2368 obsolete and add rfc6068
authorLars Ingebrigtsen <larsi@gnus.org>
Sun, 29 Aug 2021 23:56:10 +0000 (01:56 +0200)
committerLars Ingebrigtsen <larsi@gnus.org>
Sun, 29 Aug 2021 23:56:10 +0000 (01:56 +0200)
* lisp/obsolete/rfc2368.el: Moved here and made obsolete.

* lisp/mail/rfc6068.el (rfc6068-unhexify-string): New file.

etc/NEWS
lisp/mail/rfc2368.el [deleted file]
lisp/mail/rfc6068.el [new file with mode: 0644]
lisp/net/browse-url.el
lisp/obsolete/rfc2368.el [new file with mode: 0644]
test/lisp/mail/rfc2368-tests.el [deleted file]
test/lisp/mail/rfc6068-tests.el [new file with mode: 0644]
test/lisp/obsolete/rfc2368-tests.el [new file with mode: 0644]

index 9651ce101bcee5a6ffc1f0a9097cdb0010203891..5beea33dfb246c99929a092d08d5aea9942b0df3 100644 (file)
--- a/etc/NEWS
+++ b/etc/NEWS
@@ -1489,6 +1489,13 @@ deleting.
 +++
 **** The spec element 'function-form' is obsolete, use 'form' instead.
 
+---
+*** rfc2368.el is now obsolete.
+Use rfc6068.el instead.  The main difference is that
+'rfc2368-parse-mailto-url' and 'rfc2368-unhexify-string' assumed that
+the strings were all-ASCII, while 'rfc6068-parse-mailto-url' and
+'rfc2068-unhexify-string' parse UTF-8 strings.
+
 +++
 *** New function 'def-edebug-elem-spec' to define Edebug spec elements.
 These used to be defined with 'def-edebug-spec' thus conflating the
diff --git a/lisp/mail/rfc2368.el b/lisp/mail/rfc2368.el
deleted file mode 100644 (file)
index b96f15d..0000000
+++ /dev/null
@@ -1,135 +0,0 @@
-;;; rfc2368.el --- support for rfc2368  -*- lexical-binding:t -*-
-
-;; Copyright (C) 1998, 2000-2021 Free Software Foundation, Inc.
-
-;; Author: Sen Nagata <sen@eccosys.com>
-;; Keywords: mail
-
-;; This file is part of GNU Emacs.
-
-;; GNU Emacs 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 of the License, or
-;; (at your option) any later version.
-
-;; GNU Emacs 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 GNU Emacs.  If not, see <https://www.gnu.org/licenses/>.
-
-;;; Commentary:
-;;
-;; notes:
-;;
-;;   -repeat after me: "the colon is not part of the header name..."
-;;   -if w3 becomes part of emacs, then it may make sense to have this
-;;    file depend on w3 -- the maintainer of w3 says merging w/ Emacs
-;;    is planned!
-;;
-;; historical note:
-;;
-;;   this is intended as a replacement for mailto.el
-;;
-;; acknowledgments:
-;;
-;;   the functions that deal w/ unhexifying in this file were basically
-;; taken from w3 -- i hope to replace them w/ something else soon OR
-;; perhaps if w3 becomes a part of emacs soon, use the functions from w3.
-
-;;; History:
-;;
-;; 0.3:
-;;
-;;  added the constant rfc2368-version
-;;  implemented first potential fix for a bug in rfc2368-mailto-regexp
-;;  implemented first potential fix for a bug in rfc2368-parse-mailto
-;;  (both bugs reported by Kenichi OKADA)
-;;
-;; 0.2:
-;;
-;;  started to use checkdoc
-;;
-;; 0.1:
-;;
-;;  initial implementation
-
-;;; Code:
-
-;; only an approximation?
-;; see rfc 1738
-(defconst rfc2368-mailto-regexp
-  "^\\(mailto:\\)\\([^?]+\\)?\\(\\?\\(.*\\)\\)*"
-  "Regular expression to match and aid in parsing a mailto url.")
-
-;; describes 'mailto:'
-(defconst rfc2368-mailto-scheme-index 1
-  "Describes the `mailto:' portion of the url.")
-;; i'm going to call this part the 'prequery'
-(defconst rfc2368-mailto-prequery-index 2
-  "Describes the portion of the url between `mailto:' and `?'.")
-;; i'm going to call this part the 'query'
-(defconst rfc2368-mailto-query-index 4
-  "Describes the portion of the url after `?'.")
-
-(defun rfc2368-unhexify-string (string)
-  "Unhexify STRING -- e.g. `hello%20there' -> `hello there'."
-  (replace-regexp-in-string "%[[:xdigit:]]\\{2\\}"
-                           (lambda (match)
-                             (string (string-to-number (substring match 1)
-                                                       16)))
-                           string t t))
-
-(defun rfc2368-parse-mailto-url (mailto-url)
-  "Parse MAILTO-URL, and return an alist of header-name, header-value pairs.
-MAILTO-URL should be a RFC 2368 (mailto) compliant url.  A cons cell w/ a
-key of `Body' is a special case and is considered a header for this purpose.
-The returned alist is intended for use w/ the `compose-mail' interface.
-Note: make sure MAILTO-URL has been \"unhtmlized\" (e.g., &amp; -> &), before
-calling this function."
-  (let ((case-fold-search t)
-       prequery query headers-alist)
-    (setq mailto-url (string-replace "\n" " " mailto-url))
-    (if (string-match rfc2368-mailto-regexp mailto-url)
-       (progn
-         (setq prequery
-               (match-string rfc2368-mailto-prequery-index mailto-url))
-         (setq query
-               (match-string rfc2368-mailto-query-index mailto-url))
-
-         ;; build alist of header name-value pairs
-         (if (not (null query))
-             (setq headers-alist
-                   (mapcar
-                    (lambda (x)
-                      (let* ((temp-list (split-string x "="))
-                             (header-name (car temp-list))
-                             (header-value (cadr temp-list)))
-                        ;; return ("Header-Name" . "header-value")
-                        (cons
-                         (capitalize (rfc2368-unhexify-string header-name))
-                         (rfc2368-unhexify-string header-value))))
-                    (split-string query "&"))))
-
-         ;; deal w/ multiple 'To' recipients
-         (if prequery
-             (progn
-               (setq prequery (rfc2368-unhexify-string prequery))
-               (if (assoc "To" headers-alist)
-                   (let* ((our-cons-cell
-                           (assoc "To" headers-alist))
-                          (our-cdr
-                           (cdr our-cons-cell)))
-                     (setcdr our-cons-cell (concat prequery ", " our-cdr)))
-                 (setq headers-alist
-                       (cons (cons "To" prequery) headers-alist)))))
-
-         headers-alist)
-
-      (error "Failed to match a mailto: url"))))
-
-(provide 'rfc2368)
-
-;;; rfc2368.el ends here
diff --git a/lisp/mail/rfc6068.el b/lisp/mail/rfc6068.el
new file mode 100644 (file)
index 0000000..6198342
--- /dev/null
@@ -0,0 +1,76 @@
+;;; rfc6068.el --- support for rfc6068  -*- lexical-binding: t -*-
+
+;; Copyright (C) 2021 Free Software Foundation, Inc.
+
+;; Keywords: mail
+
+;; This file is part of GNU Emacs.
+
+;; GNU Emacs 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 of the License, or
+;; (at your option) any later version.
+
+;; GNU Emacs 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 GNU Emacs.  If not, see <https://www.gnu.org/licenses/>.
+
+;;; Commentary:
+;;; Code:
+
+(defun rfc6068-unhexify-string (string)
+  "Unhexify STRING -- e.g. `hello%20there' -> `hello there'."
+  (decode-coding-string
+   (with-temp-buffer
+     (set-buffer-multibyte nil)
+     (insert string)
+     (goto-char (point-min))
+     (while (re-search-forward "%\\([[:xdigit:]]\\{2\\}\\)" nil t)
+       (replace-match (string (string-to-number (match-string 1) 16)) t t))
+     (buffer-string))
+   'utf-8))
+
+(defun rfc6068-parse-mailto-url (mailto-url)
+  "Parse MAILTO-URL, and return an alist of header-name, header-value pairs.
+MAILTO-URL should be a RFC 6068 (mailto) compliant url.  A cons cell w/ a
+key of `Body' is a special case and is considered a header for this purpose.
+The returned alist is intended for use w/ the `compose-mail' interface.
+Note: make sure MAILTO-URL has been \"unhtmlized\" (e.g., &amp; -> &), before
+calling this function."
+  (let ((case-fold-search t)
+       headers-alist)
+    (setq mailto-url (string-replace "\n" " " mailto-url))
+    (when (string-match "^\\(mailto:\\)\\([^?]+\\)?\\(\\?\\(.*\\)\\)*"
+                        mailto-url)
+      (let ((address (match-string 2 mailto-url))
+            (query (match-string 4 mailto-url)))
+       ;; Build alist of header name-value pairs.
+       (when query
+         (setq headers-alist
+               (mapcar
+                (lambda (x)
+                  (let* ((pair (split-string x "="))
+                         (name (car pair))
+                         (value (cadr pair)))
+                    ;; Return ("Header-Name" . "header-value").
+                    (cons
+                     (capitalize (rfc6068-unhexify-string name))
+                     (rfc6068-unhexify-string value))))
+                (split-string query "&"))))
+
+       (when address
+         (setq address (rfc6068-unhexify-string address))
+         ;; Deal with multiple 'To' recipients.
+         (if-let ((elem (assoc "To" headers-alist)))
+             (setcdr elem (concat address ", " (cdr elem)))
+            (push (cons "To" address) headers-alist)))
+
+       headers-alist))))
+
+(provide 'rfc6068)
+
+;;; rfc6068.el ends here
index c8ca70cc1f914a4b129eb5bad2507839cc0d3093..73b8c439f2818358607d6a3eaecb642a51acad7b 100644 (file)
@@ -1603,7 +1603,7 @@ used instead of `browse-url-new-window-flag'."
 
 ;; --- mailto ---
 
-(autoload 'rfc2368-parse-mailto-url "rfc2368")
+(autoload 'rfc6068-parse-mailto-url "rfc2368")
 
 ;;;###autoload
 (defun browse-url-mail (url &optional new-window)
@@ -1622,7 +1622,7 @@ When called non-interactively, optional second argument NEW-WINDOW is
 used instead of `browse-url-new-window-flag'."
   (interactive (browse-url-interactive-arg "Mailto URL: "))
   (save-excursion
-    (let* ((alist (rfc2368-parse-mailto-url url))
+    (let* ((alist (rfc6068-parse-mailto-url url))
           (to (assoc "To" alist))
           (subject (assoc "Subject" alist))
           (body (assoc "Body" alist))
diff --git a/lisp/obsolete/rfc2368.el b/lisp/obsolete/rfc2368.el
new file mode 100644 (file)
index 0000000..8a842b0
--- /dev/null
@@ -0,0 +1,136 @@
+;;; rfc2368.el --- support for rfc2368  -*- lexical-binding:t -*-
+
+;; Copyright (C) 1998, 2000-2021 Free Software Foundation, Inc.
+
+;; Author: Sen Nagata <sen@eccosys.com>
+;; Keywords: mail
+;; Obsolete-since: 28.1
+
+;; This file is part of GNU Emacs.
+
+;; GNU Emacs 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 of the License, or
+;; (at your option) any later version.
+
+;; GNU Emacs 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 GNU Emacs.  If not, see <https://www.gnu.org/licenses/>.
+
+;;; Commentary:
+;;
+;; notes:
+;;
+;;   -repeat after me: "the colon is not part of the header name..."
+;;   -if w3 becomes part of emacs, then it may make sense to have this
+;;    file depend on w3 -- the maintainer of w3 says merging w/ Emacs
+;;    is planned!
+;;
+;; historical note:
+;;
+;;   this is intended as a replacement for mailto.el
+;;
+;; acknowledgments:
+;;
+;;   the functions that deal w/ unhexifying in this file were basically
+;; taken from w3 -- i hope to replace them w/ something else soon OR
+;; perhaps if w3 becomes a part of emacs soon, use the functions from w3.
+
+;;; History:
+;;
+;; 0.3:
+;;
+;;  added the constant rfc2368-version
+;;  implemented first potential fix for a bug in rfc2368-mailto-regexp
+;;  implemented first potential fix for a bug in rfc2368-parse-mailto
+;;  (both bugs reported by Kenichi OKADA)
+;;
+;; 0.2:
+;;
+;;  started to use checkdoc
+;;
+;; 0.1:
+;;
+;;  initial implementation
+
+;;; Code:
+
+;; only an approximation?
+;; see rfc 1738
+(defconst rfc2368-mailto-regexp
+  "^\\(mailto:\\)\\([^?]+\\)?\\(\\?\\(.*\\)\\)*"
+  "Regular expression to match and aid in parsing a mailto url.")
+
+;; describes 'mailto:'
+(defconst rfc2368-mailto-scheme-index 1
+  "Describes the `mailto:' portion of the url.")
+;; i'm going to call this part the 'prequery'
+(defconst rfc2368-mailto-prequery-index 2
+  "Describes the portion of the url between `mailto:' and `?'.")
+;; i'm going to call this part the 'query'
+(defconst rfc2368-mailto-query-index 4
+  "Describes the portion of the url after `?'.")
+
+(defun rfc2368-unhexify-string (string)
+  "Unhexify STRING -- e.g. `hello%20there' -> `hello there'."
+  (replace-regexp-in-string "%[[:xdigit:]]\\{2\\}"
+                           (lambda (match)
+                             (string (string-to-number (substring match 1)
+                                                       16)))
+                           string t t))
+
+(defun rfc2368-parse-mailto-url (mailto-url)
+  "Parse MAILTO-URL, and return an alist of header-name, header-value pairs.
+MAILTO-URL should be a RFC 2368 (mailto) compliant url.  A cons cell w/ a
+key of `Body' is a special case and is considered a header for this purpose.
+The returned alist is intended for use w/ the `compose-mail' interface.
+Note: make sure MAILTO-URL has been \"unhtmlized\" (e.g., &amp; -> &), before
+calling this function."
+  (let ((case-fold-search t)
+       prequery query headers-alist)
+    (setq mailto-url (string-replace "\n" " " mailto-url))
+    (if (string-match rfc2368-mailto-regexp mailto-url)
+       (progn
+         (setq prequery
+               (match-string rfc2368-mailto-prequery-index mailto-url))
+         (setq query
+               (match-string rfc2368-mailto-query-index mailto-url))
+
+         ;; build alist of header name-value pairs
+         (if (not (null query))
+             (setq headers-alist
+                   (mapcar
+                    (lambda (x)
+                      (let* ((temp-list (split-string x "="))
+                             (header-name (car temp-list))
+                             (header-value (cadr temp-list)))
+                        ;; return ("Header-Name" . "header-value")
+                        (cons
+                         (capitalize (rfc2368-unhexify-string header-name))
+                         (rfc2368-unhexify-string header-value))))
+                    (split-string query "&"))))
+
+         ;; deal w/ multiple 'To' recipients
+         (if prequery
+             (progn
+               (setq prequery (rfc2368-unhexify-string prequery))
+               (if (assoc "To" headers-alist)
+                   (let* ((our-cons-cell
+                           (assoc "To" headers-alist))
+                          (our-cdr
+                           (cdr our-cons-cell)))
+                     (setcdr our-cons-cell (concat prequery ", " our-cdr)))
+                 (setq headers-alist
+                       (cons (cons "To" prequery) headers-alist)))))
+
+         headers-alist)
+
+      (error "Failed to match a mailto: url"))))
+
+(provide 'rfc2368)
+
+;;; rfc2368.el ends here
diff --git a/test/lisp/mail/rfc2368-tests.el b/test/lisp/mail/rfc2368-tests.el
deleted file mode 100644 (file)
index f997ea3..0000000
+++ /dev/null
@@ -1,39 +0,0 @@
-;;; rfc2368-tests.el --- Tests for rfc2368.el  -*- lexical-binding:t -*-
-
-;; Copyright (C) 2020-2021 Free Software Foundation, Inc.
-
-;; This file is part of GNU Emacs.
-
-;; GNU Emacs 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 of the License, or
-;; (at your option) any later version.
-
-;; GNU Emacs 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 GNU Emacs.  If not, see <https://www.gnu.org/licenses/>.
-
-;;; Commentary:
-
-;;; Code:
-
-(require 'ert)
-(require 'rfc2368)
-
-(ert-deftest rfc2368-unhexify-string ()
-  (should (equal (rfc2368-unhexify-string "hello%20there") "hello there")))
-
-(ert-deftest rfc2368-parse-mailto-url ()
-  (should (equal (rfc2368-parse-mailto-url "mailto:foo@example.org?subject=Foo&bar=baz")
-                 '(("To" . "foo@example.org") ("Subject" . "Foo") ("Bar" . "baz"))))
-  (should (equal (rfc2368-parse-mailto-url "mailto:foo@bar.com?to=bar@example.org")
-                 '(("To" . "foo@bar.com, bar@example.org"))))
-  (should (equal (rfc2368-parse-mailto-url "mailto:foo@bar.com?subject=bar%20baz")
-                 '(("To" . "foo@bar.com") ("Subject" . "bar baz")))))
-
-(provide 'rfc2368-tests)
-;;; rfc2368-tests.el ends here
diff --git a/test/lisp/mail/rfc6068-tests.el b/test/lisp/mail/rfc6068-tests.el
new file mode 100644 (file)
index 0000000..caf8230
--- /dev/null
@@ -0,0 +1,52 @@
+;;; rfc6068-tests.el --- Tests for rfc6068.el  -*- lexical-binding:t -*-
+
+;; Copyright (C) 2020-2021 Free Software Foundation, Inc.
+
+;; This file is part of GNU Emacs.
+
+;; GNU Emacs 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 of the License, or
+;; (at your option) any later version.
+
+;; GNU Emacs 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 GNU Emacs.  If not, see <https://www.gnu.org/licenses/>.
+
+;;; Commentary:
+
+;;; Code:
+
+(require 'ert)
+(require 'rfc6068)
+
+(ert-deftest rfc6068-unhexify-string ()
+  (should (equal (rfc6068-unhexify-string "hello%20there") "hello there"))
+  (should (equal (rfc6068-unhexify-string "caf%C3%A9") "café")))
+
+(ert-deftest rfc6068-parse-mailto-url ()
+  (should
+   (equal
+    (rfc6068-parse-mailto-url "mailto:foo@example.org?subject=Foo&bar=baz")
+    '(("To" . "foo@example.org") ("Subject" . "Foo") ("Bar" . "baz"))))
+  (should
+   (equal
+    (rfc6068-parse-mailto-url "mailto:foo@bar.com?to=bar@example.org")
+    '(("To" . "foo@bar.com, bar@example.org"))))
+  (should
+   (equal (rfc6068-parse-mailto-url "mailto:foo@bar.com?subject=bar%20baz")
+          '(("To" . "foo@bar.com") ("Subject" . "bar baz"))))
+  (should
+   (equal (rfc6068-parse-mailto-url "mailto:foo@bar.com?subject=bar%20baz&to=other@bar.com")
+          '(("Subject" . "bar baz") ("To" . "foo@bar.com, other@bar.com"))))
+  (should
+   (equal (rfc6068-parse-mailto-url "mailto:user@example.org?subject=caf%C3%A9&body=caf%C3%A9")
+          '(("To" . "user@example.org") ("Subject" . "café") ("Body" . "café")))))
+
+(provide 'rfc6068-tests)
+
+;;; rfc6068-tests.el ends here
diff --git a/test/lisp/obsolete/rfc2368-tests.el b/test/lisp/obsolete/rfc2368-tests.el
new file mode 100644 (file)
index 0000000..f997ea3
--- /dev/null
@@ -0,0 +1,39 @@
+;;; rfc2368-tests.el --- Tests for rfc2368.el  -*- lexical-binding:t -*-
+
+;; Copyright (C) 2020-2021 Free Software Foundation, Inc.
+
+;; This file is part of GNU Emacs.
+
+;; GNU Emacs 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 of the License, or
+;; (at your option) any later version.
+
+;; GNU Emacs 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 GNU Emacs.  If not, see <https://www.gnu.org/licenses/>.
+
+;;; Commentary:
+
+;;; Code:
+
+(require 'ert)
+(require 'rfc2368)
+
+(ert-deftest rfc2368-unhexify-string ()
+  (should (equal (rfc2368-unhexify-string "hello%20there") "hello there")))
+
+(ert-deftest rfc2368-parse-mailto-url ()
+  (should (equal (rfc2368-parse-mailto-url "mailto:foo@example.org?subject=Foo&bar=baz")
+                 '(("To" . "foo@example.org") ("Subject" . "Foo") ("Bar" . "baz"))))
+  (should (equal (rfc2368-parse-mailto-url "mailto:foo@bar.com?to=bar@example.org")
+                 '(("To" . "foo@bar.com, bar@example.org"))))
+  (should (equal (rfc2368-parse-mailto-url "mailto:foo@bar.com?subject=bar%20baz")
+                 '(("To" . "foo@bar.com") ("Subject" . "bar baz")))))
+
+(provide 'rfc2368-tests)
+;;; rfc2368-tests.el ends here