html_export_write_head(out);
db_enumerate_items(e) {
- fprintf(out, "<tr>");
+ fprintf(out, " <tr>\n");
for(cur = index_elements; cur; cur = cur->next) {
if(cur->type != INDEX_FIELD)
continue;
-
+
get_list_field(e.item, cur, &f);
+ fprintf(out, " <td>");
+
if(f.type == FIELD_EMAILS) {
- fprintf(out, "<td>");
html_print_emails(out, &f);
- fprintf(out, "</td>");
- continue;
} else {
- fprintf(out, "<td>%s</td>", safe_str(f.data));
+ if (strcmp(safe_str(f.data), "") == 0)
+ fprintf(out, " ");
+ else
+ fprintf(out, "%s", safe_str(f.data));
}
+ fprintf(out, "</td>\n");
}
- fprintf(out, "</tr>\n");
+ fprintf(out, " </tr>\n");
}
html_export_write_tail(out);
char *realname = get_real_name(), *str;
struct index_elem *cur;
- fprintf(out, "<!DOCTYPE HTML PUBLIC \"-//W3C//DTD HTML 4.01 Transitional//EN\">\n");
- fprintf(out, "<html>\n<head>\n <title>%s's addressbook</title>",
- realname );
- fprintf(out, "\n</head>\n<body>\n");
- fprintf(out, "\n<h2>%s's addressbook</h2>\n", realname );
- fprintf(out, "<br><br>\n\n");
-
- fprintf(out, "<table border=\"1\" align=\"center\">\n<tr>");
+ fprintf(out, "<!DOCTYPE html>\n");
+ fprintf(out, "<html>\n");
+ fprintf(out, "<head>\n");
+ fprintf(out, " <meta charset=\"utf-8\" />\n");
+ fprintf(out, " <title>");
+ fprintf(out, _("%s's addressbook"), realname );
+ fprintf(out, "</title>\n");
+ fprintf(out, " <style type=\"text/css\">\n");
+ fprintf(out, " table {border-collapse: collapse ; border: 1px solid #000;}\n");
+ fprintf(out, " table th, table td {text-align: left; border: 1px solid #000; padding: 0.33em;}\n");
+ fprintf(out, " table th {border-bottom: 3px double #000; background-color: #ccc;}\n");
+ fprintf(out, " </style>\n");
+ fprintf(out, "</head>\n");
+ fprintf(out, "<body>\n");
+ fprintf(out, "<h1>");
+ fprintf(out, _("%s's addressbook"), realname);
+ fprintf(out, "</h1>\n");
+
+ fprintf(out, "<table>\n");
+ fprintf(out, "<thead>\n");
+ fprintf(out, " <tr>\n");
for(cur = index_elements; cur; cur = cur->next) {
if(cur->type != INDEX_FIELD)
continue;
get_field_info(cur->d.field.id, NULL, &str, NULL);
- fprintf(out, "<th>%s</th>", str);
+
+ fprintf(out, " <th>");
+
+ if (strcmp(str, "") == 0)
+ fprintf(out, " ");
+ else
+ fprintf(out, "%s", str);
+
+ fprintf(out, "</th>\n");
}
- fprintf(out, "</tr>\n\n");
+ fprintf(out, " </tr>\n");
+ fprintf(out, "<thead>\n");
+ fprintf(out, "<tbody>\n");
free(realname);
}
static void
html_export_write_tail(FILE *out)
{
- fprintf(out, "\n</table>\n");
- fprintf(out, "\n</body>\n</html>\n");
+ fprintf(out, "</table>\n");
+ fprintf(out, "</body>\n");
+ fprintf(out, "</html>");
}
/*
"NICKNAME", /* NICK */
"URL", /* URL */
"NOTE", /* NOTES */
+ "BDAY", /* ANNIVERSARY */
"N", /* NAME: special case/mapping in vcard_parse_line() */
- NULL /* not implemented: ANNIVERSARY, ITEM_FIELDS */
+ NULL /* ITEM_FIELDS */
};
enum {
// vCard(post office box) - not used
strsep(&value, ";");
+ if(!value) return;
+
// vCard(the extended address)
item_fput(item, ADDRESS2, xstrdup(strsep(&value, ";")));
+ if(!value) return;
+
// vCard(the street address)
item_fput(item, ADDRESS, xstrdup(strsep(&value, ";")));
+ if(!value) return;
+
// vCard(the locality)
item_fput(item, CITY, xstrdup(strsep(&value, ";")));
+ if(!value) return;
+
// vCard(the region)
item_fput(item, STATE, xstrdup(strsep(&value, ";")));
+ if(!value) return;
+
// vCard(the postal code)
item_fput(item, ZIP, xstrdup(strsep(&value, ";")));
+ if(!value) return;
+
// vCard(the country name)
item_fput(item, COUNTRY, xstrdup(strsep(&value, ";")));
- if(*value) xfree(value);
+ // support of optional trailing ";" to the ADR field
+ if(value && *value) xfree(value);
}
static void
free(name);
+ if(db_fget(item, NICK))
+ fprintf(out, "NICKNAME:%s\r\n",
+ safe_str(db_fget(item, NICK)));
+ if(db_fget(item, ANNIVERSARY))
+ fprintf(out, "BDAY:%s\r\n",
+ safe_str(db_fget(item, ANNIVERSARY)));
+
// see rfc6350 section 6.3.1
if(db_fget(item, ADDRESS)) {
fprintf(out, "ADR:;%s;%s;%s;%s;%s;%s\r\n",
return 0;
}
+/*
+ * end of BSD calendar export filter
+ */
+
+/*
+ * custom export filter
+ */
+
static int
find_field_enum(char *s) {
int i = -1;
cannotparse:
fprintf(stderr, _("%s: invalid format, index %ld\n"), __FUNCTION__, (start - s));
- free(fmt_string);
- while(*ft) free(ft--);
+ free(ft);
exit(EXIT_FAILURE);
}
custom_export_item(FILE *out, int item, char *s, enum field_types *ft);
-// used to store the format string from --outformatstr when "custom" format is used
-// default value overriden in export_file()
-extern char *parsed_custom_format;
-extern enum field_types *custom_format_fields;
+// stores the format string generated from --outformatstr {custom_format}
+// (when "custom" output format is requested)
+// overrides default value of custom_format set by from abook.c
+extern char custom_format[FORMAT_STRING_LEN];
+char parsed_custom_format[FORMAT_STRING_LEN];
+enum field_types *custom_format_fields = 0;
/* wrapper for custom_export_item:
1) avoid messing with extern pointer
return 0;
}
-// used to store the format string from --outformatstr when "custom" format is used
-// default value overriden from abook.c
-extern char custom_format[FORMAT_STRING_LEN];
-
static int
custom_export_database(FILE *out, struct db_enumerator e)
{
- char *format_string =
- (char *)malloc(FORMAT_STRING_LEN * sizeof(char*));
-
enum field_types *ft =
- (enum field_types *)malloc(FORMAT_STRING_MAX_FIELDS * sizeof(enum field_types *));
-
- parse_custom_format(custom_format, format_string, ft);
+ (enum field_types *)malloc(FORMAT_STRING_MAX_FIELDS * sizeof(enum field_types));
+ parse_custom_format(custom_format, (char*)&parsed_custom_format, ft);
db_enumerate_items(e) {
- if(custom_export_item(out, e.item, format_string, ft) == 0)
+ if(custom_export_item(out, e.item, (char*)&parsed_custom_format, ft) == 0)
fprintf(out, "\n");
}
return 0;
}
/*
- * end of BSD calendar export filter
+ * end of custom export filter
*/
-