| 123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176177178179180181182183184185186187188189190191 | 
							- ;;; org-annotation-helper.el --- start remember from a web browser
 
- ;;
 
- ;; Author: bzg AT altern DOT org
 
- ;; Author: dmg AT uvic   DOT org
 
- ;;
 
- ;; Keywords: org remember
 
- ;; 
 
- ;; Version 0.3,  May 19, 2008
 
- ;;
 
- ;;; Commentary:
 
- ;;
 
- ;; [bzg:] This is an adapted version of the planner-mode extension the
 
- ;; was first posted by Geert Kloosterman <g.j.kloosterman@gmail.com> on
 
- ;; the Planner mailing list.  
 
- ;;
 
- ;; [dmg:] I have updated and extended the function to allow for
 
- ;; handling of the selection (it is now available as a region, so it
 
- ;; can be used in a template using %i )
 
- ;;
 
- ;;
 
- ;; We want to be able to pass a URL and document title directly from a
 
- ;; web browser to Emacs.
 
- ;;
 
- ;; We define a remember:// url handler in the browser and use a shell
 
- ;; script to handle the protocol.  This script passes the information
 
- ;; to a running Emacs process (using emacsclient/gnuclient).  We use 
 
- ;; bookmarklets to create the remember:// urls dynamicly.
 
- ;;
 
- ;; The protocol types currently recognized are:
 
- ;; 
 
- ;; remember://     start `remember' with the url and title filled in
 
- ;; annotation://   similar to `planner-annotation-as-kill' (org?)
 
- ;;
 
- ;; The urls used internally will have the following form:
 
- ;;
 
- ;;   remember://<the web page url>::remember::<the title>::remember::<selection>
 
- ;;
 
- ;; The title will be url-hex-encoded. 
 
- ;;
 
- ;; The bookmarklets:
 
- ;;
 
- ;;----------------------------------------------------------------------
 
- ;; javascript:location.href='remember://' + location.href + \ 
 
- ;;   '::remember::' + escape(document.title) + '::remember::' + escape(window.getSelection())
 
- ;;----------------------------------------------------------------------
 
- ;; javascript:location.href='annotation://' + location.href + '::remember::' +\
 
- ;;     escape(document.title) ;; 
 
- ;;----------------------------------------------------------------------
 
- ;;
 
- ;; The handler
 
- ;;
 
- ;;----------------------------------------------------------------------
 
- ;; #!/bin/sh
 
- ;; # org-annotation-helper -- pass a remember-url to emacs
 
- ;; #
 
- ;; # Author: Geert Kloosterman <g.j.kloosterman@gmail.com>
 
- ;; # Date: Sat Nov 19 22:33:18 2005
 
- ;; 
 
- ;; if [ -z "$1" ]; then
 
- ;;     echo "$0: Error: no arguments given!" 1>&2
 
- ;;     exit 1
 
- ;; fi
 
- ;; 
 
- ;; # To test uncomment following line
 
- ;; #echo $1 >> /tmp/remember.out
 
- ;; 
 
- ;; emacsclient --eval "(progn (bzg/org-annotation-helper \"$1\" ) nil)"
 
- ;;----------------------------------------------------------------------
 
- ;; 
 
- ;;  To install:
 
- ;; 
 
- ;; Step 0: Install this module
 
- ;;
 
- ;;  *  Install this script and require it in your .emacs (or wherever you
 
- ;;    want to do it)
 
- ;;
 
- ;;    (require 'org-annotation-helper)
 
- ;;
 
- ;;
 
- ;; Step 1: Install the remember script
 
- ;; 
 
- ;;  * Save the handler as a script, and make sure it is executable, i.e.
 
- ;;     remember
 
- ;;  * Try it:  
 
- ;;     Make sure emacs is running and you have started its server mode (server-start)
 
- ;;     Run this command from the command line
 
- ;;      remember 'remember://http%3A//orgmode.org/::remember::Org-Mode%20Homepage::remember::Notes'
 
- ;;     Emacs should now show a remember window with a URL to remember.org
 
- ;;
 
- ;;
 
- ;; Step 2: add two bookmarklets
 
- ;;
 
- ;; For firefox:
 
- ;;
 
- ;;  * Right click on the bookmarks area of Firefox. 
 
- ;;  * Select new bookmark.
 
- ;;  * In location fill the javascript code above (the bookmarklet)
 
- ;;  * Make sure "Load this bookmark in the sidebar is deselected
 
- ;;
 
- ;;  Try it. You should have now a url that starts with "remember://"
 
- ;;  and your browser will not know what do to with it.
 
- ;;
 
- ;; Step 3: Add the handler for the "remember://" URI
 
- ;;
 
- ;; Firefox
 
- ;;
 
- ;; To add a protocol handler (eg: remember://) in Firefox, take the
 
- ;; following steps:
 
- ;;
 
- ;; - type in "about:config" in the location bar
 
- ;; - right click, select New --> String
 
- ;; - the name should be "network.protocol-handler.app.remember" 
 
- ;; - the value should be the executable, eg. "org-annotation-helper".
 
- ;;   At least under Linux this does not need to be the full path to 
 
- ;;   the executable.
 
- ;;
 
- ;; See http://kb.mozillazine.org/Register_protocol for more details.
 
- ;;
 
- ;; Opera
 
- ;;
 
- ;; In Opera add the protocol in the Preferences->Advanced->Programs
 
- ;; dialog.
 
- ;;
 
- ;;   Step 4: Configure a template
 
- ;;    I personally  use the following template for this mode
 
- ;;
 
- ;; 	   (?w "* %u %c \n\n%i" "~/working/trunk/org/bookmarks.org" "Web links")
 
- ;;  
 
- ;;    %c will be replaced with the hyperlink to the page, displaying the title of the page 
 
- ;;    %i will be replaced with the selected text from the browser
 
- ;;       By default the new remember notes are placed in the
 
- ;;    bookmarks.org file under the "Web links" section, but it can be
 
- ;;    easily overriden with C-u C-c C-c
 
- ;;
 
- ;; Step 5:
 
- ;;    Enjoy
 
- (require 'url)
 
- (autoload 'url-unhex-string "url")
 
- (defun bzg/org-annotation-helper (info)
 
- (interactive)
 
-   "Process an externally passed remember:// style url.
 
- URLSTRING consists of a protocol part and a url and title,
 
- separated by ::remember::
 
- The protocol types currently recognized are:
 
- remember://     start `remember' with the url and title
 
- annotation://   similar to `org-annotation-as-kill'."
 
-   (let ((remember-annotation-functions nil))
 
-     ;; The `parse-url' functions break on the embedded url,
 
-     ;; since our format is fixed we'll split the url ourselves.
 
-     (if (string-match  "^\\([^:]*\\):\\(/*\\)\\(.*\\)" info)
 
-       (let* ((b (get-buffer-create "*org-ann*"))
 
- 	     (proto (match-string 1 info))
 
- 	     (url_title_region (match-string 3 info))
 
- 	     (splitparts (split-string url_title_region "::remember::"))
 
- 	     (url (url-unhex-string (car splitparts)))
 
- 	     (type (if (string-match "^\\([a-z]+\\):" url) 
 
- 		       (match-string 1 url)))
 
- 	     (title (cadr splitparts))
 
- 	     (region (url-unhex-string (caddr splitparts)))
 
- 	     orglink)
 
-         (setq title (if (> (length title) 0) (url-unhex-string title)))
 
-         (setq orglink (org-make-link-string url title))
 
- 	(org-store-link-props :type type
 
- 			      :link url
 
- 			      :region region
 
- 			      :description title)
 
- 	(setq org-stored-links
 
- 	      (cons (list url title) org-stored-links))
 
- 	;; FIXME can't access %a in the template -- how to set annotation? 
 
- 	(raise-frame)
 
-         (cond ((equal proto "remember")
 
- 	       (kill-new orglink)
 
- 	       (set-buffer b)
 
- 	       (set-mark (point))
 
- 	       (insert region)
 
-                (org-remember nil ?w))
 
-               ((equal proto "annotation")
 
-                (message "Copied '%s' to the kill-ring." orglink)
 
-                (kill-new orglink))
 
-               (t (error "unrecognized org-helper protocol"))))
 
-       (error "could not parse argument")))
 
- )
 
- (provide 'org-annotation-helper)
 
 
  |