bug#34387: 26.1; Gnus: handle empty message parts

classic Classic list List threaded Threaded
11 messages Options
Reply | Threaded
Open this post in threaded view
|

bug#34387: 26.1; Gnus: handle empty message parts

Christophe TROESTLER-11
Hi,

Some messages only contain an attachment (no body) and (gnus-article-prepare-display) choke on the empty part.  More specifically, `gnus-mime-display-single' does (narrow-to-region beg (point)) which fails if the part is empty.  An easy fix is to write

      (when (< beg (point))
        (narrow-to-region beg (point))
        (if (eq handle gnus-article-mime-handles)
          ...))



In GNU Emacs 26.1 (build 2, x86_64-pc-linux-gnu, GTK+ Version 3.24.2)
 of 2018-12-26, modified by Debian built on x86-ubc-01
Windowing system distributor 'The X.Org Foundation', version 11.0.12003000
System Description: Debian GNU/Linux buster/sid

Recent messages:
(No changes need to be saved)
Mark set
Saved text from "(defun gnus-mime-display-single (handle)"
Mark set [2 times]
gnus-mime-display-single
Back to top level
Quit
gnus-mime-display-single
Mark saved where search started
Making completion list... [2 times]

Configured using:
 'configure --build x86_64-linux-gnu --prefix=/usr
 --sharedstatedir=/var/lib --libexecdir=/usr/lib
 --localstatedir=/var/lib --infodir=/usr/share/info
 --mandir=/usr/share/man --enable-libsystemd --with-pop=yes
 --enable-locallisppath=/etc/emacs:/usr/local/share/emacs/26.1/site-lisp:/usr/local/share/emacs/site-lisp:/usr/share/emacs/26.1/site-lisp:/usr/share/emacs/site-lisp
 --with-sound=alsa --without-gconf --with-mailutils --build
 x86_64-linux-gnu --prefix=/usr --sharedstatedir=/var/lib
 --libexecdir=/usr/lib --localstatedir=/var/lib
 --infodir=/usr/share/info --mandir=/usr/share/man --enable-libsystemd
 --with-pop=yes
 --enable-locallisppath=/etc/emacs:/usr/local/share/emacs/26.1/site-lisp:/usr/local/share/emacs/site-lisp:/usr/share/emacs/26.1/site-lisp:/usr/share/emacs/site-lisp
 --with-sound=alsa --without-gconf --with-mailutils --with-x=yes
 --with-x-toolkit=gtk3 --with-toolkit-scroll-bars 'CFLAGS=-g -O2
 -fdebug-prefix-map=/build/emacs-3ThesY/emacs-26.1+1=. -fstack-protector-strong
 -Wformat -Werror=format-security -Wall' 'CPPFLAGS=-Wdate-time
 -D_FORTIFY_SOURCE=2' LDFLAGS=-Wl,-z,relro'

Configured features:
XPM JPEG TIFF GIF PNG RSVG IMAGEMAGICK SOUND GPM DBUS GSETTINGS NOTIFY
ACL LIBSELINUX GNUTLS LIBXML2 FREETYPE M17N_FLT LIBOTF XFT ZLIB
TOOLKIT_SCROLL_BARS GTK3 X11 THREADS LIBSYSTEMD LCMS2

Important settings:
  value of $LC_MESSAGES: en_US.UTF-8
  value of $LC_NUMERIC: en_US.UTF-8
  value of $LANG: en_US.UTF-8
  locale-coding-system: utf-8-unix

Major mode: mu4e:view

Minor modes in effect:
  visual-fill-column-mode: t
  TeX-PDF-mode: t
  global-magit-file-mode: t
  diff-auto-refine-mode: t
  magit-auto-revert-mode: t
  global-git-commit-mode: t
  async-bytecomp-package-mode: t
  shell-dirtrack-mode: t
  desktop-save-mode: t
  show-paren-mode: t
  global-edit-server-edit-mode: t
  tooltip-mode: t
  global-eldoc-mode: t
  electric-indent-mode: t
  mouse-wheel-mode: t
  menu-bar-mode: t
  file-name-shadow-mode: t
  global-font-lock-mode: t
  font-lock-mode: t
  auto-composition-mode: t
  auto-encryption-mode: t
  auto-compression-mode: t
  buffer-read-only: t
  column-number-mode: t
  line-number-mode: t
  visual-line-mode: t
  transient-mark-mode: t

Load-path shadows:
~/software/OCaml/dune/editor-integration/emacs/dune-flymake hides /home/trch/.opam/4.06.1/share/emacs/site-lisp/dune-flymake
~/software/OCaml/dune/editor-integration/emacs/dune hides /home/trch/.opam/4.06.1/share/emacs/site-lisp/dune
/home/trch/.emacs.d/elpa/debian-el-20181020.1513/deb-view hides /usr/share/emacs/site-lisp/elpa/debian-el-37/deb-view
/home/trch/.emacs.d/elpa/debian-el-20181020.1513/debian-bug hides /usr/share/emacs/site-lisp/elpa/debian-el-37/debian-bug
/home/trch/.emacs.d/elpa/debian-el-20181020.1513/apt-utils hides /usr/share/emacs/site-lisp/elpa/debian-el-37/apt-utils
/home/trch/.emacs.d/elpa/debian-el-20181020.1513/preseed hides /usr/share/emacs/site-lisp/elpa/debian-el-37/preseed
/home/trch/.emacs.d/elpa/debian-el-20181020.1513/apt-sources hides /usr/share/emacs/site-lisp/elpa/debian-el-37/apt-sources
/home/trch/.emacs.d/elpa/debian-el-20181020.1513/debian-autoloads hides /usr/share/emacs/site-lisp/elpa/debian-el-37/debian-autoloads
/home/trch/.emacs.d/elpa/debian-el-20181020.1513/debian-el hides /usr/share/emacs/site-lisp/elpa/debian-el-37/debian-el
/home/trch/.emacs.d/elpa/debian-el-20181020.1513/debian-el-autoloads hides /usr/share/emacs/site-lisp/elpa/debian-el-37/debian-el-autoloads
/home/trch/.emacs.d/elpa/debian-el-20181020.1513/gnus-BTS hides /usr/share/emacs/site-lisp/elpa/debian-el-37/gnus-BTS
/home/trch/.emacs.d/elpa/debian-el-20181020.1513/debian-el-pkg hides /usr/share/emacs/site-lisp/elpa/debian-el-37/debian-el-pkg
/home/trch/.emacs.d/elpa/debian-el-20181020.1513/deb-view hides /usr/share/emacs/site-lisp/elpa-src/debian-el-37/deb-view
/home/trch/.emacs.d/elpa/debian-el-20181020.1513/apt-utils hides /usr/share/emacs/site-lisp/elpa-src/debian-el-37/apt-utils
/home/trch/.emacs.d/elpa/debian-el-20181020.1513/preseed hides /usr/share/emacs/site-lisp/elpa-src/debian-el-37/preseed
/home/trch/.emacs.d/elpa/debian-el-20181020.1513/debian-bug hides /usr/share/emacs/site-lisp/elpa-src/debian-el-37/debian-bug
/home/trch/.emacs.d/elpa/debian-el-20181020.1513/apt-sources hides /usr/share/emacs/site-lisp/elpa-src/debian-el-37/apt-sources
/home/trch/.emacs.d/elpa/debian-el-20181020.1513/debian-autoloads hides /usr/share/emacs/site-lisp/elpa-src/debian-el-37/debian-autoloads
/home/trch/.emacs.d/elpa/debian-el-20181020.1513/debian-el hides /usr/share/emacs/site-lisp/elpa-src/debian-el-37/debian-el
/home/trch/.emacs.d/elpa/debian-el-20181020.1513/debian-el-autoloads hides /usr/share/emacs/site-lisp/elpa-src/debian-el-37/debian-el-autoloads
/home/trch/.emacs.d/elpa/debian-el-20181020.1513/gnus-BTS hides /usr/share/emacs/site-lisp/elpa-src/debian-el-37/gnus-BTS
/home/trch/.emacs.d/elpa/debian-el-20181020.1513/debian-el-pkg hides /usr/share/emacs/site-lisp/elpa-src/debian-el-37/debian-el-pkg

Features:
(shadow emacsbug network-stream starttls mailalias face-remap timezone
cl-print debug cus-start cus-load view cal-china lunar solar cal-dst
cal-islam holidays hol-loaddefs cal-move reftex-parse misearch
multi-isearch sh-script executable texmathp qp visual-fill-column sort
gnus-cite smiley shr-color color shr svg dom mm-archive mail-extr
make-mode org-rmail org-mhe org-irc org-info org-gnus nnir org-docview
org-bibtex org-bbdb org-w3m latexenc tuareg caml caml-help reftex-auc
preview prv-emacs tex-buf reftex-dcr reftex reftex-loaddefs reftex-vars
flyspell ispell latex latex-flymake tex-ispell tex-style tex-mode vc-git
elec-pair font-latex tex dbus xml bibtex dune-flymake flymake-proc
flymake compile warnings dune skeleton smie utop utop-minor-mode pcase
merlin-cap merlin caml-types caml-emacs magit-gh-pulls subr-x s gh
gh-users gh-issues gh-pulls gh-repos gh-comments gh-gist gh-oauth gh-api
logito gh-cache pcache eieio-base gh-auth gh-url url-http url url-proxy
url-privacy url-expand url-methods url-history url-auth url-cookie
url-domsuf url-util url-gw nsm gh-profile json map magit-submodule
magit-obsolete magit-blame magit-stash magit-bisect magit-push
magit-pull magit-fetch magit-clone magit-remote magit-commit
magit-sequence magit-notes magit-worktree magit-tag magit-merge
magit-branch magit-reset magit-files magit-refs magit-status magit
magit-repos magit-apply magit-wip magit-log which-func imenu magit-diff
smerge-mode diff-mode magit-core magit-autorevert magit-process
magit-margin magit-mode git-commit magit-git magit-section magit-utils
magit-popup crm log-edit pcvs-util add-log with-editor cl-extra
async-bytecomp async shell dash erc-goodies erc erc-backend erc-compat
pp org-mu4e gnus-icalendar org-capture mu4e-contrib mu4e desktop
frameset mu4e-speedbar speedbar sb-image ezimage dframe mu4e-main
mu4e-view thingatpt browse-url gnus-art mm-uu mml2015 mm-view mml-smime
smime dig mailcap gnus-sum gnus-group gnus-undo gnus-start gnus-cloud
nnimap nnmail mail-source tls gnutls utf7 netrc nnoo parse-time
gnus-spec gnus-int gnus-range gnus-win gnus nnheader wid-edit
mu4e-headers mu4e-compose mu4e-context mu4e-draft mu4e-actions ido
rfc2368 smtpmail sendmail mu4e-mark mu4e-message flow-fill mu4e-proc
mu4e-utils doc-view jka-compr image-mode mu4e-lists mu4e-vars message
rmc puny dired dired-loaddefs rfc822 mml mml-sec gnus-util rmail
rmail-loaddefs mm-decode mm-bodies mm-encode mail-parse rfc2231 rfc2047
rfc2045 ietf-drums mailabbrev mail-utils gmm-utils mailheader hl-line
mu4e-meta adoc-mode tempo markup-faces org-element avl-tree generator
org org-macro org-footnote org-pcomplete pcomplete org-list org-faces
org-entities noutline outline easy-mmode org-version ob-emacs-lisp ob
ob-tangle org-src ob-ref ob-lob ob-table ob-keys ob-exp ob-comint comint
ansi-color ring ob-core ob-eval org-compat org-macs org-loaddefs
format-spec find-func epa-file epa derived epg cl quail help-mode
mm-util mail-prsvr autorevert filenotify edmacro kmacro paren icalendar
diary-lib diary-loaddefs cal-menu calendar cal-loaddefs edit-server
advice server finder-inf rx tex-site debian-el gh-common marshal
eieio-compat info package easymenu epg-config url-handlers url-parse
auth-source cl-seq eieio eieio-core cl-macs eieio-loaddefs
password-cache url-vars seq byte-opt gv bytecomp byte-compile cconv
cl-loaddefs cl-lib time-date mule-util tooltip eldoc electric uniquify
ediff-hook vc-hooks lisp-float-type mwheel term/x-win x-win
term/common-win x-dnd tool-bar dnd fontset image regexp-opt fringe
tabulated-list replace newcomment text-mode elisp-mode lisp-mode
prog-mode register page menu-bar rfn-eshadow isearch timer select
scroll-bar mouse jit-lock font-lock syntax facemenu font-core
term/tty-colors frame cl-generic cham georgian utf-8-lang misc-lang
vietnamese tibetan thai tai-viet lao korean japanese eucjp-ms cp51932
hebrew greek romanian slovak czech european ethiopic indian cyrillic
chinese composite charscript charprop case-table epa-hook jka-cmpr-hook
help simple abbrev obarray minibuffer cl-preloaded nadvice loaddefs
button faces cus-face macroexp files text-properties overlay sha1 md5
base64 format env code-pages mule custom widget hashtable-print-readable
backquote dbusbind inotify lcms2 dynamic-setting system-font-setting
font-render-setting move-toolbar gtk x-toolkit x multi-tty
make-network-process emacs)

Memory information:
((conses 16 699181 113871)
 (symbols 48 59955 1)
 (miscs 40 3906 2143)
 (strings 32 212031 19012)
 (string-bytes 1 6376648)
 (vectors 16 80239)
 (vector-slots 8 2307806 160564)
 (floats 8 1465 2911)
 (intervals 56 9982 2963)
 (buffers 992 403))



Reply | Threaded
Open this post in threaded view
|

bug#34387: Acknowledgement (26.1; Gnus: handle empty message parts)

Christophe TROESTLER-11
For those who encounter this problem, a fix that does not require to modify the body of the function gnus-mime-display-single is:

(define-advice gnus-mime-display-single (:around (oldfn &rest handle) fix)
  "Protect against bad handling of empty message parts."
  (ignore-errors (apply oldfn handle)))



Reply | Threaded
Open this post in threaded view
|

bug#34387: 26.1; Gnus: handle empty message parts

Katsumi Yamaoka
In reply to this post by Christophe TROESTLER-11
On Fri, 08 Feb 2019 15:58:19 +0100, Christophe Troestler wrote:
> Some messages only contain an attachment (no body) and
> (gnus-article-prepare-display) choke on the empty part.
> More specifically, `gnus-mime-display-single' does
> (narrow-to-region beg (point)) which fails if the part is empty.

Could you let me know how it fails?  Otherwise, could you show
me a sample email in question?  Unfortunately I'm not successful
in making such an email that causes the problem so far, and trying
(narrow-to-region beg beg) and (narrow-to-region (point) (point))
cause nothing special.

But I found at least two other kinds of problems in relation to
an empty attachment:

1. In the article buffer, pressing the RET key on an empty
 text/plain attachment conceals the succeeding other attachments,
 does not toggle.  `g' restores them of course, though.

2. Some kind of an empty mail isn't able to be edited using the
 `e' command (gnus-summary-edit-article), that is, a single part
 email whose body is an empty attachment.  Gnus misunderstands
 that the header is its body.

On Fri, 08 Feb 2019 16:39:47 +0100, Christophe Troestler wrote:
> For those who encounter this problem, a fix that does not require to
> modify the body of the function gnus-mime-display-single is:

> (define-advice gnus-mime-display-single (:around (oldfn &rest handle) fix)
>   "Protect against bad handling of empty message parts."
>   (ignore-errors (apply oldfn handle)))

I'd like to fix those problems in the Gnus code. :)

Thanks.
Regards,



Reply | Threaded
Open this post in threaded view
|

bug#34387: 26.1; Gnus: handle empty message parts

Christophe TROESTLER-11

On 12 February 2019 at 05:34 CET, Katsumi Yamaoka wrote:
>
> […] Could you let me know how it fails?

Here is the debugger trace (message attached) :

Debugger entered--Lisp error: (args-out-of-range 4409 4410)
  #f(compiled-function (handle) #<bytecode 0x1471e8d>)((#<buffer  *mm*-671873> ("text/html" (charset . "Windows-1252")) quoted-printable (lambda nil (let ((inhibit-read-only t)) (delete-region #<marker at 4408 in *Article*> #<marker at 4408 in *Article*>))) nil nil nil nil))
  apply(#f(compiled-function (handle) #<bytecode 0x1471e8d>) (#<buffer  *mm*-671873> ("text/html" (charset . "Windows-1252")) quoted-printable (lambda nil (let ((inhibit-read-only t)) (delete-region #<marker at 4408 in *Article*> #<marker at 4408 in *Article*>))) nil nil nil nil))
  gnus-mime-display-single@fix(#f(compiled-function (handle) #<bytecode 0x1471e8d>) (#<buffer  *mm*-671873> ("text/html" (charset . "Windows-1252")) quoted-printable (lambda nil (let ((inhibit-read-only t)) (delete-region #<marker at 4408 in *Article*> #<marker at 4408 in *Article*>))) nil nil nil nil))
  apply(gnus-mime-display-single@fix #f(compiled-function (handle) #<bytecode 0x1471e8d>) (#<buffer  *mm*-671873> ("text/html" (charset . "Windows-1252")) quoted-printable (lambda nil (let ((inhibit-read-only t)) (delete-region #<marker at 4408 in *Article*> #<marker at 4408 in *Article*>))) nil nil nil nil))
  gnus-mime-display-single((#<buffer  *mm*-671873> ("text/html" (charset . "Windows-1252")) quoted-printable (lambda nil (let ((inhibit-read-only t)) (delete-region #<marker at 4408 in *Article*> #<marker at 4408 in *Article*>))) nil nil nil nil))
  gnus-mime-display-part((#<buffer  *mm*-671873> ("text/html" (charset . "Windows-1252")) quoted-printable (lambda nil (let ((inhibit-read-only t)) (delete-region #<marker at 4408 in *Article*> #<marker at 4408 in *Article*>))) nil nil nil nil))
  mapcar(gnus-mime-display-part ((#<buffer  *mm*-671873> ("text/html" (charset . "Windows-1252")) quoted-printable (lambda nil (let ((inhibit-read-only t)) (delete-region #<marker at 4408 in *Article*> #<marker at 4408 in *Article*>))) nil nil nil nil) (#<buffer  *mm*-589619> ("application/pdf" (name . "homologie_de_contact_legendrienne_bilinearisee.pdf")) base64 nil ("attachment" (modification-date . "Fri, 08 Feb 2019 11:42:34 GMT") (creation-date . "Fri, 08 Feb 2019 11:40:17 GMT") (size . "308005") (filename . "homologie_de_contact_legendrienne_bilinearisee.pdf")) "homologie_de_contact_legendrienne_bilinearisee.pdf" nil nil)))
  gnus-mime-display-mixed(((#<buffer  *mm*-671873> ("text/html" (charset . "Windows-1252")) quoted-printable (lambda nil (let ((inhibit-read-only t)) (delete-region #<marker at 4408 in *Article*> #<marker at 4408 in *Article*>))) nil nil nil nil) (#<buffer  *mm*-589619> ("application/pdf" (name . "homologie_de_contact_legendrienne_bilinearisee.pdf")) base64 nil ("attachment" (modification-date . "Fri, 08 Feb 2019 11:42:34 GMT") (creation-date . "Fri, 08 Feb 2019 11:40:17 GMT") (size . "308005") (filename . "homologie_de_contact_legendrienne_bilinearisee.pdf")) "homologie_de_contact_legendrienne_bilinearisee.pdf" nil nil)))
  gnus-mime-display-part((#("multipart/mixed" 0 15 (boundary "_002_VI1PR0101MB215751953182701525CB4AD9E7690VI1PR0101MB2157_" buffer #<buffer  *mm*-468382> from "[hidden email]" start nil)) (#<buffer  *mm*-671873> ("text/html" (charset . "Windows-1252")) quoted-printable (lambda nil (let ((inhibit-read-only t)) (delete-region #<marker at 4408 in *Article*> #<marker at 4408 in *Article*>))) nil nil nil nil) (#<buffer  *mm*-589619> ("application/pdf" (name . "homologie_de_contact_legendrienne_bilinearisee.pdf")) base64 nil ("attachment" (modification-date . "Fri, 08 Feb 2019 11:42:34 GMT") (creation-date . "Fri, 08 Feb 2019 11:40:17 GMT") (size . "308005") (filename . "homologie_de_contact_legendrienne_bilinearisee.pdf")) "homologie_de_contact_legendrienne_bilinearisee.pdf" nil nil)))
  gnus-display-mime()
  gnus-article-prepare-display()

> Otherwise, could you show me a sample email in question? […]

Attached.

>> […] (define-advice gnus-mime-display-single (:around (oldfn &rest handle) fix)
>>   "Protect against bad handling of empty message parts."
>>   (ignore-errors (apply oldfn handle)))
>
> I'd like to fix those problems in the Gnus code. :)

Sure — it was just a suggestion in the meantime! ;-)

Best,
Christophe




homologie_de_contact_legendrienne_bilinearisee.pdf (411K) Download Attachment
Reply | Threaded
Open this post in threaded view
|

bug#34387: 26.1; Gnus: handle empty message parts

Katsumi Yamaoka
In reply to this post by Christophe TROESTLER-11
On Tue, 12 Feb 2019 08:31:39 +0100, Christophe Troestler wrote:
> Here is the debugger trace (message attached) :

> Debugger entered--Lisp error: (args-out-of-range 4409 4410)
>   #f(compiled-function...)(PART1)
>   apply(#f(compiled-function...) PART1)
>   gnus-mime-display-single@fix(#f(compiled-function...) PART1)
>   apply(gnus-mime-display-single@fix #f(compiled-function...) PART1)
>   gnus-mime-display-single(PART1)
>   gnus-mime-display-part(PART1)
>   mapcar(gnus-mime-display-part (PART1 PART2))
>   gnus-mime-display-mixed((PART1 PART2))
>   gnus-mime-display-part((...PART1 PART2))
>   gnus-display-mime()
>   gnus-article-prepare-display()

;; Where PART1 is the html part and PART2 is the pdf part.

If it is (narrow-to-region beg (point)) in gnus-mime-display-single
to issue (args-out-of-range 4409 4410), I guess an html rendering
function deletes buffer's contents so that the buffer's end point
may be 4409.  Here is a model to reproduce the same error:

(with-temp-buffer               ;; article buffer
  (insert-char ?x 4409)
  (let ((beg (point)))          ;; buffer's end point == 4410
    (delete-char -1)            ;; html function does this
    (narrow-to-region beg (point))))
 => (args-out-of-range 4409 4410)

The default html function is mm-shr, that gnus-mime-display-single
calls by way of mm-display-part, mm-display-inline, and
mm-inline-text-html.  At that time, the point is positioned at
the end of the article buffer, where the header lines and a
single empty line are there.

>> Otherwise, could you show me a sample email in question? […]
> Attached.

Thanks.  However, I couldn't reproduce the error with the mail
that I copied to my nnml group.  I tried it using Emacs 26.1
with no ~/.emacs, no ~/.gnus.el, but ~/.newsrc.eld,
(setq gnus-select-method '(nnnil)), and every candidate for
mm-text-html-renderer.  The only thing that reproduces it is:

(defadvice mm-shr (before delete-ceiling-newlines activate)
  "Delete newlines before the point."
  (skip-chars-backward "\n")
  (delete-region (point) (point-max)))

Well, if you have time for analyzing the problem, don't you try
edebug on the functions listed above?

Regards,

;; I'm going to fix the other 2 issues anyway.



Reply | Threaded
Open this post in threaded view
|

bug#34387: 26.1; Gnus: handle empty message parts

Christophe TROESTLER-11

On 13 February 2019 at 05:53 CET, Katsumi Yamaoka wrote:

>
> […] If it is (narrow-to-region beg (point)) in gnus-mime-display-single to issue (args-out-of-range 4409 4410), I guess an html rendering function deletes buffer's contents so that the buffer's end point may be 4409.  Here is a model to reproduce the same error:
>
> (with-temp-buffer               ;; article buffer
>   (insert-char ?x 4409)
>   (let ((beg (point)))          ;; buffer's end point == 4410
>     (delete-char -1)            ;; html function does this
>     (narrow-to-region beg (point))))
>  => (args-out-of-range 4409 4410)
>
> The default html function is mm-shr, that gnus-mime-display-single calls by way of mm-display-part, mm-display-inline, and mm-inline-text-html.  At that time, the point is positioned at the end of the article buffer, where the header lines and a single empty line are there.

Thanks for your analysis.  I indeed had an advice executed after mm-shr to remove trailing whitespace—these making sometimes the rendered text hard to read.  Deleting the advice makes the call work.

What approach would you recommend to remove trailing whitespace after rendering HTML?

Best,
C.




Reply | Threaded
Open this post in threaded view
|

bug#34387: 26.1; Gnus: handle empty message parts

Katsumi Yamaoka
In reply to this post by Christophe TROESTLER-11
On Wed, 13 Feb 2019 18:26:44 +0100, Christophe Troestler wrote:
> Thanks for your analysis.  I indeed had an advice executed after
> mm-shr to remove trailing whitespace—these making sometimes the
> rendered text hard to read.  Deleting the advice makes the call
> work.

Bingo! :)

> What approach would you recommend to remove trailing whitespace
> after rendering HTML?

The point would be to delete only whitespace that mm-shr inserts.
How about this?

(defadvice mm-shr (around delete-leading-and-trailing-whitespace activate)
  "Delete leading and trailing whitespace in Gnus article buffer."
  (when (derived-mode-p 'gnus-article-mode)
    (save-restriction
      (narrow-to-region (point) (point))
      ad-do-it
      (goto-char (point-min))
      (skip-chars-forward "\t\n ")
      (delete-region (point-min) (point))
      (goto-char (point-max))
      (skip-chars-backward "\t\n ")
      (delete-region (point) (point-max))
      (insert "\n"))))

I'll close this thread after fixing the other two related bugs.

> 1. In the article buffer, pressing the RET key on an empty
>  text/plain attachment conceals the succeeding other attachments,
>  does not toggle.  `g' restores them of course, though.

> 2. Some kind of an empty mail isn't able to be edited using the
>  `e' command (gnus-summary-edit-article), that is, a single part
>  email whose body is an empty attachment.  Gnus misunderstands
>  that the header is its body.

Regards,



Reply | Threaded
Open this post in threaded view
|

bug#34387: 26.1; Gnus: handle empty message parts

Katsumi Yamaoka
In reply to this post by Christophe TROESTLER-11
On Thu, 14 Feb 2019 08:20:20 +0900, Katsumi Yamaoka wrote:
> I'll close this thread after fixing the other two related bugs.

>> 1. In the article buffer, pressing the RET key on an empty
>>  text/plain attachment conceals the succeeding other attachments,
>>  does not toggle.  `g' restores them of course, though.

>> 2. Some kind of an empty mail isn't able to be edited using the
>>  `e' command (gnus-summary-edit-article), that is, a single part
>>  email whose body is an empty attachment.  Gnus misunderstands
>>  that the header is its body.

Done.  Closing.



Reply | Threaded
Open this post in threaded view
|

bug#34387: 26.1; Gnus: handle empty message parts

Christophe TROESTLER-11
In reply to this post by Katsumi Yamaoka

On 14 February 2019 at 00:20 CET, Katsumi Yamaoka wrote:

>
> The point would be to delete only whitespace that mm-shr inserts.
> How about this?
>
> (defadvice mm-shr (around delete-leading-and-trailing-whitespace activate)
>   "Delete leading and trailing whitespace in Gnus article buffer."
>   (when (derived-mode-p 'gnus-article-mode)
>     (save-restriction
>       (narrow-to-region (point) (point))
>       ad-do-it
>       (goto-char (point-min))
>       (skip-chars-forward "\t\n ")
>       (delete-region (point-min) (point))
>       (goto-char (point-max))
>       (skip-chars-backward "\t\n ")
>       (delete-region (point) (point-max))
>       (insert "\n"))))
The point is to delete all trailing whitespace coming from the conversion of HTML to text.  Without this, some emails (such as the one attached) are hard to read because the lines end with so many whitespaces that they take several lines on the screen (filled with spaces).  The following does what I want (and does not trigger the bug, thanks to the narrowing).

(define-advice mm-shr (:around (oldfn &rest handle) delete-trailing-whitespace)
  "Delete leading and trailing whitespace in Gnus article buffer."
  (when (derived-mode-p 'gnus-article-mode)
    (save-restriction
      (narrow-to-region (point) (point))
      (apply oldfn handle)
      (delete-trailing-whitespace))))

Thanks,
C.




If this email is not displayed correctly, please click here to read this table of contents online.
New Issue Alert
02/14/2019

Dear Ch. TROESTLER,

We are pleased to deliver your requested table of contents alert for Numerical Algorithms. Volume 80 Number 2 is now available online.

Important news

Celebrate 2019 Chinese New Year with Springer!

Read 2017 & 2018 top download books with open chapters. Download Highly Cited Papers, top 1% cited in the field, free online until 28 Feb.
» Learn more

SRC conf.

In this issue

Original Paper

Improved optimization methods for image registration problems

Ke Chen, Geovani Nunes Grapiglia, Jinyun Yuan & Daoping Zhang

» Abstract   » Full text PDF
Original Paper

Efficient parameterized rotated shift-splitting preconditioner for a class of complex symmetric linear systems

Cheng-Liang Li & Chang-Feng Ma

» Abstract   » Full text PDF
Original Paper

Modified Newton-MDPMHSS method for solving nonlinear systems with block two-by-two complex symmetric Jacobian matrices

Min-Hong Chen & Qing-Biao Wu

» Abstract   » Full text PDF
Original Paper

Picard iteration-based variable-order integrator with dense output employing algorithmic differentiation

Herman D. Schaumburg, Afnan Al Marzouk & Bela Erdelyi

» Abstract   » Full text PDF
Original Paper

An infeasible bundle method for nonconvex constrained optimization with application to semi-infinite programming problems

Jian Lv, Li-Ping Pang, Na Xu & Ze-Hao Xiao

» Abstract   » Full text PDF
Original Paper

A two-grid parallel partition of unity finite element scheme

Guangzhi Du & Liyun Zuo

» Abstract   » Full text PDF
Original Paper

Parallel computing investigations for the projection method applied to the interface transport scheme of a two-phase flow by the method of characteristics

Mireille Haddad, Frédéric Hecht, Toni Sayah & Pierre Henri Tournier

» Abstract   » Full text PDF
Original Paper

Convergence of discrete time waveform relaxation methods

Zhencheng Fan

» Abstract   » Full text PDF
Original Paper

Modified PHSS iterative methods for solving nonsingular and singular saddle point problems

Zheng-Ge Huang, Li-Gong Wang, Zhong Xu & Jing-Jing Cui

» Abstract   » Full text PDF
Original Paper

On the asymptotic optimality of error bounds for some linear complementarity problems

M. García-Esnaola & J. M. Peña

» Abstract   » Full text PDF
Original Paper

Some second-order 𝜃 schemes combined with finite element method for nonlinear fractional cable equation

Yang Liu, Yanwei Du, Hong Li, Fawang Liu & Yajun Wang

» Abstract   » Full text PDF
Original Paper

A new family of three-stage two-step P-stable multiderivative methods with vanished phase-lag and some of its derivatives for the numerical solution of radial Schrödinger equation and IVPs with oscillating solutions

Ali Shokri, Mohammad Mehdizadeh Khalsaraei, Mortaza Tahmourasi & Raquel Garcia-Rubio

» Abstract   » Full text PDF
Original Paper

A modified Newton iteration for finding nonnegative Z-eigenpairs of a nonnegative tensor

Chun-Hua Guo, Wen-Wei Lin & Ching-Sung Liu

» Abstract   » Full text PDF
Original Paper

Selective projection methods for solving a class of variational inequalities

Songnian He & Hanlin Tian

» Abstract   » Full text PDF
Original Paper

Look-ahead in the two-sided reduction to compact band forms for symmetric eigenvalue problems and the SVD

Rafael Rodríguez-Sánchez, Sandra Catalán, José R. Herrero, Enrique S. Quintana-Ortí & Andrés E. Tomás

» Abstract   » Full text PDF
Original Paper

Truncation dimension for linear problems on multivariate function spaces

Aicke Hinrichs, Peter Kritzer, Friedrich Pillichshammer & G. W. Wasilkowski

» Abstract   » Full text PDF

Do you want to publish your article in this journal?

Please visit the homepage of Numerical Algorithms for full details on:

  • aims and scope
  • editorial policy
  • article submission

Impact Factor: 1.536 (2017)
Journal Citation Reports®, Clarivate Analytics

Read open access articles

Click here to view all open access articles published in this journal.

Interested in publishing your article open access?
When you opt for Open Choice, you retain full copyright and
your article is permanently freely available.

Sign up for SpringerAlerts!

Register for Springer’s email services providing you with info on the latest books in your field. » Click here

Important news

Springer Nature Transfer Desk

Imagine a world where you only have to submit your article once. With our Transfer Desk, we’re working toward making that a reality. Learn more here:

Reply | Threaded
Open this post in threaded view
|

bug#34387: 26.1; Gnus: handle empty message parts

Katsumi Yamaoka
In reply to this post by Christophe TROESTLER-11
On Thu, 14 Feb 2019 13:30:34 +0100, Christophe Troestler wrote:
> The point is to delete all trailing whitespace coming from the
> conversion of HTML to text.  Without this, some emails (such as the
> one attached) are hard to read because the lines end with so many
> whitespaces that they take several lines on the screen (filled with
> spaces).  The following does what I want (and does not trigger the
> bug, thanks to the narrowing).

> (define-advice mm-shr (:around (oldfn &rest handle) delete-trailing-whitespace)
>   "Delete leading and trailing whitespace in Gnus article buffer."
>   (when (derived-mode-p 'gnus-article-mode)
>     (save-restriction
>       (narrow-to-region (point) (point))
>       (apply oldfn handle)
>       (delete-trailing-whitespace))))

I see.  But, sorry, I meant to do first was:

(define-advice mm-shr (:around (oldfn &rest handle) delete-trailing-whitespace)
  "Delete leading and trailing whitespace in Gnus article buffer."
  (if (derived-mode-p 'gnus-article-mode)
      (save-restriction
        (narrow-to-region (point) (point))
        (apply oldfn handle)
        (delete-trailing-whitespace))
    (apply oldfn handle)))

That is, not to do the whitespace deletion when mm-shr is used
in other than Gnus as it might require whitespace.  Anyway the
(when ...) way makes mm-shr work only in the Gnus article buffer.
:-p

Regards,



Reply | Threaded
Open this post in threaded view
|

bug#34387: 26.1; Gnus: handle empty message parts

Christophe TROESTLER-11

On 14 February 2019 at 23:50 CET, Katsumi Yamaoka wrote:

>
> […] I see.  But, sorry, I meant to do first was:
>
> (define-advice mm-shr (:around (oldfn &rest handle) delete-trailing-whitespace)
>   "Delete leading and trailing whitespace in Gnus article buffer."
>   (if (derived-mode-p 'gnus-article-mode)
>       (save-restriction
> (narrow-to-region (point) (point))
> (apply oldfn handle)
> (delete-trailing-whitespace))
>     (apply oldfn handle)))
>
> That is, not to do the whitespace deletion when mm-shr is used
> in other than Gnus as it might require whitespace.  […]

Sure.  Thanks for taking the time to attract my attention to this.

Best,
C.