[RFC PATCH 5/5] show: Simplify new text formatter code

Subject: [RFC PATCH 5/5] show: Simplify new text formatter code

Date: Wed, 11 Jan 2012 20:49:33 -0500

To: notmuch@notmuchmail.org

Cc:

From: Austin Clements


This makes the text formatter take advantage of the new code
structure.  The previously duplicated header logic is now unified,
several things that we used to compute repeatedly across different
callbacks are now computed once, and the code is generally simplified.

Unifying the header logic causes this to format some dates slightly
differently, so the two affected test cases are updated.
---
 notmuch-show.c     |   84 ++++++++++++----------------------------------------
 test/crypto        |    2 +-
 test/thread-naming |   16 +++++-----
 3 files changed, 28 insertions(+), 74 deletions(-)

diff --git a/notmuch-show.c b/notmuch-show.c
index 3241965..1689222 100644
--- a/notmuch-show.c
+++ b/notmuch-show.c
@@ -175,67 +175,42 @@ format_part_text (const void *ctx, mime_node_t *node,
     GMimeObject *meta = node->envelope_part ?
 	GMIME_OBJECT (node->envelope_part) : node->part;
     GMimeContentType *content_type = g_mime_object_get_content_type (meta);
+    GMimeContentDisposition *disposition =
+	g_mime_object_get_content_disposition (meta);
+    notmuch_bool_t attachment = disposition &&
+	strcmp (disposition->disposition, GMIME_DISPOSITION_ATTACHMENT) == 0;
+    notmuch_bool_t leaf = GMIME_IS_PART (node->part);
     int i;
 
     if (node->envelope_file) {
 	notmuch_message_t *message = node->envelope_file;
-	const char *headers[] = {
-	    "Subject", "From", "To", "Cc", "Bcc", "Date"
-	};
-	const char *name, *value;
-	unsigned int i;
 
-	printf ("\fmessage{ ");
-	printf ("id:%s depth:%d match:%d filename:%s\n",
+	printf ("\fmessage{ id:%s depth:%d match:%d filename:%s\n",
 		notmuch_message_get_message_id (message),
 		indent,
 		notmuch_message_get_flag (message, NOTMUCH_MESSAGE_FLAG_MATCH),
 		notmuch_message_get_filename (message));
-
-	printf ("\fheader{\n");
-
-	printf ("%s\n", _get_one_line_summary (ctx, message));
-
-	for (i = 0; i < ARRAY_SIZE (headers); i++) {
-	    name = headers[i];
-	    value = notmuch_message_get_header (message, name);
-	    if (value && strlen (value))
-		printf ("%s: %s\n", name, value);
-	}
-	printf ("\fheader}\n");
     } else {
-	GMimeContentDisposition *disposition = g_mime_object_get_content_disposition (meta);
 	const char *cid = g_mime_object_get_content_id (meta);
+	const char *filename = leaf ?
+	    g_mime_part_get_filename (GMIME_PART (node->part)) : NULL;
 
-	if (disposition &&
-	    strcmp (disposition->disposition, GMIME_DISPOSITION_ATTACHMENT) == 0)
-	{
-	    printf ("\fattachment{ ID: %d", node->part_num);
-
-	} else {
-
-	    printf ("\fpart{ ID: %d", node->part_num);
-	}
-
-	if (GMIME_IS_PART (node->part))
-	{
-	    const char *filename = g_mime_part_get_filename (GMIME_PART (node->part));
-	    if (filename)
-		printf (", Filename: %s", filename);
-	}
-
+	printf ("\f%s{ ID: %d", attachment ? "attachment" : "part", node->part_num);
+	if (filename)
+	    printf (", Filename: %s", filename);
 	if (cid)
 	    printf (", Content-id: %s", cid);
-
 	printf (", Content-type: %s\n", g_mime_content_type_to_string (content_type));
     }
 
-    if (node->envelope_part) {
+    if (GMIME_IS_MESSAGE (node->part)) {
 	GMimeMessage *message = GMIME_MESSAGE (node->part);
 	InternetAddressList *recipients;
 	const char *recipients_string;
 
 	printf ("\fheader{\n");
+	if (node->envelope_file)
+	    printf ("%s\n", _get_one_line_summary (ctx, node->envelope_file));
 	printf ("Subject: %s\n", g_mime_message_get_subject (message));
 	printf ("From: %s\n", g_mime_message_get_sender (message));
 	recipients = g_mime_message_get_recipients (message, GMIME_RECIPIENT_TYPE_TO);
@@ -248,9 +223,11 @@ format_part_text (const void *ctx, mime_node_t *node,
 	    printf ("Cc: %s\n", recipients_string);
 	printf ("Date: %s\n", g_mime_message_get_date_as_string (message));
 	printf ("\fheader}\n");
+
+	printf ("\fbody{\n");
     }
 
-    if (!node->envelope_file) {
+    if (leaf) {
 	if (g_mime_content_type_is_type (content_type, "text", "*") &&
 	    !g_mime_content_type_is_type (content_type, "text", "html"))
 	{
@@ -258,24 +235,12 @@ format_part_text (const void *ctx, mime_node_t *node,
 	    g_mime_stream_file_set_owner (GMIME_STREAM_FILE (stream_stdout), FALSE);
 	    show_text_part_content (node->part, stream_stdout);
 	    g_object_unref(stream_stdout);
-	}
-	else if (g_mime_content_type_is_type (content_type, "multipart", "*") ||
-		 g_mime_content_type_is_type (content_type, "message", "rfc822"))
-	{
-	    /* Do nothing for multipart since its content will be printed
-	     * when recursing. */
-	}
-	else
-	{
+	} else {
 	    printf ("Non-text part: %s\n",
 		    g_mime_content_type_to_string (content_type));
 	}
     }
 
-    if (GMIME_IS_MESSAGE (node->part)) {
-	printf ("\fbody{\n");
-    }
-
     for (i = 0; i < node->nchildren; i++)
 	format_part_text (ctx, mime_node_child (node, i), indent, params);
 
@@ -286,18 +251,7 @@ format_part_text (const void *ctx, mime_node_t *node,
     if (node->envelope_file) {
 	printf ("\fmessage}\n");
     } else {
-	GMimeContentDisposition *disposition;
-
-	disposition = g_mime_object_get_content_disposition (meta);
-	if (disposition &&
-	    strcmp (disposition->disposition, GMIME_DISPOSITION_ATTACHMENT) == 0)
-	{
-	    printf ("\fattachment}\n");
-	}
-	else
-	{
-	    printf ("\fpart}\n");
-	}
+	printf ("\f%s}\n", attachment ? "attachment" : "part");
     }
 }
 
diff --git a/test/crypto b/test/crypto
index 0af4aa8..6723ef8 100755
--- a/test/crypto
+++ b/test/crypto
@@ -157,7 +157,7 @@ Notmuch Test Suite <test_suite@notmuchmail.org> (2000-01-01) (encrypted inbox)
 Subject: test encrypted message 001
 From: Notmuch Test Suite <test_suite@notmuchmail.org>
 To: test_suite@notmuchmail.org
-Date: 01 Jan 2000 12:00:00 -0000
+Date: Sat, 01 Jan 2000 12:00:00 +0000
 header}
 body{
 part{ ID: 1, Content-type: multipart/encrypted
diff --git a/test/thread-naming b/test/thread-naming
index 41b97d9..b7c96f2 100755
--- a/test/thread-naming
+++ b/test/thread-naming
@@ -71,7 +71,7 @@ Notmuch Test Suite <test_suite@notmuchmail.org> (2001-01-05) (unread)
 Subject: thread-naming: Initial thread subject
 From: Notmuch Test Suite <test_suite@notmuchmail.org>
 To: Notmuch Test Suite <test_suite@notmuchmail.org>
-Date: Fri, 05 Jan 2001 15:43:56 -0000
+Date: Fri, 05 Jan 2001 15:43:56 +0000
 header}
 body{
 part{ ID: 1, Content-type: text/plain
@@ -85,7 +85,7 @@ Notmuch Test Suite <test_suite@notmuchmail.org> (2001-01-06) (inbox unread)
 Subject: thread-naming: Older changed subject
 From: Notmuch Test Suite <test_suite@notmuchmail.org>
 To: Notmuch Test Suite <test_suite@notmuchmail.org>
-Date: Sat, 06 Jan 2001 15:43:56 -0000
+Date: Sat, 06 Jan 2001 15:43:56 +0000
 header}
 body{
 part{ ID: 1, Content-type: text/plain
@@ -99,7 +99,7 @@ Notmuch Test Suite <test_suite@notmuchmail.org> (2001-01-07) (inbox unread)
 Subject: thread-naming: Newer changed subject
 From: Notmuch Test Suite <test_suite@notmuchmail.org>
 To: Notmuch Test Suite <test_suite@notmuchmail.org>
-Date: Sun, 07 Jan 2001 15:43:56 -0000
+Date: Sun, 07 Jan 2001 15:43:56 +0000
 header}
 body{
 part{ ID: 1, Content-type: text/plain
@@ -113,7 +113,7 @@ Notmuch Test Suite <test_suite@notmuchmail.org> (2001-01-08) (unread)
 Subject: thread-naming: Final thread subject
 From: Notmuch Test Suite <test_suite@notmuchmail.org>
 To: Notmuch Test Suite <test_suite@notmuchmail.org>
-Date: Mon, 08 Jan 2001 15:43:56 -0000
+Date: Mon, 08 Jan 2001 15:43:56 +0000
 header}
 body{
 part{ ID: 1, Content-type: text/plain
@@ -127,7 +127,7 @@ Notmuch Test Suite <test_suite@notmuchmail.org> (2001-01-09) (inbox unread)
 Subject: Re: thread-naming: Initial thread subject
 From: Notmuch Test Suite <test_suite@notmuchmail.org>
 To: Notmuch Test Suite <test_suite@notmuchmail.org>
-Date: Tue, 09 Jan 2001 15:43:45 -0000
+Date: Tue, 09 Jan 2001 15:43:45 +0000
 header}
 body{
 part{ ID: 1, Content-type: text/plain
@@ -141,7 +141,7 @@ Notmuch Test Suite <test_suite@notmuchmail.org> (2001-01-10) (inbox unread)
 Subject: Aw: thread-naming: Initial thread subject
 From: Notmuch Test Suite <test_suite@notmuchmail.org>
 To: Notmuch Test Suite <test_suite@notmuchmail.org>
-Date: Wed, 10 Jan 2001 15:43:45 -0000
+Date: Wed, 10 Jan 2001 15:43:45 +0000
 header}
 body{
 part{ ID: 1, Content-type: text/plain
@@ -155,7 +155,7 @@ Notmuch Test Suite <test_suite@notmuchmail.org> (2001-01-11) (inbox unread)
 Subject: Vs: thread-naming: Initial thread subject
 From: Notmuch Test Suite <test_suite@notmuchmail.org>
 To: Notmuch Test Suite <test_suite@notmuchmail.org>
-Date: Thu, 11 Jan 2001 15:43:45 -0000
+Date: Thu, 11 Jan 2001 15:43:45 +0000
 header}
 body{
 part{ ID: 1, Content-type: text/plain
@@ -169,7 +169,7 @@ Notmuch Test Suite <test_suite@notmuchmail.org> (2001-01-12) (inbox unread)
 Subject: Sv: thread-naming: Initial thread subject
 From: Notmuch Test Suite <test_suite@notmuchmail.org>
 To: Notmuch Test Suite <test_suite@notmuchmail.org>
-Date: Fri, 12 Jan 2001 15:43:45 -0000
+Date: Fri, 12 Jan 2001 15:43:45 +0000
 header}
 body{
 part{ ID: 1, Content-type: text/plain
-- 
1.7.7.3


Thread: