Commit | Line | Data |
---|---|---|
e5f29d66 CD |
1 | ;;; org-w3m.el --- Support from copy and paste from w3m to Org-mode |
2 | ||
3ab2c837 | 3 | ;; Copyright (C) 2008, 2009, 2010 Free Software Foundation, Inc. |
e5f29d66 CD |
4 | |
5 | ;; Author: Andy Stewart <lazycat dot manatee at gmail dot com> | |
6 | ;; Keywords: outlines, hypermedia, calendar, wp | |
7 | ;; Homepage: http://orgmode.org | |
3ab2c837 | 8 | ;; Version: 7.7 |
e5f29d66 CD |
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 | |
8bfe682a | 29 | ;; transforming the text on the fly so that it can be pasted into |
e5f29d66 | 30 | ;; an org-mode buffer with hot links. It will also work for regions |
86fbb8ca | 31 | ;; in gnus buffers that have been washed with w3m. |
e5f29d66 CD |
32 | |
33 | ;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;; | |
34 | ;; | |
86fbb8ca | 35 | ;;; Acknowledgments: |
e5f29d66 CD |
36 | |
37 | ;; Richard Riley <rileyrgdev at googlemail dot com> | |
38 | ;; | |
33306645 CD |
39 | ;; The idea of transforming the HTML content with org-mode style is |
40 | ;; proposed by Richard, I'm just coding it. | |
e5f29d66 CD |
41 | ;; |
42 | ||
86fbb8ca CD |
43 | ;;; Code: |
44 | ||
e5f29d66 | 45 | (require 'org) |
e5f29d66 CD |
46 | |
47 | (defun org-w3m-copy-for-org-mode () | |
48 | "Copy current buffer content or active region with `org-mode' style links. | |
49 | This will encode `link-title' and `link-location' with | |
50 | `org-make-link-string', and insert the transformed test into the kill ring, | |
51 | so that it can be yanked into an Org-mode buffer with links working correctly." | |
52 | (interactive) | |
0bd48b37 CD |
53 | (let* ((regionp (org-region-active-p)) |
54 | (transform-start (point-min)) | |
55 | (transform-end (point-max)) | |
56 | return-content | |
57 | link-location link-title | |
58 | temp-position out-bound) | |
59 | (when regionp | |
60 | (setq transform-start (region-beginning)) | |
61 | (setq transform-end (region-end)) | |
62 | ;; Deactivate mark if current mark is activate. | |
63 | (if (fboundp 'deactivate-mark) (deactivate-mark))) | |
e5f29d66 CD |
64 | (message "Transforming links...") |
65 | (save-excursion | |
66 | (goto-char transform-start) | |
0bd48b37 CD |
67 | (while (and (not out-bound) ; still inside region to copy |
68 | (not (org-w3m-no-next-link-p))) ; no next link current buffer | |
69 | ;; store current point before jump next anchor | |
70 | (setq temp-position (point)) | |
71 | ;; move to next anchor when current point is not at anchor | |
86fbb8ca | 72 | (or (get-text-property (point) 'w3m-href-anchor) (org-w3m-get-next-link-start)) |
0bd48b37 CD |
73 | (if (<= (point) transform-end) ; if point is inside transform bound |
74 | (progn | |
75 | ;; get content between two links. | |
76 | (if (> (point) temp-position) | |
77 | (setq return-content (concat return-content | |
78 | (buffer-substring | |
79 | temp-position (point))))) | |
80 | ;; get link location at current point. | |
86fbb8ca | 81 | (setq link-location (get-text-property (point) 'w3m-href-anchor)) |
0bd48b37 CD |
82 | ;; get link title at current point. |
83 | (setq link-title (buffer-substring (point) | |
84 | (org-w3m-get-anchor-end))) | |
85 | ;; concat `org-mode' style url to `return-content'. | |
86 | (setq return-content (concat return-content | |
87 | (org-make-link-string | |
88 | link-location link-title)))) | |
89 | (goto-char temp-position) ; reset point before jump next anchor | |
90 | (setq out-bound t) ; for break out `while' loop | |
91 | )) | |
33306645 | 92 | ;; add the rest until end of the region to be copied |
e5f29d66 | 93 | (if (< (point) transform-end) |
0bd48b37 CD |
94 | (setq return-content |
95 | (concat return-content | |
96 | (buffer-substring (point) transform-end)))) | |
c8d0cf5c | 97 | (org-kill-new return-content) |
e5f29d66 CD |
98 | (message "Transforming links...done, use C-y to insert text into Org-mode file") |
99 | (message "Copy with link transformation complete.")))) | |
100 | ||
101 | (defun org-w3m-get-anchor-start () | |
0bd48b37 | 102 | "Move cursor to the start of current anchor. Return point." |
e5f29d66 CD |
103 | ;; get start position of anchor or current point |
104 | (goto-char (or (previous-single-property-change (point) 'w3m-anchor-sequence) | |
0bd48b37 | 105 | (point)))) |
e5f29d66 CD |
106 | |
107 | (defun org-w3m-get-anchor-end () | |
0bd48b37 | 108 | "Move cursor to the end of current anchor. Return point." |
e5f29d66 CD |
109 | ;; get end position of anchor or point |
110 | (goto-char (or (next-single-property-change (point) 'w3m-anchor-sequence) | |
111 | (point)))) | |
112 | ||
113 | (defun org-w3m-get-next-link-start () | |
0bd48b37 | 114 | "Move cursor to the start of next link. Return point." |
e5f29d66 CD |
115 | (catch 'reach |
116 | (while (next-single-property-change (point) 'w3m-anchor-sequence) | |
117 | ;; jump to next anchor | |
118 | (goto-char (next-single-property-change (point) 'w3m-anchor-sequence)) | |
86fbb8ca | 119 | (when (get-text-property (point) 'w3m-href-anchor) |
0bd48b37 CD |
120 | ;; return point when current is valid link |
121 | (throw 'reach nil)))) | |
e5f29d66 CD |
122 | (point)) |
123 | ||
124 | (defun org-w3m-get-prev-link-start () | |
8bfe682a | 125 | "Move cursor to the start of previous link. Return point." |
e5f29d66 CD |
126 | (catch 'reach |
127 | (while (previous-single-property-change (point) 'w3m-anchor-sequence) | |
128 | ;; jump to previous anchor | |
129 | (goto-char (previous-single-property-change (point) 'w3m-anchor-sequence)) | |
86fbb8ca | 130 | (when (get-text-property (point) 'w3m-href-anchor) |
0bd48b37 CD |
131 | ;; return point when current is valid link |
132 | (throw 'reach nil)))) | |
e5f29d66 CD |
133 | (point)) |
134 | ||
135 | (defun org-w3m-no-next-link-p () | |
0bd48b37 CD |
136 | "Whether there is no next link after the cursor. |
137 | Return t if there is no next link; otherwise, return nil." | |
e5f29d66 CD |
138 | (save-excursion |
139 | (equal (point) (org-w3m-get-next-link-start)))) | |
140 | ||
141 | (defun org-w3m-no-prev-link-p () | |
0bd48b37 CD |
142 | "Whether there is no previous link after the cursor. |
143 | Return t if there is no previous link; otherwise, return nil." | |
e5f29d66 CD |
144 | (save-excursion |
145 | (equal (point) (org-w3m-get-prev-link-start)))) | |
146 | ||
147 | ;; Install keys into the w3m keymap | |
148 | (defvar w3m-mode-map) | |
149 | (defvar w3m-minor-mode-map) | |
150 | (when (and (boundp 'w3m-mode-map) | |
0bd48b37 | 151 | (keymapp w3m-mode-map)) |
e5f29d66 CD |
152 | (define-key w3m-mode-map "\C-c\C-x\M-w" 'org-w3m-copy-for-org-mode) |
153 | (define-key w3m-mode-map "\C-c\C-x\C-w" 'org-w3m-copy-for-org-mode)) | |
154 | (when (and (boundp 'w3m-minor-mode-map) | |
0bd48b37 | 155 | (keymapp w3m-minor-mode-map)) |
e5f29d66 CD |
156 | (define-key w3m-minor-mode-map "\C-c\C-x\M-w" 'org-w3m-copy-for-org-mode) |
157 | (define-key w3m-minor-mode-map "\C-c\C-x\C-w" 'org-w3m-copy-for-org-mode)) | |
158 | (add-hook | |
159 | 'w3m-mode-hook | |
160 | (lambda () | |
161 | (define-key w3m-mode-map "\C-c\C-x\M-w" 'org-w3m-copy-for-org-mode) | |
162 | (define-key w3m-mode-map "\C-c\C-x\C-w" 'org-w3m-copy-for-org-mode))) | |
163 | (add-hook | |
164 | 'w3m-minor-mode-hook | |
165 | (lambda () | |
166 | (define-key w3m-minor-mode-map "\C-c\C-x\M-w" 'org-w3m-copy-for-org-mode) | |
167 | (define-key w3m-minor-mode-map "\C-c\C-x\C-w" 'org-w3m-copy-for-org-mode))) | |
168 | ||
169 | (provide 'org-w3m) | |
170 | ||
5b409b39 | 171 | |
e5f29d66 CD |
172 | |
173 | ;;; org-w3m.el ends here |