Sync
[elisp/gnus.git-] / lisp / nnshimbun.el
index 682e370..71a9e8d 100644 (file)
      (contents-end   . "<!--BODYEND-->"))
     ))
 
+(defvar nnshimbun-x-face-alist
+  '(("default" .
+     (("default" .
+       "X-Face: Ygq$6P.,%Xt$U)DS)cRY@k$VkW!7(X'X'?U{{osjjFG\"E]hND;SPJ-J?O?R|a?L
+       g2$0rVng=O3Lt}?~IId8Jj&vP^3*o=LKUyk(`t%0c!;t6REk=JbpsEn9MrN7gZ%"))))
+  "Alist of server vs. alist of group vs. X-Face field.  It looks like:
+
+\((\"asahi\" . ((\"national\" . \"X-face: ***\")
+            (\"business\" . \"X-Face: ***\")
+               ;;
+               ;;
+            (\"default\" . \"X-face: ***\")))
+ (\"sponichi\" . ((\"baseball\" . \"X-face: ***\")
+               (\"soccer\" . \"X-Face: ***\")
+               ;;
+               ;;
+               (\"default\" . \"X-face: ***\")))
+               ;;
+ (\"default\" . ((\"default\" . \"X-face: ***\")))")
+
 (defvoo nnshimbun-directory (nnheader-concat gnus-directory "shimbun/")
   "Where nnshimbun will save its files.")
 
 (defvoo nnshimbun-pre-fetch-article nil
   "*Non nil means that nnshimbun fetch unread articles when scanning groups.")
 
-;; set by nnshimbun-possibly-change-server
+;; set by nnshimbun-possibly-change-group
 (defvoo nnshimbun-buffer nil)
 (defvoo nnshimbun-current-directory nil)
 (defvoo nnshimbun-current-group nil)
                           (set-buffer (nnshimbun-open-nov group))
                           (and (nnheader-find-nov-line article)
                                (nnheader-parse-nov))))
-       (let ((xref (substring (mail-header-xref header) 6)))
+       (let* ((xref (substring (mail-header-xref header) 6))
+              (x-faces (cdr (or (assoc (or server
+                                           (nnoo-current-server 'nnshimbun))
+                                       nnshimbun-x-face-alist)
+                                (assoc "default" nnshimbun-x-face-alist))))
+              (x-face (cdr (or (assoc group x-faces)
+                               (assoc "default" x-faces)))))
          (save-excursion
            (set-buffer nnshimbun-buffer)
            (erase-buffer)
            (nnshimbun-retrieve-url xref)
            (nnheader-message 6 "nnshimbun: Make contents...")
            (goto-char (point-min))
-           (setq contents (funcall nnshimbun-make-contents header))
+           (setq contents (funcall nnshimbun-make-contents header x-face))
            (nnheader-message 6 "nnshimbun: Make contents...done"))))
       (when contents
        (save-excursion
   (nnshimbun-generate-nov-database group))
 
 (deffoo nnshimbun-close-group (group &optional server)
+  (nnshimbun-write-nov group)
   t)
 
 (deffoo nnshimbun-request-list (&optional server)
 
 (defun nnshimbun-generate-nov-database (group)
   (prog1 (funcall nnshimbun-generate-nov group)
-    (save-excursion
-      (set-buffer (nnshimbun-open-nov group))
-      (when (buffer-modified-p)
-       (nnmail-write-region 1 (point-max) nnshimbun-nov-buffer-file-name
-                            nil 'nomesg)))))
+    (nnshimbun-write-nov group)))
 
 (defun nnshimbun-generate-nov-for-each-group (group)
   (nnshimbun-possibly-change-group group)
       (goto-char (point-max))
       (forward-line -1)
       (setq i (or (ignore-errors (read (current-buffer))) 0))
-      (goto-char (point-max))
       (dolist (header (save-excursion
                        (set-buffer nnshimbun-buffer)
                        (erase-buffer)
                        (funcall nnshimbun-get-headers)))
        (unless (nnshimbun-search-id group (mail-header-id header))
          (mail-header-set-number header (setq i (1+ i)))
+         (goto-char (point-max))
          (nnheader-insert-nov header)
          (if nnshimbun-pre-fetch-article
              (nnshimbun-request-article-1 i group nil nnshimbun-buffer)))))))
              (goto-char (point-max))
              (forward-line -1)
              (setq i (or (ignore-errors (read (current-buffer))) 0))
-             (goto-char (point-max))
              (dolist (header (cdr list))
                (unless (nnshimbun-search-id group (mail-header-id header))
                  (mail-header-set-number header (setq i (1+ i)))
+                 (goto-char (point-max))
                  (nnheader-insert-nov header)
                  (if nnshimbun-pre-fetch-article
                      (nnshimbun-request-article-1 i group nil nnshimbun-buffer))))))))
       (nnshimbun-save-nov)
       (setq nnshimbun-nov-last-check (current-time)))))
 
-(defun nnshimbun-search-id (group id)
+(defun nnshimbun-search-id (group id &optional nov)
   (save-excursion
     (set-buffer (nnshimbun-open-nov group))
     (goto-char (point-min))
-    (let (number found)
+    (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)
-         (beginning-of-line)
-         (setq found t)
-         ;; We return the article number.
-         (setq number (ignore-errors (read (current-buffer))))))
-      number)))
+         (forward-line 0)
+         (setq found t)))
+      (unless found
+       (goto-char (point-min))
+       (when (search-forward (concat "X-Nnshimbun-Original-Id: " id) nil t)
+         (forward-line 0)
+         (setq found t)))
+      (if found
+         (if nov
+             (nnheader-parse-nov)
+           ;; We return the article number.
+           (ignore-errors (read (current-buffer))))))))
+
+(defun nnshimbun-nov-fix-header (group header args)
+  (save-excursion
+    (set-buffer (nnshimbun-open-nov group))
+    (when (nnheader-find-nov-line (mail-header-number header))
+      (dolist (arg args)
+       (if (eq (car arg) 'id)
+           (let ((extra (mail-header-extra header)) x)
+             (when (setq x (assq 'X-Nnshimbun-Original-Id extra))
+               (setq extra (delq x extra)))
+             (mail-header-set-extra
+              header
+              (cons (cons 'X-Nnshimbun-Original-Id (cdr arg)) extra)))
+         (let ((func (intern (concat "mail-header-set-" (symbol-name (car arg))))))
+           (if (cdr arg) (eval (list func header (cdr arg)))))))
+      (let ((xref (mail-header-xref header)))
+       (when (string-match "^Xref: " xref)
+         (mail-header-set-xref header (substring xref 6))))
+      (delete-region (point) (progn (forward-line 1) (point)))
+      (nnheader-insert-nov header))))
 
 (defun nnshimbun-open-nov (group)
   (let ((buffer (cdr (assoc group nnshimbun-nov-buffer-alist))))
       (push (cons group buffer) nnshimbun-nov-buffer-alist)
       buffer)))
 
+(defun nnshimbun-write-nov (group)
+  (let ((buffer (cdr (assoc group nnshimbun-nov-buffer-alist))))
+    (when (buffer-live-p buffer)
+      (save-excursion
+       (set-buffer buffer)
+       (buffer-modified-p)
+       (nnmail-write-region 1 (point-max) nnshimbun-nov-buffer-file-name
+                            nil 'nomesg)))))
+
 (defun nnshimbun-save-nov ()
   (save-excursion
     (while nnshimbun-nov-buffer-alist
          (aref [nil "Jan" "Feb" "Mar" "Apr" "May" "Jun"
                     "Jul" "Aug" "Sep" "Oct" "Nov" "Dec"]
                month)
-         year
+         (cond ((< year 69)
+                (+ year 2000))
+               ((< year 100)
+                (+ year 1900))
+               ((< year 1000)  ; possible 3-digit years.
+                (+ year 1900))
+               (t year))
          (or time "00:00")))
 
 (if (fboundp 'regexp-opt)
@@ -610,7 +675,8 @@ is enclosed by at least one regexp grouping construct."
 (defun nnshimbun-fill-line ()
   (forward-line 0)
   (let ((top (point)) chr)
-    (while (if (>= (move-to-column fill-column) fill-column)
+    (while (if (>= (move-to-column nnshimbun-fill-column)
+                  nnshimbun-fill-column)
               (not (progn
                      (if (memq (preceding-char) nnshimbun-kinsoku-eol-list)
                          (progn
@@ -653,7 +719,7 @@ is enclosed by at least one regexp grouping construct."
     (delete-region (point) (point-max)))
   (insert "\n"))
 
-(defun nnshimbun-make-text-or-html-contents (header)
+(defun nnshimbun-make-text-or-html-contents (header &optional x-face)
   (let ((case-fold-search t) (html t) (start))
     (when (and (search-forward nnshimbun-contents-start nil t)
               (setq start (point))
@@ -665,11 +731,16 @@ is enclosed by at least one regexp grouping construct."
     (goto-char (point-min))
     (nnshimbun-insert-header header)
     (insert "Content-Type: " (if html "text/html" "text/plain")
-           "; charset=ISO-2022-JP\nMIME-Version: 1.0\n\n")
+           "; charset=ISO-2022-JP\nMIME-Version: 1.0\n")
+    (when x-face
+      (insert x-face)
+      (unless (bolp)
+       (insert "\n")))
+    (insert "\n")
     (encode-coding-string (buffer-string)
                          (mime-charset-to-coding-system "ISO-2022-JP"))))
 
-(defun nnshimbun-make-html-contents (header)
+(defun nnshimbun-make-html-contents (header &optional x-face)
   (let (start)
     (when (and (search-forward nnshimbun-contents-start nil t)
               (setq start (point))
@@ -678,7 +749,13 @@ is enclosed by at least one regexp grouping construct."
       (delete-region (- (point) (length nnshimbun-contents-end)) (point-max)))
     (goto-char (point-min))
     (nnshimbun-insert-header header)
-    (insert "Content-Type: text/html; charset=ISO-2022-JP\nMIME-Version: 1.0\n\n")
+    (insert "Content-Type: text/html; charset=ISO-2022-JP\n"
+           "MIME-Version: 1.0\n")
+    (when x-face
+      (insert x-face)
+      (unless (bolp)
+       (insert "\n")))
+    (insert "\n")
     (encode-coding-string (buffer-string)
                          (mime-charset-to-coding-system "ISO-2022-JP"))))
 
@@ -710,7 +787,7 @@ is enclosed by at least one regexp grouping construct."
                                (buffer-substring
                                 (match-end 0)
                                 (progn (search-forward "<br>" nil t) (point)))
-                               "<[^>]+>")
+                               "\\(<[^>]+>\\|\r\\)")
                               ""))
                   nnshimbun-from-address
                   "" id "" 0 0 (concat nnshimbun-url url))