aboutsummaryrefslogtreecommitdiffstats
path: root/lisp/w3m.el
diff options
context:
space:
mode:
Diffstat (limited to 'lisp/w3m.el')
-rw-r--r--lisp/w3m.el1252
1 files changed, 0 insertions, 1252 deletions
diff --git a/lisp/w3m.el b/lisp/w3m.el
deleted file mode 100644
index e096746..0000000
--- a/lisp/w3m.el
+++ /dev/null
@@ -1,1252 +0,0 @@
-;;; -*- mode: Emacs-Lisp; coding: euc-japan -*-
-
-;; Copyright (C) 2000 TSUCHIYA Masatoshi <tsuchiya@pine.kuee.kyoto-u.ac.jp>
-
-;; Authors: TSUCHIYA Masatoshi <tsuchiya@pine.kuee.kyoto-u.ac.jp>,
-;; Shun-ichi GOTO <gotoh@taiyo.co.jp>,
-;; Satoru Takabayashi <satoru-t@is.aist-nara.ac.jp>
-;; Hideyuki SHIRAI <shirai@meadowy.org>
-;; Keywords: w3m, WWW, hypermedia
-
-;; w3m.el is free software; you can redistribute it and/or modify it
-;; under the terms of the GNU General Public License as published by
-;; the Free Software Foundation; either version 2 of the License, or
-;; (at your option) any later version.
-
-;; w3m.el is distributed in the hope that it will be useful, but
-;; WITHOUT ANY WARRANTY; without even the implied warranty of
-;; MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
-;; GNU General Public License for more details.
-
-;; You should have received a copy of the GNU General Public License
-;; along with w3m.el; if not, write to the Free Software Foundation,
-;; Inc., 59 Temple Place, Suite 330, Boston, MA 02111-1307 USA
-
-
-;;; Commentary:
-
-;; w3m.el is the interface program of w3m on Emacs. For more detail
-;; about w3m, see:
-;;
-;; http://ei5nazha.yz.yamagata-u.ac.jp/~aito/w3m/
-;;
-
-;;; How to install:
-
-;; Please put this file to appropriate directory, and if you want
-;; byte-compile it. And add following lisp expressions to your
-;; ~/.emacs.
-;;
-;; (autoload 'w3m "w3m" "Interface for w3m on Emacs." t)
-
-
-;;; Code:
-
-(or (and (boundp 'emacs-major-version)
- (>= emacs-major-version 20))
- (progn
- (require 'poe)
- (require 'pcustom)))
-
-(defgroup w3m nil
- "w3m - the web browser of choice."
- :group 'hypermedia)
-
-(defgroup w3m-face nil
- "Faces for w3m."
- :group 'w3m
- :prefix "w3m-")
-
-(defcustom w3m-command "w3m"
- "*Name of the executable file of w3m."
- :group 'w3m
- :type 'string)
-
-(defcustom w3m-command-arguments '("-e" "-halfdump" "-cols" col url)
- "*Arguments of w3m."
- :group 'w3m
- :type '(repeat (restricted-sexp :match-alternatives (stringp 'col 'url))))
-
-(defcustom w3m-viewer-command "xv"
- "*Name of the viewer."
- :group 'w3m
- :type 'string)
-
-(defcustom w3m-viewer-command-arguments '(file)
- "Arguments of viewer."
- :group 'w3m
- :type '(repeat (restricted-sexp :match-alternatives (stringp 'file))))
-
-(defcustom w3m-browser-command "netscape"
- "*Command name or function name of the browser."
- :group 'w3m
- :type '(choice (string :tag "Name of command")
- (function :tag "Name of function")))
-
-(defcustom w3m-browser-command-arguments '(url)
- "*Arguments of browser."
- :group 'w3m
- :type '(repeat (restricted-sexp :match-alternatives (stringp 'url))))
-
-(defcustom w3m-mailto-url-function nil
- "*Mailto handling Function."
- :group 'w3m
- :type 'function)
-
-(defcustom w3m-use-cygdrive t
- "*If non-nil, use /cygdrive/ rule when expand-file-name."
- :group 'w3m
- :type 'boolean)
-
-(defcustom w3m-default-save-dir "~/.w3m"
- "*Default directory for save file."
- :group 'w3m
- :type 'directory)
-
-(defcustom w3m-coding-system (if (boundp 'MULE) '*euc-japan* 'euc-japan)
- "*Coding system for w3m."
- :group 'w3m
- :type 'symbol)
-
-(defcustom w3m-bookmark-file (expand-file-name "~/.w3m/bookmark.html")
- "*Bookmark file of w3m."
- :group 'w3m
- :type 'file)
-
-(defcustom w3m-arrived-list-file (expand-file-name "~/.w3m/.arrived")
- "*Arrived URL file of w3m."
- :group 'w3m
- :type 'file)
-
-(defcustom w3m-arrived-ct-file (expand-file-name "~/.w3m/.ctcheck")
- "*Arrived URL's context-type file of w3m."
- :group 'w3m
- :type 'file)
-
-(defcustom w3m-arrived-file-cs
- (if (boundp 'MULE) '*euc-japan*unix 'euc-japan-unix)
- "*Coding system for arrived file."
- :group 'w3m
- :type 'symbol)
-
-(defcustom w3m-arrived-list-keep 500
- "*Arrived keep count of w3m."
- :group 'w3m
- :type 'integer)
-
-(defcustom w3m-keep-backlog 300
- "*Back log size of w3m."
- :group 'w3m
- :type 'integer)
-
-(defcustom w3m-fill-column (- (frame-width) 4)
- "*Fill column of w3m."
- :group 'w3m
- :type 'integer)
-
-(defcustom w3m-always-html-url-regex nil
- "*If URL is matched this regex, it handle always Text/Html."
- :group 'w3m
- :type 'string)
-
-(defface w3m-anchor-face
- '((((class color) (background light)) (:foreground "red" :underline t))
- (((class color) (background dark)) (:foreground "blue" :underline t))
- (t (:underline t)))
- "*Face to fontify anchors."
- :group 'w3m-face)
-
-(defface w3m-arrived-anchor-face
- '((((class color) (background light))
- (:foreground "navy" :underline t :bold t))
- (((class color) (background dark))
- (:foreground "blue" :underline t :bold t))
- (t (:underline t)))
- "*Face to fontify anchors, if arrived."
- :group 'w3m-face)
-
-(defface w3m-image-face
- '((((class color) (background light)) (:foreground "ForestGreen"))
- (((class color) (background dark)) (:foreground "PaleGreen"))
- (t (:underline t)))
- "*Face to fontify image alternate strings."
- :group 'w3m-face)
-
-(defcustom w3m-hook nil
- "*Hook run before w3m called."
- :group 'w3m
- :type 'hook)
-
-(defcustom w3m-mode-hook nil
- "*Hook run before w3m-mode called."
- :group 'w3m
- :type 'hook)
-
-(defcustom w3m-fontify-before-hook nil
- "*Hook run before w3m-fontify called."
- :group 'w3m
- :type 'hook)
-
-(defcustom w3m-fontify-after-hook nil
- "*Hook run after w3m-fontify called."
- :group 'w3m
- :type 'hook)
-
-(defcustom w3m-process-type 'start-process
- "*Function type for w3m execution."
- :group 'w3m
- :type '(choice (symbol :tag "call-process" call-process)
- (symbol :tag "start-process" start-process)))
-
-(defcustom w3m-process-connection-type t
- "*Process connection type for w3m execution."
- :group 'w3m
- :type 'boolean)
-
-(defvar w3m-current-url nil "URL of this buffer.")
-(defvar w3m-current-title nil "Title of this buffer.")
-(defvar w3m-url-history nil "History of URL.")
-
-(defvar w3m-backlog-buffer nil)
-(defvar w3m-backlog-articles nil)
-(defvar w3m-backlog-hashtb nil)
-(defvar w3m-input-url-history nil)
-
-(defvar w3m-arrived-anchor-list nil)
-(defvar w3m-arrived-url-ct nil)
-(defvar w3m-arrived-user-list nil)
-
-(defvar w3m-process nil)
-(defvar w3m-process-string nil)
-(defvar w3m-process-url nil)
-(defvar w3m-process-user nil)
-(defvar w3m-process-passwd nil)
-(defvar w3m-process-user-counter 0)
-
-(make-variable-buffer-local 'w3m-process)
-(make-variable-buffer-local 'w3m-process-string)
-(make-variable-buffer-local 'w3m-process-url)
-(make-variable-buffer-local 'w3m-process-user)
-(make-variable-buffer-local 'w3m-process-passwd)
-(make-variable-buffer-local 'w3m-process-user-counter)
-
-(defun w3m-arrived-list-load ()
- "Load arrived url list from 'w3m-arrived-list-file'
-and 'w3m-arrived-ct-file'."
- (when (file-readable-p w3m-arrived-ct-file)
- (with-temp-buffer
- (let ((file-coding-system-for-read w3m-arrived-file-cs)
- (coding-system-for-read w3m-arrived-file-cs))
- (insert-file-contents w3m-arrived-ct-file)
- (setq w3m-arrived-url-ct
- (condition-case nil
- (read (current-buffer))
- (error nil))))))
- (when (file-readable-p w3m-arrived-list-file)
- (with-temp-buffer
- (let ((file-coding-system-for-read w3m-arrived-file-cs)
- (coding-system-for-read w3m-arrived-file-cs))
- (insert-file-contents w3m-arrived-list-file)
- (setq w3m-arrived-anchor-list
- (condition-case nil
- (read (current-buffer))
- (error nil)))))))
-
-(defun w3m-arrived-list-save ()
- "Save arrived url list to 'w3m-arrived-list-file'
-and 'w3m-arrived-ct-file'."
- (when (> (length w3m-arrived-url-ct) w3m-arrived-list-keep)
- (setq w3m-arrived-url-ct
- (nreverse (nthcdr (- (length w3m-arrived-url-ct)
- w3m-arrived-list-keep)
- (nreverse w3m-arrived-url-ct)))))
- (when (and w3m-arrived-url-ct
- (file-writable-p w3m-arrived-ct-file))
- (with-temp-buffer
- (let ((file-coding-system w3m-arrived-file-cs)
- (coding-system-for-write w3m-arrived-file-cs))
- (prin1 w3m-arrived-url-ct (current-buffer))
- (princ "\n" (current-buffer))
- (write-region (point-min) (point-max)
- w3m-arrived-ct-file nil 'nomsg))))
- (when (> (length w3m-arrived-anchor-list) w3m-arrived-list-keep)
- (setq w3m-arrived-anchor-list
- (nreverse (nthcdr (- (length w3m-arrived-anchor-list)
- w3m-arrived-list-keep)
- (nreverse w3m-arrived-anchor-list)))))
- (when (and w3m-arrived-anchor-list
- (file-writable-p w3m-arrived-list-file))
- (with-temp-buffer
- (let ((file-coding-system w3m-arrived-file-cs)
- (coding-system-for-write w3m-arrived-file-cs))
- (prin1 w3m-arrived-anchor-list (current-buffer))
- (princ "\n" (current-buffer))
- (write-region (point-min) (point-max)
- w3m-arrived-list-file nil 'nomsg)
- (setq w3m-arrived-anchor-list nil)))))
-
-(defun w3m-arrived-list-add (&optional url)
- "Cons url to 'w3m-arrived-anchor-list'. CAR is newest."
- (setq url (or url w3m-current-url))
- (when (> (length url) 5) ;; ignore short
- (set-text-properties 0 (length url) nil url)
- (setq w3m-arrived-anchor-list
- (cons url (delete url w3m-arrived-anchor-list)))))
-
-(defun w3m-fontify ()
- "Fontify this buffer."
- (let ((case-fold-search t))
- (run-hooks 'w3m-fontify-before-hook)
- ;; Delete extra title tag.
- (let (start)
- (and (search-forward "<title>" nil t)
- (setq start (match-beginning 0))
- (search-forward "</title>" nil t)
- (delete-region start (match-end 0))))
- ;; Fontify bold characters.
- (goto-char (point-min))
- (while (search-forward "<b>" nil t)
- (let ((start (match-beginning 0)))
- (delete-region start (match-end 0))
- (when (search-forward "</b>" nil t)
- (delete-region (match-beginning 0) (match-end 0))
- (put-text-property start (match-beginning 0) 'face 'bold))))
- ;; Delete excessive `hseq' elements of anchor tags.
- (goto-char (point-min))
- (while (re-search-forward "<a\\( hseq=\"[-0-9]+\"\\)" nil t)
- (delete-region (match-beginning 1) (match-end 1)))
- ;; Re-ordering anchor elements.
- (goto-char (point-min))
- (let (href)
- (while (re-search-forward "<a\\([ \t\n]\\)[^>]+[ \t\n]href=\\(\"[^\"]*\"\\)" nil t)
- (setq href (buffer-substring (match-beginning 2) (match-end 2)))
- (delete-region (match-beginning 2) (match-end 2))
- (goto-char (match-beginning 1))
- (insert " href=" href)))
- ;; Fontify anchor tags.
- (goto-char (point-min))
- (while (re-search-forward
- "<a\\([ \t\n]+href=\"\\([^\"]*\\)\"\\)?\\([ \t\n]+name=\"\\([^\"]*\\)\"\\)?[^>]*>"
- nil t)
- (let ((url (match-string 2))
- (tag (match-string 4))
- (start (match-beginning 0))
- (end))
- (delete-region start (match-end 0))
- (cond (url
- (when (search-forward "</a>" nil t)
- (delete-region (setq end (match-beginning 0)) (match-end 0))
- (if (member (w3m-expand-url url w3m-current-url)
- w3m-arrived-anchor-list)
- (put-text-property start end 'face 'w3m-arrived-anchor-face)
- (put-text-property start end 'face 'w3m-anchor-face))
- (put-text-property start end 'w3m-href-anchor url))
- (when tag
- (put-text-property start end 'w3m-name-anchor tag)))
- (tag
- (when (re-search-forward "<\\|\n" nil t)
- (setq end (match-beginning 0))
- (put-text-property start end 'w3m-name-anchor tag))))))
- ;; Fontify image alternate strings.
- (goto-char (point-min))
- (while (re-search-forward "<img_alt src=\"\\([^\"]*\\)\">" nil t)
- (let ((src (match-string 1))
- (start (match-beginning 0))
- (end))
- (delete-region start (match-end 0))
- (when (search-forward "</img_alt>" nil t)
- (delete-region (setq end (match-beginning 0)) (match-end 0))
- (put-text-property start end 'face 'w3m-image-face)
- (put-text-property start end 'w3m-image src))))
- ;; Remove other markups.
- (goto-char (point-min))
- (while (re-search-forward "</?[A-z][^>]*>" nil t)
- (delete-region (match-beginning 0) (match-end 0)))
- ;; Decode escaped characters.
- (goto-char (point-min))
- (let (prop)
- (while (re-search-forward
- "&\\(\\(nbsp\\)\\|\\(gt\\)\\|\\(lt\\)\\|\\(amp\\)\\|\\(quot\\)\\|\\(apos\\)\\);"
- nil t)
- (setq prop (text-properties-at (match-beginning 0)))
- (delete-region (match-beginning 0) (match-end 0))
- (insert (if (match-beginning 2) " "
- (if (match-beginning 3) ">"
- (if (match-beginning 4) "<"
- (if (match-beginning 5) "&"
- (if (match-beginning 6) "\"" "'"))))))
- (if prop (add-text-properties (1- (point)) (point) prop))))
- (run-hooks 'w3m-fontify-after-hook)))
-
-
-(defun w3m-refontify-anchor (&optional buff)
- "Change face 'w3m-anchor-face to 'w3m-arrived-anchor-face."
- (save-excursion
- (and buff (set-buffer buff))
- (when (and (eq major-mode 'w3m-mode)
- (eq (get-text-property (point) 'face) 'w3m-anchor-face))
- (let* (start
- (end (next-single-property-change (point) 'face))
- (buffer-read-only nil))
- (when(and end
- (setq start (previous-single-property-change end 'face)))
- (put-text-property start end 'face 'w3m-arrived-anchor-face))
- (set-buffer-modified-p nil)))))
-
-
-(defun w3m-input-url (&optional prompt default)
- "Read a URL from the minibuffer, prompting with string PROMPT."
- (let (url candidates)
- (w3m-backlog-setup)
- (or w3m-input-url-history
- (setq w3m-input-url-history (or w3m-arrived-anchor-list
- (w3m-arrived-list-load))))
- (mapatoms (lambda (x)
- (setq candidates (cons (cons (symbol-name x) x) candidates)))
- w3m-backlog-hashtb)
- (setq url (completing-read (or prompt "URL: ")
- candidates nil nil
- default 'w3m-input-url-history default))
- ;; remove duplication
- (setq w3m-input-url-history (cons url (delete url w3m-input-url-history)))
- ;; return value
- url))
-
-
-(defun w3m-backlog-setup ()
- "Initialize backlog variables."
- (unless (and (bufferp w3m-backlog-buffer)
- (buffer-live-p w3m-backlog-buffer))
- (save-excursion
- (set-buffer (get-buffer-create " *w3m backlog*"))
- (buffer-disable-undo)
- (setq buffer-read-only t
- w3m-backlog-buffer (current-buffer))))
- (unless w3m-backlog-hashtb
- (setq w3m-backlog-hashtb (make-vector 1021 0))))
-
-(defun w3m-backlog-shutdown ()
- "Clear all backlog variables and buffers."
- (when (get-buffer w3m-backlog-buffer)
- (kill-buffer w3m-backlog-buffer))
- (setq w3m-backlog-hashtb nil
- w3m-backlog-articles nil))
-
-(defun w3m-backlog-enter (url buffer)
- (w3m-backlog-setup)
- (let ((ident (intern url w3m-backlog-hashtb)))
- (if (memq ident w3m-backlog-articles)
- () ; It's already kept.
- ;; Remove the oldest article, if necessary.
- (and (numberp w3m-keep-backlog)
- (>= (length w3m-backlog-articles) w3m-keep-backlog)
- (w3m-backlog-remove-oldest))
- ;; Insert the new article.
- (save-excursion
- (set-buffer w3m-backlog-buffer)
- (let (buffer-read-only)
- (goto-char (point-max))
- (unless (bolp) (insert "\n"))
- (let ((b (point)))
- (insert-buffer-substring buffer)
- ;; Tag the beginning of the article with the ident.
- (when (> (point-max) b)
- (put-text-property b (1+ b) 'w3m-backlog ident)
- (setq w3m-backlog-articles (cons ident w3m-backlog-articles)))
- ))))))
-
-(defun w3m-backlog-remove-oldest ()
- (save-excursion
- (set-buffer w3m-backlog-buffer)
- (goto-char (point-min))
- (if (zerop (buffer-size))
- () ; The buffer is empty.
- (let ((ident (get-text-property (point) 'w3m-backlog))
- buffer-read-only)
- ;; Remove the ident from the list of articles.
- (when ident
- (setq w3m-backlog-articles (delq ident w3m-backlog-articles)))
- ;; Delete the article itself.
- (delete-region (point)
- (next-single-property-change
- (1+ (point)) 'w3m-backlog nil (point-max)))))))
-
-(defun w3m-backlog-remove (url)
- "Remove data of URL from the backlog."
- (w3m-backlog-setup)
- (let ((ident (intern url w3m-backlog-hashtb))
- beg end)
- (when (memq ident w3m-backlog-articles)
- ;; It was in the backlog.
- (save-excursion
- (set-buffer w3m-backlog-buffer)
- (let (buffer-read-only)
- (when (setq beg (text-property-any
- (point-min) (point-max) 'w3m-backlog ident))
- ;; Find the end (i. e., the beginning of the next article).
- (setq end (next-single-property-change
- (1+ beg) 'w3m-backlog (current-buffer) (point-max)))
- (delete-region beg end)))
- (setq w3m-backlog-articles (delq ident w3m-backlog-articles))))))
-
-(defun w3m-backlog-request (url &optional buffer)
- (w3m-backlog-setup)
- (let ((ident (intern url w3m-backlog-hashtb)))
- (when (memq ident w3m-backlog-articles)
- ;; It was in the backlog.
- (let (beg end)
- (save-excursion
- (set-buffer w3m-backlog-buffer)
- (if (not (setq beg (text-property-any
- (point-min) (point-max) 'w3m-backlog ident)))
- ;; It wasn't in the backlog after all.
- (setq w3m-backlog-articles (delq ident w3m-backlog-articles))
- ;; Find the end (i. e., the beginning of the next article).
- (setq end
- (next-single-property-change
- (1+ beg) 'w3m-backlog (current-buffer) (point-max)))))
- (and beg
- end
- (save-excursion
- (and buffer (set-buffer buffer))
- (let (buffer-read-only)
- (insert-buffer-substring w3m-backlog-buffer beg end))
- t))))))
-
-(defun w3m-exec (url &optional buffer ct)
- "Download URL with w3m to the BUFFER.
-If BUFFER is nil, all data is placed to the current buffer.
-CT denotes content-type."
- (let ((cbuf (current-buffer)))
- (when (let ((args (copy-sequence w3m-command-arguments)))
- (cond
- ;; backlog exist.
- ((w3m-backlog-request url)
- (w3m-exec-w3m url args buffer) nil)
- ;; ange|efs-ftp
- ((and (string-match "^ftp://" url)
- (not (string-match "\\.s?html?$" url)))
- (w3m-exec-ftp url) t)
- ;; text/html
- ((or (string-match "\\.s?html?$\\|/$" url)
- (and w3m-always-html-url-regex
- (string-match w3m-always-html-url-regex url))
- (eq ct 'text/html))
- (w3m-exec-w3m url args buffer) nil)
- ;; text/*
- ((or (string-match "\\.\\(txt\\|el\\)$" url) (eq ct 'text))
- (setq args (cons "-dump" (delete "-halfdump" args)))
- (w3m-exec-w3m url args buffer) nil)
- ;; image/*
- ((eq ct 'image)
- (require 'w3)
- (w3-fetch url) t)
- ;; application/*, audio/*, etc...
- ((eq ct 'application)
- (require 'w3)
- (let ((mm-download-directory
- (file-name-as-directory w3m-default-save-dir)))
- (w3-download-url (w3m-expand-url url w3m-current-url))) t)
- ;; get context-type and w3-exec() call recursion .
- ((not ct)
- (w3m-exec url buffer (w3m-exec-w3m-ctcheck url)))
- ;; error
- (t (error "context-type check error."))))
- ;; if not exec w3m, return (current-buffer)
- cbuf)))
-
-
-(defun w3m-exec-w3m-ctcheck (url)
- (or (cdr (assoc url w3m-arrived-url-ct))
- (save-excursion
- (message "Dump header...")
- (set-buffer (get-buffer-create " *w3m ctcheck*"))
- (buffer-disable-undo)
- (delete-region (point-min) (point-max))
- (let ((args (copy-sequence w3m-command-arguments))
- (case-fold-search t)
- (ct 'error))
- (setq args (cons "-dump_head" (delete "-halfdump" args)))
- (w3m-exec-process url args)
- (message "Dump header... done.")
- (goto-char (point-min))
- (when (re-search-forward "^content-type: " nil t)
- (setq ct (if (looking-at "text/html") 'text/html
- (if (looking-at "text") 'text
- (if (looking-at "image") 'image
- 'application))))
- (setq w3m-arrived-url-ct (cons (cons url ct) w3m-arrived-url-ct))
- ct)))))
-
-(defun w3m-exec-w3m (url args buffer)
- (save-excursion
- (setq buffer-read-only nil)
- (if buffer (set-buffer buffer))
- (delete-region (point-min) (point-max))
- (unless (w3m-backlog-request url)
- (message "Loading page...")
- (w3m-exec-process url args)
- (message "Loading page... done."))
- (w3m-backlog-enter url (current-buffer))
- ;; Setting buffer local variables.
- (set (make-local-variable 'w3m-current-url) url)
- (goto-char (point-min))
- (let (title)
- (mapcar (lambda (regexp)
- (goto-char 1)
- (when (re-search-forward regexp nil t)
- (setq title (match-string 1))
- (delete-region (match-beginning 0) (match-end 0))))
- '("<title_alt[ \t\n]+title=\"\\([^\"]+\\)\">"
- "<title>\\([^<]\\)</title>"))
- (if (and (null title)
- (< 0 (length (file-name-nondirectory url))))
- (setq title (file-name-nondirectory url)))
- (set (make-local-variable 'w3m-current-title) (or title "<no-title>")))
- (set (make-local-variable 'w3m-url-history)
- (cons url w3m-url-history))
- (setq-default w3m-url-history
- (cons url (default-value 'w3m-url-history)))))
-
-
-(defun w3m-exec-ftp (url)
- (let ((ftp (w3m-convert-ftp-to-emacsen url))
- (file (file-name-nondirectory url)))
- (if (string-match "\\(\\.gz\\|\\.bz2\\|\\.zip\\|\\.lzh\\)$" file)
- (copy-file ftp (w3m-read-file-name nil nil file))
- (dired-other-window ftp))))
-
-
-(defun w3m-convert-ftp-to-emacsen (url)
- (or (and (string-match "^ftp://?\\([^/@]+@\\)?\\([^/]+\\)\\(/~/\\)?" url)
- (concat "/"
- (if (match-beginning 1)
- (substring url (match-beginning 1) (match-end 1))
- "anonymous@")
- (substring url (match-beginning 2) (match-end 2))
- ":"
- (substring url (match-end 2))))
- (error "URL is strange.")))
-
-(defun w3m-exec-process (url args)
- (save-excursion
- (let ((coding-system-for-read w3m-coding-system)
- (coding-system-for-write w3m-coding-system)
- (default-process-coding-system
- (cons w3m-coding-system w3m-coding-system))
- (process-connection-type w3m-process-connection-type))
- (if (eq w3m-process-type 'start-process)
- ;; start-process
- (unwind-protect nil
- (let ()
- ;; (pop-to-buffer (current-buffer))
- (setq w3m-process-url url)
- (setq w3m-process-string nil)
- (setq w3m-process-user nil)
- (setq w3m-process-passwd nil)
- (setq w3m-process-user-counter 2)
- (setq buffer-read-only t)
- (setq w3m-process
- (apply 'start-process w3m-command (current-buffer) w3m-command
- (mapcar (lambda (arg)
- (if (eq arg 'col)
- (format "%d" w3m-fill-column)
- (eval arg)))
- args)))
- (set-process-coding-system w3m-process w3m-coding-system)
- (set-process-filter w3m-process 'w3m-exec-filter)
- (set-process-sentinel w3m-process 'w3m-exec-sentinel)
- (process-kill-without-query w3m-process)
- (while w3m-process
- (sit-for 0.5)
- (discard-input)))
- (setq w3m-process nil)
- (setq w3m-process-url url)
- (setq w3m-process-string nil)
- (setq w3m-process-user nil)
- (setq w3m-process-passwd nil)
- (setq w3m-process-user-counter 0)
- (setq buffer-read-only nil))
- ;; call-process
- (apply 'call-process w3m-command nil t nil
- (mapcar (lambda (arg)
- (if (eq arg 'col)
- (format "%d" w3m-fill-column)
- (eval arg)))
- args))))))
-
-(defun w3m-exec-filter (process string)
- (if (bufferp (process-buffer process))
- (let ((obuf (buffer-name)))
- (unwind-protect
- (progn
- (set-buffer (process-buffer process))
- (let ((buffer-read-only nil)
- (case-fold-search nil)
- file input prompt)
- (goto-char (point-max))
- (setq w3m-process-string
- (concat w3m-process-string string))
- (while (string-match "\n" w3m-process-string)
- (insert (concat
- (substring w3m-process-string 0 (match-beginning 0))
- "\n"))
- (setq w3m-process-string
- (substring w3m-process-string (match-end 0))))
- (cond
- ;; username
- ((string-match "^Username: " w3m-process-string)
- (setq prompt (match-string 0 w3m-process-string))
- (setq w3m-process-string "")
- (setq w3m-process-user
- (or (nth 0 (w3m-exec-get-user w3m-process-url))
- (read-from-minibuffer prompt)))
- (process-send-string process (concat w3m-process-user "\n")))
- ;; passwd
- ((string-match "^Password: " w3m-process-string)
- (setq prompt (match-string 0 w3m-process-string))
- (setq w3m-process-string "")
- (setq w3m-process-passwd
- (or (nth 1 (w3m-exec-get-user w3m-process-url))
- (w3m-read-passwd prompt)))
- (process-send-string process (concat w3m-process-passwd "\n")))
- ;; save file
- ((string-match "Save file to:" w3m-process-string)
- (setq w3m-process-string "")
- (setq input (w3m-read-file-name nil nil w3m-process-url))
- (process-send-string process (concat input "\n"))
- (insert (format "Save to %s.\n" input)))
- ;; overwrite
- ((string-match "File exists. Overwrite? (y or n)" w3m-process-string)
- (setq w3m-process-string "")
- (condition-case nil
- (process-send-string process "y\n")
- (error nil)))
- ;; quit
- ((string-match " *Hit any key to quit w3m:" w3m-process-string)
- (condition-case nil
- (quit-process process)
- (error nil))))))
- (if (get-buffer obuf)
- (set-buffer obuf))))))
-
-(defun w3m-exec-get-user (url)
- (if (= w3m-process-user-counter 0)
- nil
- (let ((urllist w3m-arrived-user-list))
- (catch 'get
- (while urllist
- (when (string-match (concat "^"
- (regexp-quote (car (car urllist))))
- url)
- (setq w3m-process-user-counter (1- w3m-process-user-counter))
- (throw 'get (cdr (car urllist))))
- (setq urllist (cdr urllist)))))))
-
-(defun w3m-exec-sentinel (process event)
- (if (bufferp (process-buffer process))
- (let ((obuf (buffer-name)))
- (unwind-protect
- (progn
- (set-buffer (process-buffer process))
- (if (and w3m-process-url w3m-process-user)
- (setq w3m-arrived-user-list
- (cons
- (cons w3m-process-url
- (list w3m-process-user w3m-process-passwd))
- (delete (assoc w3m-process-url w3m-arrived-user-list)
- w3m-arrived-user-list))))
- (setq w3m-process-string nil)
- (setq w3m-process nil)
- (setq w3m-process-url nil)
- (setq w3m-process-user nil)
- (setq w3m-process-passwd nil))
- (if (get-buffer obuf)
- (set-buffer obuf))))))
-
-(defun w3m-read-file-name (&optional prompt dir default existing initial)
- (let* ((default (and default (file-name-nondirectory default)))
- (prompt (or prompt
- (if default (format "Save to (%s): " default) "Save to: ")))
- (initial (or initial default))
- (dir (file-name-as-directory (or dir w3m-default-save-dir)))
- (default-directory dir)
- (file (read-file-name prompt dir default existing initial)))
- (if (not (file-directory-p file))
- (setq w3m-default-save-dir
- (or (file-name-directory file) w3m-default-save-dir))
- (setq w3m-default-save-dir file)
- (if default
- (setq file (expand-file-name default file))))
- (expand-file-name file)))
-
-(defun w3m-read-passwd (prompt)
- (let ((inhibit-input-event-recording t))
- (if (fboundp 'read-passwd)
- (condition-case nil
- (read-passwd prompt)
- (error ""))
- (let ((pass "")
- (c 0)
- (echo-keystrokes 0)
- (ociea cursor-in-echo-area))
- (condition-case nil
- (progn
- (setq cursor-in-echo-area 1)
- (while (and (/= c ?\r) (/= c ?\n) (/= c ?\e) (/= c 7)) ;; ^G
- (message "%s%s"
- prompt
- (make-string (length pass) ?.))
- (setq c (read-char-exclusive))
- (cond
- ((char-equal c ?\C-u)
- (setq pass ""))
- ((or (char-equal c ?\b) (char-equal c ?\177)) ;; BS DELL
- ;; delete one character in the end
- (if (not (equal pass ""))
- (setq pass (substring pass 0 -1))))
- ((< c 32) ()) ;; control, just ignore
- (t
- (setq pass (concat pass (char-to-string c))))))
- (setq cursor-in-echo-area -1))
- (quit
- (setq cursor-in-echo-area ociea)
- (signal 'quit nil))
- (error
- ;; Probably not happen. Just align to the code above.
- (setq pass "")))
- (setq cursor-in-echo-area ociea)
- (message "")
- (sit-for 0)
- pass))))
-
-(defun w3m-search-name-anchor (name &optional quiet)
- (interactive "sName: ")
- (let ((pos (point-min)))
- (catch 'found
- (while (setq pos (next-single-property-change pos 'w3m-name-anchor))
- (when (equal name (get-text-property pos 'w3m-name-anchor))
- (goto-char pos)
- (throw 'found t))
- (setq pos (next-single-property-change pos 'w3m-name-anchor)))
- (unless quiet
- (message "Not found such name anchor."))
- nil)))
-
-
-(defun w3m-save-position (url)
- (if url
- (let ((ident (intern-soft url w3m-backlog-hashtb)))
- (when ident
- (set ident (cons (window-start) (point)))))))
-
-(defun w3m-restore-position (url)
- (let ((ident (intern-soft url w3m-backlog-hashtb)))
- (when (and ident (boundp ident))
- (set-window-start nil (car (symbol-value ident)))
- (goto-char (cdr (symbol-value ident))))))
-
-
-(defun w3m-view-previous-page (&optional arg)
- (interactive "p")
- (unless arg (setq arg 1))
- (let ((url (nth arg w3m-url-history)))
- (when url
- (let (w3m-url-history) (w3m-goto-url url))
- ;; restore last position
- (w3m-restore-position url)
- (setq w3m-url-history
- (nthcdr arg w3m-url-history)))))
-
-(defun w3m-view-previous-point ()
- (interactive)
- (w3m-restore-position w3m-current-url))
-
-(defun w3m-expand-url (url base)
- "Convert URL to absolute, and canonicalize it."
- (if (not base) (setq base ""))
- (if (string-match "^[^:]+://[^/]*$" base)
- (setq base (concat base "/")))
- (cond
- ;; URL is relative on BASE.
- ((string-match "^#" url)
- (concat base url))
- ;; URL has absolute spec.
- ((string-match "^[^:]+:" url)
- url)
- ((string-match "^/" url)
- (if (string-match "^\\([^:]+://[^/]*\\)/" base)
- (concat (match-string 1 base) url)
- url))
- (t
- (let ((server "") path)
- (if (string-match "^\\([^:]+://[^/]*\\)/" base)
- (setq server (match-string 1 base)
- base (substring base (match-end 1))))
- (setq path (expand-file-name url (file-name-directory base)))
- ;; remove drive (for Win32 platform)
- (if (string-match "^.:" path)
- (setq path (substring path (match-end 0))))
- (concat server path)))))
-
-
-(defun w3m-view-this-url (arg)
- "*View the URL of the link under point."
- (interactive "P")
- (let ((url (get-text-property (point) 'w3m-href-anchor)))
- (if url (w3m-goto-url (w3m-expand-url url w3m-current-url) arg))))
-
-(defun w3m-mouse-view-this-url (event)
- (interactive "e")
- (mouse-set-point event)
- (call-interactively (function w3m-view-this-url)))
-
-(defun w3m-view-image ()
- "*View the image under point."
- (interactive)
- (let ((file (get-text-property (point) 'w3m-image)))
- (if (not file)
- (message "No file at point.")
- (require 'w3)
- (w3-fetch (w3m-expand-url file w3m-current-url)))))
-
-
-(defun w3m-save-image ()
- "*Save the image under point to a file."
- (interactive)
- (let ((file (get-text-property (point) 'w3m-image)))
- (if (not file)
- (message "No file at point.")
- (require 'w3)
- (let ((mm-download-directory
- (file-name-as-directory w3m-default-save-dir)))
- (w3-download-url (w3m-expand-url file w3m-current-url))))))
-
-
-(defun w3m-view-current-url-with-external-browser ()
- "*View this URL."
- (interactive)
- (let ((buffer (get-buffer-create " *w3m-view*"))
- (url (get-text-property (point) 'w3m-href-anchor)))
- (if url
- (setq url (w3m-expand-url url w3m-current-url))
- (if (y-or-n-p (format "Browse <%s> ? " w3m-current-url))
- (setq url w3m-current-url)))
- (when url
- (message "Browse <%s>" url)
- (if (and (symbolp w3m-browser-command)
- (fboundp w3m-browser-command))
- (funcall w3m-browser-command url)
- (apply 'start-process
- "w3m-external-browser"
- buffer
- w3m-browser-command
- (mapcar (function eval)
- w3m-browser-command-arguments))))))
-
-
-(defun w3m-download-this-url ()
- "*Download the URL of the link under point to a file."
- (interactive)
- (let ((url (get-text-property (point) 'w3m-href-anchor)))
- (if (not url)
- (message "No URL at point.")
- (require 'w3)
- (let ((mm-download-directory
- (file-name-as-directory w3m-default-save-dir)))
- (w3-download-url (w3m-expand-url url w3m-current-url)))
- (w3m-refontify-anchor (current-buffer)))))
-
-
-(defun w3m-print-current-url ()
- "*Print the URL of current page and push it into kill-ring."
- (interactive)
- (kill-new w3m-current-url)
- (message "%s" w3m-current-url))
-
-(defun w3m-print-this-url ()
- "*Print the URL of the link under point."
- (interactive)
- (let ((url (get-text-property (point) 'w3m-href-anchor)))
- (if url
- (kill-new (setq url (w3m-expand-url url w3m-current-url))))
- (message "%s" (or url "Not found."))))
-
-
-(defun w3m-next-anchor (&optional arg)
- "*Move cursor to the next anchor."
- (interactive "p")
- (unless arg (setq arg 1))
- (if (< arg 0)
- ;; If ARG is negative.
- (w3m-previous-anchor (- arg))
- (when (get-text-property (point) 'w3m-href-anchor)
- (goto-char (next-single-property-change (point) 'w3m-href-anchor)))
- (while (and
- (> arg 0)
- (setq pos (next-single-property-change (point) 'w3m-href-anchor)))
- (goto-char pos)
- (unless (zerop (setq arg (1- arg)))
- (goto-char (next-single-property-change (point) 'w3m-href-anchor))))))
-
-
-(defun w3m-previous-anchor (&optional arg)
- "Move cursor to the previous anchor."
- (interactive "p")
- (unless arg (setq arg 1))
- (if (< arg 0)
- ;; If ARG is negative.
- (w3m-next-anchor (- arg))
- (when (get-text-property (point) 'w3m-href-anchor)
- (goto-char (previous-single-property-change (1+ (point)) 'w3m-href-anchor)))
- (while (and
- (> arg 0)
- (setq pos (previous-single-property-change (point) 'w3m-href-anchor)))
- (goto-char (previous-single-property-change pos 'w3m-href-anchor))
- (setq arg (1- arg)))))
-
-
-(defun w3m-expand-file-name (file)
- (setq file (expand-file-name file))
- (if (string-match "^\\(.\\):\\(.*\\)" file)
- (if w3m-use-cygdrive
- (concat "/cygdrive/" (match-string 1 file) (match-string 2 file))
- (concat "file://" (match-string 1 file) (match-string 2 file)))
- file))
-
-
-(defun w3m-view-bookmark ()
- (interactive)
- (if (file-readable-p w3m-bookmark-file)
- (w3m-goto-url (w3m-expand-file-name w3m-bookmark-file))))
-
-
-(defun w3m-copy-buffer (buf &optional newname and-pop) "\
-Create a twin copy of the current buffer.
-if NEWNAME is nil, it defaults to the current buffer's name.
-if AND-POP is non-nil, the new buffer is shown with `pop-to-buffer'."
- (interactive (list (current-buffer)
- (if current-prefix-arg (read-string "Name: "))
- t))
- (setq newname (or newname (buffer-name)))
- (if (string-match "<[0-9]+>\\'" newname)
- (setq newname (substring newname 0 (match-beginning 0))))
- (with-current-buffer buf
- (let ((ptmin (point-min))
- (ptmax (point-max))
- (content (save-restriction (widen) (buffer-string)))
- (mode major-mode)
- (lvars (buffer-local-variables))
- (new (generate-new-buffer (or newname (buffer-name)))))
- (with-current-buffer new
- ;;(erase-buffer)
- (insert content)
- (narrow-to-region ptmin ptmax)
- (funcall mode) ;still needed?? -sm
- (mapcar (lambda (v)
- (if (not (consp v)) (makunbound v)
- (condition-case () ;in case var is read-only
- (set (make-local-variable (car v)) (cdr v))
- (error nil))))
- lvars)
- (when and-pop (pop-to-buffer new))
- new))))
-
-
-(defvar w3m-mode-map nil)
-(unless w3m-mode-map
- (setq w3m-mode-map (make-keymap))
- (define-key w3m-mode-map " " 'scroll-up)
- (define-key w3m-mode-map "b" 'scroll-down)
- (define-key w3m-mode-map [backspace] 'scroll-down)
- (define-key w3m-mode-map [delete] 'scroll-down)
- (define-key w3m-mode-map "h" 'backward-char)
- (define-key w3m-mode-map "j" 'next-line)
- (define-key w3m-mode-map "k" 'previous-line)
- (define-key w3m-mode-map "l" 'forward-char)
- (define-key w3m-mode-map "J" (lambda () (interactive) (scroll-up 1)))
- (define-key w3m-mode-map "K" (lambda () (interactive) (scroll-up -1)))
- (define-key w3m-mode-map "G" 'goto-line)
- (define-key w3m-mode-map "\C-?" 'scroll-down)
- (define-key w3m-mode-map "\t" 'w3m-next-anchor)
- (define-key w3m-mode-map [down] 'w3m-next-anchor)
- (define-key w3m-mode-map "\M-\t" 'w3m-previous-anchor)
- (define-key w3m-mode-map [up] 'w3m-previous-anchor)
- (define-key w3m-mode-map "\C-m" 'w3m-view-this-url)
- (define-key w3m-mode-map [right] 'w3m-view-this-url)
- (if (featurep 'xemacs)
- (define-key w3m-mode-map [(button2)] 'w3m-mouse-view-this-url)
- (define-key w3m-mode-map [mouse-2] 'w3m-mouse-view-this-url))
- (define-key w3m-mode-map "\C-c\C-b" 'w3m-view-previous-point)
- (define-key w3m-mode-map [left] 'w3m-view-previous-page)
- (define-key w3m-mode-map "B" 'w3m-view-previous-page)
- (define-key w3m-mode-map "d" 'w3m-download-this-url)
- (define-key w3m-mode-map "u" 'w3m-print-this-url)
- (define-key w3m-mode-map "I" 'w3m-view-image)
- (define-key w3m-mode-map "\M-I" 'w3m-save-image)
- (define-key w3m-mode-map "c" 'w3m-print-current-url)
- (define-key w3m-mode-map "M" 'w3m-view-current-url-with-external-browser)
- (define-key w3m-mode-map "g" 'w3m)
- (define-key w3m-mode-map "U" 'w3m)
- (define-key w3m-mode-map "V" 'w3m)
- (define-key w3m-mode-map "v" 'w3m-view-bookmark)
- (define-key w3m-mode-map "q" 'w3m-quit)
- (define-key w3m-mode-map "Q" (lambda () (interactive) (w3m-quit t)))
- (define-key w3m-mode-map "\M-n" 'w3m-copy-buffer)
- (define-key w3m-mode-map "R" 'w3m-reload-this-page)
- (define-key w3m-mode-map "?" 'describe-mode)
- )
-
-
-(defun w3m-quit (&optional force)
- (interactive "P")
- (when (or force
- (y-or-n-p "Do you want to exit w3m? "))
- (kill-buffer (current-buffer))
- (w3m-arrived-list-save)
- (or (save-excursion
- ;; Check existing w3m buffers.
- (delq nil (mapcar (lambda (b)
- (set-buffer b)
- (eq major-mode 'w3m-mode))
- (buffer-list))))
- ;; If no w3m buffer exists, then destruct all cache.
- (w3m-backlog-shutdown))))
-
-
-(defun w3m-mode ()
- "\\<w3m-mode-map>
- Major mode to browsing w3m buffer.
-
-\\[w3m-view-this-url] View this url.
-\\[w3m-mouse-view-this-url] View this url.
-\\[w3m-reload-this-page] Reload this page.
-\\[w3m-next-anchor] Jump next anchor.
-\\[w3m-previous-anchor] Jump previous anchor.
-\\[w3m-view-previous-page] Back to previous page.
-
-\\[w3m-download-this-url] Download this url.
-\\[w3m-print-this-url] Print this url.
-\\[w3m-view-image] View image.
-\\[w3m-save-image] Save image.
-
-\\[w3m-print-current-url] Print current url.
-\\[w3m-view-current-url-with-external-browser] View current url with external browser.
-
-\\[scroll-up] Scroll up.
-\\[scroll-down] Scroll down.
-
-\\[next-line] Next line.
-\\[previous-line] Previous line.
-
-\\[forward-char] Forward char.
-\\[backward-char] Backward char.
-
-\\[goto-line] Jump to line.
-\\[w3m-view-previous-point] w3m-view-previous-point.
-
-\\[w3m] w3m.
-\\[w3m-view-bookmark] w3m-view-bookmark.
-\\[w3m-copy-buffer] w3m-copy-buffer.
-
-\\[w3m-quit] w3m-quit.
-\\[describe-mode] describe-mode.
-"
- (kill-all-local-variables)
- (buffer-disable-undo)
- (setq major-mode 'w3m-mode
- mode-name "w3m")
- (use-local-map w3m-mode-map)
- (run-hooks 'w3m-mode-hook))
-
-(defun w3m-mailto-url (url)
- (if (and (symbolp w3m-mailto-url-function)
- (fboundp w3m-mailto-url-function))
- (funcall w3m-mailto-url-function url)
- (let (comp)
- ;; Require `mail-user-agent' setting
- (if (not (and (boundp 'mail-user-agent)
- mail-user-agent
- (setq comp (intern-soft (concat (symbol-name mail-user-agent)
- "-compose")))
- (fboundp comp)))
- (error "You must specify valid `mail-user-agent'."))
- ;; Use rfc2368.el if exist.
- ;; rfc2368.el is written by Sen Nagata.
- ;; You can find it in "contrib" directory of Mew package
- ;; or in "utils" directory of Wanderlust package.
- (if (or (featurep 'rfc2368)
- (condition-case nil (require 'rfc2368) (error nil)))
- (let ((info (rfc2368-parse-mailto-url url)))
- (apply comp (mapcar (lambda (x)
- (cdr (assoc x info)))
- '("To" "Subject"))))
- ;; without rfc2368.el.
- (funcall comp (match-string 1 url))))))
-
-
-(defun w3m-goto-url (url &optional reload)
- "Retrieve URL and display it in this buffer."
- (let (name buff)
- (if reload
- (w3m-backlog-remove url))
- (cond
- ;; process mailto: protocol
- ((string-match "^mailto:\\(.*\\)" url)
- (w3m-mailto-url url))
- (t
- (when (string-match "#\\([^#]+\\)$" url)
- (setq name (match-string 1 url)
- url (substring url 0 (match-beginning 0))))
- (w3m-save-position w3m-current-url)
- (or w3m-arrived-anchor-list (w3m-arrived-list-load))
- (w3m-arrived-list-add url)
- (if (setq buff (w3m-exec url))
- ;; no w3m exec and return *w3m* buffer.
- (w3m-refontify-anchor buff)
- ;; w3m exec.
- (w3m-fontify)
- (setq buffer-read-only t)
- (set-buffer-modified-p nil)
- (or (and name (w3m-search-name-anchor name))
- (goto-char (point-min))))))))
-
-
-(defun w3m-reload-this-page ()
- "Reload current page without cache."
- (interactive)
- (setq w3m-url-history (cdr w3m-url-history))
- (w3m-goto-url w3m-current-url 'reload))
-
-
-(defun w3m (url &optional args)
- "Interface for w3m on Emacs."
- (interactive (list (w3m-input-url)))
- (set-buffer (get-buffer-create "*w3m*"))
- (or (eq major-mode 'w3m-mode)
- (w3m-mode))
- (setq mode-line-buffer-identification
- (list "%12b" " / " 'w3m-current-title))
- (if (string= url "")
- (w3m-view-bookmark)
- (w3m-goto-url url))
- (switch-to-buffer (current-buffer))
- (run-hooks 'w3m-hook))
-
-
-(defun w3m-browse-url (url &optional new-window)
- "w3m interface function for browse-url.el."
- (interactive
- (progn
- (require 'browse-url)
- (browse-url-interactive-arg "w3m URL: ")))
- (if new-window (split-window))
- (w3m url))
-
-(defun w3m-find-file (file)
- "w3m Interface function for local file."
- (interactive "fFilename: ")
- (w3m (w3m-expand-file-name file)))
-
-(provide 'w3m)
-;;; w3m.el ends here.