| 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 titleannotation://   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)
 |