+++ /dev/null
-;;; nnshimbun.el --- interfacing with web newspapers
-
-;; Copyright (C) 2000,2001,2002 TSUCHIYA Masatoshi <tsuchiya@namazu.org>
-
-;; Authors: TSUCHIYA Masatoshi <tsuchiya@namazu.org>,
-;; Akihiro Arisawa <ari@atesoft.advantest.co.jp>,
-;; Katsumi Yamaoka <yamaoka@jpl.org>,
-;; Yuuichi Teranishi <teranisi@gohome.org>
-;; Keywords: news
-
-;; This file is a part of Semi-Gnus.
-
-;; This program 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, or (at your option)
-;; any later version.
-
-;; This program 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 this program; if not, you can either send email to this
-;; program's maintainer or write to: The Free Software Foundation,
-;; Inc.; 59 Temple Place, Suite 330; Boston, MA 02111-1307, USA.
-
-;;; Commentary:
-
-;; Gnus (or gnus) backend to read newspapers on the World Wide Web.
-;; This module requires the emacs-w3m and the external command w3m.
-;; Visit the following pages for more information.
-;;
-;; http://emacs-w3m.namazu.org/
-;; http://w3m.sourceforge.net/
-
-;; 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" nil t)
-
-
-;;; Definitions:
-
-(eval-when-compile (require 'cl))
-(require 'nnoo)
-(require 'nnheader)
-(require 'nnmail)
-(require 'gnus-bcklg)
-(require 'shimbun)
-
-
-;; Customize variables
-(defgroup nnshimbun nil
- "Reading Web Newspapers with Gnus."
- :group 'gnus)
-
-(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)
-
-(unless (fboundp 'gnus-define-group-parameter)
- (defmacro gnus-define-group-parameter (&rest args) nil)
- (defun nnshimbun-find-group-parameters (name)
- "Return a nnshimbun GROUP's group parameters."
- (when name
- (or (gnus-group-find-parameter name 'nnshimbun-group-parameters t)
- (assoc-default name
- (and (boundp 'nnshimbun-group-parameters-alist)
- (symbol-value 'nnshimbun-group-parameters-alist))
- (function string-match))))))
-
-(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."
- :group 'nnshimbun
- :type 'boolean)
-
-
-;; Define backend
-(gnus-declare-backend "nnshimbun" 'address)
-(nnoo-declare nnshimbun)
-
-(defvoo nnshimbun-directory (nnheader-concat gnus-directory "shimbun/")
- "Where nnshimbun will save its files.")
-
-(defvoo nnshimbun-nov-is-evil nil
- "*Non-nil means that nnshimbun will never retrieve NOV headers.")
-
-(defvoo nnshimbun-nov-file-name ".overview")
-
-(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 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-open-server
-(defvoo nnshimbun-shimbun nil)
-
-(defvoo nnshimbun-status-string "")
-(defvoo nnshimbun-keep-backlog 300)
-(defvoo nnshimbun-backlog-articles nil)
-(defvoo nnshimbun-backlog-hashtb nil)
-
-
-;;; backlog
-(defmacro nnshimbun-current-server ()
- '(nnoo-current-server 'nnshimbun))
-
-(defmacro nnshimbun-server-directory (&optional server)
- `(nnmail-group-pathname ,(or server '(nnshimbun-current-server))
- nnshimbun-directory))
-
-(defmacro nnshimbun-current-group ()
- '(shimbun-current-group-internal nnshimbun-shimbun))
-
-(defmacro nnshimbun-current-directory (&optional group)
- `(nnmail-group-pathname ,(or group '(nnshimbun-current-group))
- (nnshimbun-server-directory)))
-
-(defmacro nnshimbun-backlog (&rest form)
- `(let ((gnus-keep-backlog nnshimbun-keep-backlog)
- (gnus-backlog-buffer
- (format " *nnshimbun backlog %s*" (nnshimbun-current-server)))
- (gnus-backlog-articles nnshimbun-backlog-articles)
- (gnus-backlog-hashtb nnshimbun-backlog-hashtb))
- (unwind-protect
- (progn ,@form)
- (setq nnshimbun-backlog-articles gnus-backlog-articles
- nnshimbun-backlog-hashtb gnus-backlog-hashtb))))
-(put 'nnshimbun-backlog 'lisp-indent-function 0)
-(put 'nnshimbun-backlog 'edebug-form-spec t)
-
-
-;;; 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+" (nnshimbun-current-server) ":" ,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)
-
-(defun nnshimbun-possibly-change-group (group &optional server)
- (when (if server
- (nnshimbun-open-server server)
- nnshimbun-shimbun)
- (or (not group)
- (when (condition-case err
- (shimbun-open-group nnshimbun-shimbun group)
- (error
- (nnheader-report 'nnshimbun "%s" (error-message-string err))))
- (let ((file-name-coding-system nnmail-pathname-coding-system)
- (pathname-coding-system nnmail-pathname-coding-system)
- (dir (nnshimbun-current-directory group)))
- (or (file-directory-p dir)
- (ignore-errors
- (make-directory dir)
- (file-directory-p dir))
- (nnheader-report 'nnshimbun
- (if (file-exists-p dir)
- "Not a directory: %s"
- "Couldn't create directory: %s")
- dir)))))))
-
-(deffoo nnshimbun-open-server (server &optional defs)
- (or (nnshimbun-server-opened server)
- (let ((file-name-coding-system nnmail-pathname-coding-system)
- (pathname-coding-system nnmail-pathname-coding-system)
- (shimbun))
- (when (condition-case err
- (setq shimbun
- (shimbun-open server
- (luna-make-entity 'shimbun-gnus-mua)))
- (error
- (nnheader-report 'nnshimbun "%s" (error-message-string err))))
- (nnoo-change-server 'nnshimbun server
- (cons (list 'nnshimbun-shimbun shimbun) defs))
- (when (or (file-directory-p nnshimbun-directory)
- (ignore-errors
- (make-directory nnshimbun-directory)
- (file-directory-p nnshimbun-directory))
- (progn
- (nnshimbun-close-server)
- (nnheader-report 'nnshimbun
- (if (file-exists-p nnshimbun-directory)
- "Not a directory: %s"
- "Couldn't create directory: %s")
- nnshimbun-directory)))
- (let ((dir (nnshimbun-server-directory server)))
- (when (or (file-directory-p dir)
- (ignore-errors
- (make-directory dir)
- (file-directory-p dir))
- (progn
- (nnshimbun-close-server)
- (nnheader-report 'nnshimbun
- (if (file-exists-p dir)
- "Not a directory: %s"
- "Couldn't create directory: %s")
- dir)))
- (nnheader-report 'nnshimbun
- "Opened server %s using directory %s"
- server dir)
- t)))))))
-
-(deffoo nnshimbun-close-server (&optional server)
- (when (nnshimbun-server-opened server)
- (when nnshimbun-shimbun
- (dolist (group (shimbun-groups nnshimbun-shimbun))
- (nnshimbun-write-nov group t))
- (shimbun-close nnshimbun-shimbun)))
- (nnshimbun-backlog (gnus-backlog-shutdown))
- (nnoo-close-server 'nnshimbun server)
- t)
-
-(eval-when-compile
- (require 'gnus-sum)) ;; For the macro `gnus-summary-article-header'.
-
-(defun nnshimbun-request-article-1 (article &optional group server to-buffer)
- (if (nnshimbun-backlog
- (gnus-backlog-request-article
- group article (or to-buffer nntp-server-buffer)))
- (cons group article)
- (let* ((header (with-current-buffer (nnshimbun-open-nov group)
- (and (nnheader-find-nov-line article)
- (nnshimbun-parse-nov))))
- (original-id (shimbun-header-id header)))
- (when header
- (with-current-buffer (or to-buffer nntp-server-buffer)
- (erase-buffer)
- (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
- ;; Trick to suppress byte compile of mail-header-set-date(),
- ;; in order to keep compatibility between T-gnus and Oort Gnus.
- (eval
- `(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)))
- (nnheader-report 'nnshimbun "Article %s retrieved"
- (shimbun-header-id header))
- (cons group article)))))))
-
-(deffoo nnshimbun-request-article (article &optional group server to-buffer)
- (when (nnshimbun-possibly-change-group group server)
- (if (or (integerp article)
- (when (stringp article)
- (setq article
- (or (when (or group (setq group (nnshimbun-current-group)))
- (nnshimbun-search-id group article))
- (catch 'found
- (dolist (x (shimbun-groups nnshimbun-shimbun))
- (and (nnshimbun-possibly-change-group x)
- (setq x (nnshimbun-search-id x article))
- (throw 'found x))))))))
- (nnshimbun-request-article-1 article group server to-buffer)
- (nnheader-report 'nnshimbun "Couldn't retrieve article: %s"
- (prin1-to-string article)))))
-
-(deffoo nnshimbun-request-group (group &optional server dont-check)
- (if (not (nnshimbun-possibly-change-group group server))
- (nnheader-report 'nnshimbun "Invalid group (no such directory)")
- (let (beg end lines)
- (with-current-buffer (nnshimbun-open-nov group)
- (goto-char (point-min))
- (setq beg (ignore-errors (read (current-buffer))))
- (goto-char (point-max))
- (forward-line -1)
- (setq end (ignore-errors (read (current-buffer)))
- lines (count-lines (point-min) (point-max))))
- (nnheader-report 'nnshimbun "Selected group %s" group)
- (nnheader-insert "211 %d %d %d %s\n"
- lines (or beg 0) (or end 0) group))))
-
-(deffoo nnshimbun-request-scan (&optional group server)
- (when (nnshimbun-possibly-change-group nil server)
- (if group
- (nnshimbun-generate-nov-database group)
- (dolist (group (shimbun-groups nnshimbun-shimbun))
- (nnshimbun-generate-nov-database group)))))
-
-(deffoo nnshimbun-close-group (group &optional server)
- (nnshimbun-write-nov group)
- t)
-
-(deffoo nnshimbun-request-list (&optional server)
- (when (nnshimbun-possibly-change-group nil server)
- (with-current-buffer nntp-server-buffer
- (erase-buffer)
- (dolist (group (shimbun-groups nnshimbun-shimbun))
- (when (nnshimbun-possibly-change-group group)
- (let (beg end)
- (with-current-buffer (nnshimbun-open-nov group)
- (goto-char (point-min))
- (setq beg (ignore-errors (read (current-buffer))))
- (goto-char (point-max))
- (forward-line -1)
- (setq end (ignore-errors (read (current-buffer)))))
- (insert (format "%s %d %d n\n" group (or end 0) (or beg 0)))))))
- t)) ; return value
-
-(deffoo nnshimbun-retrieve-headers (articles &optional group server fetch-old)
- (when (nnshimbun-possibly-change-group group server)
- (if (nnshimbun-retrieve-headers-with-nov articles group fetch-old)
- 'nov
- (with-current-buffer nntp-server-buffer
- (erase-buffer)
- (let (header)
- (dolist (art articles)
- (when (and (if (stringp art)
- (setq art (nnshimbun-search-id group art))
- (integerp art))
- (setq header
- (with-current-buffer (nnshimbun-open-nov group)
- (and (nnheader-find-nov-line art)
- (nnshimbun-parse-nov)))))
- (insert (format "220 %d Article retrieved.\n" art))
- (shimbun-header-insert nnshimbun-shimbun header)
- (insert ".\n")
- (delete-region (point) (point-max)))))
- 'header))))
-
-(defun nnshimbun-retrieve-headers-with-nov (articles &optional group fetch-old)
- (unless (or gnus-nov-is-evil nnshimbun-nov-is-evil)
- (with-current-buffer nntp-server-buffer
- (erase-buffer)
- (insert-buffer (nnshimbun-open-nov group))
- (unless (and fetch-old (not (numberp fetch-old)))
- (nnheader-nov-delete-outside-range
- (if fetch-old
- (max 1 (- (car articles) fetch-old))
- (car articles))
- (nth (1- (length articles)) articles)))
- t)))
-
-
-;;; Nov Database Operations
-(defvar nnshimbun-tmp-string nil
- "Internal variable used to just a rest for a temporary string. The
-macro `nnshimbun-string-or' uses it exclusively.")
-
-(defmacro nnshimbun-string-or (&rest strings)
- "Return the first element of STRINGS that is a non-blank string. It
-should run fast, especially if two strings are given. Each string can
-also be nil."
- (cond ((null strings)
- nil)
- ((= 1 (length strings))
- ;; Return irregularly nil if one blank string is given.
- `(unless (zerop (length (setq nnshimbun-tmp-string ,(car strings))))
- nnshimbun-tmp-string))
- ((= 2 (length strings))
- ;; Return the second string when the first string is blank.
- `(if (zerop (length (setq nnshimbun-tmp-string ,(car strings))))
- ,(cadr strings)
- nnshimbun-tmp-string))
- (t
- `(let ((strings (list ,@strings)))
- (while strings
- (setq strings (if (zerop (length (setq nnshimbun-tmp-string
- (car strings))))
- (cdr strings))))
- nnshimbun-tmp-string))))
-
-(autoload 'message-make-date "message")
-
-(defsubst nnshimbun-insert-nov (number header &optional id)
- (insert "\n")
- (backward-char 1)
- (let ((header-id (nnshimbun-string-or (shimbun-header-id header)))
- ;; Force `princ' to work in the current buffer.
- (standard-output (current-buffer))
- (xref (nnshimbun-string-or (shimbun-header-xref header)))
- (start (point)))
- (and (stringp id)
- header-id
- (string-equal id header-id)
- (setq id nil))
- (princ number)
- (insert
- "\t"
- (nnshimbun-string-or (shimbun-header-subject header) "(none)") "\t"
- (nnshimbun-string-or (shimbun-header-from header) "(nobody)") "\t"
- (nnshimbun-string-or (shimbun-header-date header) (message-make-date))
- "\t"
- (or header-id (nnmail-message-id)) "\t"
- (or (shimbun-header-references header) "") "\t")
- (princ (or (shimbun-header-chars header) 0))
- (insert "\t")
- (princ (or (shimbun-header-lines header) 0))
- (insert "\t")
- (if xref
- (progn
- (insert "Xref: " xref "\t")
- (when id
- (insert "X-Nnshimbun-Id: " id "\t")))
- (when id
- (insert "\tX-Nnshimbun-Id: " id "\t")))
- ;; Replace newlines with spaces in the current NOV line.
- (while (progn
- (forward-line 0)
- (> (point) start))
- (backward-delete-char 1)
- (insert " "))
- (forward-line 1)))
-
-(defun nnshimbun-generate-nov-database (group)
- (when (nnshimbun-possibly-change-group group)
- (with-current-buffer (nnshimbun-open-nov group)
- (goto-char (point-max))
- (forward-line -1)
- (let* ((i (or (ignore-errors (read (current-buffer))) 0))
- (name (concat "nnshimbun+" (nnshimbun-current-server) ":" 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 pre-fetch
- (with-temp-buffer
- (nnshimbun-request-article-1 i group nil (current-buffer)))))))
- (nnshimbun-write-nov group))))
-
-(defun nnshimbun-replace-nov-entry (group article header &optional id)
- (with-current-buffer (nnshimbun-open-nov group)
- (when (nnheader-find-nov-line article)
- (delete-region (point) (progn (forward-line 1) (point)))
- (nnshimbun-insert-nov article header id))))
-
-(defun nnshimbun-search-id (group id)
- (with-current-buffer (nnshimbun-open-nov group)
- (goto-char (point-min))
- (let (found)
- (while (and (not found)
- (search-forward id nil t)) ; We find the ID.
- ;; And the id is in the fourth field.
- (if (not (and (search-backward "\t" nil t 4)
- (not (search-backward "\t" (gnus-point-at-bol) t))))
- (forward-line 1)
- (forward-line 0)
- (setq found t)))
- (unless found
- (goto-char (point-min))
- (setq id (concat "X-Nnshimbun-Id: " id))
- (while (and (not found)
- (search-forward id nil t))
- (if (not (search-backward "\t" (gnus-point-at-bol) t 8))
- (forward-line 1)
- (forward-line 0)
- (setq found t))))
- (when found
- (ignore-errors (read (current-buffer)))))))
-
-;; This function is defined as an alternative of `nnheader-parse-nov',
-;; in order to keep compatibility between T-gnus and Oort Gnus.
-(defun nnshimbun-parse-nov ()
- (let ((eol (gnus-point-at-eol)))
- (let ((number (nnheader-nov-read-integer))
- (subject (nnheader-nov-field))
- (from (nnheader-nov-field))
- (date (nnheader-nov-field))
- (id (nnheader-nov-read-message-id))
- (refs (nnheader-nov-field))
- (chars (nnheader-nov-read-integer))
- (lines (nnheader-nov-read-integer))
- (xref (unless (eq (char-after) ?\n)
- (when (looking-at "Xref: ")
- (goto-char (match-end 0)))
- (nnheader-nov-field)))
- (extra (nnheader-nov-parse-extra)))
- (shimbun-make-header number subject from date
- (or (cdr (assq 'X-Nnshimbun-Id extra)) id)
- refs chars lines xref))))
-
-(defsubst nnshimbun-nov-buffer-name (&optional group)
- (format " *nnshimbun overview %s %s*"
- (nnshimbun-current-server)
- (or group (nnshimbun-current-group))))
-
-(defsubst nnshimbun-nov-file-name (&optional group)
- (nnmail-group-pathname (or group (nnshimbun-current-group))
- (nnshimbun-server-directory)
- nnshimbun-nov-file-name))
-
-(defun nnshimbun-open-nov (group)
- (let ((buffer (nnshimbun-nov-buffer-name group)))
- (unless (gnus-buffer-live-p buffer)
- (with-current-buffer (gnus-get-buffer-create buffer)
- (erase-buffer)
- (let ((file-name-coding-system nnmail-pathname-coding-system)
- (pathname-coding-system nnmail-pathname-coding-system)
- (nov (nnshimbun-nov-file-name group)))
- (when (file-exists-p nov)
- (nnheader-insert-file-contents nov)))
- (set-buffer-modified-p nil)))
- buffer))
-
-(defun nnshimbun-write-nov (group &optional close)
- (let ((buffer (nnshimbun-nov-buffer-name group)))
- (when (gnus-buffer-live-p buffer)
- (with-current-buffer buffer
- (let ((file-name-coding-system nnmail-pathname-coding-system)
- (pathname-coding-system nnmail-pathname-coding-system)
- (nov (nnshimbun-nov-file-name group)))
- (when (and (buffer-modified-p)
- (or (> (buffer-size) 0)
- (file-exists-p nov)))
- (nnmail-write-region 1 (point-max) nov nil 'nomesg)
- (set-buffer-modified-p nil))))
- (when close
- (kill-buffer buffer)))))
-
-(deffoo nnshimbun-request-expire-articles (articles group
- &optional server force)
- "Do expiration for the specified ARTICLES in the nnshimbun GROUP.
-Notice that nnshimbun does not actually delete any articles, it just
-delete the corresponding entries in the NOV database locally. The
-optional fourth argument FORCE is ignored."
- (when (nnshimbun-possibly-change-group group server)
- (let* ((expirable (copy-sequence articles))
- (name (concat "nnshimbun+" (nnshimbun-current-server) ":" group))
- ;; If the group's parameter `expiry-wait' is non-nil, 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)
- (with-current-buffer (nnshimbun-open-nov group)
- (while expirable
- (setq article (pop expirable))
- (when (and (nnheader-find-nov-line article)
- (setq end (gnus-point-at-eol))
- (not (= (point-max) (1+ end))))
- (setq time (and (search-forward "\t" end t)
- (search-forward "\t" end t)
- (search-forward "\t" end t)
- (parse-time-string
- (buffer-substring
- (point)
- (if (search-forward "\t" end t)
- (1- (point))
- end)))))
- (when (if (setq time (condition-case nil
- (apply 'encode-time time)
- (error nil)))
- (nnmail-expired-article-p name time nil)
- ;; Inhibit expiration if there's no parsable date
- ;; and the following option is non-nil.
- (not nnshimbun-keep-unparsable-dated-articles))
- (forward-line 0)
- (delete-region (point) (1+ end))
- (setq articles (delq article articles)))))
- (nnshimbun-write-nov group))
- articles)))
-
-
-;;; shimbun-gnus-mua
-(luna-define-class shimbun-gnus-mua (shimbun-mua) ())
-
-(luna-define-method shimbun-mua-search-id ((mua shimbun-gnus-mua) id)
- (nnshimbun-search-id
- (shimbun-current-group-internal (shimbun-mua-shimbun-internal mua))
- id))
-
-
-;;; Command to create nnshimbun group
-(defvar nnshimbun-server-history nil)
-
-;;;###autoload
-(defun gnus-group-make-shimbun-group ()
- "Create a nnshimbun group."
- (interactive)
- (let* ((minibuffer-setup-hook
- (append minibuffer-setup-hook '(beginning-of-line)))
- (alist
- (apply 'nconc
- (mapcar
- (lambda (d)
- (and (stringp d)
- (file-directory-p d)
- (delq nil
- (mapcar
- (lambda (f)
- (and (string-match "^sb-\\(.*\\)\\.el$" f)
- (list (match-string 1 f))))
- (directory-files d)))))
- load-path)))
- (server (completing-read
- "Shimbun address: "
- alist nil t
- (or (car nnshimbun-server-history)
- (caar alist))
- 'nnshimbun-server-history))
- (groups)
- (nnshimbun-pre-fetch-article))
- (if (setq groups (shimbun-groups (shimbun-open server)))
- (gnus-group-make-group
- (completing-read "Group name: " (mapcar 'list groups) nil t nil)
- (list 'nnshimbun server))
- (error "%s" "Can't find group"))))
-
-
-(provide 'nnshimbun)
-
-;;; nnshimbun.el ends here
@kindex G n (\e$B%0%k!<%W\e(B)
@findex gnus-group-make-shimbun-group
@cindex making groups
+@cindex emacs-w3m
@cindex nnshimbun
@cindex web newspaper
\e$B?7$7$$\e(B @code{nnshimbun} \e$B%0%k!<%W$r:n@.$7$^\e(B
\e$B$9\e(B (@code{gnus-group-make-shimbun-group})\e$B!#\e(Bgnus \e$B$O%W%m%s%W%H$rI=<($7$F!"\e(B
\e$B%5!<%P!<$N%"%I%l%9$r<($9%7%s%\%kL>$H5-;v%0%k!<%WL>$NF~NO$r5a$a$F$-$^$9!#\e(B
-@code{nnshimbun} \e$B$K4X$9$k>\:Y$O\e(B @pxref{Web Newspaper} \e$B$r;2>H$7$F2<$5$$!#\e(B
+\e$B$3$l$r;H$&$K$O\e(B @uref{http://emacs-w3m.namazu.org/, emacs-w3m} \e$B$,I,MW$G$9!#\e(B
+@code{nnshimbun} \e$B$K4X$9$k>\:Y\e(B
+\e$B$O\e(B (@pxref{Nnshimbun, , Nnshimbun, emacs-w3m-ja, Emacs-w3m-ja}) \e$B$r;2>H$7\e(B
+\e$B$F2<$5$$!#\e(B
@item G r
@kindex G r (\e$B%0%k!<%W\e(B)
\e$B%s%0%j%9%H$G$"$k$H2r<a$7$^$9!#$3$N>pJs$r\e(B gnus \e$B$KM?$($k$3$H$O!"$"$J$?$,$=\e(B
\e$B$l$i$N%a!<%j%s%0%j%9%H$KEj9F$9$k$H$-$K@5$7$$\e(B Mail-Followup-To \e$B%X%C%@!<$r\e(B
\e$B@8@.$9$k$?$a$N\e(B (\e$B$[$s$N\e(B) \e$BBh0lJb$G$9!#MxMQ$G$-$k\e(B MFT \e$BBP1~5!G=$r40A4$K07$&\e(B
-\e$B$K$O!"$3$3\e(B @pxref{Mailing Lists, , Mailing Lists, message, The Message
-Manual} \e$B$r8+$F2<$5$$!#\e(B
+\e$B$K$O!"$3$3\e(B (@pxref{Mailing Lists, , Mailing Lists, message, The Message
+Manual}) \e$B$r8+$F2<$5$$!#\e(B
@code{gnus-find-subscribed-addresses} \e$B$b;2>H$7$F2<$5$$!#$3$N4X?t$O$3$N%0\e(B
\e$B%k!<%W%Q%i%a!<%?$rD>@\$K;H$$$^$9!#\e(B
@}
@end example
-Sieve \e$B8@8l$O\e(B RFC 3028 \e$B$G=R$Y$i$l$F$$$^$9!#\e(B@xref{Top, , Top, sieve, Emacs
-Sieve}\e$B!#\e(B
+Sieve \e$B8@8l$O\e(B RFC 3028 \e$B$G=R$Y$i$l$F$$$^\e(B
+\e$B$9\e(B (@pxref{Top, , Top, sieve, Emacs Sieve})\e$B!#\e(B
@item (@var{variable} @var{form})
\e$B%0%k!<%W$KF~$k$H$-$K!"$=$N%0%k!<%W%m!<%+%k$NJQ?t$r@_Dj$9$k%0%k!<%W%Q%i%a!<\e(B
@kindex C-c C-c (\e$BEj9F\e(B)
\e$BEj9F$N$?$a$NL?Na$r$9$k$H!"$"$J$?$O%a%C%;!<%8%P%C%U%!$K0\F0$7$^$9!#\e(B
\e$B$=$3$G$O!"5-;v$r9%$-$J$h$&$KJT=8$9$k;v$,$G$-$^$9!#\e(B
-\e$B$=$N8e$G\e(B @kbd{C-c C-c} \e$B$r2!$9;v$K$h$C$F!"5-;v$rAw?.$7$^$9!#\e(B
-@xref{Top, , Overview, message, Message Manual}\e$B!#5-;v$O$"$J$?$N@_Dj$K4p\e(B
-\e$B$E$$$FAw?.$5$l$^$9\e(B (@pxref{Posting Server})\e$B!#\e(B
+\e$B$=$N8e$G\e(B @kbd{C-c C-c} \e$B$r2!$9;v$K$h$C$F!"5-;v$rAw?.$7$^\e(B
+\e$B$9\e(B (@pxref{Top, , Overview, message, Message Manual})\e$B!#5-;v$O$"$J$?$N@_\e(B
+\e$BDj$K4p$E$$$FAw?.$5$l$^$9\e(B (@pxref{Posting Server})\e$B!#\e(B
@menu
* Mail:: \e$B%a!<%k$HJVEz\e(B
@node Web Newspaper
@subsection Web Newspaper
+@cindex emacs-w3m
@cindex nnshimbun
@cindex Web Newspaper
-\e$B:G6a$G$O4v$D$+$N?7J9$,%&%'%V$G8x3+$5$l$F$$$^$9!#\e(BGnus \e$B$O$3$l$i$bE,@Z$K<h\e(B
-\e$B$j07$&$3$H$,=PMh$k$h$&$K$J$j$D$D$"$j$^$9!#8=;~E@$G$OD+F|?7J9!"FIGd?7J9!"\e(B
-\e$B%9%]%K%A!"\e(BCNET Japan\e$B!"\e(BHOTWIRED Japan\e$B!"\e(BZDNet Japan \e$B$J$I$KBP1~$7$F$$$^$9!#\e(B
-
-@code{nnshimbun} \e$B$O\e(B @code{shimbun} \e$B%i%$%V%i%j$K0MB8$7$F$$$^$9$N$G!"$=$l\e(B
-\e$B$r4^$s$G$$$k\e(B emacs-w3m \e$B%Q%C%1!<%8$H30It%3%^%s%I\e(B w3m \e$B$r@h$K%$%s%9%H!<%k$7\e(B
-\e$B$F$*$$$F$/$@$5$$!#>\$7$$$3$H$O0J2<$N%Z!<%8$GCN$k$3$H$,$G$-$^$9!#\e(B
-
-@example
- @uref{http://emacs-w3m.namazu.org/}
- @uref{http://w3m.sourceforge.net/}
-@end example
-
-@findex gnus-group-make-shimbun-group
-@kindex G n (\e$B%0%k!<%W\e(B)
-@code{nnshimbun} \e$B$r;O$a$k$?$a$N0lHV4JC1$JJ}K!$O%0%k!<%W%P%C%U%!$NE,Ev$J\e(B
-\e$B>l=j$G\e(B @kbd{G n asahi RET national RET} \e$B$J$I$H%?%$%W$9$k$3$H$G$9!#\e(B
-@samp{asahi} \e$B$O@\B3$7$?$$%5!<%P!<$N%"%I%l%9$r<($9%7%s%\%k$K!"\e(B
-@samp{national} \e$B$O1\Mw$7$?$$5-;v%0%k!<%W$K$=$l$>$lCV$-49$($F$/$@$5$$!#N>\e(B
-\e$BJ}$H$bL>A0$NJd40$,$G$-$^$9!#\e(B
-@c \e$B$^$?$O\e(B @kbd{B nnshimbun RET asahi RET} \e$B$G%P%C%/%(%s%I$r%V%i%&%:$9$k$3$H\e(B
-@c \e$B$K$h$C$F$b5-;v$rFI$`$3$H$,$G$-$^$9!#\e(B
-\e$B2C$($F!"\e(B@acronym{HTML} \e$B$N%I%-%e%a%s%H$r%$%s%i%$%sI=<($5$;$?$$>l9g$O!"\e(B
-@file{~/.gnus.el} \e$B%U%!%$%k$K0J2<$N@_Dj$r$7$F2<$5$$!#\e(B
-
-@lisp
-(require 'mime-w3m)
-@end lisp
-
-Web Newspaper \e$B$K4X$9$k0J2<$N\e(B @code{nnshimbun} \e$BJQ?t$rJQ$($k$3$H$,2DG=$G$9\e(B:
-
-@table @code
-@item nnshimbun-directory
-@vindex nnshimbun-directory
-@code{nnshimbun} \e$B$,%U%!%$%k$rJ]B8$9$k%G%#%l%/%H%j!<$G$9!#=i4|CM\e(B
-\e$B$O\e(B @samp{~/News/shimbun} \e$B$G$9!#\e(B
-@end table
-
-@cindex group parameters
-@code{nnshimbun} \e$B$O\e(B Gnus \e$B$,Ds6!$9$kHFMQ$N%0%k!<%W%Q%i%a!<\e(B
-\e$B%?\e(B @footnote{\e$B%0%k!<%W%Q%i%a!<%?$r@_Dj$9$k$?$a$N:G$b<j7Z$JJ}K!$O!"%0%k!<\e(B
-\e$B%W%P%C%U%!$G!"@_Dj$7$?$$%0%k!<%W$N>l=j$K%+!<%=%k$,$"$k>uBV\e(B
-\e$B$G\e(B @kbd{G c} \e$B$r%?%$%W$9$k$3$H$G$9\e(B (@xref{Group Parameters})\e$B!#\e(B} \e$B$K2C$($F!"\e(B
-@code{nnshimbun} \e$B@lMQ$N%0%k!<%W%Q%i%a!<%?$rMxMQ$9$k$3$H$,$G$-$^$9!#$=$l\e(B
-\e$B$i$O\e(B @code{nnshimbun-group-parameters} \e$B$H$$$&C10l$N%0%k!<%W%Q%i%a!<%?$K\e(B
-\e$B$^$H$a$i$l$F$$$^$9$,!"$=$l$,3F%0%k!<%WKh$K;}$D$3$H$,$G$-$kCM$O%W%m%Q%F%#\e(B
-\e$B%j%9%H$G!"Nc$($P<!$N$h$&$JCM$G$9!#\e(B
-
-@lisp
-'(index-range all prefetch-articles off encapsulate-images on
- expiry-wait 6)
-@end lisp
-
-\e$B<B:]$K$O$3$N$h$&$J%j%9%H$N@hF,$K\e(B @code{nnshimbun-group-parameters} \e$B$H$$\e(B
-\e$B$&%7%s%\%k$,IU2C$5$l$?$b$N$,!"\e(B``~/.newsrc.eld'' \e$B%U%!%$%k$K5-O?$5$l$^$9!#\e(B
-\e$B0J9_$O!"$3$l$i$N%0%k!<%W%Q%i%a!<%?$H!"$=$l$K4XO"$9$kJQ?t$N@bL@$G$9!#\e(B
-
-@table @code
-@item prefetch-articles
-@vindex nnshimbun-pre-fetch-article
-\e$B$3$N%0%k!<%W%Q%i%a!<%?$,\e(B @code{off} \e$B$^$?$O\e(B @code{nil} \e$B0J30$NCM$K%;%C%H$5\e(B
-\e$B$l$F$$$k%0%k!<%W$G$O!"\e(B@code{nnshimbun} \e$B$O?7Ce5-;v$r8!:w$HF1;~$K5-;v$N%@\e(B
-\e$B%&%s%m!<%I$b9T$$$^$9!#$3$l$K$h$C$F?7Ce5-;v$N8!:w$OCY$/$J$j$^$9$,!"5-;v$N\e(B
-\e$B1\Mw;~$KBT$?$5$l$k$3$H$O>/$J$/$J$j$^$9!#%0%k!<%W%Q%i%a!<\e(B
-\e$B%?\e(B @code{prefetch-articles} \e$B$,@_Dj$5$l$F$$$J$$$+!"$=$NCM$,\e(B @code{nil} \e$B$K\e(B
-\e$B$J$C$F$$$k%0%k!<%W$G$O!"%0%k!<%W%Q%i%a!<%?\e(B @code{prefetch-articles} \e$B$NBe\e(B
-\e$B$o$j$K%G%#%U%)%k%HCM$H$7$FJQ?t\e(B @code{nnshimbun-pre-fetch-article} \e$B$NCM$,\e(B
-\e$B;H$o$l$^$9!#$3$NJQ?t\e(B @code{nnshimbun-pre-fetch-article} \e$B$N=i4|CM\e(B
-\e$B$O\e(B @code{off} \e$B$G$9!#\e(B
-
-@item encapsulate-images
-@vindex nnshimbun-encapsulate-images
-\e$B$3$N%0%k!<%W%Q%i%a!<%?$,\e(B @code{off} \e$B$^$?$O\e(B @code{nil} \e$B0J30$NCM$K%;%C%H$5\e(B
-\e$B$l$F$$$k%0%k!<%W$G$O!"\e(B@code{nnshimbun} \e$B$O85$N5-;v$KKd$a9~$^$l$F$$$k2hA|\e(B
-\e$B%G!<%?$r\e(B @samp{multipart/related} \e$B$N7A<0$G5-;v$K$O$a9~$_$^$9!#%0%k!<%W%Q\e(B
-\e$B%i%a!<%?\e(B @code{encapsulate-images} \e$B$,@_Dj$5$l$F$$$J$$$+!"$=$NCM$,\e(B
-@code{nil} \e$B$K$J$C$F$$$k%0%k!<%W$G$O!"%0%k!<%W%Q%i%a!<\e(B
-\e$B%?\e(B @code{encapsulate-images} \e$B$NBe$o$j$K%G%#%U%)%k%HCM$H$7$FJQ\e(B
-\e$B?t\e(B @code{nnshimbun-encapsulate-images} \e$B$NCM$,;H$o$l$^$9!#$3$NJQ\e(B
-\e$B?t\e(B @code{nnshimbun-encapsulate-images} \e$B$N%G%#%U%)%k%HCM$O!"\e(B
-@code{shimbun} \e$B%i%$%V%i%j$NJQ?t\e(B @code{shimbun-encapsulate-images} \e$B$NCM$G\e(B
-\e$B$9\e(B (\e$B$?$V$s$=$N=i4|CM$O\e(B @code{t} \e$B$G$9\e(B)\e$B!#\e(B
-
-@item index-range
-@vindex nnshimbun-index-range
-\e$B%0%k!<%W%Q%i%a!<%?\e(B @code{index-range} \e$B$G!"%&%'%V%5!<%P!<$+$i<hF@$9$k5-;v\e(B
-\e$B$NHO0O$r;XDj$9$k$3$H$,$G$-$^$9!#HO0O$N;XDj$K$O0J2<$NCM$r;H$C$F2<$5$$!#\e(B
-
-@example
-@code{nil}, @code{all}:
- \e$B$9$Y$F\e(B
-@code{last}:
- \e$B:G?7$N$_\e(B
-@samp{\e$B@0?t\e(BN}:
- \e$B:G?7$+$i\e(B N \e$B%Z!<%8\e(B
-@end example
-
-@code{nnshimbun} \e$B$O%5!<%P!<>e$KB8:_$9$kL\<!%Z!<%8$r;H$C$F?7Ce5-;v$NM-L5\e(B
-\e$B$rD4$Y$^$9$,!"%5!<%P!<$K$h$C$F$O$=$N$h$&$JL\<!%Z!<%8$,J#?tB8:_$9$k>l9g$,\e(B
-\e$B$"$j$^$9!#Nc$($P!"%a!<%j%s%0%j%9%H$N5-;v$rDs6!$7$F$$$k%5!<%P!<$N>l9g$O!"\e(B
-\e$B$=$N5-;v$,Ej9F$5$l$?F|IU$K$h$C$FJ,N`$5$l$?L\<!$K$J$C$F$$$k$3$H$,0lHLE*$G\e(B
-\e$B$9!#FC$KCY$$2s@~$rMxMQ$7$F$$$k;~$K!"$3$N$h$&$KJ#?t!&BgNL$NL\<!$rD4$Y$k$3\e(B
-\e$B$H$K$J$k$H!"BgJQ;~4V$,$+$+$k$3$H$K$J$j$^$9!#\e(B
-
-@code{nnshimbun} \e$B$OA02s$N@\B3;~$KD4$Y$?L\<!$K$D$$$F$O!"$J$k$Y$/D4$Y$:$K\e(B
-\e$B:Q$^$;$k$h$&$K$J$C$F$$$^$9$,!"99$K;~4V$r@aLs$7$?$$>l9g$O\e(B @code{last} \e$B$r\e(B
-\e$B;H$C$F2<$5$$!#$3$&$9$k$H:G?7$NL\<!$N$_$r;2>H$7$F?7Ce5-;v$N8!::$r9T$&$h$&\e(B
-\e$B$K$J$j$^$9!#\e(B
-
-\e$B%0%k!<%W%Q%i%a!<%?\e(B @code{index-range} \e$B$,@_Dj$5$l$F$$$J$$$+!"CM\e(B
-\e$B$,\e(B @code{nil} \e$B$K$J$C$F$$$k%0%k!<%W$G$O!"JQ\e(B
-\e$B?t\e(B @code{nnshimbun-index-range} \e$B$NCM$,%G%#%U%)%k%H$H$7$F;H$o$l$^$9!#\e(B
-\e$B$J$*!"\e(B@code{nnshimbun-index-range} \e$B$N%G%#%U%)%k%HCM$O\e(B @code{nil} \e$B$G$9!#\e(B
-
-@item nnshimbun-group-parameters-alist
-@vindex nnshimbun-group-parameters-alist
-@code{nnshimbun-group-parameters-alist} \e$B$O%+%9%?%^%$%:2DG=$J%f!<%6%*%W%7%g\e(B
-\e$B%s$G!"3FMWAG$K%0%k!<%WL>$N@55,I=8=$H\e(B @code{nnshimbun} \e$B@lMQ$N%0%k!<%W%Q%i\e(B
-\e$B%a!<%?$HF1$8%W%m%Q%F%#%j%9%H$r;}$D$3$H$,$G$-$kO"A[%j%9%H$G$9!#O"A[%j%9%H\e(B
-\e$B$N3FMWAG$O<!$N$h$&$JCM$r;}$A$^$9!#=i4|CM$O\e(B @code{nil} \e$B$G$9!#\e(B
-
-@lisp
-'("^nnshimbun\\+asahi:" index-range all prefetch-articles off
- encapsulate-images on expiry-wait 6)
-@end lisp
-
-\e$B;w$?@-3J$r;}$DJ#?t$N%0%k!<%W$KBP$7$FF1$8@_Dj$r9T$J$&$3$H$,$G$-$k$N$G!"8D!9\e(B
-\e$B$N%0%k!<%W$KBP$7$F$=$l$>$l%0%k!<%W%Q%i%a!<%?$r@_Dj$9$kBe$o$j$K;H$&$3$H$,\e(B
-\e$B$G$-$^$9!#$b$7@55,I=8=$K%^%C%A$9$k%0%k!<%W$G%0%k!<%W%Q%i%a!<%?$N@_Dj$,9T\e(B
-\e$B$J$o$l$F$$$?>l9g$O!"$=$N@_DjCM$NJ}$,M%@h$5$l$^$9!#\e(B
-@end table
-
-@cindex article expiry
-@cindex auto-expire
-@cindex expiry-wait
-@vindex nnmail-expiry-wait-function
-@vindex nnmail-expiry-wait
-\e$B$H$3$m$G\e(B @code{nnshimbun} \e$B%P%C%/%(%s%I$G$O!"5-;v$N4|8B@Z$l>C5n$r9T$J$&$3\e(B
-\e$B$H$,$G$-$^$9\e(B @footnote{@code{nnshimbun} \e$B%0%k!<%W$G<+F04|8B@Z$l>C5n$r9T$J\e(B
-\e$B$&J}K!$K$O<g$KFs<oN`$"$j$^$9!#0l$D$O\e(B ``^nnshimbun\\+'' \e$B$G;O$^$k%0%k!<%W\e(B
-\e$BL>$N@55,I=8=$r\e(B @code{gnus-auto-expirable-newsgroups} \e$B$KDI2C$7$F!">C5n$9\e(B
-\e$B$k$^$G$NF|?t$r3F%0%k!<%WKh$K\e(B @code{nnmail-expiry-wait-function} \e$B$G;XDj$9\e(B
-\e$B$k$3$H!#$b$&0l$D$O\e(B @code{nnshimbun} \e$B$N3F%0%k!<%WKh$K%0%k!<%W%Q%i%a!<\e(B
-\e$B%?\e(B @code{auto-expire} \e$B$r\e(B @code{t} \e$B$K$7$F!"F1$8$/%0%k!<%W%Q%i%a!<\e(B
-\e$B%?\e(B @code{expiry-wait} \e$B$G>C5n$9$k$^$G$NF|?t$r;XDj$9$k$d$jJ}$G$9!#>\$7$$$3\e(B
-\e$B$H$O\e(B @xref{Expiring Mail} \e$B$r;2>H$7$F2<$5$$!#$J$*K\JT$G$b?($l$F$$$^$9$,!"\e(B
-\e$B8D!9$KF|?t$r@_Dj$7$J$$>l9g$O%G%#%U%)%k%H$NCM$,E,MQ$5$l$^$9!#\e(B}\e$B!#$"$"!"$b\e(B
-\e$B$A$m$s$"$J$?$,;0F|A0$N?7J95-;v$r>C5n$9$k$h$&$K@_Dj$7$?$+$i$H$$$C$F!"?7J9\e(B
-\e$B<R$N%5!<%P!<$K$"$k;0F|A0$N5-;v$,>C$($F$7$^$&$o$1$G$O$"$j$^$;$s!#>C$($k$N\e(B
-\e$B$O$"$J$?8D?M$,;}$C$F$$$k\e(B @code{nnshimbun} \e$BMQ$N\e(B @acronym{NOV} \e$B%U%!%$\e(B
-\e$B%k\e(B @footnote{@code{nnshimbun} \e$BMQ$N\e(B @acronym{NOV} \e$B%U%!%$%k$H\e(B
-\e$B$O\e(B ``~/News/shimbun/asahi/national/.overview'' \e$B$N$h$&$J$b$N$G$9!#\e(B} \e$B$N3:\e(B
-\e$BEv$9$kItJ,$G!"$=$l$K$h$C$F$=$N5-;v$OFsEY$H35N,%P%C%U%!$K8=$l$J$/$J$j$^$9!#\e(B
-
-@code{nnshimbun} \e$B%P%C%/%(%s%I$G$O5-;v$N4|8B@Z$l>C5n$r9T$J$o$J$$\e(B
-\e$B$H\e(B @acronym{NOV} \e$B%U%!%$%k$,:]8BL5$/B@$jB3$1!"?7J9<R$N%5!<%P!<$G$O$H$C$/\e(B
-\e$B$KL5$/$J$C$F$7$^$C$?;0G/A0$N5-;v$,!"35N,%P%C%U%!$G$O$"$?$+$bB8:_$7$F$$$k\e(B
-\e$B$h$&$K8+$($^$9!#$=$l$rFI$b$&$H$7$F$b5-;v%P%C%U%!$K$O2?$b8=$l$^$;$s!#0lJ}\e(B
-\e$B%a!<%j%s%0%j%9%H$N5-;v$rDs6!$7$F$$$k%5!<%P!<$N>l9g$K$O!"2a5n$NA45-;v$rJ]\e(B
-\e$BM-$7$F$$$k>l9g$,>/$J$/$J$$$G$7$g$&!#@N$"$J$?$,6=$8$?0lO"$N5-;v$rFI$_JV$7\e(B
-\e$B$F2{$+$7$`$?$a$K!"$=$&$$$&%0%k!<%W$G$O4|8B@Z$l>C5n$O$5$;$?$/$J$$$H;W$&$+\e(B
-\e$B$b$7$l$^$;$s!#\e(B
-
-\e$B<B$O\e(B @code{nnshimbun} \e$B%P%C%/%(%s%I$G$b!"B>$N%a!<%k%P%C%/%(%s%I$HF1MM$NJ}\e(B
-\e$BK!$G%0%k!<%WKh$K<+F04|8B@Z$l>C5n2DG=$K$7$?$j!";D$7$F$*$/4|4V$r@_Dj$9$k$3\e(B
-\e$B$H$,$G$-$k$N$G$9!#\e(B
-
-\e$B$?$@\e(B @code{nnshimbun} \e$B%P%C%/%(%s%I$N4|8B@Z$l>C5n$K$O!"B>$N%a!<%k%P%C%/%(\e(B
-\e$B%s%I$H>/$7$@$10c$&E@$,$"$j$^$9!#Bh0l$K!";D$7$F$*$/4|4V$N%G%#%U%)%k%HCM$K\e(B
-@code{shimbun} \e$B%i%$%V%i%j$,Ds6!$9$kCM$,4X78$7!"0J2<$NM%@hEY$G4|4V$,7hDj\e(B
-\e$B$5$l$k$3$H$G$9!#\e(B
+\e$B%&%'%V$K4p$E$$$?%P%C%/%(%s%I$G$"$k\e(B @samp{nnshimbun} \e$B$O!"\e(B2003\e$BG/\e(B6\e$B7n\e(B18\e$BF|$r\e(B
+\e$B0J$F\e(B emacs-w3m \e$B%Q%C%1!<%8$K0\@R$5$l$^$7$?!#:#$^$G$N$h$&$K\e(B T-gnus \e$B$G%&%'\e(B
+\e$B%V$N?7J9$r1\Mw$7$?$$$N$G$"$l$P!":G?7HG$N\e(B emacs-w3m \e$B$r%$%s%9%H!<%k$9$kI,\e(B
+\e$BMW$,$"$j$^$9!#$=$N:]!"\e(B@emph{\e$BI,$:\e(B} T-gnus \e$BM3Mh\e(B
+\e$B$N\e(B @file{nnshimbun.el} \e$B$H\e(B @file{nnshimbun.elc} \e$B%U%!%$%k$r>C$7$F2<$5$$!#\e(B
+Emacs-w3m \e$B$O30It%3%^%s%I\e(B w3m \e$B$X$N\e(B Emacs \e$B$N%$%s%?!<%U%'!<%9$G$9!#>\:Y>pJs\e(B
+\e$B$K$D$$$F$O0J2<$N%Z!<%8$rK,$M$F$_$F2<$5$$!#\e(B
@example
-\e$B%0%k!<%W%Q%i%a!<%?$N\e(B @code{expiry-wait}
-@code{nnmail-expiry-wait-function} \e$B$rI>2A$7$?CM\e(B
-@code{shimbun} \e$B%i%$%V%i%j$,Ds6!$9$k%0%k!<%WKh$N%G%#%U%)%k%HCM\e(B
-@code{nnmail-expiry-wait} \e$B$NCM\e(B
+@uref{http://emacs-w3m.namazu.org/, emacs-w3m}
+@uref{http://w3m.sourceforge.net/, w3m}
@end example
-\e$BBhFs$K!"\e(B@code{nnmail-expiry-wait-function} \e$B$,4X?t$@$C$?>l9g$K!"$=$N0z?t\e(B
-\e$B$KM?$($i$l$kJ8;zNs$K\e(B ``nnshimbin+asahi:national'' \e$B$N$h$&$K%P%C%/%(%s%I$H\e(B
-\e$B%5!<%P!<$NL>A0$,4^$^$l$k$3$H$G$9!#B>$N%a!<%k%P%C%/%(%s%I$N>l9g$K$O%0%k!<\e(B
-\e$B%WL>$@$1$,M?$($i$l$k$N$K!"$G$9!#0l$DNc$r5s$2$^$7$g$&!#\e(B
-
-@lisp
-(setq nnmail-expiry-wait-function
- (lambda (group)
- (cond ((string-equal group "wl") 7)
- ((string-equal group "nnshimbun+airs:wl") 'never))))
-@end lisp
-
-\e$B$3$l$O!"Nc$($P\e(B @code{nnml} \e$B$d\e(B @code{nnmh} \e$B$G<u?.$7$F$$$k\e(B Wanderlust \e$B%a!<\e(B
-\e$B%j%s%0%j%9%H$N5-;v$O\e(B 7\e$BF|$G4|8B@Z$l>C5n$9$k$,!"\e(B@code{nnshimbun} \e$B$GFI$`F1\e(B
-\e$B$8%a!<%j%s%0%j%9%H$N%"!<%+%$%V$O$9$Y$FFI$a$k>uBV$K$7$F$*$/!"$H$$$&$3$H$G\e(B
-\e$B$9!#$I$&$G$9!"$J$+$J$+8-$$$G$7$g\e(B?
-
-\e$BBh;0$K!"$3$l$O$"$J$?$,IT?3$K;W$C$?$H$-$K;W$$=P$7$F$/$l$k$3$H$r4|BT$7$F=q\e(B
-\e$B$$$F$*$-$^$9$,!"%0%k!<%W$N$9$Y$F$N5-;v$,4|8B@Z$l>C5n$NBP>]$K$J$C$F$7$^$C\e(B
-\e$B$?$H$-$K!"\e(B@code{nnshimbun} \e$B$O:G8e$N0lDL$@$1$O>C$5$:$K;D$7$F$*$-$^$9!#$3\e(B
-\e$B$l$O$"$J$?$NL$N}?4$rK~B-$5$;$k$?$a$G$O$J$/!"%5!<%P!<$+$i8E$$5-;v$r:F$S<h\e(B
-\e$BF@$7$F$7$^$o$J$$$?$a$N5gM>$N:v$J$N$G$9!#\e(B
-
-@code{nnshimbun} \e$B$N4|8B@Z$l>C5n$K4X78$9$k%0%k!<%W%Q%i%a!<%?$HJQ?t$O0J2<\e(B
-\e$B$NDL$j$G$9!#\e(B
-
-@table @code
-@item expiry-wait
-@cindex expiry-wait
-\e$B$I$&$+:.Mp$J$5$i$J$$$h$&$K!#\e(Bgnus \e$B$,Ds6!$7$F$$$kHFMQ$N%0%k!<%W%Q%i%a!<\e(B
-\e$B%?\e(B @code{expiry-wait} \e$B$HF1$8L>A0$G0UL#$bF1$8$b$N$,\e(B @code{nnshimbun} \e$B@lMQ\e(B
-\e$B$N%0%k!<%W%Q%i%a!<%?$K$bMQ0U$5$l$F$$$^$9!#$"$J$?$O$I$A$i$r;H$C$F$b9=$$$^\e(B
-\e$B$;$s!#$b$7\e(B @code{nnshimbun} \e$B@lMQ$N%0%k!<%W%Q%i%a!<%?$NJ}$r\e(B @code{nil} \e$B0J\e(B
-\e$B30$NCM$K@_Dj$9$k$H!"HFMQ$N%0%k!<%W%Q%i%a!<%?$NCM$h$j$bM%@h$7$F;H$o$l$^$9!#\e(B
-\e$B$3$l$O!"%0%k!<%W%P%C%U%!$G\e(B @kbd{G c} \e$B$r%?%$%W$7$?$H$-$K8=$l$kJT=82hLL$K\e(B
-\e$B$*$$$F!"\e(B@code{nnshimbun} \e$B$K4X78$9$k$b$N$r0l2U=j$K=8$a$k$?$a$H!"%f!<%6%*\e(B
-\e$B%W%7%g%s\e(B @code{nnshimbun-group-parameters-alist} \e$B$G0l3g$7$F4IM}$G$-$k$h\e(B
-\e$B$&$K$9$k$3$H$rL\E*$KMQ0U$7$?$b$N$G$9\e(B @footnote{\e$B$J\e(B
-\e$B$<\e(B @code{auto-expire} \e$B$J$I$b\e(B @code{nnshimbun} \e$B@lMQ$N%0%k!<%W%Q%i%a!<%?$K\e(B
-\e$B4^$a$F$*$$$F$/$l$J$$$N\e(B? \e$B$H$$$&Ld$$$KBP$9$kEz$($rMQ0U$7$F$$$^$9!#\e(B
-@code{expiry-wait} \e$B$r;2>H$9$k$N$,\e(B @code{nnshimbun} \e$B%P%C%/%(%s%I$J$N$KBP\e(B
-\e$B$7$F!"\e(B@code{auto-expire} \e$B$J$I$r;2>H$9$k$N$O\e(B Gnus \e$B$NK\BN$J$N$G$9$,!"K\BN\e(B
-\e$B$N5!G=$rFCDj$N%P%C%/%(%s%I$NLLE]$r8+$k$h$&$K3HD%$9$k$N$O!"\e(BGnus \e$B$N@_7W;W\e(B
-\e$BA[$KH?$7$F$$$k$+$i$G$9!#\e(B}\e$B!#@_Dj$G$-$kCM$OHFMQ$N%0%k!<%W%Q%i%a!<%?$HF1MM\e(B
-\e$B$K!";~8B>C5n$NF|?t!"\e(B@code{never} \e$B$^$?$O\e(B @code{immediate} \e$B$G$9!#\e(B
-
-@item nnshimbun-keep-unparsable-dated-articles
-@vindex nnshimbun-keep-unparsable-dated-articles
-\e$B$3$NJQ?t$NCM$,\e(B @code{nil} \e$B$G$J$$>l9g$O!":n@.$5$l$?$jAw?.$5$l$?;~9o$,$h$/\e(B
-\e$B$o$+$i$J$$5-;v$r4|8B@Z$l>C5n$7$^$;$s!#$J$K$7$m4|8B$,$o$+$i$J$$$s$G$9$+$i!#\e(B
-\e$B=i4|CM$O\e(B @code{t} \e$B$G$9$,!"\e(B@code{nil} \e$B$K$9$k$H4|8B@Z$l>C5n$N=hM}$,9T$J$o\e(B
-\e$B$l$k$H$-$K!"4|8B$,$o$+$i$J$$5-;v$G$bM-L5$r8@$o$:>C$7$F$7$^$$$^$9!#$^$"!"\e(B
-\e$BG/$NJk$l$NBgA]=|$N$H$-$K$G$b;H$C$F2<$5$$!#\e(B
-@end table
+@c This comment line is needed to prevent texinfmt bug. :-(
+\e$B$"$J$?$N%7%9%F%`$K$9$G$K\e(B emacs-w3m \e$B$,%$%s%9%H!<%k$5$l$F$$$k$N$J$i$P!"\e(B
+(@pxref{Nnshimbun, , Nnshimbun, emacs-w3m-ja, Emacs-w3m-ja}) \e$B$r;2>H$7$F\e(B
+\e$B2<$5$$!#\e(B
@node RSS
@subsection RSS
\e$B%&%#%s%I%&@_Dj$G!">.$5$JDI2C$N%U%l!<%`$,\e(B picon \e$B$rI=<($9$k$?$a$K:n$i$l$k\e(B
\e$B$H$$$&;v$K$J$j$^$9!#$4Mw$NDL$j!"IaDL$N\e(B @code{1.0} \e$B:G>e0L;XDj$NBe$o$j$K!"\e(B
\e$B$=$l$>$l$NDI2C$NJ,3d$,%U%l!<%`%Q%i%a!<%?O"A[%j%9%H$rBg$-$5;XDj$H$7$F;}$?\e(B
-\e$B$J$1$l$P$J$j$^$;$s!#\e(B@xref{Frame Parameters, , Frame Parameters, elisp,
-The GNU Emacs Lisp Reference Manual}\e$B!#\e(BXEmacs \e$B$G$O!"%U%l!<%`%W%m%Q%F%#%j\e(B
+\e$B$J$1$l$P$J$j$^$;$s\e(B (@pxref{Frame Parameters, , Frame Parameters, elisp,
+The GNU Emacs Lisp Reference Manual})\e$B!#\e(BXEmacs \e$B$G$O!"%U%l!<%`%W%m%Q%F%#%j\e(B
\e$B%9%H$b;H$($^$9\e(B---\e$BNc$($P!"\e(B@code{(height 5 width 15 left -1 top 1)} \e$B$O$=$N\e(B
\e$B$h$&$J%Q%i%a!<%?%j%9%H$G$9!#\e(B
@code{gnus-buffer-configuration} \e$B$K;HMQ2DG=$JA4$F$N%-!<$N0lMw$O$=$N=i4|\e(B
\e$B$G\e(B @kbd{D g} \e$B$r;H$&$H40A4$J\e(B Sieve \e$B%9%/%j%W%H$,@8@.$5$l$^$9!#$=$&$7$?$i!"\e(B
\e$B@8@.$5$l$?\e(B Sieve \e$B%P%C%U%!$G\e(B @kbd{C-c C-l} \e$B$r;H$C$F!"%5!<%P!<$K%"%C%W%m!<\e(B
\e$B%I$7$F2<$5$$!#\e(B@xref{Sieve Commands}\e$B!"$=$l$K?7$7$$\e(B Sieve \e$B$N%^%K%e%"\e(B
-\e$B%k\e(B @ref{Top, , Top, sieve, Emacs Sieve} \e$B$r;2>H$7$F2<$5$$!#\e(B
+\e$B%k\e(B (@pxref{Top, , Top, sieve, Emacs Sieve}) \e$B$r;2>H$7$F2<$5$$!#\e(B
@item
\e$B3HD%$5$l$?%U%)!<%^%C%H$N;EMM\e(B (format specs)\e$B!#\e(B