From 818b6a661087bfabb7363e06249bb925740f9616 Mon Sep 17 00:00:00 2001 From: Rick Frankel Date: Fri, 18 Oct 2013 14:03:03 -0400 Subject: [PATCH] * org-download.el (): - org-download-image-dir: Fix mismatch error (string set to nil.) - org-download--backend-cmd: Removed. - org-download-backend: Use a choice instead of a string reprensenting the tag. (org-download--fullname): Use url-parse to remove query params urls. Use `file-name-nondirectory' instead of splitting on slashes. (org-download--image): Use `org-download-backend' directly and generate better error messages for `url-retrieve' failures. (org-download-image): Prompt for image url instead of attempting to use the clipboard directly. Fix docstring to better match implementation. --- org-download.el | 49 ++++++++++++++++++++++++------------------------- 1 file changed, 24 insertions(+), 25 deletions(-) diff --git a/org-download.el b/org-download.el index e7ae1a1..1d9ca40 100644 --- a/org-download.el +++ b/org-download.el @@ -33,6 +33,7 @@ (eval-when-compile (require 'cl)) +(require 'url-parse) (defgroup org-download nil "Image drag-and-drop for org-mode." @@ -40,24 +41,18 @@ :prefix "org-download-") (defcustom org-download-image-dir nil - "If not nil, `org-download-image' will store images here." - :type 'string + "If set, images will be stored in this directory +instead of the default (see `org-download-image'.)" + :type '(choice (const :tag "Default" nil) + (string :tag "Directory")) :group 'org-download) -(defvar org-download--backend-cmd nil - "Backend command for downloading. - -Do not set this directly. Customize `org-download-backend' instead.") - -(defcustom org-download-backend 'wget - "Set this to `wget' or `curl' or `url-retrieve'" - :set (lambda (symbol value) - (case value - (wget (setq org-download--backend-cmd "wget \"%s\" -O \"%s\"")) - (curl (setq org-download--backend-cmd "curl \"%s\" -o \"%s\"")) - (url-retrieve t) - (t (error "Unsupported key: %s" value))) - (set-default symbol value)) +(defcustom org-download-backend t + "Method to use for downloading" + :type '(choice + (const :tag "wget" "wget \"%s\" -O \"%s\"") + (const :tag "curl" "curl \"%s\" -o \"%s\"") + (const :tag "url-retrieve" t)) :group 'org-download) (defcustom org-download-timestamp "_%Y-%m-%d_%H:%M:%S" @@ -91,7 +86,10 @@ Set this to \"\" if you don't want time stamps." It's affected by `org-download-timestamp' and `org-download-image-dir' custom variables." - (let ((filename (car (last (split-string link "/")))) + (let ((filename + (file-name-nondirectory + (car (url-path-and-query + (url-generic-parse-url link))))) (dir (org-download--dir))) (format "%s/%s%s.%s" dir @@ -101,14 +99,16 @@ custom variables." (defun org-download--image (link filename) "Save LINK to FILENAME asynchronously and show inline images in current buffer." - (if (eq org-download-backend 'url-retrieve) + (if (eq org-download-backend t) (url-retrieve link (lambda (status filename buffer) - "Write current buffer to FILENAME and update inline images in BUFFER" + ;; Write current buffer to FILENAME + ;; and update inline images in BUFFER (let ((err (plist-get status :error))) - (if err - (signal :error (cdr err)))) + (if err (error + "\"%s\" %s." url + (downcase (nth 2 (assq (nth 2 err) url-http-codes)))))) (delete-region (point-min) (progn @@ -125,16 +125,15 @@ custom variables." (require 'async) (async-start `(lambda() (shell-command - ,(format org-download--backend-cmd link filename))) + ,(format org-download--backend link filename))) (lexical-let ((cur-buf (current-buffer))) (lambda(x) (with-current-buffer cur-buf (org-display-inline-images))))))) (defun org-download-image (link) - "Save image at address LINK to current directory's sub-directory DIR. -DIR is the name of the current level 0 heading." - (interactive (list (current-kill 0))) + "Save image at address LINK to a either the directory specified by `org-download-image-directory', or a subdirectory named after the current level 0 heading." + (interactive "sUrl: ") (let ((filename (org-download--fullname link))) (if (null (image-type-from-file-name filename)) (message "not an image URL") -- 1.8.0