-;;; nnshimbun.el --- interfacing with web newspapers -*- coding: junet; -*-
+;;; nnshimbun.el --- interfacing with web newspapers
;; Authors: TSUCHIYA Masatoshi <tsuchiya@namazu.org>,
;; Akihiro Arisawa <ari@atesoft.advantest.co.jp>,
;; This module requires the Emacs-W3M and the external command W3M.
;; Visit the following pages for more information.
;;
-;; http://namazu.org/~tsuchiya/emacs-w3m/
+;; http://emacs-w3m.namazu.org/
;; http://ei5nazha.yz.yamagata-u.ac.jp/~aito/w3m/
;; If you would like to use this module in Gnus (not T-gnus), put this
;; file into the lisp/ directory in the Gnus source tree and run `make
;; install'. And then, put the following expression into your ~/.gnus.
-
-;; (autoload 'gnus-group-make-shimbun-group
-;; "nnshimbun" "Create a nnshimbun group." t)
+;;
+;; (autoload 'gnus-group-make-shimbun-group "nnshimbun" nil t)
;;; Definitions:
(require 'nnheader)
(require 'nnmail)
(require 'nnoo)
+(require 'gnus)
(require 'gnus-bcklg)
(require 'shimbun)
(require 'message)
"Reading Web Newspapers with Gnus."
:group 'gnus)
-(defcustom nnshimbun-keep-last-article t
- "*If non-nil, nnshimbun will never delete a group's last article.
-It can be marked expirable, so it will be deleted when it is no
-longer last."
- :group 'nnshimbun
- :type 'boolean)
+(defvar nnshimbun-group-parameters-custom
+ '(list :format "%v"
+ (checklist :inline t
+ (list :inline t :format "%v"
+ (const :format "" index-range)
+ (choice :tag "Index range"
+ :value all
+ (const all)
+ (const last)
+ (integer :tag "days")))
+ (list :inline t :format "%v"
+ (const :format "" prefetch-articles)
+ (choice :tag "Prefetch articles"
+ :value off
+ (const on)
+ (const off)))
+ (list :inline t :format "%v"
+ (const :format "" encapsulate-images)
+ (choice :tag "Encapsulate article"
+ :value on
+ (const on)
+ (const off)))
+ (list :inline t :format "%v"
+ (const :format "" expiry-wait)
+ (choice :tag "Expire wait"
+ :value never
+ (const never)
+ (const immediate)
+ (number :tag "days"))))
+ (repeat :inline t :tag "Others"
+ (list :inline t :format "%v"
+ (symbol :tag "Keyword")
+ (sexp :tag "Value"))))
+ "A type definition for customizing the nnshimbun group parameters.")
+
+;; The following definition provides the group parameter
+;; `nnshimbun-group-parameters', the user option
+;; `nnshimbun-group-parameters-alist' and the function
+;; `nnshimbun-find-group-parameters'.
+;; The group parameter `nnshimbun-group-parameters' will have a
+;; property list like the following:
+;;
+;; '(index-range all prefetch-articles off encapsulate-images on
+;; expiry-wait 6)
+
+(gnus-define-group-parameter
+ nnshimbun-group-parameters
+ :type list
+ :function nnshimbun-find-group-parameters
+ :function-document "\
+Return a nnshimbun GROUP's group parameters."
+ :variable nnshimbun-group-parameters-alist
+ :variable-default nil
+ :variable-document "\
+Alist of nnshimbun group parameters. Each element should be a cons of
+a group name regexp and a plist which consists of a keyword and a value
+pairs like the following:
+
+'(\"^nnshimbun\\\\+asahi:\" index-range all prefetch-articles off
+ encapsulate-images on expiry-wait 6)
+
+`index-range' specifies a range of header indices as described below:
+ all: Retrieve all header indices.
+ last: Retrieve the last header index.
+integer N: Retrieve N pages of header indices.
+
+`prefetch-articles' specifies whether to pre-fetch the unread articles
+when scanning the group.
+
+`encapsulate-images' specifies whether inline images in the shimbun
+article are encapsulated.
+
+`expiry-wait' is similar to the generic group parameter `expiry-wait',
+but it has a preference."
+ :variable-group nnshimbun
+ :variable-type `(repeat (cons :format "%v" (regexp :tag "Group name regexp"
+ :value "^nnshimbun\\+")
+ ,nnshimbun-group-parameters-custom))
+ :parameter-type nnshimbun-group-parameters-custom
+ :parameter-document "\
+Group parameters for the nnshimbun group.
+
+`Index range' specifies a range of header indices as described below:
+ all: Retrieve all header indices.
+ last: Retrieve the last header index.
+integer N: Retrieve N pages of header indices.
+
+`Prefetch articles' specifies whether to pre-fetch the unread articles
+when scanning the group.
+
+`Encapsulate article' specifies whether inline images in the shimbun
+article are encapsulated.
+
+`Expire wait' is similar to the generic group parameter `expiry-wait',
+but it has a preference.")
(defcustom nnshimbun-keep-unparsable-dated-articles t
"*If non-nil, nnshimbun will never delete articles whose NOV date is unparsable."
:type 'boolean)
-;; Define baekend
+;; Define backend
(gnus-declare-backend "nnshimbun" 'address)
(nnoo-declare nnshimbun)
(defvoo nnshimbun-nov-file-name ".overview")
-(defvoo nnshimbun-pre-fetch-article nil
- "*Non nil means that nnshimbun fetch unread articles when scanning groups.")
+(defvoo nnshimbun-pre-fetch-article 'off
+ "*If it is neither `off' nor nil, nnshimbun fetch unread articles when
+scanning groups. Note that this variable has just a default value for
+all the nnshimbun groups. You can specify the nnshimbun group
+parameter `prefecth-articles' for each nnshimbun group.")
+
+(defvoo nnshimbun-encapsulate-images shimbun-encapsulate-images
+ "*If it is neither `off' nor nil, inline images will be encapsulated in
+the articles. Note that this variable has just a default value for
+all the nnshimbun groups. You can specify the nnshimbun group
+parameter `encapsulate-images' for each nnshimbun group.")
(defvoo nnshimbun-index-range nil
- "*Range of indecis to detect new pages.")
+ "*Range of indices to detect new pages. Note that this variable has
+just a default value for all the nnshimbun groups. You can specify
+the nnshimbun group parameter `index-range' for each nnshimbun group.")
;; set by nnshimbun-possibly-change-group
(defvoo nnshimbun-buffer nil)
(put 'nnshimbun-backlog 'edebug-form-spec '(form body))
+;;; Group parameter
+(defmacro nnshimbun-find-parameter (group symbol &optional full-name-p)
+ "Return the value of a nnshimbun group parameter for GROUP which is
+associated with SYMBOL. If FULL-NAME-P is non-nil, it treats that
+GROUP has a full name."
+ (let ((name (if full-name-p
+ group
+ `(concat "nnshimbun+" (nnoo-current-server 'nnshimbun)
+ ":" ,group))))
+ (cond ((eq 'index-range (eval symbol))
+ `(or (plist-get (nnshimbun-find-group-parameters ,name)
+ 'index-range)
+ nnshimbun-index-range))
+ ((eq 'prefetch-articles (eval symbol))
+ `(let ((val (or (plist-get (nnshimbun-find-group-parameters ,name)
+ 'prefetch-articles)
+ nnshimbun-pre-fetch-article)))
+ (if (eq 'off val)
+ nil
+ val)))
+ ((eq 'encapsulate-images (eval symbol))
+ `(let ((val (or (plist-get (nnshimbun-find-group-parameters ,name)
+ 'encapsulate-images)
+ nnshimbun-encapsulate-images)))
+ (if (eq 'off val)
+ nil
+ val)))
+ ((eq 'expiry-wait (eval symbol))
+ (if full-name-p
+ `(or (plist-get (nnshimbun-find-group-parameters ,group)
+ 'expiry-wait)
+ (gnus-group-find-parameter ,group 'expiry-wait))
+ `(let ((name ,name))
+ (or (plist-get (nnshimbun-find-group-parameters name)
+ 'expiry-wait)
+ (gnus-group-find-parameter name 'expiry-wait)))))
+ (t
+ `(plist-get (nnshimbun-find-group-parameters ,name) ,symbol)))))
+
+
;;; Interface Functions
(nnoo-define-basics nnshimbun)
(eval-and-compile
(let ((Gnus-p
(eval-when-compile
- (let ((gnus (locate-library "gnus"))
- ;; Gnus has mailcap.el in the same directory of gnus.el.
- (mailcap (locate-library "mailcap")))
- (and gnus mailcap
- (string-equal (file-name-directory gnus)
- (file-name-directory mailcap)))))))
+ (let ((gnus (locate-library "gnus")))
+ (and gnus
+ ;; Gnus has mailcap.el in the same directory of gnus.el.
+ (file-exists-p (expand-file-name
+ "mailcap.el"
+ (file-name-directory gnus))))))))
(if Gnus-p
(progn
(defmacro nnshimbun-mail-header-subject (header)
(when header
(with-current-buffer (or to-buffer nntp-server-buffer)
(delete-region (point-min) (point-max))
- (shimbun-article nnshimbun-shimbun header)
- ;; Kludge! replace a date string in `gnus-newsgroup-data'
- ;; based on the newly retrieved article.
- (let ((x (gnus-summary-article-header article)))
- (when x
- (mail-header-set-date x (shimbun-header-date header))))
+ (let ((shimbun-encapsulate-images
+ (nnshimbun-find-parameter group 'encapsulate-images)))
+ (shimbun-article nnshimbun-shimbun header))
(when (> (buffer-size) 0)
+ ;; Kludge! replace a date string in `gnus-newsgroup-data'
+ ;; based on the newly retrieved article.
+ (let ((x (gnus-summary-article-header article)))
+ (when x
+ (mail-header-set-date x (shimbun-header-date header))))
(nnshimbun-replace-nov-entry group article header original-id)
(nnshimbun-backlog
(gnus-backlog-enter-article group article (current-buffer)))
(forward-line -1)
(setq end (ignore-errors (read (current-buffer)))
lines (count-lines (point-min) (point-max))))
- (nnheader-report 'nnshimbunw "Selected group %s" group)
+ (nnheader-report 'nnshimbun "Selected group %s" group)
(nnheader-insert "211 %d %d %d %s\n"
lines (or beg 0) (or end 0) group))))))
(nnheader-nov-delete-outside-range
(if fetch-old (max 1 (- (car articles) fetch-old))
(car articles))
- (and articles (nth (1- (length articles)) articles)))
+ (nth (1- (length articles)) articles))
t))))))
(with-current-buffer (nnshimbun-open-nov group)
(goto-char (point-max))
(forward-line -1)
- (let ((i (or (ignore-errors (read (current-buffer))) 0)))
- (dolist (header (shimbun-headers
- nnshimbun-shimbun
- (or (gnus-group-find-parameter
- (concat "nnshimbun+"
- (nnoo-current-server 'nnshimbun)
- ":" group)
- 'nnshimbun-index-range)
- nnshimbun-index-range)))
+ (let* ((i (or (ignore-errors (read (current-buffer))) 0))
+ (name (concat "nnshimbun+" (nnoo-current-server 'nnshimbun)
+ ":" group))
+ (pre-fetch (nnshimbun-find-parameter name 'prefetch-articles t)))
+ (dolist (header
+ (shimbun-headers
+ nnshimbun-shimbun
+ (nnshimbun-find-parameter name 'index-range t)))
(unless (nnshimbun-search-id group (shimbun-header-id header))
(goto-char (point-max))
(nnshimbun-insert-nov (setq i (1+ i)) header)
- (when nnshimbun-pre-fetch-article
+ (when pre-fetch
(nnshimbun-request-article-1 i group nil nnshimbun-buffer)))))
- (nnshimbun-write-nov group)))
+ (nnshimbun-write-nov group)))
(defun nnshimbun-replace-nov-entry (group article header &optional id)
(with-current-buffer (nnshimbun-open-nov group)
(let* ((expirable (copy-sequence articles))
(name (concat "nnshimbun+" server ":" group))
;; If the group's parameter `expiry-wait' is non-nil,
- ;; `nnmail-expiry-wait' is bound to that value, and
- ;; `nnmail-expiry-wait-function' is bound to nil.
- ;; See the source code of `gnus-summary-expire-articles'.
- ;; Prefer the shimbun's default to `nnmail-expiry-wait'
- ;; only when the group's parameter is nil.
- (nnmail-expiry-wait
- (if (gnus-group-find-parameter name 'expiry-wait)
- nnmail-expiry-wait
- (or (shimbun-article-expiration-days nnshimbun-shimbun)
- nnmail-expiry-wait)))
+ ;; the value of the option `nnmail-expiry-wait' will be
+ ;; bound to that value, and the value of the option
+ ;; `nnmail-expiry-wait-function' will be bound to nil.
+ ;; See the source code of `gnus-summary-expire-articles'
+ ;; how does it work. If the group's parameter is not
+ ;; specified by user, the shimbun's default value will
+ ;; be used.
+ (expiry-wait
+ (or (nnshimbun-find-parameter name 'expiry-wait t)
+ (shimbun-article-expiration-days nnshimbun-shimbun)))
+ (nnmail-expiry-wait (or expiry-wait nnmail-expiry-wait))
+ (nnmail-expiry-wait-function (if expiry-wait
+ nil
+ nnmail-expiry-wait-function))
article end time)
(save-excursion
(set-buffer buffer)
(setq article (pop expirable))
(when (and (nnheader-find-nov-line article)
(setq end (line-end-position))
- (not (and nnshimbun-keep-last-article
- (= (point-max) (1+ end)))))
+ (not (= (point-max) (1+ end))))
(setq time (and (search-forward "\t" end t)
(search-forward "\t" end t)
(search-forward "\t" end t)
(if (search-forward "\t" end t)
(1- (point))
end)))))
- (when (and (or (setq time (condition-case nil
- (apply 'encode-time time)
- (error nil)))
- ;; Inhibit expiration if there's no parsable
- ;; date and the following option is non-nil.
- (not nnshimbun-keep-unparsable-dated-articles))
- (nnmail-expired-article-p name time nil))
+ (when (cond ((setq time (condition-case nil
+ (apply 'encode-time time)
+ (error nil)))
+ (nnmail-expired-article-p name time nil))
+ (t
+ ;; Inhibit expiration if there's no parsable
+ ;; date and the following option is non-nil.
+ (not nnshimbun-keep-unparsable-dated-articles)))
(beginning-of-line)
(delete-region (point) (1+ end))
(setq articles (delq article articles)))))
;;; Command to create nnshimbun group
-(defvar gnus-group-shimbun-server-history nil)
+(defvar nnshimbun-server-history nil)
;;;###autoload
(defun gnus-group-make-shimbun-group ()
"Create a nnshimbun group."
(interactive)
- (require 'nnshimbun)
(let* ((minibuffer-setup-hook
(append minibuffer-setup-hook '(beginning-of-line)))
(alist
(directory-files d)))))
load-path)))
(server (completing-read
- "Shimbun address: "
+ "Shimbun address: "
alist nil t
- (or (car gnus-group-shimbun-server-history)
+ (or (car nnshimbun-server-history)
(caar alist))
- 'gnus-group-shimbun-server-history))
+ 'nnshimbun-server-history))
(groups)
(nnshimbun-pre-fetch-article))
(require (intern (concat "sb-" server)))
(provide 'nnshimbun)
-;;; nnshimbun.el ends here.
+
+;;; nnshimbun.el ends here