Mercurial > emacs
annotate lisp/org/org-w3m.el @ 101061:d7b4cff6207d
Remove gs.elc dependency.
author | Chong Yidong <cyd@stupidchicken.com> |
---|---|
date | Sat, 10 Jan 2009 13:07:48 +0000 |
parents | a9dc0e7c3f2b |
children | 36abe982e7cd |
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 | |
100605
0d3c634e0bd9
2008-12-20 Carsten Dominik <carsten.dominik@gmail.com>
Carsten Dominik <dominik@science.uva.nl>
parents:
100458
diff
changeset
|
8 ;; Version: 6.16 |
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) | |
52 (let ((regionp (org-region-active-p)) | |
53 transform-start transform-end | |
54 return-content | |
55 link-location link-title | |
56 temp-position out-bound) | |
57 (setq transform-start (if regionp (region-beginning) (point-min)) | |
58 transform-end (if regionp (region-end) (point-max))) | |
59 (message "Transforming links...") | |
60 (save-excursion | |
61 (goto-char transform-start) | |
62 (while (and (not out-bound) ; still inside region to copy | |
63 (not (org-w3m-no-next-link-p))) ; no next link current buffer | |
64 ;; store current point before jump next anchor | |
65 (setq temp-position (point)) | |
66 ;; move to next anchor when current point is not at anchor | |
67 (or (w3m-anchor (point)) (org-w3m-get-next-link-start)) | |
68 (if (<= (point) transform-end) ; if point is inside transform bound | |
69 (progn | |
70 ;; get content between two links. | |
71 (if (> (point) temp-position) | |
72 (setq return-content (concat return-content | |
73 (buffer-substring | |
74 temp-position (point))))) | |
75 ;; get link location at current point. | |
76 (setq link-location (w3m-anchor (point))) | |
77 ;; get link title at current point. | |
78 (setq link-title (buffer-substring (point) | |
79 (org-w3m-get-anchor-end))) | |
80 ;; concat `org-mode' style url to `return-content'. | |
81 (setq return-content (concat return-content | |
82 (org-make-link-string | |
83 link-location link-title)))) | |
84 (goto-char temp-position) ; reset point before jump next anchor | |
100458
ba23e35d3eaf
2008-12-17 Carsten Dominik <carsten.dominik@gmail.com>
Carsten Dominik <dominik@science.uva.nl>
parents:
100448
diff
changeset
|
85 (setq out-bound t) ; for break out `while' loop |
100268 | 86 )) |
100458
ba23e35d3eaf
2008-12-17 Carsten Dominik <carsten.dominik@gmail.com>
Carsten Dominik <dominik@science.uva.nl>
parents:
100448
diff
changeset
|
87 ;; add the rest until end of the region to be copied |
100268 | 88 (if (< (point) transform-end) |
89 (setq return-content | |
90 (concat return-content | |
91 (buffer-substring (point) transform-end)))) | |
92 (kill-new return-content) | |
93 (message "Transforming links...done, use C-y to insert text into Org-mode file") | |
94 (message "Copy with link transformation complete.")))) | |
95 | |
96 (defun org-w3m-get-anchor-start () | |
97 "Move to and return `point' for the start of the current anchor." | |
98 ;; get start position of anchor or current point | |
99 (goto-char (or (previous-single-property-change (point) 'w3m-anchor-sequence) | |
100 (point)))) | |
101 | |
102 (defun org-w3m-get-anchor-end () | |
103 "Move and return `point' after the end of current anchor." | |
104 ;; get end position of anchor or point | |
105 (goto-char (or (next-single-property-change (point) 'w3m-anchor-sequence) | |
106 (point)))) | |
107 | |
108 (defun org-w3m-get-next-link-start () | |
109 "Move and return `point' for that start of the current link." | |
110 (catch 'reach | |
111 (while (next-single-property-change (point) 'w3m-anchor-sequence) | |
112 ;; jump to next anchor | |
113 (goto-char (next-single-property-change (point) 'w3m-anchor-sequence)) | |
114 (when (w3m-anchor (point)) | |
115 ;; return point when current is valid link | |
116 (throw 'reach nil)))) | |
117 (point)) | |
118 | |
119 (defun org-w3m-get-prev-link-start () | |
120 "Move and return `point' for that end of the current link." | |
121 (catch 'reach | |
122 (while (previous-single-property-change (point) 'w3m-anchor-sequence) | |
123 ;; jump to previous anchor | |
124 (goto-char (previous-single-property-change (point) 'w3m-anchor-sequence)) | |
125 (when (w3m-anchor (point)) | |
126 ;; return point when current is valid link | |
127 (throw 'reach nil)))) | |
128 (point)) | |
129 | |
130 (defun org-w3m-no-next-link-p () | |
131 "Return t if no next link after cursor. | |
132 Otherwise, return nil." | |
133 (save-excursion | |
134 (equal (point) (org-w3m-get-next-link-start)))) | |
135 | |
136 (defun org-w3m-no-prev-link-p () | |
100458
ba23e35d3eaf
2008-12-17 Carsten Dominik <carsten.dominik@gmail.com>
Carsten Dominik <dominik@science.uva.nl>
parents:
100448
diff
changeset
|
137 "Return t if no previous link after cursor. |
100268 | 138 Otherwise, return nil." |
139 (save-excursion | |
140 (equal (point) (org-w3m-get-prev-link-start)))) | |
141 | |
142 ;; Install keys into the w3m keymap | |
143 (defvar w3m-mode-map) | |
144 (defvar w3m-minor-mode-map) | |
145 (when (and (boundp 'w3m-mode-map) | |
146 (keymapp w3m-mode-map)) | |
147 (define-key w3m-mode-map "\C-c\C-x\M-w" 'org-w3m-copy-for-org-mode) | |
148 (define-key w3m-mode-map "\C-c\C-x\C-w" 'org-w3m-copy-for-org-mode)) | |
149 (when (and (boundp 'w3m-minor-mode-map) | |
150 (keymapp w3m-minor-mode-map)) | |
151 (define-key w3m-minor-mode-map "\C-c\C-x\M-w" 'org-w3m-copy-for-org-mode) | |
152 (define-key w3m-minor-mode-map "\C-c\C-x\C-w" 'org-w3m-copy-for-org-mode)) | |
153 (add-hook | |
154 'w3m-mode-hook | |
155 (lambda () | |
156 (define-key w3m-mode-map "\C-c\C-x\M-w" 'org-w3m-copy-for-org-mode) | |
157 (define-key w3m-mode-map "\C-c\C-x\C-w" 'org-w3m-copy-for-org-mode))) | |
158 (add-hook | |
159 'w3m-minor-mode-hook | |
160 (lambda () | |
161 (define-key w3m-minor-mode-map "\C-c\C-x\M-w" 'org-w3m-copy-for-org-mode) | |
162 (define-key w3m-minor-mode-map "\C-c\C-x\C-w" 'org-w3m-copy-for-org-mode))) | |
163 | |
164 (provide 'org-w3m) | |
165 | |
166 ;; arch-tag: 851d7447-488d-49f0-a14d-46c092e84352 | |
167 | |
168 ;;; org-w3m.el ends here |