mirror of
https://git.savannah.gnu.org/git/emacs/org-mode.git
synced 2024-08-21 13:19:04 +00:00
Org-protocol.el: Fix encoding problems, and call server-edit
Patch by Sebastian Rose.
This commit is contained in:
parent
a4a7dafbff
commit
13fe6b1858
|
@ -1,5 +1,10 @@
|
||||||
2009-04-18 Carsten Dominik <carsten.dominik@gmail.com>
|
2009-04-18 Carsten Dominik <carsten.dominik@gmail.com>
|
||||||
|
|
||||||
|
* org-protocol.el (server-edit): Declare `server-edit'.
|
||||||
|
(org-protocol-unhex-string, org-protocol-unhex-compound): New
|
||||||
|
functions.
|
||||||
|
(org-protocol-check-filename-for-protocol): Call `server-edit'.
|
||||||
|
|
||||||
* org.el (org-default-properties): New default properteis for
|
* org.el (org-default-properties): New default properteis for
|
||||||
completion.
|
completion.
|
||||||
|
|
||||||
|
|
|
@ -132,7 +132,8 @@
|
||||||
(&optional refresh))
|
(&optional refresh))
|
||||||
(declare-function org-publish-get-project-from-filename "org-publish"
|
(declare-function org-publish-get-project-from-filename "org-publish"
|
||||||
(filename &optional up))
|
(filename &optional up))
|
||||||
(declare-function server-delete-client proc "server" (&optional noframe))
|
(declare-function server-edit "server" ())
|
||||||
|
|
||||||
|
|
||||||
(defgroup org-protocol nil
|
(defgroup org-protocol nil
|
||||||
"Intercept calls from emacsclient to trigger custom actions.
|
"Intercept calls from emacsclient to trigger custom actions.
|
||||||
|
@ -271,13 +272,67 @@ Slashes are sanitized to double slashes here."
|
||||||
data is that one argument. Data is splitted at each occurrence of separator
|
data is that one argument. Data is splitted at each occurrence of separator
|
||||||
(regexp). If no separator is specified or separator is nil, assume \"/+\".
|
(regexp). If no separator is specified or separator is nil, assume \"/+\".
|
||||||
The results of that splitting are return as a list. If unhexify is non-nil,
|
The results of that splitting are return as a list. If unhexify is non-nil,
|
||||||
hex-decode each split part."
|
hex-decode each split part. If unhexify is a function, use that function to
|
||||||
|
decode each split part."
|
||||||
(let* ((sep (or separator "/+"))
|
(let* ((sep (or separator "/+"))
|
||||||
(split-parts (split-string data sep)))
|
(split-parts (split-string data sep)))
|
||||||
(if unhexify
|
(if unhexify
|
||||||
(mapcar 'url-unhex-string split-parts)
|
(mapcar 'url-unhex-string split-parts)
|
||||||
split-parts)))
|
split-parts)))
|
||||||
|
|
||||||
|
(defun org-protocol-unhex-string(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 ((tmp "")
|
||||||
|
(case-fold-search t))
|
||||||
|
(while (string-match "\\(%[0-9a-f][0-9a-f]\\)+" str)
|
||||||
|
(let* ((start (match-beginning 0))
|
||||||
|
(end (match-end 0))
|
||||||
|
(hex (match-string 0 str))
|
||||||
|
(replacement (org-protocol-unhex-compound hex)))
|
||||||
|
(setq tmp (concat tmp (substring str 0 start) replacement))
|
||||||
|
(setq str (substring str end))))
|
||||||
|
(setq tmp (concat tmp str))
|
||||||
|
tmp))
|
||||||
|
|
||||||
|
|
||||||
|
(defun org-protocol-unhex-compound (hex)
|
||||||
|
"Unhexify unicode hex-chars. E.g. `%C3%B6' is the german Umlaut `ü'."
|
||||||
|
(let* ((bytes (remove "" (split-string hex "%")))
|
||||||
|
(ret "")
|
||||||
|
(eat 0)
|
||||||
|
(sum 0))
|
||||||
|
(while bytes
|
||||||
|
(let* ((b (pop bytes))
|
||||||
|
(c1 (url-unhex (elt b 0)))
|
||||||
|
(c2 (url-unhex (elt b 1)))
|
||||||
|
(val (+ (lsh c1 4) c2))
|
||||||
|
(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)))
|
||||||
|
(if (>= val 192) (setq eat shift))
|
||||||
|
(setq val (logxor val xor))
|
||||||
|
(setq sum (+ (lsh sum shift) val))
|
||||||
|
(if (> eat 0) (setq eat (- eat 1)))
|
||||||
|
(when (= 0 eat)
|
||||||
|
(setq ret (concat ret (char-to-string sum)))
|
||||||
|
(setq sum 0))
|
||||||
|
)) ;; end (while bytes
|
||||||
|
ret ))
|
||||||
|
|
||||||
(defun org-protocol-flatten-greedy (param-list &optional strip-path replacement)
|
(defun org-protocol-flatten-greedy (param-list &optional strip-path replacement)
|
||||||
"Greedy handlers might recieve a list like this from emacsclient:
|
"Greedy handlers might recieve a list like this from emacsclient:
|
||||||
|
@ -477,8 +532,9 @@ as filename."
|
||||||
(greedy (plist-get (cdr prolist) :greedy))
|
(greedy (plist-get (cdr prolist) :greedy))
|
||||||
(splitted (split-string fname proto))
|
(splitted (split-string fname proto))
|
||||||
(result (if greedy restoffiles (cadr splitted))))
|
(result (if greedy restoffiles (cadr splitted))))
|
||||||
(if (plist-get (cdr prolist) :kill-client)
|
(when (plist-get (cdr prolist) :kill-client)
|
||||||
(server-delete-client client t))
|
(message "Greedy org-protocol handler. Killing client.")
|
||||||
|
(server-edit))
|
||||||
(when (fboundp func)
|
(when (fboundp func)
|
||||||
(unless greedy
|
(unless greedy
|
||||||
(throw 'fname (funcall func result)))
|
(throw 'fname (funcall func result)))
|
||||||
|
|
Loading…
Reference in a new issue