From 64b202f4a07dd7a1d927563df3c2df089c727aff Mon Sep 17 00:00:00 2001 From: Michael Brand Date: Tue, 11 Feb 2014 20:00:26 +0100 Subject: [PATCH] Fix escaping of more links in HTML export * lisp/org.el (org-link-escape-chars): Extend docstring. (org-link-escape-chars-browser): Mention in docstring that it will become a candidate for removal. (org-link-escape-browser): Mention in docstring that it will become a candidate for removal. (org-open-at-point): Move `url-encode-url' and comments into `org-link-escape-browser'. * lisp/ox-html.el (org-html-link): Make use of `org-link-escape-browser' like `org-open-at-point'. --- lisp/org.el | 60 +++++++++++++++++++++++++++++---------------------------- lisp/ox-html.el | 5 ++--- 2 files changed, 33 insertions(+), 32 deletions(-) diff --git a/lisp/org.el b/lisp/org.el index dfb0517..e87c930 100644 --- a/lisp/org.el +++ b/lisp/org.el @@ -9811,14 +9811,17 @@ according to FMT (default from `org-email-link-description-format')." (defconst org-link-escape-chars ;;%20 %2B %3B %3D %5B %5D '(?\ ?\+ ?\; ?\= ?\[ ?\]) - "List of characters that should be escaped in link. + "List of characters that should be escaped in a link when stored to Org. This is the list that is used for internal purposes.") (defconst org-link-escape-chars-browser ;;%20 %22 '(?\ ?\") - "List of escapes for characters that are problematic in links. -This is the list that is used before handing over to the browser.") + "List of characters to be escaped before handing over to the browser. +If you consider using this constant then you probably want to use +the function `org-link-escape-browser' instead. See there why +this constant is a candidate to be removed once Org drops support +for Emacs 24.1 and 24.2.") (defun org-link-escape (text &optional table merge) "Return percent escaped representation of TEXT. @@ -9847,11 +9850,27 @@ If optional argument MERGE is set, merge TABLE into (char-to-string char))) text "")) (defun org-link-escape-browser (text) - (if (org-string-match-p - (concat "[[:nonascii:]" org-link-escape-chars-browser "]") - text) - (org-link-escape text org-link-escape-chars-browser) - text)) + "Escape some characters before handing over to the browser. +This function is a candidate to be removed together with the +constant `org-link-escape-chars-browser' once Org drops support +for Emacs 24.1 and 24.2. All calls to this function will have to +be replaced with `url-encode-url' which is available since Emacs +24.3.1." + ;; Example with the Org link + ;; [[http://lists.gnu.org/archive/cgi-bin/namazu.cgi?idxname=emacs-orgmode&query=%252Bsubject:"Release+8.2"]] + ;; to open the browser with +subject:"Release 8.2" filled into the + ;; query field: In this case the variable TEXT contains the + ;; unescaped [...]=%2Bsubject:"Release+8.2". Then `url-encode-url' + ;; converts correctly to [...]=%2Bsubject:%22Release+8.2%22 or + ;; `org-link-escape' with `org-link-escape-chars-browser' converts + ;; wrongly to [...]=%252Bsubject:%22Release+8.2%22. + (if (fboundp 'url-encode-url) + (url-encode-url text) + (if (org-string-match-p + (concat "[[:nonascii:]" org-link-escape-chars-browser "]") + text) + (org-link-escape text org-link-escape-chars-browser) + text))) (defun org-link-unescape (str) "Unhex hexified Unicode strings as returned from the JavaScript function @@ -10576,29 +10595,12 @@ application the system uses for this file type." (apply cmd (nreverse args1)))) ((member type '("http" "https" "ftp" "news")) - ;; In the example of the http Org link - ;; [[http://lists.gnu.org/archive/cgi-bin/namazu.cgi?idxname=emacs-orgmode&query=%252Bsubject:"Release+8.2"]] - ;; to open a browser with +subject:"Release 8.2" in the - ;; query field the variable `path' contains - ;; [...]=%2Bsubject:"Release+8.2", `url-encode-url' - ;; converts correct to [...]=%2Bsubject:%22Release+8.2%22 - ;; and `org-link-escape-browser' converts wrong to - ;; [...]=%252Bsubject:%22Release+8.2%22. - ;; - ;; `url-encode-url' is available since Emacs 24.3.1 and - ;; `org-link-escape-browser' can be removed altogether - ;; once Org drops support for Emacs 24.1 and 24.2. - (browse-url (funcall (if (fboundp 'url-encode-url) - #'url-encode-url - #'org-link-escape-browser) - (concat type ":" path)))) + (browse-url (org-link-escape-browser + (concat type ":" path)))) ((string= type "doi") - ;; See comments for type http above - (browse-url (funcall (if (fboundp 'url-encode-url) - #'url-encode-url - #'org-link-escape-browser) - (concat org-doi-server-url path)))) + (browse-url (org-link-escape-browser + (concat org-doi-server-url path)))) ((member type '("message")) (browse-url (concat type ":" path))) diff --git a/lisp/ox-html.el b/lisp/ox-html.el index 5ceea71..a8c924f 100644 --- a/lisp/ox-html.el +++ b/lisp/ox-html.el @@ -2718,9 +2718,8 @@ INFO is a plist holding contextual information. See (path (cond ((member type '("http" "https" "ftp" "mailto")) - (org-link-escape - (org-link-unescape - (concat type ":" raw-path)) org-link-escape-chars-browser)) + (org-link-escape-browser + (org-link-unescape (concat type ":" raw-path)))) ((string= type "file") ;; Treat links to ".org" files as ".html", if needed. (setq raw-path -- 1.7.12.4 (Apple Git-37)