| 1 | ;;; iimage.el --- Inline image minor mode. |
| 2 | |
| 3 | ;; Copyright (C) 2004, 2005, 2006 Free Software Foundation, Inc. |
| 4 | |
| 5 | ;; Author: KOSEKI Yoshinori <kose@meadowy.org> |
| 6 | ;; Maintainer: KOSEKI Yoshinori <kose@meadowy.org> |
| 7 | ;; Keywords: multimedia |
| 8 | |
| 9 | ;; This file is part of GNU Emacs. |
| 10 | |
| 11 | ;; GNU Emacs 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 2, or (at your option) |
| 14 | ;; any later version. |
| 15 | |
| 16 | ;; GNU Emacs 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; see the file COPYING. If not, write to the |
| 23 | ;; Free Software Foundation, Inc., 51 Franklin Street, Fifth Floor, |
| 24 | ;; Boston, MA 02110-1301, USA. |
| 25 | |
| 26 | ;;; Commentary: |
| 27 | |
| 28 | ;; Iimage is a minor mode that displays images, when image-filename |
| 29 | ;; exists in the buffer. |
| 30 | ;; http://www.netlaputa.ne.jp/~kose/Emacs/iimage.html |
| 31 | ;; |
| 32 | ;; Add to your `~/.emacs': |
| 33 | ;; (autoload 'iimage-mode "iimage" "Support Inline image minor mode." t) |
| 34 | ;; (autoload 'turn-on-iimage-mode "iimage" "Turn on Inline image minor mode." t) |
| 35 | ;; |
| 36 | ;; ** Display images in *Info* buffer. |
| 37 | ;; |
| 38 | ;; (add-hook 'info-mode-hook 'turn-on-iimage-mode) |
| 39 | ;; |
| 40 | ;; .texinfo: @file{file://foo.png} |
| 41 | ;; .info: `file://foo.png' |
| 42 | ;; |
| 43 | ;; ** Display images in Wiki buffer. |
| 44 | ;; |
| 45 | ;; (add-hook 'wiki-mode-hook 'turn-on-iimage-mode) |
| 46 | ;; |
| 47 | ;; wiki-file: [[foo.png]] |
| 48 | |
| 49 | ;;; Code: |
| 50 | |
| 51 | (eval-when-compile |
| 52 | (require 'image-file)) |
| 53 | |
| 54 | (defgroup iimage nil |
| 55 | "Support for inline images." |
| 56 | :version "22.1" |
| 57 | :group 'image) |
| 58 | |
| 59 | (defconst iimage-version "1.1") |
| 60 | (defvar iimage-mode nil) |
| 61 | (defvar iimage-mode-map nil) |
| 62 | |
| 63 | ;; Set up key map. |
| 64 | (unless iimage-mode-map |
| 65 | (setq iimage-mode-map (make-sparse-keymap)) |
| 66 | (define-key iimage-mode-map "\C-l" 'iimage-recenter)) |
| 67 | |
| 68 | (defun iimage-recenter (&optional arg) |
| 69 | "Re-draw images and recenter." |
| 70 | (interactive "P") |
| 71 | (iimage-mode-buffer 0) |
| 72 | (iimage-mode-buffer 1) |
| 73 | (recenter arg)) |
| 74 | |
| 75 | (defvar iimage-mode-image-filename-regex |
| 76 | (concat "[-+./_0-9a-zA-Z]+\\." |
| 77 | (regexp-opt (nconc (mapcar #'upcase |
| 78 | image-file-name-extensions) |
| 79 | image-file-name-extensions) |
| 80 | t))) |
| 81 | |
| 82 | (defvar iimage-mode-image-regex-alist |
| 83 | `((,(concat "\\(`?file://\\|\\[\\[\\|<\\|`\\)?" |
| 84 | "\\(" iimage-mode-image-filename-regex "\\)" |
| 85 | "\\(\\]\\]\\|>\\|'\\)?") . 2)) |
| 86 | "*Alist of filename REGEXP vs NUM. |
| 87 | Each element looks like (REGEXP . NUM). |
| 88 | NUM specifies which parenthesized expression in the regexp. |
| 89 | |
| 90 | image filename regex exsamples: |
| 91 | file://foo.png |
| 92 | `file://foo.png' |
| 93 | \\[\\[foo.gif]] |
| 94 | <foo.png> |
| 95 | foo.JPG |
| 96 | ") |
| 97 | |
| 98 | (defvar iimage-mode-image-search-path nil |
| 99 | "*List of directories to search for image files for iimage-mode.") |
| 100 | |
| 101 | ;;;###autoload |
| 102 | (defun turn-on-iimage-mode () |
| 103 | "Unconditionally turn on iimage mode." |
| 104 | (interactive) |
| 105 | (iimage-mode 1)) |
| 106 | |
| 107 | (defun turn-off-iimage-mode () |
| 108 | "Unconditionally turn off iimage mode." |
| 109 | (interactive) |
| 110 | (iimage-mode 0)) |
| 111 | |
| 112 | ;; Emacs21.3 or earlier does not heve locate-file. |
| 113 | (if (fboundp 'locate-file) |
| 114 | (defalias 'iimage-locate-file 'locate-file) |
| 115 | (defun iimage-locate-file (filename path) |
| 116 | (locate-library filename t path))) |
| 117 | |
| 118 | (defun iimage-mode-buffer (arg) |
| 119 | "Display/Undisplay Images. |
| 120 | With numeric ARG, display the images if and only if ARG is positive." |
| 121 | (interactive) |
| 122 | (let ((ing (if (numberp arg) |
| 123 | (> arg 0) |
| 124 | iimage-mode)) |
| 125 | (modp (buffer-modified-p (current-buffer))) |
| 126 | file buffer-read-only) |
| 127 | (save-excursion |
| 128 | (goto-char (point-min)) |
| 129 | (dolist (pair iimage-mode-image-regex-alist) |
| 130 | (while (re-search-forward (car pair) nil t) |
| 131 | (if (and (setq file (match-string (cdr pair))) |
| 132 | (setq file (iimage-locate-file file |
| 133 | (cons default-directory |
| 134 | iimage-mode-image-search-path)))) |
| 135 | (if ing |
| 136 | (add-text-properties (match-beginning 0) (match-end 0) |
| 137 | (list 'display (create-image file))) |
| 138 | (remove-text-properties (match-beginning 0) (match-end 0) |
| 139 | '(display))))))) |
| 140 | (set-buffer-modified-p modp))) |
| 141 | |
| 142 | ;;;###autoload |
| 143 | (define-minor-mode iimage-mode |
| 144 | "Toggle inline image minor mode." |
| 145 | :group 'iimage :lighter " iImg" :keymap iimage-mode-map |
| 146 | (run-hooks 'iimage-mode-hook) |
| 147 | (iimage-mode-buffer iimage-mode)) |
| 148 | |
| 149 | (provide 'iimage) |
| 150 | |
| 151 | ;;; arch-tag: f6f8e29a-08f6-4a12-9496-51e67441ce65 |
| 152 | ;;; iimage.el ends here |