Browse Source

New file org-w3m.el, by Andy Stewart.

This file implements a special function to copy text from a w3m buffer
in a way that when the text is yanked back into an Org-mode buffer,
the links will be translated to Org syntax.
Carsten Dominik 17 years ago
parent
commit
a196eaa15c
6 changed files with 177 additions and 1 deletions
  1. 2 0
      Makefile
  2. 15 0
      ORGWEBPAGE/Changes.org
  3. 3 0
      doc/org.texi
  4. 2 0
      lisp/ChangeLog
  5. 153 0
      lisp/org-w3m.el
  6. 2 1
      lisp/org.el

+ 2 - 0
Makefile

@@ -91,6 +91,7 @@ LISPF      = 	org.el			\
 		org-table.el		\
 		org-table.el		\
 		org-timer.el		\
 		org-timer.el		\
 		org-vm.el		\
 		org-vm.el		\
+		org-w3m.el              \
 		org-wl.el
 		org-wl.el
 
 
 LISPFILES0 = $(LISPF:%=lisp/%)
 LISPFILES0 = $(LISPF:%=lisp/%)
@@ -329,4 +330,5 @@ lisp/org-rmail.elc:        lisp/org.elc
 lisp/org-table.elc:        lisp/org.elc
 lisp/org-table.elc:        lisp/org.elc
 lisp/org-timer.el:         lisp/org.elc
 lisp/org-timer.el:         lisp/org.elc
 lisp/org-vm.elc:           lisp/org.elc
 lisp/org-vm.elc:           lisp/org.elc
+lisp/org-w3m.elc:          lisp/org.elc
 lisp/org-wl.elc:           lisp/org.elc
 lisp/org-wl.elc:           lisp/org.elc

+ 15 - 0
ORGWEBPAGE/Changes.org

@@ -54,6 +54,21 @@
     Thanks to Alan Dove, Adam Spiers, and Alan Davis for
     Thanks to Alan Dove, Adam Spiers, and Alan Davis for
     contributions to this idea.
     contributions to this idea.
 
 
+*** Cut and Paste with hot links from w3m to Org
+
+    You can now use the key =C-c C-x M-w= in a w3m buffer with
+    HTML content to copy either the region or the entire file in
+    a special way.  When you yank this text back into an Org-mode
+    buffer, all links from the w3m buffer will continue to work
+    under Org-mode.
+
+    For this to work you need to load the new file /org-w3m.el./
+    Please check your org-modules variable to make sure that this
+    is turned on.
+
+    Thanks for Richard Riley for the idea and to Andy Stewart for
+    the implementation.
+
 * Version 6.13
 * Version 6.13
 
 
 ** Overview
 ** Overview

+ 3 - 0
doc/org.texi

@@ -10007,6 +10007,9 @@ tweaks and features.
 @i{Adam Spiers} asked for global linking commands, inspired the link
 @i{Adam Spiers} asked for global linking commands, inspired the link
 extension system, added support for mairix, and proposed the mapping API.
 extension system, added support for mairix, and proposed the mapping API.
 @item
 @item
+@i{Andy Stewart} contributed code to @file{org-w3m.el}, to copy HTML content
+with links transformation to Org syntax.
+@item
 @i{David O'Toole} wrote @file{org-publish.el} and drafted the manual
 @i{David O'Toole} wrote @file{org-publish.el} and drafted the manual
 chapter about publishing.
 chapter about publishing.
 @item
 @item

+ 2 - 0
lisp/ChangeLog

@@ -1,5 +1,7 @@
 2008-11-26  Carsten Dominik  <carsten.dominik@gmail.com>
 2008-11-26  Carsten Dominik  <carsten.dominik@gmail.com>
 
 
+	* org.el (org-modules): Add org-w3m to the default modules.
+
 	* org-table.el (orgtbl-self-insert-command): Make S-SPC work in
 	* org-table.el (orgtbl-self-insert-command): Make S-SPC work in
 	orgtbl-mode.
 	orgtbl-mode.
 	(orgtabl-create-or-convert-from-region): New command.
 	(orgtabl-create-or-convert-from-region): New command.

+ 153 - 0
lisp/org-w3m.el

@@ -0,0 +1,153 @@
+;;; org-w3m.el --- Support from copy and paste from w3m to Org-mode
+
+;; Copyright (C) 2008 Free Software Foundation, Inc.
+
+;; Author: Andy Stewart <lazycat dot manatee at gmail dot com>
+;; Keywords: outlines, hypermedia, calendar, wp
+;; Homepage: http://orgmode.org
+;; Version: 6.13trans
+;;
+;; This file is part of GNU Emacs.
+;;
+;; GNU Emacs is free software: you can redistribute it and/or modify
+;; it under the terms of the GNU General Public License as published by
+;; the Free Software Foundation, either version 3 of the License, or
+;; (at your option) any later version.
+
+;; GNU Emacs is distributed in the hope that it will be useful,
+;; but WITHOUT ANY WARRANTY; without even the implied warranty of
+;; MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the
+;; GNU General Public License for more details.
+
+;; You should have received a copy of the GNU General Public License
+;; along with GNU Emacs.  If not, see <http://www.gnu.org/licenses/>.
+;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;
+;;
+;;; Commentary:
+
+;; This file implements copying HTML content from a w3m buffer and
+;; transfomring the text on the fly so that it can be pasted into
+;; an org-mode buffer with hot links.
+
+;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;
+;;
+;;; Acknowledgments:
+
+;; Richard Riley <rileyrgdev at googlemail dot com>
+;;
+;;      The idea that transfomring the HTML content with org-mode style is
+;;      proposed by Richard, i'm just code it.
+;;
+
+(defun org-w3m-copy-for-org-mode ()
+  "Copy current buffer content or active region with `org-mode' style links.
+This will encode `link-title' and `link-location' with
+`org-make-link-string', and insert the transformed test into the kill ring,
+so that it can be yanked into an Org-mode buffer with links working correctly."
+  (interactive)
+  (let ((regionp (org-region-active-p))
+	transform-start transform-end
+	return-content
+	link-location link-title
+	temp-position out-bound)
+    (setq transform-start (if regionp (region-beginning) (point-min))
+	  transform-end (if regionp (region-end) (point-max)))
+    (message "Transforming links...")
+    (save-excursion
+      (goto-char transform-start)
+      (while (and (not out-bound)   ; still inside region to copy
+		  (not (org-w3m-no-next-link-p))) ; no next link current buffer
+	;; store current point before jump next anchor
+	(setq temp-position (point))
+	;; move to next anchor when current point is not at anchor
+	(or (w3m-anchor (point)) (org-w3m-get-next-link-start))
+	(if (<= (point) transform-end)  ; if point is inside transform bound
+	    (progn
+	      ;; get content between two links.
+	      (if (> (point) temp-position)
+		  (setq return-content (concat return-content
+					       (buffer-substring
+						temp-position (point)))))
+	      ;; get link location at current point.
+	      (setq link-location (w3m-anchor (point)))
+	      ;; get link title at current point.
+	      (setq link-title (buffer-substring (point)
+						 (org-w3m-get-anchor-end)))
+	      ;; concat `org-mode' style url to `return-content'.
+	      (setq return-content (concat return-content
+					   (org-make-link-string
+					    link-location link-title))))
+	  (goto-char temp-position)     ; reset point before jump next anchor
+	  (setq out-bound t)            ; for break out `while' loop
+	  ))
+      ;; add the rest until en end of the region to be copied
+      (if (< (point) transform-end)
+	  (setq return-content
+		(concat return-content
+			(buffer-substring (point) transform-end))))
+      (kill-new return-content)
+      (message "Transforming links...done, use C-y to insert text into Org-mode file")
+      (message "Copy with link transformation complete."))))
+
+(defun org-w3m-get-anchor-start ()
+  "Move to and return `point' for the start of the current anchor."
+  ;; get start position of anchor or current point
+  (goto-char (or (previous-single-property-change (point) 'w3m-anchor-sequence)
+		 (point))))
+
+(defun org-w3m-get-anchor-end ()
+  "Move and return `point' after the end of current anchor."
+  ;; get end position of anchor or point
+  (goto-char (or (next-single-property-change (point) 'w3m-anchor-sequence)
+		 (point))))
+
+(defun org-w3m-get-next-link-start ()
+  "Move and return `point' for that start of the current link."
+  (catch 'reach
+    (while (next-single-property-change (point) 'w3m-anchor-sequence)
+      ;; jump to next anchor
+      (goto-char (next-single-property-change (point) 'w3m-anchor-sequence))
+      (when (w3m-anchor (point))
+	;; return point when current is valid link
+	(throw 'reach nil))))
+  (point))
+
+(defun org-w3m-get-prev-link-start ()
+  "Move and return `point' for that end of the current link."
+  (catch 'reach
+    (while (previous-single-property-change (point) 'w3m-anchor-sequence)
+      ;; jump to previous anchor
+      (goto-char (previous-single-property-change (point) 'w3m-anchor-sequence))
+      (when (w3m-anchor (point)) 
+	;; return point when current is valid link
+	(throw 'reach nil))))
+  (point))
+
+(defun org-w3m-no-next-link-p ()
+  "Return t if no next link after cursor.
+Otherwise, return nil."
+  (save-excursion
+    (equal (point) (org-w3m-get-next-link-start))))
+
+(defun org-w3m-no-prev-link-p ()
+  "Return t if no prevoius link after cursor.
+Otherwise, return nil."
+  (save-excursion
+    (equal (point) (org-w3m-get-prev-link-start))))
+
+;; Install keys into the w3m keymap
+(when (and (boundp 'w3m-mode-map)
+	   (keymapp w3m-mode-map))
+  (define-key w3m-mode-map "\C-c\C-x\M-w" 'org-w3m-copy-for-org-mode)
+  (define-key w3m-mode-map "\C-c\C-x\C-w" 'org-w3m-copy-for-org-mode))
+(add-hook
+ 'w3m-mode-hook
+ (lambda ()
+   (define-key w3m-mode-map "\C-c\C-x\M-w" 'org-w3m-copy-for-org-mode)
+   (define-key w3m-mode-map "\C-c\C-x\C-w" 'org-w3m-copy-for-org-mode)))
+
+(provide 'org-w3m)
+
+;; arch-tag: 851d7447-488d-49f0-a14d-46c092e84352
+
+;;; org-w3m.el ends here

+ 2 - 1
lisp/org.el

@@ -143,7 +143,7 @@ With prefix arg HERE, insert it at point."
   (let ((a (member 'org-infojs org-modules)))
   (let ((a (member 'org-infojs org-modules)))
     (and a (setcar a 'org-jsinfo))))
     (and a (setcar a 'org-jsinfo))))
 
 
-(defcustom org-modules '(org-bbdb org-bibtex org-gnus org-info org-jsinfo org-irc org-mew org-mhe org-rmail org-vm org-wl)
+(defcustom org-modules '(org-bbdb org-bibtex org-gnus org-info org-jsinfo org-irc org-mew org-mhe org-rmail org-vm org-w3m org-wl)
   "Modules that should always be loaded together with org.el.
   "Modules that should always be loaded together with org.el.
 If a description starts with <C>, the file is not part of Emacs
 If a description starts with <C>, the file is not part of Emacs
 and loading it will require that you have downloaded and properly installed
 and loading it will require that you have downloaded and properly installed
@@ -172,6 +172,7 @@ to add the symbol `xyz', and the package must have a call to
 	(const :tag "   rmail:             Links to RMAIL folders/messages" org-rmail)
 	(const :tag "   rmail:             Links to RMAIL folders/messages" org-rmail)
 	(const :tag "   vm:                Links to VM folders/messages" org-vm)
 	(const :tag "   vm:                Links to VM folders/messages" org-vm)
 	(const :tag "   wl:                Links to Wanderlust folders/messages" org-wl)
 	(const :tag "   wl:                Links to Wanderlust folders/messages" org-wl)
+	(const :tag "   w3m:               Special cut/past from w3m to Org." org-w3m)
 	(const :tag "   mouse:             Additional mouse support" org-mouse)
 	(const :tag "   mouse:             Additional mouse support" org-mouse)
 
 
 	(const :tag "C  annotate-file:     Annotate a file with org syntax" org-annotate-file)
 	(const :tag "C  annotate-file:     Annotate a file with org syntax" org-annotate-file)