#include <tny-simple-list.h>
#include <tny-gtk-text-buffer-stream.h>
#include <tny-camel-mem-stream.h>
-#include <tny-camel-html-to-text-stream.h>
#include "modest-formatter.h"
#include "modest-text-utils.h"
#include "modest-tny-platform-factory.h"
-#include <modest-runtime.h>
+#include "modest-runtime.h"
+#include "modest-stream-html-to-text.h"
#define LINE_WRAP 78
#define MAX_BODY_LINES 1024
static TnyMimePart *find_body_parent (TnyMimePart *part);
-static guint
-count_end_tag_lines (const gchar *haystack, const gchar *needle)
-{
- gchar *tmp;
- guint lines = 0;
-
- tmp = g_strstr_len (haystack, g_utf8_strlen (haystack, -1), ">\n");
- while (tmp && (tmp <= needle)) {
- lines++;
- tmp += 2;
- tmp = g_strstr_len (tmp, g_utf8_strlen (tmp, -1), ">\n");
- }
-
- return lines;
-}
-
static gchar *
extract_text (ModestFormatter *self, TnyMimePart *body)
{
ModestFormatterPrivate *priv;
gint total, lines, total_lines, line_chars;
gboolean is_html, first_time;
+ gboolean forced_wrap;
buf = gtk_text_buffer_new (NULL);
stream = TNY_STREAM (tny_gtk_text_buffer_stream_new (buf));
is_html = (g_strcmp0 (tny_mime_part_get_content_type (body), "text/html") == 0);
if (is_html) {
- input_stream = tny_camel_html_to_text_stream_new (mp_stream);
+ input_stream = modest_stream_html_to_text_new (mp_stream);
} else {
input_stream = g_object_ref (mp_stream);
}
line_chars = 0;
lines = 0;
- /* For pure HTML emails tny_camel_html_to_text_stream inserts
- a \n for every ">\n" found in the email including the HTML
- headers (<html>, <head> ...). For that reason we need to
- remove them from the resulting text as it is artificially
- added by the stream */
- if (is_html) {
- const guint BUFFER_SIZE = 1024;
- TnyStream *is;
- gboolean look_for_end_tag, found;
- gchar buffer [BUFFER_SIZE + 1];
- gchar *needle;
-
- is = g_object_ref (mp_stream);
- look_for_end_tag = FALSE;
- found = FALSE;
-
- /* This algorithm does not work if the body tag is
- spread along 2 different stream reads. But there
- are not a lot of changes for this to happen as the
- buffer size is big enough in most situations. In
- the worst case, when it's not found we just accept
- the original translation with the extra "\n" */
- while (!tny_stream_is_eos (is) && !found) {
- gint n_read;
-
- needle = NULL;
- memset (buffer, 0, BUFFER_SIZE);
- n_read = tny_stream_read (is, buffer, BUFFER_SIZE);
-
- if (G_UNLIKELY (n_read < 0))
- break;
-
- buffer[n_read] = '\0';
-
- /* If we found body,then look for the end of the tag */
- if (look_for_end_tag) {
- needle = strchr (buffer, '>');
-
- if (needle) {
- found = TRUE;
- lines += count_end_tag_lines (buffer, needle);
- break;
- }
- } else {
- gchar *closing;
-
- /* Try to find the <body> tag. There
- is no other HTML tag starting by
- "bo", and we can detect more cases
- were <body> tag falls into two
- different stream reads */
- needle = g_strstr_len (buffer, n_read, "<bo");
-
- if (needle)
- look_for_end_tag = TRUE;
- else
- needle = &(buffer[n_read]);
-
- lines += count_end_tag_lines (buffer, needle);
-
- closing = strchr (needle, '>');
- if (closing) {
- if (*(closing + 1) == '\n')
- lines++;
- found = TRUE;
- break;
- }
- }
- }
- if (!found)
- lines = 0;
- tny_stream_reset (is);
-
- g_object_unref (is);
- }
-
+ forced_wrap = FALSE;
first_time = TRUE;
while (!tny_stream_is_eos (input_stream)) {
gchar buffer [128];
offset = buffer;
while (offset < buffer + n_read) {
- if (*offset == '\n') {
+ if (*offset == '\n' && !(forced_wrap && offset[1] == '\n')) {
total_lines ++;
line_chars = 0;
} else {
+ if (*offset == '\n') {
+ forced_wrap = FALSE;
+ }
line_chars ++;
if (line_chars >= LINE_WRAP) {
total_lines ++;
line_chars = 0;
+ forced_wrap = TRUE;
}
}
if (total_lines >= MAX_BODY_LINES)
if (offset - buffer > 0) {
gint n_write = 0, to_write = 0;
- gchar *buffer_ptr;
-
- /* Discard lines artificially inserted by
- Camel when translating from HTML to
- text. Do it only for the first read */
- buffer_ptr = buffer;
- if (G_UNLIKELY (first_time) && lines) {
- int i;
- for (i=0; i < lines; i++) {
- buffer_ptr = strchr (buffer_ptr, '\n');
- buffer_ptr++;
- }
- first_time = FALSE;
- }
- to_write = offset - buffer_ptr;
- n_write = tny_stream_write (stream, buffer_ptr, to_write);
+
+ to_write = offset - buffer;
+ n_write = tny_stream_write (stream, buffer, to_write);
total += n_write;
} else if (n_read == -1) {
break;
from,
tny_header_get_date_sent (header),
filenames,
- 80);
+ 72);
g_free (from);
g_list_foreach (filenames, (GFunc) g_free, NULL);