org-mode/contrib/lisp/org-browser-url.el

89 lines
2.9 KiB
EmacsLisp

;;; org-browser-url.el --- Bookmark from a browser into org links
;; Author: Ross Patterson <me@rpatterson.net>
;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;
;;
;;; Commentary:
;; Once a bookmarklet and a app handler are setup in your browser,
;; the functions here support using the bookmarklet to add links to
;; the org links ring.
;;
;; Much of this is taken from or modeled after
;; org-annotation-helper.el
;;
;; Installation and Activation
;; ---------------------------
;;
;; Step 1: Install this library on your path and enable it in your
;; $HOME/.emacs:
;;
;; (require 'org-browser-url)
;;
;; Step 2: Install the handler script
;;
;; * Save the following script to an appropriate place and make sure
;; it is executable:
;;
;; #!/bin/sh
;; # org-browser-url-store - Store URLs in the org links ring
;; emacsclient --eval "(let ((org-browser-url-args \"$*\"))\
;; (call-interactively 'org-store-link))"
;;
;; * Make sure emacs is running with server mode started:
;;
;; (server-start)
;;
;; * Test the script from the command line
;;
;; $ org-browser-url-store \
;; 'org-browser-url-store:///Link%20Description/http://foo.com'
;;
;; * Insert the link in an org-mode buffer with C-c C-l
;;
;; Step 3: Add the handler to your browser
;;
;; * For Firefox:
;; - type in "about:config" in the location bar
;; - right click, select "New", then "String"
;; - enter the name:
;; "network.protocol-handler.app.org-browser-url-store"
;; - leave the value blank
;;
;; See http://kb.mozillazine.org/Register_protocol for more details.
;;
;; * For Opera add the protocol in the
;; Preferences->Advanced->Programs dialog.
;;
;; Step 4: Add bookmarklet
;;
;; * Create a new bookmark with the following location:
;;
;; javascript:location.href='org-browser-url-store:///'+\
;; escape(document.title)+'/'+location.href
;;
;; When you first use the bookmarklet, Firefox will prompt you for
;; the script. Point it to the full path of the script.
;;; Code:
(require 'org)
(require 'url)
(defun org-browser-url-store-link ()
"Store a browser URL as an org link from the bookmarklet"
(if (boundp 'org-browser-url-args)
(let* ((stored (url-generic-parse-url org-browser-url-args))
(path (split-string (aref stored 6) "/"))
(parsed (url-generic-parse-url
(mapconcat 'identity (cddr path) "/")))
(type (aref parsed 1))
(link (aset parsed 7 (aref stored 7)))
(link (url-recreate-url parsed))
(description (url-unhex-string (nth 1 path))))
(org-store-link-props
:type type :link link :description description))))
(add-hook 'org-store-link-functions 'org-browser-url-store-link)
(provide 'org-browser-url)