*** empty log message ***
[gnus] / lisp / nndoc.el
index 60d21cf..5554628 100644 (file)
 (defvar nndoc-article-type 'mbox
   "*Type of the file - one of `mbox', `babyl' or `digest'.")
 
+(defvar nndoc-digest-type 'traditional
+  "Type of the last digest.  Auto-detected from the article header.
+Possible values:
+  `traditional' -- the \"lots of dashes\" (30+) rules used;
+                   we currently also do unconditional RFC 934 unquoting.
+  `rfc1341' -- RFC 1341 digest (MIME, unique boundary, no quoting).")
+
 (defconst nndoc-type-to-regexp
   (list (list 'mbox 
              (concat "^" rmail-unix-mail-delimiter)
              (concat "^" rmail-unix-mail-delimiter)
              nil "^$" nil nil nil)
-       (list 'babyl "\^_\^L *\n" "\^_" nil "^$" nil nil
+       (list 'babyl "\^_\^L *\n" "\^_" "^[0-9].*\n" "^$" nil nil
              "\\*\\*\\* EOOH \\*\\*\\*\n\\(^.+\n\\)*")
        (list 'digest
              "^------------------------------*[\n \t]+"
                sequence (cdr sequence)))
 
        ;; Fold continuation lines.
+       (set-buffer nntp-server-buffer)
        (goto-char (point-min))
        (while (re-search-forward "\\(\r?\n[ \t]+\\)+" nil t)
          (replace-match " " t t))
       (if (stringp article)
          nil
        (nndoc-insert-article article)
+       ;; Unquote quoted non-separators in digests.
+       (if (and (eq nndoc-article-type 'digest)
+                (eq nndoc-digest-type 'traditional))
+           (progn
+             (goto-char (point-min))
+             (while (re-search-forward "^- -"nil t)
+               (replace-match "-" t t))))
        t))))
 
 (defun nndoc-request-group (group &optional server dont-check)
        (progn
          (setq nndoc-status-string "No such file or buffer")
          nil)
+      (nndoc-set-header-dependent-regexps) ; hack for MIME digests
       (if dont-check
          t
        (save-excursion
          (insert-buffer-substring nndoc-address))
        t)))))
 
+;; MIME (RFC 1341) digest hack by Ulrik Dickow <dickow@nbi.dk>.
+(defun nndoc-set-header-dependent-regexps ()
+  (if (not (eq nndoc-article-type 'digest))
+      ()
+    (let ((case-fold-search t)     ; We match a bit too much, keep it simple.
+         (boundary-id) (b-delimiter))
+      (save-excursion
+       (set-buffer nndoc-current-buffer)
+       (goto-char (point-min))
+       (if (and
+            (re-search-forward
+             (concat "\n\n\\|^Content-Type: multipart/digest;[ \t\n]*[ \t]"
+                     "boundary=\"\\([^\"\n]*[^\" \t\n]\\)\"")
+             nil t)
+            (match-beginning 1))
+           (setq nndoc-digest-type 'rfc1341
+                 boundary-id (buffer-substring-no-properties
+                              (match-beginning 1) (match-end 1))
+                 b-delimiter       (concat "\n--" boundary-id "[\n \t]+")
+                 nndoc-article-begin b-delimiter ; Too strict: "[ \t]*$"
+                 nndoc-article-end (concat "\n--" boundary-id
+                                           "\\(--\\)?[\n \t]+")
+                 nndoc-first-article b-delimiter ; ^eof ends article too.
+                 nndoc-end-of-file (concat "\n--" boundary-id "--[ \t]*$"))
+         (setq nndoc-digest-type 'traditional))))))
+
 (defun nndoc-forward-article (n)
   (while (and (> n 0)
              (re-search-forward nndoc-article-begin nil t)
                  (match-beginning 0))
             (point-max)))
        (goto-char (point-min))
+       (and nndoc-head-begin
+            (re-search-forward nndoc-head-begin nil t)
+            (narrow-to-region (point) (point-max)))
        (or (re-search-forward nndoc-head-end nil t)
            (goto-char (point-max)))
        (append-to-buffer ibuf (point-min) (point))