Re: %t as To or Newsgroup?
Ping?
On Feb 20 22:02, Corinna Vinschen wrote:
> On Feb 20 20:33, Corinna Vinschen wrote:
> > On Feb 20 10:55, David Champion wrote:
> > > The most consistent and flexible approach to this, IMO, would be:
> > >
> > > * add an "if (optional)" clause in the "case 't'" switch of
> > > hdr_format_str() in hdrline.c, so that mutt can detect whether the
> > > to: field is empty or null, and
> > >
> > > * either:
> > >
> > > * add a new formatter (say, 'G') to the same function which renders
> > > the Newsgroup: header -- but realize that there is an NNTP patch
> > > extant which likely does this already if you're prepared to track
> > > complex and unsupported patches -- or
> > >
> > > * add a formatter to render arbitrary headers, for which many people
> > > would thank you
> > >
> > > If you took option 1, you could then use
> > >
> > > %?t?%24.24t&%24.24G? to get the if-else behavior.
> >
> > The second option looks more interesting. I'll have a look if that's
> > something I can contribute or if I rather go for the first option.
>
> Given the fact that none of the additional header lines is stored so far
> in struct HEADER or struct ENVELOPE, I created a preliminary patch along
> the lines of the first option. I expected the additional header lines
> to appear in the ENVELOPE::userhdrs, but apparently this list is only
> used in a restricted context. So I added a newsgroups member to struct
> ENVELOPE to store just the newsgroups information.
>
> See the patch below. It's missing comments and documentation so far.
> Apart from adding the documentation I guess it would also be a good idea
> to add newsgroup munging if the field width is smaller than the length
> of the newsgroup name. For instance, assuming the field width is 18
> chars, then
>
> Ng de.alt.rec.digitalfotografie
>
> becomes
>
> Ng de.alt.rec.digi
>
> It should better tweaked into
>
> Ng d.a.r.digitalfot
>
> However, before I put more time into this little project, I'd like to
> know if that has any chance of inclusion into mutt at all. If so, I'd
> be quite happy to implement the missing stuff as above.
>
> Another question is this: Is it too time consuming or to wasteful in
> terms of memory to always add all additional header lines to
> ENVELOPE::userhdrs? I'm asking since having all header files present
> would simplify something as outlined above to allow to specify any
> header in the format string.
>
> Ok, see preliminary patch for new 'G' format specifier below.
>
>
> Corinna
>
>
> ChangeLog entry:
>
> * mutt.h, parse.c, hdrline.c: Read Newsgroups header and store in new
> newsgroups memeber to struct ENVELOPE. Add 'G' format specifer to
> print Newsgroup header. Add optional handling to 't' format specifier.
>
>
> diff -r e37e857afc14 hdrline.c
> --- a/hdrline.c Fri Feb 20 13:23:59 2009 +0100
> +++ b/hdrline.c Fri Feb 20 21:55:23 2009 +0100
> @@ -443,6 +443,18 @@ hdr_format_str (char *dest,
> optional = 0;
> break;
>
> + case 'G':
> + {
> + if (hdr->env->newsgroups)
> + {
> + snprintf (buf2, sizeof (buf2), "Ng %s", hdr->env->newsgroups);
> + mutt_format_s (dest, destlen, prefix, buf2);
> + }
> + else
> + strfcpy(dest, "Ng ?", destlen);
> + }
> + break;
> +
> case 'H':
> /* (Hormel) spam score */
> if (optional)
> @@ -588,16 +600,21 @@ hdr_format_str (char *dest,
> break;
>
> case 't':
> - buf2[0] = 0;
> - if (!check_for_mailing_list (hdr->env->to, "To ", buf2, sizeof (buf2))
> &&
> - !check_for_mailing_list (hdr->env->cc, "Cc ", buf2, sizeof (buf2)))
> + if (!optional)
> {
> - if (hdr->env->to)
> - snprintf (buf2, sizeof (buf2), "To %s", mutt_get_name (hdr->env->to));
> - else if (hdr->env->cc)
> - snprintf (buf2, sizeof (buf2), "Cc %s", mutt_get_name (hdr->env->cc));
> + buf2[0] = 0;
> + if (!check_for_mailing_list (hdr->env->to, "To ", buf2, sizeof (buf2))
> &&
> + !check_for_mailing_list (hdr->env->cc, "Cc ", buf2, sizeof (buf2)))
> + {
> + if (hdr->env->to)
> + snprintf (buf2, sizeof (buf2), "To %s", mutt_get_name
> (hdr->env->to));
> + else if (hdr->env->cc)
> + snprintf (buf2, sizeof (buf2), "Cc %s", mutt_get_name
> (hdr->env->cc));
> + }
> + mutt_format_s (dest, destlen, prefix, buf2);
> }
> - mutt_format_s (dest, destlen, prefix, buf2);
> + else if (!hdr->env->to && !hdr->env->cc)
> + optional = 0;
> break;
>
> case 'T':
> diff -r e37e857afc14 mutt.h
> --- a/mutt.h Fri Feb 20 13:23:59 2009 +0100
> +++ b/mutt.h Fri Feb 20 21:55:23 2009 +0100
> @@ -577,6 +577,7 @@ typedef struct envelope
> char *supersedes;
> char *date;
> char *x_label;
> + char *newsgroups;
> BUFFER *spam;
> LIST *references; /* message references (in reverse order) */
> LIST *in_reply_to; /* in-reply-to header content */
> diff -r e37e857afc14 parse.c
> --- a/parse.c Fri Feb 20 13:23:59 2009 +0100
> +++ b/parse.c Fri Feb 20 21:55:23 2009 +0100
> @@ -1151,6 +1151,19 @@ int mutt_parse_rfc822_line (ENVELOPE *e,
> }
> break;
>
> + case 'n':
> + if (!ascii_strcasecmp (line + 1, "ewsgroups"))
> + {
> + FREE (&e->newsgroups);
> + p = line + strlen (line) + 1;
> + SKIPWS (p);
> + e->newsgroups = safe_strdup (p);
> + if (do_2047)
> + rfc2047_decode (&e->newsgroups);
> + matched = 1;
> + }
> + break;
> +
> case 'r':
> if (!ascii_strcasecmp (line + 1, "eferences"))
> {
>
>
> --
> Corinna Vinschen
> Cygwin Project Co-Leader
> Red Hat
--
Corinna Vinschen
Cygwin Project Co-Leader
Red Hat