notmuch/emacs: Observe the charset of text/html parts, where known.

Add the charset of text/html parts to the JSON output of 'notmuch
-show' when it is known. Observe the encoding when rendering such
parts in emacs.
This commit is contained in:
David Edmondson 2012-01-13 09:44:46 +00:00 committed by David Bremner
parent e40c01bb14
commit 647c250989
2 changed files with 25 additions and 6 deletions

View file

@ -328,7 +328,8 @@ message at DEPTH in the current thread."
current buffer, if possible." current buffer, if possible."
(let ((display-buffer (current-buffer))) (let ((display-buffer (current-buffer)))
(with-temp-buffer (with-temp-buffer
(let ((handle (mm-make-handle (current-buffer) (list content-type)))) (let* ((charset (plist-get part :content-charset))
(handle (mm-make-handle (current-buffer) `(,content-type (charset . ,charset)))))
(if (and (mm-inlinable-p handle) (if (and (mm-inlinable-p handle)
(mm-inlined-p handle)) (mm-inlined-p handle))
(let ((content (notmuch-show-get-bodypart-content msg part nth))) (let ((content (notmuch-show-get-bodypart-content msg part nth)))

View file

@ -675,14 +675,32 @@ format_part_content_json (GMimeObject *part)
printf (", \"filename\": %s", json_quote_str (ctx, filename)); printf (", \"filename\": %s", json_quote_str (ctx, filename));
} }
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")) {
/* 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
* report the charset for text/html parts.
*/
if (g_mime_content_type_is_type (content_type, "text", "html"))
{
const char *content_charset = g_mime_object_get_content_type_parameter (GMIME_OBJECT (part), "charset");
if (content_charset != NULL)
printf (", \"content-charset\": %s", json_quote_str (ctx, content_charset));
}
else
{ {
show_text_part_content (part, stream_memory); show_text_part_content (part, stream_memory);
part_content = g_mime_stream_mem_get_byte_array (GMIME_STREAM_MEM (stream_memory)); part_content = g_mime_stream_mem_get_byte_array (GMIME_STREAM_MEM (stream_memory));
printf (", \"content\": %s", json_quote_chararray (ctx, (char *) part_content->data, part_content->len)); printf (", \"content\": %s", json_quote_chararray (ctx, (char *) part_content->data, part_content->len));
} }
}
else if (g_mime_content_type_is_type (content_type, "multipart", "*")) else if (g_mime_content_type_is_type (content_type, "multipart", "*"))
{ {
printf (", \"content\": ["); printf (", \"content\": [");