* Author: Carl Worth <cworth@cworth.org>
*/
+/* This indexer creates a Xapian mail index that is remarkably similar
+ * to that created by sup. The big difference, (and the thing that
+ * will keep a notmuch index from being used by sup directly), is that
+ * sup expects a serialized ruby data structure in the document's data
+ * field, but notmuch just puts the mail's filename there (trusting
+ * that the email client can get the data in needs from the filename).
+ *
+ * Note: One bug here is that sup actually merges together fields such
+ * as To, CC, Bcc etc. when finding multiple emails with the same
+ * message ID. To support something similar, notmuch should list
+ * multiple files in the data field.
+ *
+ * Other differences between sup and notmuch-index identified so far:
+ *
+ * o sup supports encrypted mime parts by prompting for a passphrase
+ * to decrypt the message. So far, notmuch doesn't support this,
+ * both because I'm lazy to code it, and I also think doing so
+ * would present a security leak.
+ *
+ * o sup and notmuch have different heuristics for identifying (and
+ * thus ignoring) signatures. For example, sup considers a line
+ * consisting of two hypens as a signature separator, while
+ * notmuch expects those two hyphens to be followed by a space
+ * character.
+ *
+ * o sup as been seen to split some numbers before indexing
+ * them. For example, the number 1754 in an email message was
+ * indexed by sup as separate terms 17 and 54. I couldn't find any
+ * explanation for this behavior and did not try to replicate it
+ * in notmuch.
+ */
+
#include <stdio.h>
#include <stdlib.h>
#include <string.h>
}
line_end = next_line - 1;
- /* Trim whitespace. */
- while (*next_line && isspace (*next_line))
+ /* Get to the next non-blank line. */
+ while (*next_line == '\n')
next_line++;
/* Skip lines that are quotes. */
return;
}
- disposition = g_mime_object_get_content_disposition (GMIME_OBJECT (part));
+ disposition = g_mime_object_get_content_disposition (part);
if (disposition &&
strcmp (disposition->disposition, GMIME_DISPOSITION_ATTACHMENT) == 0)
{
+ const char *filename = g_mime_part_get_filename (GMIME_PART (part));
+ const char *extension;
+
add_term (term_gen.get_document (), "label", "attachment");
+ gen_terms (term_gen, "attachment", filename);
+
+ if (filename) {
+ extension = strchr (filename, '.');
+ if (extension) {
+ add_term (term_gen.get_document (), "attachment_extension",
+ extension + 1);
+ }
+ }
+
return;
}