Como “decodificar URL” uma string em Emacs Lisp?
Pergunta
Eu tenho uma string como "foo% 20bar" e eu quero "foo bar" fora dele.
Eu sei que não tem que ser um built-in função para decodificar uma string codificada em URL (string de consulta) em Emacs Lisp, mas para a vida de mim eu não posso encontrá-lo hoje, seja na minha lisp / pasta ou com o Google.
Qualquer pessoa lembrar o que é chamado?
Solução
org-link-unescape
faz o trabalho para casos muito simples ... w3m-url-decode-string
é melhor, mas não é construído em e a versão que tenho localmente não está funcionando com o Emacs 23.
Outras dicas
url-unhex-string
No meu caso eu precisava fazer isso de forma interativa. As respostas anteriores me deu as funções direito de chamar, então era apenas uma questão de envolvê-lo um pouco para torná-los interativa:
(defun func-region (start end func)
"run a function over the region between START and END in current buffer."
(save-excursion
(let ((text (delete-and-extract-region start end)))
(insert (funcall func text)))))
(defun hex-region (start end)
"urlencode the region between START and END in current buffer."
(interactive "r")
(func-region start end #'url-hexify-string))
(defun unhex-region (start end)
"de-urlencode the region between START and END in current buffer."
(interactive "r")
(func-region start end #'url-unhex-string))
Adicione o sal, eu ligamento médio para chaves de acordo com o gosto.
Emacs é fornecido com um URL biblioteca, que oferece um monte de URL parsing funções- como Huaiyuan e Charlie Martin já apontou. Aqui está um pequeno exemplo que iria dar-lhe uma idéia de como usá-lo:
(let ((url "http://www.google.hu/search?q=elisp+decode+url&btnG=Google+keres%E9s&meta="))
;; Return list of arguments and values
(url-parse-query-string
;; Decode hexas
(url-unhex-string
;; Retrieve argument list
(url-filename
;; Parse URL, return a struct
(url-generic-parse-url url)))))
=> (("meta" "") ("btnG" "Google+keresés") ("/search?q" "elisp+decode+url"))
Eu acho que é melhor contar com ele do que org-mode
como é seu principal objetivo a URL de análise.
Eu acho que você está fazendo isso um pouco demais: split-string
provavelmente irá fazer mais do que você quer. Para o material mais sofisticado, ter um olhar para as funções em url-expand.el
; Infelizmente, muitos deles não têm doc-cordas, assim você pode ter que ler o código.
url-generic-parse-url
olhares como um potencial vencedor.