gchar *tmp, *subject_dup, *retval, *prefix;
const gchar *untranslated_prefix;
gint prefix_len, untranslated_prefix_len;
- gboolean translated_found = FALSE;
- gboolean first_time;
+ gboolean found = FALSE;
if (!subject || subject[0] == '\0')
subject = _("mail_va_no_subject");
untranslated_prefix = (is_reply) ? "Re:" : "Fw:";
untranslated_prefix_len = 3;
- /* We do not want things like "Re: Re: Re:" or "Fw: Fw:" so
- delete the previous ones */
- first_time = TRUE;
- do {
- if (g_str_has_prefix (tmp, prefix)) {
- tmp += prefix_len;
- tmp = g_strchug (tmp);
- /* Do not consider translated prefixes in the
- middle of a Re:Re:..Re: like sequence */
- if (G_UNLIKELY (first_time))
- translated_found = TRUE;
- } else if (g_str_has_prefix (tmp, untranslated_prefix)) {
- tmp += untranslated_prefix_len;
- tmp = g_strchug (tmp);
- } else {
- gchar *prefix_down, *tmp_down;
-
- /* We need this to properly check the cases of
- some clients adding FW: instead of Fw: for
- example */
- prefix_down = g_utf8_strdown (prefix, -1);
- tmp_down = g_utf8_strdown (tmp, -1);
- if (g_str_has_prefix (tmp_down, prefix_down)) {
- tmp += prefix_len;
- tmp = g_strchug (tmp);
- g_free (prefix_down);
- g_free (tmp_down);
- } else {
- g_free (prefix_down);
- g_free (tmp_down);
- break;
- }
- }
- first_time = FALSE;
- } while (tmp);
+ if (g_str_has_prefix (tmp, prefix) ||
+ g_str_has_prefix (tmp, untranslated_prefix)) {
+ found = TRUE;
+ } else {
+ gchar *prefix_down, *tmp_down, *untranslated_down;
- if (!g_strcmp0 (subject, tmp)) {
- /* normal case */
- retval = g_strdup_printf ("%s %s", untranslated_prefix, tmp);
+ prefix_down = g_utf8_strdown (prefix, -1);
+ untranslated_down = g_utf8_strdown (untranslated_prefix, -1);
+ tmp_down = g_utf8_strdown (tmp, -1);
+ if (g_str_has_prefix (tmp_down, prefix_down) ||
+ g_str_has_prefix (tmp_down, untranslated_down) ||
+ (!is_reply && g_str_has_prefix (tmp_down, "fwd:")))
+ found = TRUE;
+
+ g_free (prefix_down);
+ g_free (untranslated_down);
+ g_free (tmp_down);
+ }
+
+ if (found) {
+ /* If the prefix is already present do not touch the subject */
+ retval = subject_dup;
} else {
- if (translated_found) {
- /* Found a translated prefix, i.e, "VS:" in Finish */
- retval = g_strdup_printf ("%s %s", prefix, tmp);
- } else {
- retval = g_strdup_printf ("%s %s", untranslated_prefix, tmp);
- }
+ /* Normal case, add the prefix */
+ retval = g_strdup_printf ("%s %s", untranslated_prefix, tmp);
+ g_free (subject_dup);
}
- g_free (subject_dup);
g_free (prefix);
return retval;
const gchar *pos, *last;
gunichar *uni;
+ if (2*indent >= limit)
+ return strlen (s);
+
indent = indent < 0 ? abs (indent) - 1 : indent;
last = NULL;
gsize len;
gint indent, breakpoint, rem_indent = 0;
GString *l, *remaining;
+ gchar *forced_wrap_append;
iter = text;
len = strlen(text);
remaining = g_string_new ("");
+ forced_wrap_append = NULL;
do {
- l = get_next_line (text, len, iter);
- iter = iter + l->len + 1;
- indent = get_indent_level (l->str);
- unquote_line (l, quote_symbol);
+
+ if (forced_wrap_append) {
+ gint next_line_indent;
+ gint l_len_with_indent;
+
+ g_string_erase (remaining, 0, -1);
+ next_line_indent = get_indent_level (iter);
+ l = get_next_line (text, len, iter);
+ l_len_with_indent = l->len;
+ unquote_line (l, quote_symbol);
+ if ((l->str && l->str[0] == '\0') || (next_line_indent != indent)) {
+ g_string_free (l, TRUE);
+ l = g_string_new (forced_wrap_append);
+ } else {
+ gunichar first_in_l;
+ iter = iter + l_len_with_indent + 1;
+ first_in_l = g_utf8_get_char_validated (l->str, l->len);
+ if (!g_unichar_isspace (first_in_l))
+ l = g_string_prepend (l, " ");
+ l = g_string_prepend (l, forced_wrap_append);
+ }
+ g_free (forced_wrap_append);
+ forced_wrap_append = NULL;
+ } else {
+ l = get_next_line (text, len, iter);
+ iter = iter + l->len + 1;
+ indent = get_indent_level (l->str);
+ unquote_line (l, quote_symbol);
+ }
if (remaining->len) {
if (l->len && indent == rem_indent) {
get_breakpoint (remaining->str,
rem_indent,
limit);
- append_quoted (output, quote_symbol, rem_indent,
- remaining, breakpoint);
+ if (breakpoint < remaining->len) {
+ g_free (forced_wrap_append);
+ forced_wrap_append = g_strdup (remaining->str + breakpoint);
+ } else {
+ if (!forced_wrap_append)
+ append_quoted (output, quote_symbol, rem_indent,
+ remaining, breakpoint);
+ }
g_string_erase (remaining, 0,
breakpoint);
remaining_first = g_utf8_get_char_validated (remaining->str, remaining->len);
g_string_erase (remaining, 0, 1);
}
rem_indent = indent;
+ if (remaining->len > 0) {
+ g_free (forced_wrap_append);
+ forced_wrap_append = g_strdup (remaining->str);
+ }
append_quoted (output, quote_symbol, indent, l, breakpoint);
g_string_free (l, TRUE);
- } while ((iter < text + len) || (remaining->str[0]));
+ } while ((iter < text + len) || (remaining->str[0]) || forced_wrap_append);
return output;
}