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