diff options
| author | Carsten Dominik | 2008-12-07 18:37:17 +0000 |
|---|---|---|
| committer | Carsten Dominik | 2008-12-07 18:37:17 +0000 |
| commit | e5f29d662de4a262f839332107bd683a2fc99932 (patch) | |
| tree | 4f1986b807869eb0cf117d3daf78cb6273b2d3cd | |
| parent | ff4be292b376c5a753c2da6a33ea291464820fae (diff) | |
| download | emacs-e5f29d662de4a262f839332107bd683a2fc99932.tar.gz emacs-e5f29d662de4a262f839332107bd683a2fc99932.zip | |
New file org-w3m.el.
| -rw-r--r-- | lisp/org/org-w3m.el | 168 |
1 files changed, 168 insertions, 0 deletions
diff --git a/lisp/org/org-w3m.el b/lisp/org/org-w3m.el new file mode 100644 index 00000000000..9803b338eae --- /dev/null +++ b/lisp/org/org-w3m.el | |||
| @@ -0,0 +1,168 @@ | |||
| 1 | ;;; org-w3m.el --- Support from copy and paste from w3m to Org-mode | ||
| 2 | |||
| 3 | ;; Copyright (C) 2008 Free Software Foundation, Inc. | ||
| 4 | |||
| 5 | ;; Author: Andy Stewart <lazycat dot manatee at gmail dot com> | ||
| 6 | ;; Keywords: outlines, hypermedia, calendar, wp | ||
| 7 | ;; Homepage: http://orgmode.org | ||
| 8 | ;; Version: 6.14 | ||
| 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 | ;; | ||
| 35 | ;;; Acknowledgments: | ||
| 36 | |||
| 37 | ;; Richard Riley <rileyrgdev at googlemail dot com> | ||
| 38 | ;; | ||
| 39 | ;; The idea that transfomring the HTML content with org-mode style is | ||
| 40 | ;; proposed by Richard, i'm just code it. | ||
| 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 | ||
| 85 | (setq out-bound t) ; for break out `while' loop | ||
| 86 | )) | ||
| 87 | ;; add the rest until en end of the region to be copied | ||
| 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 () | ||
| 137 | "Return t if no prevoius link after cursor. | ||
| 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 | ||