diff --git a/src/chunk.cc b/src/chunk.cc index 044aa376d..762a8475b 100644 --- a/src/chunk.cc +++ b/src/chunk.cc @@ -238,6 +238,10 @@ namespace Astroid { } + bool Chunk::is_content_type (const char * major, const char * minor) { + return (mime_object != NULL) && g_mime_content_type_is_type (content_type, major, minor); + } + ustring Chunk::viewable_text (bool html = true, bool verbose) { if (isencrypted && !crypt->decrypted) { if (verbose) { @@ -258,7 +262,7 @@ namespace Astroid { LOG (debug) << "chunk: body: part"; - if (g_mime_content_type_is_type (content_type, "text", "plain")) { + if (is_content_type ("text", "plain")) { LOG (debug) << "chunk: plain text (out html: " << html << ")"; GMimeDataWrapper * content = g_mime_part_get_content ( @@ -328,7 +332,7 @@ namespace Astroid { content_stream = filter_stream; - } else if (g_mime_content_type_is_type (content_type, "text", "html")) { + } else if (is_content_type ("text", "html")) { LOG (debug) << "chunk: html text"; GMimeDataWrapper * content = g_mime_part_get_content ( diff --git a/src/chunk.hh b/src/chunk.hh index eaea150d9..30d224b0e 100644 --- a/src/chunk.hh +++ b/src/chunk.hh @@ -30,6 +30,7 @@ namespace Astroid { ustring content_id; ustring get_content_type (); + bool is_content_type (const char* major, const char* minor); ustring viewable_text (bool, bool verbose = false); diff --git a/src/compose_message.cc b/src/compose_message.cc index b6a1a2596..20d23dd5e 100644 --- a/src/compose_message.cc +++ b/src/compose_message.cc @@ -283,8 +283,7 @@ namespace Astroid { set_subject (msg.subject); - body << msg.viewable_text (false); - + body << msg.plain_text (false); } void ComposeMessage::finalize () { diff --git a/src/message_thread.cc b/src/message_thread.cc index 589b83044..134ccd166 100644 --- a/src/message_thread.cc +++ b/src/message_thread.cc @@ -300,21 +300,12 @@ namespace Astroid { root = refptr(new Chunk (g_mime_message_get_mime_part (message))); } - ustring Message::viewable_text (bool html, bool fallback_html) { - /* build message body: - * html: output html (using gmimes html filter) - * - */ - + ustring Message::plain_text (bool fallback_html) { if (missing_content) { LOG (warn) << "message: missing content, no text."; return ""; } - if (html && fallback_html) { - throw logic_error ("message: html implies fallback_html"); - } - ustring body; function< void (refptr) > app_body = @@ -324,13 +315,13 @@ namespace Astroid { bool use = false; if (c->siblings.size() >= 1) { - if (c->preferred) { + if (c->is_content_type ("text", "plain") || fallback_html) { use = true; } else { /* check if there are any other preferred */ if (all_of (c->siblings.begin (), c->siblings.end (), - [](refptr c) { return (!c->preferred); })) { + [fallback_html](refptr c) { return !(c->is_content_type ("text", "plain") || fallback_html); })) { use = true; } else { use = false; @@ -341,8 +332,9 @@ namespace Astroid { } if (use) { - if (c->viewable && (c->preferred || html || fallback_html)) { - body += c->viewable_text (html); + if (c->viewable && (c->is_content_type ("text", "plain") || fallback_html)) { + /* will output html if HTML part */ + body += c->viewable_text (false); } for_each (c->kids.begin(), diff --git a/src/message_thread.hh b/src/message_thread.hh index 248fdf9b8..15c80750e 100644 --- a/src/message_thread.hh +++ b/src/message_thread.hh @@ -63,10 +63,10 @@ namespace Astroid { ustring date (); ustring date_asctime (); ustring pretty_date (); - ustring pretty_verbose_date (bool = false); + ustring pretty_verbose_date (bool include_short = false); std::vector tags; - ustring viewable_text (bool, bool fallback_html = false); + ustring plain_text (bool fallback_html = false); std::vector> attachments (); refptr get_chunk_by_id (int id); diff --git a/src/modes/forward_message.cc b/src/modes/forward_message.cc index a47adc1c9..8343b4268 100644 --- a/src/modes/forward_message.cc +++ b/src/modes/forward_message.cc @@ -67,7 +67,7 @@ namespace Astroid { quoted << "Cc: " << AddressList(msg->cc()).str () << endl; quoted << endl; - string vt = msg->viewable_text(false); + string vt = msg->plain_text (false); quoted << vt; body = ustring(quoted.str()); diff --git a/src/modes/reply_message.cc b/src/modes/reply_message.cc index c3b673d2b..4cad1a5d7 100644 --- a/src/modes/reply_message.cc +++ b/src/modes/reply_message.cc @@ -56,7 +56,7 @@ namespace Astroid { quoted << quoting_a.raw () << endl; - string vt = msg->viewable_text(false); + string vt = msg->plain_text (false); stringstream sstr (vt); while (sstr.good()) { string line; diff --git a/src/modes/thread_view/page_client.cc b/src/modes/thread_view/page_client.cc index a1b7977ab..82c95a528 100644 --- a/src/modes/thread_view/page_client.cc +++ b/src/modes/thread_view/page_client.cc @@ -455,7 +455,7 @@ namespace Astroid { /* set preview */ { - ustring bp = m->viewable_text (false, false); + ustring bp = m->plain_text (false); if (static_cast(bp.size()) > MAX_PREVIEW_LEN) bp = bp.substr(0, MAX_PREVIEW_LEN - 3) + "..."; diff --git a/src/modes/thread_view/thread_view.cc b/src/modes/thread_view/thread_view.cc index 16d8ba6a9..9843cde45 100644 --- a/src/modes/thread_view/thread_view.cc +++ b/src/modes/thread_view/thread_view.cc @@ -1153,7 +1153,7 @@ namespace Astroid { for (auto &m : mthread->messages) { MessageState s = state[m]; if (s.marked) { - y += m->viewable_text (false, true); + y += m->plain_text (true); y += "\n"; } } @@ -1709,7 +1709,7 @@ namespace Astroid { auto cp = Gtk::Clipboard::get (astroid->clipboard_target); ustring t; - t = focused_message->viewable_text (false, true); + t = focused_message->plain_text (true); cp->set_text (t); } @@ -1739,7 +1739,7 @@ namespace Astroid { auto cp = Gtk::Clipboard::get (astroid->clipboard_target); ustring t; - t = focused_message->viewable_text (false, true); + t = focused_message->plain_text (true); cp->set_text (t); } diff --git a/tests/test_bad_content_id.cc b/tests/test_bad_content_id.cc index fbffa5817..70b9064fc 100644 --- a/tests/test_bad_content_id.cc +++ b/tests/test_bad_content_id.cc @@ -30,7 +30,7 @@ BOOST_AUTO_TEST_SUITE(Reading) Message m (fname); - BOOST_CHECK_NO_THROW (m.viewable_text (true)); + BOOST_CHECK_NO_THROW (m.plain_text (true)); /* the first part is probablematic */ /* refptr c = m.root->kids[0]; */ @@ -60,7 +60,7 @@ BOOST_AUTO_TEST_SUITE(Reading) Message m (fname); - BOOST_CHECK_NO_THROW (m.viewable_text (true)); + BOOST_CHECK_NO_THROW (m.plain_text (true)); /* the first part is probablematic */ /* refptr c = m.root->kids[0]; */ diff --git a/tests/test_composed_message.cc b/tests/test_composed_message.cc index e401dd0ef..b9411d458 100644 --- a/tests/test_composed_message.cc +++ b/tests/test_composed_message.cc @@ -8,6 +8,7 @@ # include "account_manager.hh" # include "utils/address.hh" # include "utils/ustring_utils.hh" +# include BOOST_AUTO_TEST_SUITE(Composing) @@ -44,7 +45,7 @@ BOOST_AUTO_TEST_SUITE(Composing) Message m (fn); - ustring rbdy = m.viewable_text (false); + ustring rbdy = m.plain_text (false); BOOST_CHECK_MESSAGE (bdy == rbdy, "message reading produces the same output as compose message input"); @@ -142,7 +143,7 @@ BOOST_AUTO_TEST_SUITE(Composing) BOOST_CHECK (m.subject == subject); BOOST_CHECK (AddressList(m.to()).str () == to); BOOST_CHECK (m.mid == id); - BOOST_CHECK (m.viewable_text (false) == (body + signature)); + BOOST_CHECK (m.plain_text (false) == (body + signature)); unlink (fname.c_str ()); } @@ -150,5 +151,37 @@ BOOST_AUTO_TEST_SUITE(Composing) teardown (); } + BOOST_AUTO_TEST_CASE (compose_test_body_preferred_html) + { + using Astroid::ComposeMessage; + using Astroid::Message; + using boost::property_tree::ptree; + + setup (); + const_cast(astroid->config()).put ("thread_view.preferred_type", "html"); + + ComposeMessage * c = new ComposeMessage (); + + ustring bdy = "This is test: æøå.\n > testing\ntesting\n..."; + + LOG (trace) << "cm: writing utf-8 text to message body: " << bdy; + c->body << bdy; + + c->build (); + c->finalize (); + ustring fn = c->write_tmp (); + + delete c; + + Message m (fn); + + ustring rbdy = m.plain_text (false); + + BOOST_CHECK_MESSAGE (bdy == rbdy, "message reading produces the same output as compose message input"); + + unlink (fn.c_str ()); + teardown (); + } + BOOST_AUTO_TEST_SUITE_END() diff --git a/tests/test_convert_error.cc b/tests/test_convert_error.cc index 3f0cf5bf3..0b4b7070f 100644 --- a/tests/test_convert_error.cc +++ b/tests/test_convert_error.cc @@ -24,7 +24,7 @@ BOOST_AUTO_TEST_SUITE(Reading) Astroid::Message m (fname); - BOOST_CHECK_NO_THROW (m.viewable_text (false)); + BOOST_CHECK_NO_THROW (m.plain_text (false)); teardown (); } @@ -45,7 +45,7 @@ BOOST_AUTO_TEST_SUITE(Reading) quoted << quoting_a.raw () << endl; - std::string vt = msg.viewable_text(false); + std::string vt = msg.plain_text(false); std::stringstream sstr (vt); while (sstr.good()) { std::string line; diff --git a/tests/test_crypto.cc b/tests/test_crypto.cc index eec324a0d..d8a4b19e1 100644 --- a/tests/test_crypto.cc +++ b/tests/test_crypto.cc @@ -69,7 +69,7 @@ BOOST_AUTO_TEST_SUITE(GPGEncryption) delete c; Message m (fn); - ustring rbdy = m.viewable_text (false); + ustring rbdy = m.plain_text (false); BOOST_CHECK_MESSAGE (bdy == rbdy, "message reading produces the same output as compose message input"); @@ -116,7 +116,7 @@ BOOST_AUTO_TEST_SUITE(GPGEncryption) Message m (fn); - ustring rbdy = m.viewable_text (false); + ustring rbdy = m.plain_text (false); BOOST_CHECK_MESSAGE (bdy == rbdy, "message reading produces the same output as compose message input"); @@ -218,7 +218,7 @@ BOOST_AUTO_TEST_SUITE(GPGEncryption) } /* check that body matches */ - ustring rbdy = m->viewable_text (false); + ustring rbdy = m->plain_text (false); BOOST_CHECK_MESSAGE (bdy == rbdy, "message reading produces the same output as compose message input"); /* notmuch thread id */ @@ -251,7 +251,7 @@ BOOST_AUTO_TEST_SUITE(GPGEncryption) Db db (Db::DATABASE_READ_ONLY); mthread->load_messages (&db); - BOOST_CHECK_MESSAGE (bdy == mthread->messages[0]->viewable_text (false), "message body matches composed message"); + BOOST_CHECK_MESSAGE (bdy == mthread->messages[0]->plain_text (false), "message body matches composed message"); tries++; } @@ -321,7 +321,7 @@ BOOST_AUTO_TEST_SUITE(GPGEncryption) delete c; Message m (fn); - ustring rbdy = m.viewable_text (false); + ustring rbdy = m.plain_text (false); BOOST_CHECK_MESSAGE (bdy == rbdy, "message reading produces the same output as compose message input"); diff --git a/tests/test_markdown.cc b/tests/test_markdown.cc index 509159af6..0ac8847a1 100644 --- a/tests/test_markdown.cc +++ b/tests/test_markdown.cc @@ -35,7 +35,7 @@ BOOST_AUTO_TEST_SUITE(Markdown) Message m (fn); /* check plain text part */ - ustring pbdy = m.viewable_text (false); + ustring pbdy = m.plain_text (false); BOOST_CHECK_MESSAGE (pbdy == bdy, "plain text matches plain text"); /* check html part */ diff --git a/tests/test_mime_message.cc b/tests/test_mime_message.cc index 80d5db95a..2dc0a56ba 100644 --- a/tests/test_mime_message.cc +++ b/tests/test_mime_message.cc @@ -27,7 +27,7 @@ BOOST_AUTO_TEST_SUITE(Reading) Message m (fname); - BOOST_CHECK_NO_THROW (m.viewable_text (true)); + BOOST_CHECK_NO_THROW (m.plain_text (true)); teardown (); } diff --git a/tests/test_no_newline_msg.cc b/tests/test_no_newline_msg.cc index d06220fa1..3931df93b 100644 --- a/tests/test_no_newline_msg.cc +++ b/tests/test_no_newline_msg.cc @@ -23,11 +23,12 @@ BOOST_AUTO_TEST_SUITE(Reading) Message m (fname); - ustring text = m.viewable_text(false); + ustring text = m.plain_text(false); BOOST_CHECK (text.find ("line-ignored") != ustring::npos); - ustring html = m.viewable_text(true); - BOOST_CHECK (html.find ("line-ignored") != ustring::npos); + /* test obsolete: */ + /* ustring html = m.viewable_text(true); */ + /* BOOST_CHECK (html.find ("line-ignored") != ustring::npos); */ teardown (); } @@ -46,11 +47,12 @@ BOOST_AUTO_TEST_SUITE(Reading) Message m (fname); - ustring text = m.viewable_text(false); + ustring text = m.plain_text (false); BOOST_CHECK (text.find ("line-ignored.com") != ustring::npos); - ustring html = m.viewable_text(true); - BOOST_CHECK (html.find ("line-ignored.com") != ustring::npos); + /* test obsolete: */ + /* ustring html = m.viewable_text(true); */ + /* BOOST_CHECK (html.find ("line-ignored.com") != ustring::npos); */ teardown (); @@ -66,11 +68,12 @@ BOOST_AUTO_TEST_SUITE(Reading) Message m (fname); - ustring text = m.viewable_text(false); + ustring text = m.plain_text (false); BOOST_CHECK (text.find ("line-ignored.com") != ustring::npos); - ustring html = m.viewable_text(true); - BOOST_CHECK (html.find ("line-ignored.com") != ustring::npos); + /* test obsolete: */ + /* ustring html = m.viewable_text(true); */ + /* BOOST_CHECK (html.find ("line-ignored.com") != ustring::npos); */ teardown (); @@ -86,7 +89,7 @@ BOOST_AUTO_TEST_SUITE(Reading) Message m (fname); - ustring text = m.viewable_text(false, true); + ustring text = m.plain_text (true); BOOST_CHECK (text.find ("line-ignored.com") != ustring::npos); diff --git a/tests/test_non_existant_file.cc b/tests/test_non_existant_file.cc index e5245da3a..47fbefb05 100644 --- a/tests/test_non_existant_file.cc +++ b/tests/test_non_existant_file.cc @@ -72,7 +72,7 @@ BOOST_AUTO_TEST_SUITE(Reading) oos->save_to ("tests/mail/test_mail/wont-work.eml"); LOG (test) << "sender: " << oos->sender; - LOG (test) << "text: " << oos->viewable_text (false); + LOG (test) << "text: " << oos->plain_text (false); /* these do not seem to be cached */ LOG (test) << "to: " << AddressList (oos->to()).str();