cli: add --include-html option to notmuch show
Tomi Ollila
tomi.ollila at iki.fi
Sun Jul 21 13:23:58 PDT 2013
On Tue, Jul 02 2013, John Lenz <lenz at math.uic.edu> wrote:
> 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.
This looks like a useful option. I just wonder what effect does different
charsets do to the output (is text/html content output verbatim (with just
json/sexp escaping of '"' -characters).
If you added test(s) showing what happens with different charsets
(like one message having 3 text/html parts, one us-ascii, one iso-8859-1
and one utf-8) that would make things clearer and (also) protect us from
regressions.
Tomi
> 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
> _______________________________________________
> notmuch mailing list
> notmuch at notmuchmail.org
> http://notmuchmail.org/mailman/listinfo/notmuch
More information about the notmuch
mailing list