]> granicus.if.org Git - neomutt/commitdiff
f=f: Strip trailing spaces for interoperability. Closes #3001.
authorRocco Rutte <pdmef@gmx.net>
Sun, 31 May 2009 09:32:06 +0000 (11:32 +0200)
committerRocco Rutte <pdmef@gmx.net>
Sun, 31 May 2009 09:32:06 +0000 (11:32 +0200)
If we make a fixed reply to a flowed message we remove trailing
spaces and can now safely allow $indent_string to be used which
is what users expect.

Second, if we make a flowed reply to a fixed message we also
strip trailing spaces since from format=fixed we assume all
lines are fixed (i.e. we don't want to errorneously make fixed
lines flowed).

handler.c
init.h
rfc3676.c

index a4c27ad01e54ab3dbdfe3d03a42d7225b56085d3..e9cfafb4991e0de89b4d3f06904a437ae48e4de0 100644 (file)
--- a/handler.c
+++ b/handler.c
@@ -1485,6 +1485,34 @@ void mutt_decode_attachment (BODY *b, STATE *s)
     iconv_close (cd);
 }
 
+/* when generating format=flowed ($text_flowed is set) from format=fixed,
+ * strip all trailing spaces to improve interoperability;
+ * if $text_flowed is unset, simply verbatim copy input
+ */
+static int text_plain_handler (BODY *b, STATE *s)
+{
+  char buf[LONG_STRING];
+  size_t l;
+
+  while (fgets (buf, sizeof (buf), s->fpin))
+  {
+    l = mutt_strlen (buf);
+    if (l > 0 && buf[l-1] == '\n')
+      buf[--l] = 0;
+    if (option (OPTTEXTFLOWED))
+    {
+      while (l > 0 && buf[l-1] == ' ')
+       buf[--l] = 0;
+    }
+    if (s->prefix)
+      state_puts (s->prefix, s);
+    state_puts (buf, s);
+    state_putc ('\n', s);
+  }
+
+  return 0;
+}
+
 int mutt_body_handler (BODY *b, STATE *s)
 {
   int decode = 0;
@@ -1525,7 +1553,7 @@ int mutt_body_handler (BODY *b, STATE *s)
       else if (ascii_strcasecmp ("flowed", mutt_get_parameter ("format", b->parameter)) == 0)
        handler = rfc3676_handler;
       else
-       plaintext = 1;
+       handler = text_plain_handler;
     }
     else if (ascii_strcasecmp ("enriched", b->subtype) == 0)
       handler = text_enriched_handler;
diff --git a/init.h b/init.h
index b480f8ff94c42872132696655b6355f6a32bff38..44b46a5fd3da3298b9542f06588c7bf8894ad499 100644 (file)
--- a/init.h
+++ b/init.h
@@ -1222,12 +1222,11 @@ struct option_t MuttVars[] = {
   ** message to which you are replying.  You are strongly encouraged not to
   ** change this value, as it tends to agitate the more fanatical netizens.
   ** .pp
+  ** The value of this option is ignored if $$text_flowed is set, too because
+  ** the quoting mechanism is strictly defined for format=flowed.
+  ** .pp
   ** This option is a format string, please see the description of
   ** $$index_format for supported \fCprintf(3)\fP-style sequences.
-  ** .pp
-  ** Because for \fCformat=lowed\fP style messages the quoting mechanism
-  ** is strictly defined, this setting is ignored if $$text_flowed is
-  ** \fIset\fP.
   */
   { "indent_str",      DT_SYN,  R_NONE, UL "indent_string", 0 },
   /*
index 872dbbffb4a58e767cb53493b6ba02fd031388bb..651975d22167bc7d2b43979ffd05638f9c952f79 100644 (file)
--- a/rfc3676.c
+++ b/rfc3676.c
@@ -1,7 +1,7 @@
 /*
  * Copyright (C) 2005 Andreas Krennmair <ak@synflood.at>
  * Copyright (C) 2005 Peter J. Holzer <hjp@hjp.net>
- * Copyright (C) 2005-7 Rocco Rutte <pdmef@gmx.net>
+ * Copyright (C) 2005-9 Rocco Rutte <pdmef@gmx.net>
  * 
  *     This program is free software; you can redistribute it and/or modify
  *     it under the terms of the GNU General Public License as published by
@@ -56,14 +56,27 @@ static int get_quote_level (const char *line)
 static size_t print_indent (int ql, STATE *s, int sp)
 {
   int i;
+  size_t len = 0;
 
   if (s->prefix)
-    ql++;
+  {
+    /* use given prefix only for format=fixed replies to format=flowed,
+     * for format=flowed replies to format=flowed, use '>' indentation
+     */
+    if (option (OPTTEXTFLOWED))
+      ql++;
+    else
+    {
+      state_puts (s->prefix, s);
+      len = mutt_strlen (s->prefix);
+      sp = 0;
+    }
+  }
   for (i = 0; i < ql; i++)
     state_putc ('>', s);
   if (sp)
     state_putc (' ', s);
-  return ql + sp;
+  return ql + sp + len;
 }
 
 static void flush_par (STATE *s, size_t *sofar)
@@ -109,9 +122,11 @@ static void print_flowed_line (char *line, STATE *s, int ql, size_t *sofar, int
     dprint (4, (debugfile, "f=f: word [%s], width = %ld, line = %ld\n", NONULL(p), (long)w, (long)*sofar));
     if (w + 1 + (*sofar) > width)
     {
-      /* line would be too long, flush */
+      /* line would be too long, flush; for format=flowed we keep a
+       * trailing space but remove it otherwise for interoperability
+       */
       dprint (4, (debugfile, "f=f: width: %ld\n", (long)*sofar));
-      state_puts (\n", s);
+      state_puts (option (OPTTEXTFLOWED) ? " \n" : "\n", s);
       *sofar = 0;
     }
     if (*sofar == 0)
@@ -122,8 +137,10 @@ static void print_flowed_line (char *line, STATE *s, int ql, size_t *sofar, int
     }
     if (words > 0)
     {
-      /* put space before current word if we have words already */
-      state_putc (' ', s);
+      /* put space before current word if we have words already,
+         and the current word isn't the trailing space */
+      if (w > 0)
+       state_putc (' ', s);
       (*sofar)++;
     }
     state_puts (NONULL(p), s);