+Wed Dec 2 01:43:48 1998 Lars Magne Ingebrigtsen <larsi@menja.ifi.uio.no>
+
+ * gnus.el: Pterodactyl Gnus v0.59 is released.
+
+1998-12-02 01:38:31 Lars Magne Ingebrigtsen <larsi@gnus.org>
+
+ * mml.el (mml-insert-mime-headers): Beep at multiple charsets.
+
+ * gnus-art.el (gnus-mime-copy-part): Set buffer-file-name.
+
+1998-11-30 Hrvoje Niksic <hniksic@srce.hr>
+
+ * mml.el (mml-generate-mime-1): Handle unquoting end-tags.
+
+1998-12-02 00:15:30 Lars Magne Ingebrigtsen <larsi@gnus.org>
+
+ * mm-decode.el (mm-all-images-fit): New variable.
+ (mm-image-fit-p): Use it.
+
+ * gnus-art.el (gnus-mime-display-single): Use it.
+ (gnus-mime-internalize-part): New command and keystroke.
+
+ * mm-decode.el (mm-user-automatic-external-display): New
+ variable.
+ (mm-automatic-external-display-p): New function.
+
+ * gnus-picon.el (gnus-picons-xbm-face): Default to sensible
+ colors.
+
+1998-12-01 23:52:05 Lars Magne Ingebrigtsen <larsi@gnus.org>
+
+ * gnus-sum.el (gnus-summary-repair-multipart): Reselect article.
+
+ * gnus-art.el (gnus-with-article): Work in the original article
+ buffer.
+ (gnus-with-article): Work in read-only groups.
+
+Tue Dec 1 00:15:36 1998 Shenghuo ZHU <zsh@cs.rochester.edu>
+
+ * mm-bodies.el (mm-decode-string): Return original string if not
+ decode.
+
+Mon Nov 30 23:38:02 1998 Shenghuo ZHU <zsh@cs.rochester.edu>
+
+ * mm-uu.el (mm-uu-dissect): Use mm-make-handle.
+
+1998-12-01 01:53:49 François Pinard <pinard@iro.umontreal.ca>
+
+ * nndoc.el (nndoc-mime-parts-type-p): Do related.
+
Tue Dec 1 00:46:20 1998 Lars Magne Ingebrigtsen <larsi@menja.ifi.uio.no>
* gnus.el: Pterodactyl Gnus v0.58 is released.
b 'intangible (cddr (memq 'intangible props)))))
(defmacro gnus-with-article (article &rest forms)
- "Select ARTICLE, copy the contents of the original article buffer to a new buffer, and then perform FORMS there.
+ "Select ARTICLE and perform FORMS in the original article buffer.
Then replace the article with the result."
`(progn
;; We don't want the article to be marked as read.
(let (gnus-mark-article-hook)
(gnus-summary-select-article t t nil ,article))
(set-buffer gnus-original-article-buffer)
- (let ((buf (format "%s" (buffer-string))))
- (with-temp-buffer
- (insert buf)
- ,@forms
- (unless (gnus-request-replace-article
- ,article (car gnus-article-current)
- (current-buffer) t)
- (error "Couldn't replace article"))
- ;; The cache and backlog have to be flushed somewhat.
- (when gnus-keep-backlog
- (gnus-backlog-remove-article
- (car gnus-article-current) (cdr gnus-article-current)))
- ;; Flush original article as well.
- (save-excursion
- (when (get-buffer gnus-original-article-buffer)
- (set-buffer gnus-original-article-buffer)
- (setq gnus-original-article nil)))
- (when gnus-use-cache
- (gnus-cache-update-article
- (car gnus-article-current) (cdr gnus-article-current)))))))
+ ,@forms
+ (if (not (gnus-check-backend-function
+ 'request-replace-article (car gnus-article-current)))
+ (gnus-message 5 "Read-only group; not replacing")
+ (unless (gnus-request-replace-article
+ ,article (car gnus-article-current)
+ (current-buffer) t)
+ (error "Couldn't replace article")))
+ ;; The cache and backlog have to be flushed somewhat.
+ (when gnus-keep-backlog
+ (gnus-backlog-remove-article
+ (car gnus-article-current) (cdr gnus-article-current)))
+ (when gnus-use-cache
+ (gnus-cache-update-article
+ (car gnus-article-current) (cdr gnus-article-current)))))
(put 'gnus-with-article 'lisp-indent-function 1)
(put 'gnus-with-article 'edebug-form-spec '(form body))
(defvar gnus-mime-button-commands
'((gnus-article-press-button "\r" "Toggle Display")
- ;(gnus-mime-view-part "\M-\r" "View Interactively...")
(gnus-mime-view-part "v" "View Interactively...")
(gnus-mime-save-part "o" "Save...")
(gnus-mime-copy-part "c" "View As Text, In Other Buffer")
(gnus-mime-inline-part "i" "View As Text, In This Buffer")
+ (gnus-mime-internalize-part "E" "View Internally")
(gnus-mime-externalize-part "e" "View Externally")
(gnus-mime-pipe-part "|" "Pipe To Command...")))
(interactive)
(gnus-article-check-buffer)
(let ((data (get-text-property (point) 'gnus-data))
- ;(url-standalone-mode (not gnus-plugged))
- )
+ (url-standalone-mode (not gnus-plugged)))
(mm-interactively-view-part data)))
(defun gnus-mime-copy-part (&optional handle)
(interactive)
(gnus-article-check-buffer)
(let* ((handle (or handle (get-text-property (point) 'gnus-data)))
- (contents (mm-get-part handle))
- (buffer (generate-new-buffer
- (file-name-nondirectory
- (or
- (mail-content-type-get (mm-handle-type handle) 'name)
- (mail-content-type-get (mm-handle-type handle)
- 'filename)
- "*decoded*")))))
+ (contents (mm-get-part handle))|
+ (base (file-name-nondirectory
+ (or
+ (mail-content-type-get (mm-handle-type handle) 'name)
+ (mail-content-type-get (mm-handle-type handle)
+ 'filename)
+ "*decoded*")))
+ (buffer (generate-new-buffer base)))
(switch-to-buffer buffer)
(insert contents)
- (normal-mode)
+ ;; We do it this way to make `normal-mode' set the appropriate mode.
+ (unwind-protect
+ (progn
+ (setq buffer-file-name (expand-file-name base))
+ (normal-mode))
+ (setq buffer-file-name nil))
(goto-char (point-min))))
(defun gnus-mime-inline-part (&optional charset)
(gnus-article-check-buffer)
(let* ((data (get-text-property (point) 'gnus-data))
contents
- ;(url-standalone-mode (not gnus-plugged))
+ (url-standalone-mode (not gnus-plugged))
(b (point))
buffer-read-only)
(if (mm-handle-undisplayer data)
(goto-char b))))
(defun gnus-mime-externalize-part (&optional handle)
- "Insert the MIME part under point into the current buffer."
+ "View the MIME part under point with an external viewer."
(interactive)
(gnus-article-check-buffer)
(let* ((handle (or handle (get-text-property (point) 'gnus-data)))
- ;(url-standalone-mode (not gnus-plugged))
+ (url-standalone-mode (not gnus-plugged))
(mm-user-display-methods nil)
+ (mm-all-images-fit t)
+ (rfc2047-default-charset gnus-newsgroup-default-charset)
+ (mm-charset-iso-8859-1-forced gnus-newsgroup-iso-8859-1-forced))
+ (if (mm-handle-undisplayer handle)
+ (mm-remove-part handle)
+ (mm-display-part handle))))
+
+(defun gnus-mime-internalize-part (&optional handle)
+ "View the MIME part under point with an internal viewer."
+ (interactive)
+ (gnus-article-check-buffer)
+ (let* ((handle (or handle (get-text-property (point) 'gnus-data)))
+ (url-standalone-mode (not gnus-plugged))
+ (mm-user-display-methods '(".*"))
(rfc2047-default-charset gnus-newsgroup-default-charset)
(mm-charset-iso-8859-1-forced gnus-newsgroup-iso-8859-1-forced))
(if (mm-handle-undisplayer handle)
(when (string-match (pop ignored) type)
(throw 'ignored nil)))
(if (and (mm-automatic-display-p type)
- (mm-inlinable-part-p type)
+ (or (mm-inlinable-part-p type)
+ (mm-automatic-external-display-p type))
(setq not-attachment
(or (not (mm-handle-disposition handle))
(equal (car (mm-handle-disposition handle))
(string))
:group 'picons)
-(defface gnus-picons-xbm-face '((t (:foreground "black" :background "white")))
- "Face to show X face"
+(defface gnus-picons-xbm-face
+ '((((background dark))
+ (:foreground "green" :background "black"))
+ (t
+ (:foreground "black" :background "blue")))
+ "Face to show xbm picons in."
:group 'picons)
;;; Internal variables:
(insert (format "Content-Type: multipart/mixed; boundary=\"%s\"\n"
separator))
(insert "Mime-Version: 1.0\n")
- (widen)))))
+ (widen))))
+ (let (gnus-mark-article-hook)
+ (gnus-summary-select-article t t nil article)))
(defun gnus-summary-toggle-display-buttonized ()
"Toggle the buttonizing of the article buffer."
:link '(custom-manual "(gnus)Exiting Gnus")
:group 'gnus)
-(defconst gnus-version-number "0.58"
+(defconst gnus-version-number "0.59"
"Version number for this version of Gnus.")
(defconst gnus-version (format "Pterodactyl Gnus v%s" gnus-version-number)
(defun mm-decode-string (string charset)
"Decode STRING with CHARSET."
(setq charset (or charset rfc2047-default-charset))
- (when (featurep 'mule)
- (let (mule-charset)
- (when (and charset
- (setq mule-charset (mm-charset-to-coding-system charset))
- enable-multibyte-characters
- (or (not (eq mule-charset 'ascii))
- (setq mule-charset rfc2047-default-charset)))
- (mm-decode-coding-string string mule-charset)))))
+ (or
+ (when (featurep 'mule)
+ (let (mule-charset)
+ (when (and charset
+ (setq mule-charset (mm-charset-to-coding-system charset))
+ enable-multibyte-characters
+ (or (not (eq mule-charset 'ascii))
+ (setq mule-charset rfc2047-default-charset)))
+ (mm-decode-coding-string string mule-charset))))
+ string))
(provide 'mm-bodies)
'("text/plain" "text/enriched" "text/richtext" "text/html"
"image/.*" "message/delivery-status" "multipart/.*"))
+(defvar mm-user-automatic-external-display nil
+ "List of MIME type regexps that will be displayed externally automatically.")
+
(defvar mm-alternative-precedence
'("image/jpeg" "image/gif" "text/html" "text/enriched"
"text/richtext" "text/plain")
(defvar mm-tmp-directory "/tmp/"
"Where mm will store its temporary files.")
+(defvar mm-all-images-fit nil
+ "If non-nil, then all images fit in the buffer.")
+
;;; Internal variables.
(defvar mm-dissection-list nil)
methods nil)))
result))
+(defun mm-automatic-external-display-p (type)
+ "Return the user-defined method for TYPE."
+ (let ((methods mm-user-automatic-external-display)
+ method result)
+ (while (setq method (pop methods))
+ (when (string-match method type)
+ (setq result t
+ methods nil)))
+ result))
+
(defun add-mime-display-method (type method)
"Make parts of TYPE be displayed with METHOD.
This overrides entries in the mailcap file."
(defun mm-image-fit-p (handle)
"Say whether the image in HANDLE will fit the current window."
(let ((image (mm-get-image handle)))
- (and (< (glyph-width image) (window-pixel-width))
- (< (glyph-height image) (window-pixel-height)))))
+ (or mm-all-images-fit
+ (and (< (glyph-width image) (window-pixel-width))
+ (< (glyph-height image) (window-pixel-height))))))
(provide 'mm-decode)
;; Copyright (c) 1998 by Shenghuo Zhu <zsh@cs.rochester.edu>
;; Author: Shenghuo Zhu <zsh@cs.rochester.edu>
-;; $Revision: 1.1.1.4 $
+;; $Revision: 1.1.1.5 $
;; Keywords: news postscript uudecode binhex shar
;; This file is not part of GNU Emacs, but the same permissions
(error nil))))
(if (> start-char text-start)
(push
- (list (mm-uu-copy-to-buffer text-start start-char)
- text-plain-type cte nil nil nil)
+ (mm-make-handle (mm-uu-copy-to-buffer text-start start-char)
+ text-plain-type cte)
result))
(push
(cond
((eq type 'postscript)
- (list (mm-uu-copy-to-buffer start-char end-char)
- '("application/postscript") nil nil nil nil))
+ (mm-make-handle (mm-uu-copy-to-buffer start-char end-char)
+ '("application/postscript")))
((eq type 'uu)
- (list (mm-uu-copy-to-buffer start-char end-char)
+ (mm-make-handle (mm-uu-copy-to-buffer start-char end-char)
(list (or (and file-name
(string-match "\\.[^\\.]+$" file-name)
(mailcap-extension-to-mime
"application/octet-stream"))
mm-uu-decode-function nil
(if (and file-name (not (equal file-name "")))
- (list "attachment" (cons 'filename file-name)))
- file-name))
+ (list "attachment" (cons 'filename file-name)))))
((eq type 'binhex)
- (list (mm-uu-copy-to-buffer start-char end-char)
+ (mm-make-handle (mm-uu-copy-to-buffer start-char end-char)
(list (or (and file-name
(string-match "\\.[^\\.]+$" file-name)
(mailcap-extension-to-mime
"application/octet-stream"))
mm-uu-binhex-decode-function nil
(if (and file-name (not (equal file-name "")))
- (list "attachment" (cons 'filename file-name)))
- file-name))
+ (list "attachment" (cons 'filename file-name)))))
((eq type 'shar)
- (list (mm-uu-copy-to-buffer start-char end-char)
- '("application/x-shar") nil nil nil nil)))
+ (mm-make-handle (mm-uu-copy-to-buffer start-char end-char)
+ '("application/x-shar"))))
result)
(setq text-start end-char))))
(when result
(if (> (point-max) (1+ text-start))
(push
- (list (mm-uu-copy-to-buffer text-start (point-max))
- text-plain-type cte nil nil nil)
+ (mm-make-handle (mm-uu-copy-to-buffer text-start (point-max))
+ text-plain-type cte)
result))
(setq result (cons "multipart/mixed" (nreverse result))))
result)))
(defun mml-generate-mime-1 (cont)
(cond
((eq (car cont) 'part)
- (let (coded encoding charset filename type parameters)
+ (let (coded encoding charset filename type)
(setq type (or (cdr (assq 'type cont)) "text/plain"))
(if (equal (car (split-string type "/")) "text")
(with-temp-buffer
;; Remove quotes from quoted tags.
(goto-char (point-min))
(while (re-search-forward
- "<#!+\\(part\\|multipart\\|external\\)" nil t)
+ "<#!+/?\\(part\\|multipart\\|external\\)" nil t)
(delete-region (+ (match-beginning 0) 2)
(+ (match-beginning 0) 3)))))
(setq charset (mm-encode-body)
(mml-parameter-string
cont '(name access-type expiration size permission)))
(not (equal type "text/plain")))
+ (when (listp charset)
+ (error
+ "Can't encode a part with several charsets. Insert a <#part>."))
(insert "Content-Type: " type)
(when charset
(insert "; " (mail-header-encode-parameter
(limit (search-forward "\n\n" nil t)))
(goto-char (point-min))
(when (and limit
- (re-search-forward
- (concat "\
-^Content-Type:[ \t]*multipart/[a-z]+ *;\\(.*;\\)*"
- "[ \t\n]*[ \t]boundary=\"?[^\"\n]*[^\" \t\n]")
- limit t))
+ (re-search-forward
+ (concat "\
+^Content-Type:[ \t]*multipart/[a-z]+ *;\\(\\(\n[ \t]\\)?.*;\\)*"
+ "\\(\n[ \t]\\)?[ \t]*boundary=\"?[^\"\n]*[^\" \t\n]")
+ limit t))
t)))
(defun nndoc-transform-mime-parts (article)
(let* ((entry (cdr (assq article nndoc-dissection-alist)))
(headers (nth 5 entry)))
(when headers
- (goto-char (point-min))
+ (goto-char (point-min))
(insert headers))))
(defun nndoc-generate-mime-parts-head (article)
+1998-12-02 01:04:22 Lars Magne Ingebrigtsen <larsi@gnus.org>
+
+ * gnus.texi (Emacsen): Addition.
+
1998-12-01 00:27:04 Lars Magne Ingebrigtsen <larsi@gnus.org>
* emacs-mime.texi (rfc2045): New.
@end table
Currently, @code{mail-parse} is an abstraction over @code{ietf-drums},
-@code{rfc2047} and @code{rfc2231}. These are documented in the
-subsequent sections.
+@code{rfc2047}, @code{rfc2045} and @code{rfc2231}. These are documented
+in the subsequent sections.
\input texinfo @c -*-texinfo-*-
@setfilename gnus
-@settitle Pterodactyl Gnus 0.58 Manual
+@settitle Pterodactyl Gnus 0.59 Manual
@synindex fn cp
@synindex vr cp
@synindex pg cp
@tex
@titlepage
-@title Pterodactyl Gnus 0.58 Manual
+@title Pterodactyl Gnus 0.59 Manual
@author by Lars Magne Ingebrigtsen
@page
spool or your mbox file. All at the same time, if you want to push your
luck.
-This manual corresponds to Pterodactyl Gnus 0.58.
+This manual corresponds to Pterodactyl Gnus 0.59.
@end ifinfo
@itemize @bullet
@item
-Emacs 20.2 and up.
+Emacs 20.3 and up.
@item
XEmacs 20.4 and up.
@end itemize
-Gnus will absolutely not work on any Emacsen older than that. Not
-reliably, at least.
+This Gnus version will absolutely not work on any Emacsen older than
+that. Not reliably, at least. Older versions of Gnus may work on older
+Emacs versions.
There are some vague differences between Gnus on the various
platforms---XEmacs features more graphics (a logo and a toolbar)---but
\input texinfo @c -*-texinfo-*-
@setfilename message
-@settitle Pterodactyl Message 0.58 Manual
+@settitle Pterodactyl Message 0.59 Manual
@synindex fn cp
@synindex vr cp
@synindex pg cp
@tex
@titlepage
-@title Pterodactyl Message 0.58 Manual
+@title Pterodactyl Message 0.59 Manual
@author by Lars Magne Ingebrigtsen
@page
* Key Index:: List of Message mode keys.
@end menu
-This manual corresponds to Pterodactyl Message 0.58. Message is
+This manual corresponds to Pterodactyl Message 0.59. Message is
distributed with the Gnus distribution bearing the same version number
as this manual.