Hi Bastien

>From the commit of Rick Frankel for org-html-link (reformatted):

#+BEGIN_SRC emacs-lisp
  (org-link-escape
   (org-link-unescape (concat type ":" raw-path))
   org-link-escape-chars-browser)
#+END_SRC

I would like to discourage the use of the constant
org-link-escape-chars-browser in favor of the function
org-link-escape-browser that should use, and finally can be replaced
with, the function url-encode-url available since Emacs 24.3.1. The
patch attached for review will fix an Org link like e. g.
[[http://lists.gnu.org/archive/cgi-bin/namazu.cgi?idxname=emacs-orgmode&query=%252Bsubject:"Release+8.2";]]
with Emacs 24.3.1 now also for the Org export to HTML.

Some time ago I added url-encode-url already to the function
org-open-at-point. As this is not in maint and the attached patch
depends on it I intend to apply the latter only on master.

Michael
From 64b202f4a07dd7a1d927563df3c2df089c727aff Mon Sep 17 00:00:00 2001
From: Michael Brand <michael.ch.br...@gmail.com>
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)

Reply via email to