emacs-orgmode@gnu.org archives
 help / color / mirror / code / Atom feed
From: "Vincent Belaïche" <vincent.b.1@hotmail.fr>
To: Org mode <emacs-orgmode@gnu.org>
Cc: "Vincent Belaïche" <vincent.b.1@hotmail.fr>
Subject: Re: %20 in file://... URL
Date: Tue, 23 Nov 2010 06:25:40 +0100	[thread overview]
Message-ID: <80ipzofw6j.fsf@gmail.com> (raw)

>From: 	David Maus
>Subject: 	Re: [Orgmode] %20 in file://... URL
>Date: 	Mon, 22 Nov 2010 19:16:09 +0100
>User-agent: 	Wanderlust/2.15.9 (Almost Unreal) SEMI/1.14.6 (Maruoka) FLIM/1.14.9 (GojÅ) APEL/10.8 Emacs/23.2 (i486-pc-linux-gnu) MULE/6.0 (HANACHIRUSATO)
>At Mon, 22 Nov 2010 16:46:44 +0100,
>Vincent Belaïche wrote:
>> I see, so I understand that you will someday modify a function creating
>> links in order to implement character escaping. I can give a hand if
>> tell me the function name.
>To be exact: Org already escapes some characters (C-h v
>org-link-escape-chars RET) and the colon is a candidate for beeing on
>the list.  

What does "already" exactly means ? I pushed the colon '(?: . "%3A")
into this org-link-escape-chars list, and I made a trial with a link
like this:


I get this message: "if: No such file:
//localhost/c%3A/msys/1.0/temp/jay.html", evaluating the full org.el on
the link you gave does not make it either because I get the message that
org-complete cannot be loaded.

>The functions responsible for escaping/unescaping are `org-link-escape'
>and `org-link-unescape' and the new implementations of these functions
>can be found in

Ok, you mean that some version of org already does the job, but not the
org that is on the official Git depo ?

>The task at hand: Anticipate the consquences of the new implementation.
>I.e.  what will happen to links created with the old algorithm.

I have no idea of the consequences, I can be a beta tester of it, but
for the time being this code does not work with the kind of link which I

>Patches, ideas, and comments on the modifications are welcome.

The following is just comments on the code, most of it is a matter of
taste, which you may well disagree with.

1. In the org.el file in the link which you provided I found also these
   functions org-entry-protect-space & org-entry-restore-space which
   does also some escaping, why not use a unique function

2. In the function org-link-escape, there is a lambda expression  

   (lambda (sequence)
   			(format "%%%.2X" sequence))

   The argument name should be sequence-element rather than sequence.

3. In org-link-unescape, there are 3 substringing-or-concatenations, but
   you could make it simpler by a single replace-match and using a start-position in the
   string-match. That would look like this (*not tested*):

(defun org-link-unescape (str)
  "Unhex hexified unicode strings as returned from the JavaScript function
encodeURIComponent. E.g. `%C3%B6' is the german Umlaut `ö'."
  (setq str (or str ""))
  (let ((case-fold-search t)
        (pos 0))
    (while (string-match "\\(%[0-9a-f][0-9a-f]\\)+" str pos)
             (setq pos (+ pos (/ (- (match-end 0) (match-beginning 0))
		   str (replace-match 
			(org-link-unescape-compound (upcase  (match-string 0 str); hex
			t t str))))

My feeling that the kind of code above is slightly simpler in
execution as there is only one string manipulation at each
iteration instead of two, and also easier to maintain as is has
fewer use cases (i.e. it does not really matter if the escaped
sequence is at the end of string or not). You also avoid some
intermediate variables like `replacement' as the use of
replace-match make it self explanatory that the result of
org-link-unescape-compound is a replacement.

3. in org-link-unescape-compound,  

    (remove "" (split-string hex "%"))

   can be replaced by (cdr  (split-string hex "%")) because there is
   always only one empty string in the sequence and it is in the 1st

4. in org-link-unescape-compound, you could have made fewer comparison
   by replacing code

	      (if (= 0 eat) ;; new byte
		  (if (>= val 252) 6
		    (if (>= val 248) 5
		      (if (>= val 240) 4
			(if (>= val 224) 3
			  (if (>= val 192) 2 0)))))
	      (if (= 0 eat) ;; new byte
		  (if (>= val 252) 252
		    (if (>= val 248) 248
		      (if (>= val 240) 240
			(if (>= val 224) 224
			  (if (>= val 192) 192 0)))))

by (*not tested*):

	      (if (= 0 eat) ;; new byte
		  (if (>= val 252) '(6 . 252)
		    (if (>= val 248) '(5 . 248)
		      (if (>= val 240) '(4 . 240)
			(if (>= val 224) '(3 . 224)
			  (if (>= val 192) '(2 . 192) '(0. 0))))))
		 '(6 . 128)))
         (shift (car shift-xor))
	     (xor (cdr shift-xor))

the code above looks more concise to me, depending on val it may also
run faster.

hoping that the above helps.

>  -- David



             reply	other threads:[~2010-11-23  5:25 UTC|newest]

Thread overview: 21+ messages / expand[flat|nested]  mbox.gz  Atom feed  top
2010-11-23  5:25 Vincent Belaïche [this message]
2010-11-24 20:57 ` David Maus
2011-02-12 14:36   ` Bastien
     [not found] ` <BLU104-W15A3F7F6097ED8F6D95CEB84210@phx.gbl>
2010-11-29 20:03   ` David Maus
  -- strict thread matches above, loose matches on Subject: below --
2010-12-30  5:29 Vincent Belaïche
2010-11-22 15:46 Vincent Belaïche
2010-11-22 18:16 ` David Maus
2011-02-12 15:02   ` Bastien
2010-11-22 15:46 Vincent Belaïche
2010-11-13  6:18 Vincent Belaïche
2010-11-13  6:28 ` Vincent Belaïche
2010-11-14 17:30 ` David Maus
2010-11-17 20:43 ` David Maus
2010-11-17 20:43 ` David Maus
2010-11-05  6:42 Vincent Belaïche
2010-11-05  8:39 ` Giovanni Ridolfi
2010-10-27 21:19 Vincent Belaïche
2010-10-26  5:15 Vincent Belaïche
2010-10-26 15:39 ` Giovanni Ridolfi
2010-10-24 20:49 Vincent Belaïche
2010-10-24 21:02 ` David Maus

Reply instructions:

You may reply publicly to this message via plain-text email
using any one of the following methods:

* Save the following mbox file, import it into your mail client,
  and reply-to-all from there: mbox

  Avoid top-posting and favor interleaved quoting:

  List information: https://www.orgmode.org/

* Reply using the --to, --cc, and --in-reply-to
  switches of git-send-email(1):

  git send-email \
    --in-reply-to=80ipzofw6j.fsf@gmail.com \
    --to=vincent.b.1@hotmail.fr \
    --cc=emacs-orgmode@gnu.org \
    --subject='Re: %20 in file://... URL' \


* If your mail client supports setting the In-Reply-To header
  via mailto: links, try the mailto: link

Code repositories for project(s) associated with this inbox:


This is a public inbox, see mirroring instructions
for how to clone and mirror all data and code used for this inbox;
as well as URLs for read-only IMAP folder(s) and NNTP newsgroup(s).