From 9f8e5cabb34430978fb9ad52a9d980fb04ebe442 Mon Sep 17 00:00:00 2001 From: John Lenz Date: Tue, 2 Jul 2013 19:19:42 +1900 Subject: [PATCH] cli: add --include-html option to notmuch show --- a0/d2ec4cf18542cf4545b3256994e8f87eb5f94b | 221 ++++++++++++++++++++++ 1 file changed, 221 insertions(+) create mode 100644 a0/d2ec4cf18542cf4545b3256994e8f87eb5f94b diff --git a/a0/d2ec4cf18542cf4545b3256994e8f87eb5f94b b/a0/d2ec4cf18542cf4545b3256994e8f87eb5f94b new file mode 100644 index 000000000..c25ba7a17 --- /dev/null +++ b/a0/d2ec4cf18542cf4545b3256994e8f87eb5f94b @@ -0,0 +1,221 @@ +Return-Path: +X-Original-To: notmuch@notmuchmail.org +Delivered-To: notmuch@notmuchmail.org +Received: from localhost (localhost [127.0.0.1]) + by olra.theworths.org (Postfix) with ESMTP id A87DC431FCF + for ; Mon, 1 Jul 2013 17:19:52 -0700 (PDT) +X-Virus-Scanned: Debian amavisd-new at olra.theworths.org +X-Spam-Flag: NO +X-Spam-Score: 0 +X-Spam-Level: +X-Spam-Status: No, score=0 tagged_above=-999 required=5 + tests=[RCVD_IN_DNSWL_NONE=-0.0001] autolearn=disabled +Received: from olra.theworths.org ([127.0.0.1]) + by localhost (olra.theworths.org [127.0.0.1]) (amavisd-new, port 10024) + with ESMTP id QGG4L3nO6QAs for ; + Mon, 1 Jul 2013 17:19:45 -0700 (PDT) +Received: from smtp.rcn.com (smtp.rcn.com [69.168.97.78]) + by olra.theworths.org (Postfix) with ESMTP id 1AF50431FC7 + for ; Mon, 1 Jul 2013 17:19:45 -0700 (PDT) +X_CMAE_Category: 0,0 Undefined,Undefined +X-CNFS-Analysis: v=2.1 cv=IKk7VGfG c=1 sm=0 tr=0 + a=C2bPeGdon5f+QfTtoGFpIg==:117 a=L41ukIAEf44A:10 + a=97V-WqMTq8EA:10 a=IkcTkHD0fZMA:10 a=3wHbS4G-AAAA:8 + a=7343-z1_AAAA:8 a=pm0CvZHm5i0A:10 a=K-m1EemV6aEvyrkEG1UA:9 + a=QEXdDO2ut3YA:10 +X-CM-Score: 0 +X-Scanned-by: Cloudmark Authority Engine +Authentication-Results: smtp01.rcn.cmh.synacor.com + smtp.mail=wuzzeb@wuzzeb.org; spf=pass; sender-id=pass +Authentication-Results: smtp01.rcn.cmh.synacor.com + header.from=wuzzeb@wuzzeb.org; sender-id=pass +Received-SPF: pass (smtp01.rcn.cmh.synacor.com: domain wuzzeb.org designates + 205.178.10.182 as permitted sender) +Received: from [205.178.10.182] ([205.178.10.182:45556] helo=wuzzeb.org) + by smtp.rcn.com (envelope-from ) + (ecelerity 2.2.3.49 r(42060/42061)) with ESMTP + id 17/7B-12322-F9C12D15; Mon, 01 Jul 2013 20:19:43 -0400 +Received: from wuzzeb by wuzzeb.org with local (Exim 4.80.1) + (envelope-from ) id 1UtoJq-0000IK-Qa + for notmuch@notmuchmail.org; Mon, 01 Jul 2013 19:19:43 -0500 +From: =?utf-8?Q?John_Lenz?= +To: +Subject: cli: add --include-html option to notmuch show +Message-ID: +MIME-Version: 1.0 +Content-Type: text/plain; charset=UTF-8 +Sender: +Date: Mon, 01 Jul 2013 19:19:42 -0500 +X-BeenThere: notmuch@notmuchmail.org +X-Mailman-Version: 2.1.13 +Precedence: list +List-Id: "Use and development of the notmuch mail system." + +List-Unsubscribe: , + +List-Archive: +List-Post: +List-Help: +List-Subscribe: , + +X-List-Received-Date: Tue, 02 Jul 2013 00:19:52 -0000 + +For my client, the largest bottleneck for displaying large threads is +exporting each html part individually since by default notmuch will not +show the json parts. For large threads there can be quite a few parts and +each must be exported and decoded one by one. Also, I then have to deal +with all the crazy charsets which I can do through a library but is a +pain. + +Therefore, this patch adds an --include-html option that causes the +text/html parts to be included as part of the output of show. + + +diff man/man1/notmuch-show.1 +--- a/man/man1/notmuch-show.1 Sun Jun 23 14:24:02 2013 +1000 ++++ b/man/man1/notmuch-show.1 Mon Jul 01 18:51:13 2013 -0500 +@@ -207,6 +207,20 @@ + output is much faster and substantially smaller. + .RE + ++.RS 4 ++.TP 4 ++.B \-\-include-html ++ ++Include "text/html" parts as part of the output (currently only supported with ++--format=json and --format=sexp). ++By default, unless ++.B --part=N ++is used to select a specific part or ++.B --include-html ++is used to include all "text/html" parts, no part with content type "text/html" ++is included in the output. ++.RE ++ + A common use of + .B notmuch show + is to display a single thread of email messages. For this, use a +diff notmuch-client.h +--- a/notmuch-client.h Sun Jun 23 14:24:02 2013 +1000 ++++ b/notmuch-client.h Mon Jul 01 18:51:13 2013 -0500 +@@ -89,6 +89,7 @@ + notmuch_bool_t raw; + int part; + notmuch_crypto_t crypto; ++ notmuch_bool_t include_html; + } notmuch_show_params_t; + + /* There's no point in continuing when we've detected that we've done +@@ -220,7 +221,8 @@ + + void + format_part_sprinter (const void *ctx, struct sprinter *sp, mime_node_t *node, +- notmuch_bool_t first, notmuch_bool_t output_body); ++ notmuch_bool_t first, notmuch_bool_t output_body, ++ notmuch_bool_t include_html); + + void + format_headers_sprinter (struct sprinter *sp, GMimeMessage *message, +diff notmuch-reply.c +--- a/notmuch-reply.c Sun Jun 23 14:24:02 2013 +1000 ++++ b/notmuch-reply.c Mon Jul 01 18:51:13 2013 -0500 +@@ -624,7 +624,7 @@ + + /* Start the original */ + sp->map_key (sp, "original"); +- format_part_sprinter (ctx, sp, node, TRUE, TRUE); ++ format_part_sprinter (ctx, sp, node, TRUE, TRUE, FALSE); + + /* End */ + sp->end (sp); +diff notmuch-show.c +--- a/notmuch-show.c Sun Jun 23 14:24:02 2013 +1000 ++++ b/notmuch-show.c Mon Jul 01 18:51:13 2013 -0500 +@@ -630,7 +630,8 @@ + + void + format_part_sprinter (const void *ctx, sprinter_t *sp, mime_node_t *node, +- notmuch_bool_t first, notmuch_bool_t output_body) ++ notmuch_bool_t first, notmuch_bool_t output_body, ++ notmuch_bool_t include_html) + { + /* Any changes to the JSON or S-Expression format should be + * reflected in the file devel/schemata. */ +@@ -645,7 +646,7 @@ + if (output_body) { + sp->map_key (sp, "body"); + sp->begin_list (sp); +- format_part_sprinter (ctx, sp, mime_node_child (node, 0), first, TRUE); ++ format_part_sprinter (ctx, sp, mime_node_child (node, 0), first, TRUE, include_html); + sp->end (sp); + } + sp->end (sp); +@@ -700,14 +701,15 @@ + /* For non-HTML text parts, we include the content in the + * JSON. Since JSON must be Unicode, we handle charset + * decoding here and do not report a charset to the caller. +- * For text/html parts, we do not include the content. If a +- * caller is interested in text/html parts, it should retrieve +- * them separately and they will not be decoded. Since this +- * makes charset decoding the responsibility on the caller, we ++ * For text/html parts, we do not include the content unless ++ * the --include-html option has been passed. If a html part ++ * is not included, it can be requested directly. This makes ++ * charset decoding the responsibility on the caller so we + * report the charset for text/html parts. + */ + if (g_mime_content_type_is_type (content_type, "text", "*") && +- ! g_mime_content_type_is_type (content_type, "text", "html")) ++ (include_html || ++ ! g_mime_content_type_is_type (content_type, "text", "html"))) + { + GMimeStream *stream_memory = g_mime_stream_mem_new (); + GByteArray *part_content; +@@ -737,7 +739,7 @@ + } + + for (i = 0; i < node->nchildren; i++) +- format_part_sprinter (ctx, sp, mime_node_child (node, i), i == 0, TRUE); ++ format_part_sprinter (ctx, sp, mime_node_child (node, i), i == 0, TRUE, include_html); + + /* Close content structures */ + for (i = 0; i < nclose; i++) +@@ -751,7 +753,7 @@ + mime_node_t *node, unused (int indent), + const notmuch_show_params_t *params) + { +- format_part_sprinter (ctx, sp, node, TRUE, params->output_body); ++ format_part_sprinter (ctx, sp, node, TRUE, params->output_body, params->include_html); + + return NOTMUCH_STATUS_SUCCESS; + } +@@ -1077,7 +1079,8 @@ + .crypto = { + .verify = FALSE, + .decrypt = FALSE +- } ++ }, ++ .include_html = FALSE + }; + int format_sel = NOTMUCH_FORMAT_NOT_SPECIFIED; + int exclude = EXCLUDE_TRUE; +@@ -1105,6 +1108,7 @@ + { NOTMUCH_OPT_BOOLEAN, ¶ms.crypto.decrypt, "decrypt", 'd', 0 }, + { NOTMUCH_OPT_BOOLEAN, ¶ms.crypto.verify, "verify", 'v', 0 }, + { NOTMUCH_OPT_BOOLEAN, ¶ms.output_body, "body", 'b', 0 }, ++ { NOTMUCH_OPT_BOOLEAN, ¶ms.include_html, "include-html", 0, 0 }, + { 0, 0, 0, 0, 0 } + }; + +@@ -1176,6 +1180,11 @@ + } + } + ++ if (params.include_html && ++ (format_sel != NOTMUCH_FORMAT_JSON && format_sel != NOTMUCH_FORMAT_SEXP)) { ++ fprintf (stderr, "Warning: --include-html only implemented for format=json and format=sexp\n"); ++ } ++ + if (entire_thread == ENTIRE_THREAD_TRUE) + params.entire_thread = TRUE; + else -- 2.26.2