diff options
Diffstat (limited to 'composer')
-rw-r--r-- | composer/ChangeLog | 5 | ||||
-rw-r--r-- | composer/e-msg-composer.c | 40 |
2 files changed, 33 insertions, 12 deletions
diff --git a/composer/ChangeLog b/composer/ChangeLog index 70562a8ed9..41c9182d85 100644 --- a/composer/ChangeLog +++ b/composer/ChangeLog @@ -1,3 +1,8 @@ +2000-06-12 Dan Winship <danw@helixcode.com> + + * e-msg-composer.c (format_text): If a paragraph starts with TABs, + indent the whole paragraph to that tab level. + 2000-06-12 Ettore Perazzoli <ettore@helixcode.com> * e-msg-composer.c: Make the `attachment_scroll_frame' an diff --git a/composer/e-msg-composer.c b/composer/e-msg-composer.c index 254274c48d..57fac7d38c 100644 --- a/composer/e-msg-composer.c +++ b/composer/e-msg-composer.c @@ -150,23 +150,31 @@ get_editor_text (BonoboWidget *editor, char *format) static char * format_text (char *text) { - char *out, *s, *d, *space; - int len; + GString *out; + char *s, *space, *outstr; + int len, tabbing, i; + gboolean linestart = TRUE; len = strlen (text); - out = g_malloc (len + len / LINE_LEN + 3); + out = g_string_sized_new (len + len / LINE_LEN); s = text; - d = out; - while (*s) { + if (linestart) { + tabbing = 0; + while (*s == '\t') { + s++; + tabbing++; + } + } + len = strcspn (s, "\n"); - if (len > LINE_LEN) { + if (len > LINE_LEN - tabbing * 8) { /* If we can break anywhere between s and * s + LINE_LEN, do that. We can break between * space and anything but */ - space = s + LINE_LEN; + space = s + LINE_LEN - tabbing * 8; while (space > s && (*space != ' ' || (*(space + 1) == '\240') || (*(space - 1) == '\240'))) @@ -176,24 +184,32 @@ format_text (char *text) len = space - s; } + /* Do initial tabs */ + for (i = 0; i < tabbing; i++) + g_string_append_c (out, '\t'); + /* Copy the line... */ while (len--) { - *d++ = (*s == '\240' ? ' ' : *s); + g_string_append_c (out, *s == '\240' ? ' ' : *s); s++; } /* Eat whitespace... */ while (*s == ' ' || *s == '\240') s++; - if (*s == '\n') + if (*s == '\n') { s++; + linestart = TRUE; + } else + linestart = FALSE; /* And end the line. */ - *d++ = '\n'; + g_string_append_c (out, '\n'); } - *d++ = '\0'; - return out; + outstr = out->str; + g_string_free (out, FALSE); + return outstr; } typedef enum { |