]> granicus.if.org Git - neomutt/commitdiff
feature: cond-date
authorAaron Schrab <aaron@schrab.com>
Mon, 1 Feb 2016 01:04:48 +0000 (01:04 +0000)
committerRichard Russon <rich@flatcap.org>
Thu, 18 Aug 2016 15:15:10 +0000 (16:15 +0100)
Use rules to choose date format

hdrline.c
init.h
muttlib.c

index eef19e6c552cc2c6fad82e09e6e8b7d59ac8fa19..4b86352d0d9b7207d12dc7cb7c7db5bd72523c37 100644 (file)
--- a/hdrline.c
+++ b/hdrline.c
@@ -328,6 +328,98 @@ hdr_format_str (char *dest,
        const char *cp;
        struct tm *tm; 
        time_t T;
+       int i = 0, invert = 0;
+
+       if (optional && ((op == '[') || (op == '('))) {
+         char *is;
+         T = time (NULL);
+         tm = localtime (&T);
+         T -= (op == '(') ? hdr->received : hdr->date_sent;
+
+         is = (char *) prefix;
+         if (*is == '>') {
+           invert = 1;
+           is++;
+         }
+
+         while (*is && (*is != '?')) {
+           int t = strtol (is, &is, 10);
+           /* semi-broken (assuming 30 days in all months) */
+           switch (*(is++)) {
+             case 'y':
+               if (t > 1) {
+                 t--;
+                 t *= (60 * 60 * 24 * 365);
+               }
+               t += ((tm->tm_mon  * 60 * 60 * 24 * 30) +
+                     (tm->tm_mday * 60 * 60 * 24) +
+                     (tm->tm_hour * 60 * 60) +
+                     (tm->tm_min  * 60) +
+                      tm->tm_sec);
+               break;
+
+             case 'm':
+               if (t > 1) {
+                 t--;
+                 t *= (60 * 60 * 24 * 30);
+               }
+               t += ((tm->tm_mday * 60 * 60 * 24) +
+                     (tm->tm_hour * 60 * 60) +
+                     (tm->tm_min  * 60) +
+                     tm->tm_sec);
+               break;
+
+             case 'w':
+               if (t > 1) {
+                 t--;
+                 t *= (60 * 60 * 24 * 7);
+               }
+               t += ((tm->tm_wday * 60 * 60 * 24) +
+                     (tm->tm_hour * 60 * 60) +
+                     (tm->tm_min  * 60) +
+                      tm->tm_sec);
+               break;
+
+             case 'd':
+               if (t > 1) {
+                 t--;
+                 t *= (60 * 60 * 24);
+               }
+               t += ((tm->tm_hour * 60 * 60) +
+                     (tm->tm_min  * 60) +
+                      tm->tm_sec);
+               break;
+
+             case 'H':
+               if (t > 1) {
+                 t--;
+                 t *= (60 * 60);
+               }
+               t += ((tm->tm_min * 60) +
+                      tm->tm_sec);
+               break;
+
+             case 'M':
+               if (t > 1) {
+                 t--;
+                 t *= (60);
+               }
+               t += (tm->tm_sec);
+               break;
+
+             default:
+               break;
+           }
+           i += t;
+         }
+
+         if (i < 0)
+           i *= -1;
+
+         if (((T > i) || (T < (-1*i))) ^ invert)
+           optional = 0;
+         break;
+       }
 
        p = dest;
 
diff --git a/init.h b/init.h
index 3f3f96d9dd57e3d12e609bd9e3c01f8cc3fd7d93..040277d2fb409a32da9a03bdf83b7f9dbd45b33a 100644 (file)
--- a/init.h
+++ b/init.h
@@ -1372,6 +1372,10 @@ struct option_t MuttVars[] = {
   ** .dt %*X    .dd soft-fill with character ``X'' as pad
   ** .de
   ** .pp
+  ** Date format expressions can be constructed based on relative dates. Using
+  ** the date formatting operators along with nested conditionals, the date
+  ** format can be modified based on how old a message is.  See the section on
+  ** ``Conditional Dates'' for an explanation and examples
   ** ``Soft-fill'' deserves some explanation: Normal right-justification
   ** will print everything to the left of the ``%>'', displaying padding and
   ** whatever lies to the right only if there's room. By contrast,
index 209c7ab90306e25a09ee8a9b48a9ac9471b59b14..0542f1e2c5db169293ae3d8b3ba4e04bbcd79253 100644 (file)
--- a/muttlib.c
+++ b/muttlib.c
@@ -1217,7 +1217,15 @@ void mutt_FormatString (char *dest,              /* output buffer */
       if (*src == '?')
       {
        flags |= MUTT_FORMAT_OPTIONAL;
+       ch = *(++src); /* save the character to switch on */
        src++;
+       cp = prefix;
+       count = 0;
+       while ((count < sizeof (prefix)) && (*src != '?')) {
+         *cp++ = *src++;
+         count++;
+       }
+       *cp = 0;
       }
       else
       {
@@ -1233,12 +1241,12 @@ void mutt_FormatString (char *dest,             /* output buffer */
          count++;
        }
        *cp = 0;
-      }
 
-      if (!*src)
-       break; /* bad format */
+       if (!*src)
+         break; /* bad format */
 
-      ch = *src++; /* save the character to switch on */
+       ch = *src++; /* save the character to switch on */
+      }
 
       if (flags & MUTT_FORMAT_OPTIONAL)
       {