mirror of
https://git.notmuchmail.org/git/notmuch
synced 2024-11-21 18:38:08 +01:00
cli: add --include-html option to notmuch show
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
This commit is contained in:
parent
3e60e0b3e9
commit
f735a85c28
4 changed files with 37 additions and 12 deletions
|
@ -207,6 +207,20 @@ This is useful if the caller only needs the headers as body-less
|
||||||
output is much faster and substantially smaller.
|
output is much faster and substantially smaller.
|
||||||
.RE
|
.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
|
A common use of
|
||||||
.B notmuch show
|
.B notmuch show
|
||||||
is to display a single thread of email messages. For this, use a
|
is to display a single thread of email messages. For this, use a
|
||||||
|
|
|
@ -89,6 +89,7 @@ typedef struct notmuch_show_params {
|
||||||
notmuch_bool_t raw;
|
notmuch_bool_t raw;
|
||||||
int part;
|
int part;
|
||||||
notmuch_crypto_t crypto;
|
notmuch_crypto_t crypto;
|
||||||
|
notmuch_bool_t include_html;
|
||||||
} notmuch_show_params_t;
|
} notmuch_show_params_t;
|
||||||
|
|
||||||
/* There's no point in continuing when we've detected that we've done
|
/* There's no point in continuing when we've detected that we've done
|
||||||
|
@ -220,7 +221,8 @@ show_one_part (const char *filename, int part);
|
||||||
|
|
||||||
void
|
void
|
||||||
format_part_sprinter (const void *ctx, struct sprinter *sp, mime_node_t *node,
|
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
|
void
|
||||||
format_headers_sprinter (struct sprinter *sp, GMimeMessage *message,
|
format_headers_sprinter (struct sprinter *sp, GMimeMessage *message,
|
||||||
|
|
|
@ -621,7 +621,7 @@ notmuch_reply_format_sprinter(void *ctx,
|
||||||
|
|
||||||
/* Start the original */
|
/* Start the original */
|
||||||
sp->map_key (sp, "original");
|
sp->map_key (sp, "original");
|
||||||
format_part_sprinter (ctx, sp, node, TRUE, TRUE);
|
format_part_sprinter (ctx, sp, node, TRUE, TRUE, FALSE);
|
||||||
|
|
||||||
/* End */
|
/* End */
|
||||||
sp->end (sp);
|
sp->end (sp);
|
||||||
|
|
|
@ -630,7 +630,8 @@ format_omitted_part_meta_sprinter (sprinter_t *sp, GMimeObject *meta, GMimePart
|
||||||
|
|
||||||
void
|
void
|
||||||
format_part_sprinter (const void *ctx, sprinter_t *sp, mime_node_t *node,
|
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
|
/* Any changes to the JSON or S-Expression format should be
|
||||||
* reflected in the file devel/schemata. */
|
* reflected in the file devel/schemata. */
|
||||||
|
@ -645,7 +646,7 @@ format_part_sprinter (const void *ctx, sprinter_t *sp, mime_node_t *node,
|
||||||
if (output_body) {
|
if (output_body) {
|
||||||
sp->map_key (sp, "body");
|
sp->map_key (sp, "body");
|
||||||
sp->begin_list (sp);
|
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);
|
||||||
}
|
}
|
||||||
sp->end (sp);
|
sp->end (sp);
|
||||||
|
@ -700,14 +701,15 @@ format_part_sprinter (const void *ctx, sprinter_t *sp, mime_node_t *node,
|
||||||
/* For non-HTML text parts, we include the content in the
|
/* For non-HTML text parts, we include the content in the
|
||||||
* JSON. Since JSON must be Unicode, we handle charset
|
* JSON. Since JSON must be Unicode, we handle charset
|
||||||
* decoding here and do not report a charset to the caller.
|
* decoding here and do not report a charset to the caller.
|
||||||
* For text/html parts, we do not include the content. If a
|
* For text/html parts, we do not include the content unless
|
||||||
* caller is interested in text/html parts, it should retrieve
|
* the --include-html option has been passed. If a html part
|
||||||
* them separately and they will not be decoded. Since this
|
* is not included, it can be requested directly. This makes
|
||||||
* makes charset decoding the responsibility on the caller, we
|
* charset decoding the responsibility on the caller so we
|
||||||
* report the charset for text/html parts.
|
* report the charset for text/html parts.
|
||||||
*/
|
*/
|
||||||
if (g_mime_content_type_is_type (content_type, "text", "*") &&
|
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 ();
|
GMimeStream *stream_memory = g_mime_stream_mem_new ();
|
||||||
GByteArray *part_content;
|
GByteArray *part_content;
|
||||||
|
@ -737,7 +739,7 @@ format_part_sprinter (const void *ctx, sprinter_t *sp, mime_node_t *node,
|
||||||
}
|
}
|
||||||
|
|
||||||
for (i = 0; i < node->nchildren; i++)
|
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 */
|
/* Close content structures */
|
||||||
for (i = 0; i < nclose; i++)
|
for (i = 0; i < nclose; i++)
|
||||||
|
@ -751,7 +753,7 @@ format_part_sprinter_entry (const void *ctx, sprinter_t *sp,
|
||||||
mime_node_t *node, unused (int indent),
|
mime_node_t *node, unused (int indent),
|
||||||
const notmuch_show_params_t *params)
|
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;
|
return NOTMUCH_STATUS_SUCCESS;
|
||||||
}
|
}
|
||||||
|
@ -1077,7 +1079,8 @@ notmuch_show_command (notmuch_config_t *config, int argc, char *argv[])
|
||||||
.crypto = {
|
.crypto = {
|
||||||
.verify = FALSE,
|
.verify = FALSE,
|
||||||
.decrypt = FALSE
|
.decrypt = FALSE
|
||||||
}
|
},
|
||||||
|
.include_html = FALSE
|
||||||
};
|
};
|
||||||
int format_sel = NOTMUCH_FORMAT_NOT_SPECIFIED;
|
int format_sel = NOTMUCH_FORMAT_NOT_SPECIFIED;
|
||||||
int exclude = EXCLUDE_TRUE;
|
int exclude = EXCLUDE_TRUE;
|
||||||
|
@ -1105,6 +1108,7 @@ notmuch_show_command (notmuch_config_t *config, int argc, char *argv[])
|
||||||
{ NOTMUCH_OPT_BOOLEAN, ¶ms.crypto.decrypt, "decrypt", 'd', 0 },
|
{ NOTMUCH_OPT_BOOLEAN, ¶ms.crypto.decrypt, "decrypt", 'd', 0 },
|
||||||
{ NOTMUCH_OPT_BOOLEAN, ¶ms.crypto.verify, "verify", 'v', 0 },
|
{ NOTMUCH_OPT_BOOLEAN, ¶ms.crypto.verify, "verify", 'v', 0 },
|
||||||
{ NOTMUCH_OPT_BOOLEAN, ¶ms.output_body, "body", 'b', 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 }
|
{ 0, 0, 0, 0, 0 }
|
||||||
};
|
};
|
||||||
|
|
||||||
|
@ -1176,6 +1180,11 @@ notmuch_show_command (notmuch_config_t *config, int argc, char *argv[])
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
|
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)
|
if (entire_thread == ENTIRE_THREAD_TRUE)
|
||||||
params.entire_thread = TRUE;
|
params.entire_thread = TRUE;
|
||||||
else
|
else
|
||||||
|
|
Loading…
Reference in a new issue