procmail
[Top] [All Lists]

Re: text/enriched (Was: misc lock/write problems)

1997-08-12 03:46:00
era eriksson writes on 12 August 1997 at 11:23:57
On Tue, 12 Aug 1997 09:20:08 +0200,
Martin Ramsch <ramsch(_at_)forwiss(_dot_)uni-passau(_dot_)de> wrote:
For mailers not aware of text/enriched this might be the job of a
Procmail recipe again to convert text/enriched to text/plain on the
[...]
have figured it out already. In other words, are there stand-alone
text/enriched to plain text converters available? 

From RFC1563

Appendix A -- A Simple enriched-to-plain Translator in C

   One of the major goals in the design of the text/enriched subtype of
   the text Content-Type is to make formatted text so simple that even
   text-only mailers will implement enriched-to-plain-text translators,
   thus increasing the likelihood that multifont text will become "safe"
   to use very widely.  To demonstrate this simplicity, what follows is
   a simple C program that converts text/enriched input into plain text
   output.  Note that the local newline convention (the single character
   represented by "\n") is assumed by this program, but that special
   CRLF handling might be necessary on some systems.

#include <stdio.h>
#include <ctype.h>

main() {
    int c, i, paramct=0, newlinect=0, nofill=0;
    char token[62], *p;

    while ((c=getc(stdin)) != EOF) {
        if (c == '<') {
            if (newlinect == 1) putc(' ', stdout);
            newlinect = 0;
            c = getc(stdin);
            if (c == '<') {
                if (paramct <= 0) putc(c, stdout);
            } else {
                  ungetc(c, stdin);
                  for (i=0, p=token; (c=getc(stdin)) != EOF && c != '>';
                  i++)
                  { if (i < sizeof(token)-1)
                    *p++ = isupper(c) ? tolower(c) : c;
                  }
                  *p = '\0';
                  if (c == EOF) break;
                  if (strcmp(token, "param") == 0)
                      paramct++;
                  else if (strcmp(token, "nofill") == 0)
                      nofill++;
                  else if (strcmp(token, "/param") == 0)
                      paramct--;
                  else if (strcmp(token, "/nofill") == 0)
                      nofill--;
              }
        } else {
            if (paramct > 0)
                ; /* ignore params */
            else if (c == '\n' && nofill <= 0) {
                if (++newlinect > 1) putc(c, stdout);
            } else {
                if (newlinect == 1) putc(' ', stdout);
                newlinect = 0;
                putc(c, stdout);
            }
        }
     }
     /* The following line is only needed with line-buffering */
     putc('\n', stdout);
     exit(0);
}

   It should be noted that one can do considerably better than this in
   displaying text/enriched data on a dumb terminal.  In particular, one
   can replace font information such as "bold" with textual emphasis
   (like *this* or _T_H_I_S_).  One can also properly handle the
   text/enriched formatting commands regarding indentation,
   justification, and others.  However, the above program is all that is
   necessary in order to present text/enriched on a dumb terminal
   without showing the user any formatting artifacts.

   Dan
------------------- message is author's opinion only ------------------
J. Daniel Smith <DanS(_at_)bristol(_dot_)com>        
http://www.bristol.com/~DanS
Bristol Technology B.V.                   +31 33 450 50 50, ...51 (FAX)
Amersfoort, The Netherlands               {info,jobs}(_at_)bristol(_dot_)com

<Prev in Thread] Current Thread [Next in Thread>