emacs-orgmode
[Top][All Lists]
Advanced

[Date Prev][Date Next][Thread Prev][Thread Next][Date Index][Thread Index]

Re: [Orgmode] %20 in file://... URL


From: Vincent Belaïche
Subject: Re: [Orgmode] %20 in file://... URL
Date: Tue, 23 Nov 2010 06:25:40 +0100

>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:

[[file://localhost/c%3A/msys/1.0/temp/jay.html][link]]

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
>
>https://github.com/dmj/dmj-org-mode/tree/feature/org-percent-escaping
>

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
use.

>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))
                                 3))
                   str (replace-match 
                        (org-link-unescape-compound (upcase  (match-string 0 
str); hex
                                                   ))
                        t t str))))
  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
   place.

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

             (shift
              (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)))))
                6))
             (xor
              (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)))))
                128)))

by (*not tested*):

             (shift-xor
              (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.

>
>Best,
>  -- David
>-- 

BR,
   Vincent.

[...]




reply via email to

[Prev in Thread] Current Thread [Next in Thread]