Mercurial > emacs
annotate lisp/org/org-w3m.el @ 104388:395f430854da
(news-mail-reply): Use goto-char rather than goto-line.
author | Glenn Morris <rgm@gnu.org> |
---|---|
date | Fri, 21 Aug 2009 07:34:18 +0000 |
parents | ac1a55cc2c38 |
children | 86b7fe7d1d8f |
rev | line source |
---|---|
100268 | 1 ;;; org-w3m.el --- Support from copy and paste from w3m to Org-mode |
2 | |
100908 | 3 ;; Copyright (C) 2008, 2009 Free Software Foundation, Inc. |
100268 | 4 |
5 ;; Author: Andy Stewart <lazycat dot manatee at gmail dot com> | |
6 ;; Keywords: outlines, hypermedia, calendar, wp | |
7 ;; Homepage: http://orgmode.org | |
104164
ac1a55cc2c38
2009-08-06 Carsten Dominik <carsten.dominik@gmail.com>
Carsten Dominik <dominik@science.uva.nl>
parents:
101757
diff
changeset
|
8 ;; Version: 6.29c |
100268 | 9 ;; |
10 ;; This file is part of GNU Emacs. | |
11 ;; | |
12 ;; GNU Emacs is free software: you can redistribute it and/or modify | |
13 ;; it under the terms of the GNU General Public License as published by | |
14 ;; the Free Software Foundation, either version 3 of the License, or | |
15 ;; (at your option) any later version. | |
16 | |
17 ;; GNU Emacs is distributed in the hope that it will be useful, | |
18 ;; but WITHOUT ANY WARRANTY; without even the implied warranty of | |
19 ;; MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the | |
20 ;; GNU General Public License for more details. | |
21 | |
22 ;; You should have received a copy of the GNU General Public License | |
23 ;; along with GNU Emacs. If not, see <http://www.gnu.org/licenses/>. | |
24 ;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;; | |
25 ;; | |
26 ;;; Commentary: | |
27 | |
28 ;; This file implements copying HTML content from a w3m buffer and | |
29 ;; transfomring the text on the fly so that it can be pasted into | |
30 ;; an org-mode buffer with hot links. It will also work for regions | |
31 ;; in gnus buffers that have ben washed with w3m. | |
32 | |
33 ;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;; | |
34 ;; | |
100458
ba23e35d3eaf
2008-12-17 Carsten Dominik <carsten.dominik@gmail.com>
Carsten Dominik <dominik@science.uva.nl>
parents:
100448
diff
changeset
|
35 ;;; Acknowledgements: |
100268 | 36 |
37 ;; Richard Riley <rileyrgdev at googlemail dot com> | |
38 ;; | |
100458
ba23e35d3eaf
2008-12-17 Carsten Dominik <carsten.dominik@gmail.com>
Carsten Dominik <dominik@science.uva.nl>
parents:
100448
diff
changeset
|
39 ;; The idea of transforming the HTML content with org-mode style is |
ba23e35d3eaf
2008-12-17 Carsten Dominik <carsten.dominik@gmail.com>
Carsten Dominik <dominik@science.uva.nl>
parents:
100448
diff
changeset
|
40 ;; proposed by Richard, I'm just coding it. |
100268 | 41 ;; |
42 | |
43 (require 'org) | |
44 (declare-function w3m-anchor "ext:w3m-util" (position)) | |
45 | |
46 (defun org-w3m-copy-for-org-mode () | |
47 "Copy current buffer content or active region with `org-mode' style links. | |
48 This will encode `link-title' and `link-location' with | |
49 `org-make-link-string', and insert the transformed test into the kill ring, | |
50 so that it can be yanked into an Org-mode buffer with links working correctly." | |
51 (interactive) | |
101458
36abe982e7cd
2009-01-25 Carsten Dominik <carsten.dominik@gmail.com>
Carsten Dominik <dominik@science.uva.nl>
parents:
100908
diff
changeset
|
52 (let* ((regionp (org-region-active-p)) |
36abe982e7cd
2009-01-25 Carsten Dominik <carsten.dominik@gmail.com>
Carsten Dominik <dominik@science.uva.nl>
parents:
100908
diff
changeset
|
53 (transform-start (point-min)) |
36abe982e7cd
2009-01-25 Carsten Dominik <carsten.dominik@gmail.com>
Carsten Dominik <dominik@science.uva.nl>
parents:
100908
diff
changeset
|
54 (transform-end (point-max)) |
36abe982e7cd
2009-01-25 Carsten Dominik <carsten.dominik@gmail.com>
Carsten Dominik <dominik@science.uva.nl>
parents:
100908
diff
changeset
|
55 return-content |
36abe982e7cd
2009-01-25 Carsten Dominik <carsten.dominik@gmail.com>
Carsten Dominik <dominik@science.uva.nl>
parents:
100908
diff
changeset
|
56 link-location link-title |
36abe982e7cd
2009-01-25 Carsten Dominik <carsten.dominik@gmail.com>
Carsten Dominik <dominik@science.uva.nl>
parents:
100908
diff
changeset
|
57 temp-position out-bound) |
36abe982e7cd
2009-01-25 Carsten Dominik <carsten.dominik@gmail.com>
Carsten Dominik <dominik@science.uva.nl>
parents:
100908
diff
changeset
|
58 (when regionp |
36abe982e7cd
2009-01-25 Carsten Dominik <carsten.dominik@gmail.com>
Carsten Dominik <dominik@science.uva.nl>
parents:
100908
diff
changeset
|
59 (setq transform-start (region-beginning)) |
36abe982e7cd
2009-01-25 Carsten Dominik <carsten.dominik@gmail.com>
Carsten Dominik <dominik@science.uva.nl>
parents:
100908
diff
changeset
|
60 (setq transform-end (region-end)) |
36abe982e7cd
2009-01-25 Carsten Dominik <carsten.dominik@gmail.com>
Carsten Dominik <dominik@science.uva.nl>
parents:
100908
diff
changeset
|
61 ;; Deactivate mark if current mark is activate. |
36abe982e7cd
2009-01-25 Carsten Dominik <carsten.dominik@gmail.com>
Carsten Dominik <dominik@science.uva.nl>
parents:
100908
diff
changeset
|
62 (if (fboundp 'deactivate-mark) (deactivate-mark))) |
100268 | 63 (message "Transforming links...") |
64 (save-excursion | |
65 (goto-char transform-start) | |
101458
36abe982e7cd
2009-01-25 Carsten Dominik <carsten.dominik@gmail.com>
Carsten Dominik <dominik@science.uva.nl>
parents:
100908
diff
changeset
|
66 (while (and (not out-bound) ; still inside region to copy |
36abe982e7cd
2009-01-25 Carsten Dominik <carsten.dominik@gmail.com>
Carsten Dominik <dominik@science.uva.nl>
parents:
100908
diff
changeset
|
67 (not (org-w3m-no-next-link-p))) ; no next link current buffer |
36abe982e7cd
2009-01-25 Carsten Dominik <carsten.dominik@gmail.com>
Carsten Dominik <dominik@science.uva.nl>
parents:
100908
diff
changeset
|
68 ;; store current point before jump next anchor |
36abe982e7cd
2009-01-25 Carsten Dominik <carsten.dominik@gmail.com>
Carsten Dominik <dominik@science.uva.nl>
parents:
100908
diff
changeset
|
69 (setq temp-position (point)) |
36abe982e7cd
2009-01-25 Carsten Dominik <carsten.dominik@gmail.com>
Carsten Dominik <dominik@science.uva.nl>
parents:
100908
diff
changeset
|
70 ;; move to next anchor when current point is not at anchor |
36abe982e7cd
2009-01-25 Carsten Dominik <carsten.dominik@gmail.com>
Carsten Dominik <dominik@science.uva.nl>
parents:
100908
diff
changeset
|
71 (or (w3m-anchor (point)) (org-w3m-get-next-link-start)) |
36abe982e7cd
2009-01-25 Carsten Dominik <carsten.dominik@gmail.com>
Carsten Dominik <dominik@science.uva.nl>
parents:
100908
diff
changeset
|
72 (if (<= (point) transform-end) ; if point is inside transform bound |
36abe982e7cd
2009-01-25 Carsten Dominik <carsten.dominik@gmail.com>
Carsten Dominik <dominik@science.uva.nl>
parents:
100908
diff
changeset
|
73 (progn |
36abe982e7cd
2009-01-25 Carsten Dominik <carsten.dominik@gmail.com>
Carsten Dominik <dominik@science.uva.nl>
parents:
100908
diff
changeset
|
74 ;; get content between two links. |
36abe982e7cd
2009-01-25 Carsten Dominik <carsten.dominik@gmail.com>
Carsten Dominik <dominik@science.uva.nl>
parents:
100908
diff
changeset
|
75 (if (> (point) temp-position) |
36abe982e7cd
2009-01-25 Carsten Dominik <carsten.dominik@gmail.com>
Carsten Dominik <dominik@science.uva.nl>
parents:
100908
diff
changeset
|
76 (setq return-content (concat return-content |
36abe982e7cd
2009-01-25 Carsten Dominik <carsten.dominik@gmail.com>
Carsten Dominik <dominik@science.uva.nl>
parents:
100908
diff
changeset
|
77 (buffer-substring |
36abe982e7cd
2009-01-25 Carsten Dominik <carsten.dominik@gmail.com>
Carsten Dominik <dominik@science.uva.nl>
parents:
100908
diff
changeset
|
78 temp-position (point))))) |
36abe982e7cd
2009-01-25 Carsten Dominik <carsten.dominik@gmail.com>
Carsten Dominik <dominik@science.uva.nl>
parents:
100908
diff
changeset
|
79 ;; get link location at current point. |
36abe982e7cd
2009-01-25 Carsten Dominik <carsten.dominik@gmail.com>
Carsten Dominik <dominik@science.uva.nl>
parents:
100908
diff
changeset
|
80 (setq link-location (w3m-anchor (point))) |
36abe982e7cd
2009-01-25 Carsten Dominik <carsten.dominik@gmail.com>
Carsten Dominik <dominik@science.uva.nl>
parents:
100908
diff
changeset
|
81 ;; get link title at current point. |
36abe982e7cd
2009-01-25 Carsten Dominik <carsten.dominik@gmail.com>
Carsten Dominik <dominik@science.uva.nl>
parents:
100908
diff
changeset
|
82 (setq link-title (buffer-substring (point) |
36abe982e7cd
2009-01-25 Carsten Dominik <carsten.dominik@gmail.com>
Carsten Dominik <dominik@science.uva.nl>
parents:
100908
diff
changeset
|
83 (org-w3m-get-anchor-end))) |
36abe982e7cd
2009-01-25 Carsten Dominik <carsten.dominik@gmail.com>
Carsten Dominik <dominik@science.uva.nl>
parents:
100908
diff
changeset
|
84 ;; concat `org-mode' style url to `return-content'. |
36abe982e7cd
2009-01-25 Carsten Dominik <carsten.dominik@gmail.com>
Carsten Dominik <dominik@science.uva.nl>
parents:
100908
diff
changeset
|
85 (setq return-content (concat return-content |
36abe982e7cd
2009-01-25 Carsten Dominik <carsten.dominik@gmail.com>
Carsten Dominik <dominik@science.uva.nl>
parents:
100908
diff
changeset
|
86 (org-make-link-string |
36abe982e7cd
2009-01-25 Carsten Dominik <carsten.dominik@gmail.com>
Carsten Dominik <dominik@science.uva.nl>
parents:
100908
diff
changeset
|
87 link-location link-title)))) |
36abe982e7cd
2009-01-25 Carsten Dominik <carsten.dominik@gmail.com>
Carsten Dominik <dominik@science.uva.nl>
parents:
100908
diff
changeset
|
88 (goto-char temp-position) ; reset point before jump next anchor |
36abe982e7cd
2009-01-25 Carsten Dominik <carsten.dominik@gmail.com>
Carsten Dominik <dominik@science.uva.nl>
parents:
100908
diff
changeset
|
89 (setq out-bound t) ; for break out `while' loop |
36abe982e7cd
2009-01-25 Carsten Dominik <carsten.dominik@gmail.com>
Carsten Dominik <dominik@science.uva.nl>
parents:
100908
diff
changeset
|
90 )) |
100458
ba23e35d3eaf
2008-12-17 Carsten Dominik <carsten.dominik@gmail.com>
Carsten Dominik <dominik@science.uva.nl>
parents:
100448
diff
changeset
|
91 ;; add the rest until end of the region to be copied |
100268 | 92 (if (< (point) transform-end) |
101458
36abe982e7cd
2009-01-25 Carsten Dominik <carsten.dominik@gmail.com>
Carsten Dominik <dominik@science.uva.nl>
parents:
100908
diff
changeset
|
93 (setq return-content |
36abe982e7cd
2009-01-25 Carsten Dominik <carsten.dominik@gmail.com>
Carsten Dominik <dominik@science.uva.nl>
parents:
100908
diff
changeset
|
94 (concat return-content |
36abe982e7cd
2009-01-25 Carsten Dominik <carsten.dominik@gmail.com>
Carsten Dominik <dominik@science.uva.nl>
parents:
100908
diff
changeset
|
95 (buffer-substring (point) transform-end)))) |
104164
ac1a55cc2c38
2009-08-06 Carsten Dominik <carsten.dominik@gmail.com>
Carsten Dominik <dominik@science.uva.nl>
parents:
101757
diff
changeset
|
96 (org-kill-new return-content) |
100268 | 97 (message "Transforming links...done, use C-y to insert text into Org-mode file") |
98 (message "Copy with link transformation complete.")))) | |
99 | |
100 (defun org-w3m-get-anchor-start () | |
101458
36abe982e7cd
2009-01-25 Carsten Dominik <carsten.dominik@gmail.com>
Carsten Dominik <dominik@science.uva.nl>
parents:
100908
diff
changeset
|
101 "Move cursor to the start of current anchor. Return point." |
100268 | 102 ;; get start position of anchor or current point |
103 (goto-char (or (previous-single-property-change (point) 'w3m-anchor-sequence) | |
101458
36abe982e7cd
2009-01-25 Carsten Dominik <carsten.dominik@gmail.com>
Carsten Dominik <dominik@science.uva.nl>
parents:
100908
diff
changeset
|
104 (point)))) |
100268 | 105 |
106 (defun org-w3m-get-anchor-end () | |
101458
36abe982e7cd
2009-01-25 Carsten Dominik <carsten.dominik@gmail.com>
Carsten Dominik <dominik@science.uva.nl>
parents:
100908
diff
changeset
|
107 "Move cursor to the end of current anchor. Return point." |
100268 | 108 ;; get end position of anchor or point |
109 (goto-char (or (next-single-property-change (point) 'w3m-anchor-sequence) | |
110 (point)))) | |
111 | |
112 (defun org-w3m-get-next-link-start () | |
101458
36abe982e7cd
2009-01-25 Carsten Dominik <carsten.dominik@gmail.com>
Carsten Dominik <dominik@science.uva.nl>
parents:
100908
diff
changeset
|
113 "Move cursor to the start of next link. Return point." |
100268 | 114 (catch 'reach |
115 (while (next-single-property-change (point) 'w3m-anchor-sequence) | |
116 ;; jump to next anchor | |
117 (goto-char (next-single-property-change (point) 'w3m-anchor-sequence)) | |
118 (when (w3m-anchor (point)) | |
101458
36abe982e7cd
2009-01-25 Carsten Dominik <carsten.dominik@gmail.com>
Carsten Dominik <dominik@science.uva.nl>
parents:
100908
diff
changeset
|
119 ;; return point when current is valid link |
36abe982e7cd
2009-01-25 Carsten Dominik <carsten.dominik@gmail.com>
Carsten Dominik <dominik@science.uva.nl>
parents:
100908
diff
changeset
|
120 (throw 'reach nil)))) |
100268 | 121 (point)) |
122 | |
123 (defun org-w3m-get-prev-link-start () | |
101458
36abe982e7cd
2009-01-25 Carsten Dominik <carsten.dominik@gmail.com>
Carsten Dominik <dominik@science.uva.nl>
parents:
100908
diff
changeset
|
124 "Move cursor to the start of prevoius link. Return point." |
100268 | 125 (catch 'reach |
126 (while (previous-single-property-change (point) 'w3m-anchor-sequence) | |
127 ;; jump to previous anchor | |
128 (goto-char (previous-single-property-change (point) 'w3m-anchor-sequence)) | |
129 (when (w3m-anchor (point)) | |
101458
36abe982e7cd
2009-01-25 Carsten Dominik <carsten.dominik@gmail.com>
Carsten Dominik <dominik@science.uva.nl>
parents:
100908
diff
changeset
|
130 ;; return point when current is valid link |
36abe982e7cd
2009-01-25 Carsten Dominik <carsten.dominik@gmail.com>
Carsten Dominik <dominik@science.uva.nl>
parents:
100908
diff
changeset
|
131 (throw 'reach nil)))) |
100268 | 132 (point)) |
133 | |
134 (defun org-w3m-no-next-link-p () | |
101458
36abe982e7cd
2009-01-25 Carsten Dominik <carsten.dominik@gmail.com>
Carsten Dominik <dominik@science.uva.nl>
parents:
100908
diff
changeset
|
135 "Whether there is no next link after the cursor. |
36abe982e7cd
2009-01-25 Carsten Dominik <carsten.dominik@gmail.com>
Carsten Dominik <dominik@science.uva.nl>
parents:
100908
diff
changeset
|
136 Return t if there is no next link; otherwise, return nil." |
100268 | 137 (save-excursion |
138 (equal (point) (org-w3m-get-next-link-start)))) | |
139 | |
140 (defun org-w3m-no-prev-link-p () | |
101458
36abe982e7cd
2009-01-25 Carsten Dominik <carsten.dominik@gmail.com>
Carsten Dominik <dominik@science.uva.nl>
parents:
100908
diff
changeset
|
141 "Whether there is no previous link after the cursor. |
36abe982e7cd
2009-01-25 Carsten Dominik <carsten.dominik@gmail.com>
Carsten Dominik <dominik@science.uva.nl>
parents:
100908
diff
changeset
|
142 Return t if there is no previous link; otherwise, return nil." |
100268 | 143 (save-excursion |
144 (equal (point) (org-w3m-get-prev-link-start)))) | |
145 | |
146 ;; Install keys into the w3m keymap | |
147 (defvar w3m-mode-map) | |
148 (defvar w3m-minor-mode-map) | |
149 (when (and (boundp 'w3m-mode-map) | |
101458
36abe982e7cd
2009-01-25 Carsten Dominik <carsten.dominik@gmail.com>
Carsten Dominik <dominik@science.uva.nl>
parents:
100908
diff
changeset
|
150 (keymapp w3m-mode-map)) |
100268 | 151 (define-key w3m-mode-map "\C-c\C-x\M-w" 'org-w3m-copy-for-org-mode) |
152 (define-key w3m-mode-map "\C-c\C-x\C-w" 'org-w3m-copy-for-org-mode)) | |
153 (when (and (boundp 'w3m-minor-mode-map) | |
101458
36abe982e7cd
2009-01-25 Carsten Dominik <carsten.dominik@gmail.com>
Carsten Dominik <dominik@science.uva.nl>
parents:
100908
diff
changeset
|
154 (keymapp w3m-minor-mode-map)) |
100268 | 155 (define-key w3m-minor-mode-map "\C-c\C-x\M-w" 'org-w3m-copy-for-org-mode) |
156 (define-key w3m-minor-mode-map "\C-c\C-x\C-w" 'org-w3m-copy-for-org-mode)) | |
157 (add-hook | |
158 'w3m-mode-hook | |
159 (lambda () | |
160 (define-key w3m-mode-map "\C-c\C-x\M-w" 'org-w3m-copy-for-org-mode) | |
161 (define-key w3m-mode-map "\C-c\C-x\C-w" 'org-w3m-copy-for-org-mode))) | |
162 (add-hook | |
163 'w3m-minor-mode-hook | |
164 (lambda () | |
165 (define-key w3m-minor-mode-map "\C-c\C-x\M-w" 'org-w3m-copy-for-org-mode) | |
166 (define-key w3m-minor-mode-map "\C-c\C-x\C-w" 'org-w3m-copy-for-org-mode))) | |
167 | |
168 (provide 'org-w3m) | |
169 | |
170 ;; arch-tag: 851d7447-488d-49f0-a14d-46c092e84352 | |
171 | |
172 ;;; org-w3m.el ends here |