>>>>> "RFP" == Rob Feztaa Park <[EMAIL PROTECTED]> writes:

RFP> Alas! Bernard Massot spake thus:
RFP> > On Fri, Apr 19, 2002 at 02:13:31PM -0600, Rob 'Feztaa' Park wrote:
RFP> > > Then use the message-hooks idea that I posted, but replace the 
RFP> > > `date +%m` bit with something that gives you the day-of-month of last
RFP> > > monday.
RFP> > 
RFP> > I can't be sure the mail was written the previous monday.
RFP> > I may answer an old mail.
RFP> 
RFP> Then I guess you'll just have to settle on speaking broken brezhoneg
RFP> then, won't you?

Oh, heavens.

This patch lets any variable that's subjected to %-expansion be a pipe,
just like filenames ($signature, source, etc.) can. With this patch,
Bernard can use
    set attribution="~/.mutt/deiziat.sh %[%w] %d, %n en deus skrivet: |"

With something like:
#!/bin/sh
article="ar"
[ "$1" eq 1 ] && article="al"
shift
echo -n "D'$article $*"

and the attribution will be whatever deiziat.sh says. %-expandos are
expanded *before* the piped script is run (so watch your quoting), and
at the time that the variable is evaluated (not when the rcfile is
read).

I've wanted this kind of functionality a few times with other variables,
so maybe this approach is good. At the worst, it makes quoting rules
*much* simpler.

Note that if the text returned by your piped command ends in "%", the
command output will be recycled through the formatter. This means that
you can embed more mutt-style %-expandos in your command output, if you
like, so that the format sequences used can depend on the values of
other format sequences.

Watch out for newlines in your output -- the patch does not discard
them. And watch out for infinite loops. :)

Note also that you do probably do **NOT** want to use a piped command
for variables like $index_format which are evaluated frequently,
although someone might find some neat trick you can achieve with that.

Here's another fun example. "afh.sh" is attached.
set attribution="afh.sh -a '%n' '<%a>' |"
set indent_string="afh.sh -q '%n' |"

-- 
 -D.    [EMAIL PROTECTED]        NSIT    University of Chicago
diff -ur mutt-1.3.28-base/muttlib.c mutt-1.3.28-fmtpipe/muttlib.c
--- mutt-1.3.28-base/muttlib.c  Sun Jan 13 02:52:15 2002
+++ mutt-1.3.28-fmtpipe/muttlib.c       Sat Apr 20 13:35:24 2002
@@ -907,6 +907,10 @@
   char prefix[SHORT_STRING], buf[LONG_STRING], *cp, *wptr = dest, ch;
   char ifstring[SHORT_STRING], elsestring[SHORT_STRING];
   size_t wlen, count, len;
+  pid_t pid;
+  FILE *filter;
+  int n, dofilter = 0;
+  char *recycler;
 
   destlen--; /* save room for the terminal \0 */
   wlen = (flags & M_FORMAT_ARROWCURSOR && option (OPTARROWCURSOR)) ? 3 : 0;
@@ -1078,6 +1082,20 @@
       wptr++;
       wlen++;
     }
+    else if (*src == '|')
+    {
+      if (*++src != '\0')
+      {
+       /* Not end of string - copy '|' */
+       *wptr++ = '|';
+       wlen++;
+      }
+      else
+      {
+       /* End of string - wants to be filtered */
+       dofilter = 1;
+      }
+    }
     else
     {
       *wptr++ = *src++;
@@ -1085,6 +1103,39 @@
     }
   }
   *wptr = 0;
+
+  /* Filter this string? */
+  if (dofilter)
+  {
+    wptr = dest;       /* reset write ptr */
+    wlen = (flags & M_FORMAT_ARROWCURSOR && option (OPTARROWCURSOR)) ? 3 : 0;
+    if (pid = mutt_create_filter(dest, NULL, &filter, NULL))
+    {
+      n = fread(dest, 1, destlen /* already decremented */, filter);
+      fclose(filter);
+      dest[n] = '\0';
+      if (pid != -1)
+       mutt_wait_filter(pid);
+
+      /* If ends with '%', recycle through FormatString :P */
+      /* To really end with '%', use "%%" */
+      if (dest[--n] == '%')
+      {
+       dest[n] = '\0';         /* remove '%' */
+       if (dest[--n] != '%')
+       {
+         recycler = safe_strdup(dest);
+         mutt_FormatString(dest, destlen++, recycler, callback, data, flags);
+         safe_free((void **) &recycler);
+       }
+      }
+    }
+    else
+    {
+      /* Filter failed; erase write buffer */
+      *wptr = '\0';
+    }
+  }
 
 #if 0
   if (flags & M_FORMAT_MAKEPRINT)
#!/bin/sh
##
## Attributions from Hell.
##

initials () {
        for word in $*; do
                letter=`echo $word | cut -c1`
                out="$out$letter"
        done
        echo $out;
}

attribute () {
        inits=`initials "$1"`
        cat <<GOD_HAVE_MERCY_ON_MY_SOUL
>>>>> "$inits" == $@ writes:
GOD_HAVE_MERCY_ON_MY_SOUL
}

quote () {
        inits=`initials "$@"`
        case "`echo -n`" in
                -n)     echo "$inits> \c";;
                *)      echo -n "$inits> ";;
        esac
}

mode=$1
shift
case "$mode" in
        -a)     attribute "$1" "$2";;
        -q)     quote "$1";;
esac

Reply via email to