X-Git-Url: https://git.deb.at/?a=blobdiff_plain;f=filter.c;h=2cb145ce9e9e0965d1d624bdeace1171b296c6f5;hb=f7e59f061fe120a6e8e684a9631e3d7a9e653f89;hp=0447a3c87081a7a06fc41fbbecef91189d3801e7;hpb=413f19f049d680fb45485de4c2c5a4b2589f319d;p=pkg%2Fabook.git
diff --git a/filter.c b/filter.c
index 0447a3c..2cb145c 100644
--- a/filter.c
+++ b/filter.c
@@ -1069,23 +1069,26 @@ html_export_database(FILE *out, struct db_enumerator e)
html_export_write_head(out);
db_enumerate_items(e) {
- fprintf(out, "
");
+ fprintf(out, "
\n");
for(cur = index_elements; cur; cur = cur->next) {
if(cur->type != INDEX_FIELD)
continue;
-
+
get_list_field(e.item, cur, &f);
+ fprintf(out, " ");
+
if(f.type == FIELD_EMAILS) {
- fprintf(out, " | ");
html_print_emails(out, &f);
- fprintf(out, " | ");
- continue;
} else {
- fprintf(out, "%s | ", safe_str(f.data));
+ if (strcmp(safe_str(f.data), "") == 0)
+ fprintf(out, " ");
+ else
+ fprintf(out, "%s", safe_str(f.data));
}
+ fprintf(out, "\n");
}
- fprintf(out, "
\n");
+ fprintf(out, " \n");
}
html_export_write_tail(out);
@@ -1099,22 +1102,45 @@ html_export_write_head(FILE *out)
char *realname = get_real_name(), *str;
struct index_elem *cur;
- fprintf(out, "\n");
- fprintf(out, "\n\n %s's addressbook",
- realname );
- fprintf(out, "\n\n\n");
- fprintf(out, "\n%s's addressbook
\n", realname );
- fprintf(out, "
\n\n");
-
- fprintf(out, "\n");
+ fprintf(out, "\n");
+ fprintf(out, "\n");
+ fprintf(out, "\n");
+ fprintf(out, " \n");
+ fprintf(out, " ");
+ fprintf(out, _("%s's addressbook"), realname );
+ fprintf(out, "\n");
+ fprintf(out, " \n");
+ fprintf(out, "\n");
+ fprintf(out, "\n");
+ fprintf(out, "");
+ fprintf(out, _("%s's addressbook"), realname);
+ fprintf(out, "
\n");
+
+ fprintf(out, "\n");
+ fprintf(out, "\n");
+ fprintf(out, " \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, "%s | ", str);
+
+ fprintf(out, " ");
+
+ if (strcmp(str, "") == 0)
+ fprintf(out, " ");
+ else
+ fprintf(out, "%s", str);
+
+ fprintf(out, " | \n");
}
- fprintf(out, "
\n\n");
+ fprintf(out, " \n");
+ fprintf(out, "\n");
+ fprintf(out, "\n");
free(realname);
}
@@ -1122,8 +1148,9 @@ html_export_write_head(FILE *out)
static void
html_export_write_tail(FILE *out)
{
- fprintf(out, "\n
\n");
- fprintf(out, "\n\n\n");
+ fprintf(out, "
\n");
+ fprintf(out, "\n");
+ fprintf(out, "");
}
/*
@@ -1287,6 +1314,11 @@ pine_export_database(FILE *out, struct db_enumerator e)
* csv import filter
*/
+/* This is used by both allcsv_export_database() and csv_export_common()
+ to distinguish between standard and defined fields.
+ To avoid confusions this should stay > ITEM_FIELDS */
+#define CUSTOM_FIELD_START_INDEX (ITEM_FIELDS + 10)
+
/* FIXME
* these files should be parsed according to a certain
* lay out, or the default if layout is not given, at
@@ -1552,8 +1584,9 @@ static char *vcard_fields[] = {
"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 {
@@ -1655,20 +1688,33 @@ vcard_parse_address(list_item item, char *line)
// 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
@@ -1815,7 +1861,12 @@ csv_export_common(FILE *out, struct db_enumerator e,
else if(CSV_IS_SPECIAL(fields[i])) {
if(special_func)
(*special_func)(out, e.item, fields[i]);
- } else
+ }
+ else if(fields[i] >= CUSTOM_FIELD_START_INDEX) {
+ fprintf(out, "\"%s\"",
+ safe_str(db_fget_byid(e.item, fields[i] - CUSTOM_FIELD_START_INDEX)));
+ }
+ else
/*fprintf(out,(
strchr(safe_str(database[e.item][field_idx(fields[i])]), ',') ||
strchr(safe_str(database[e.item][field_idx(fields[i])]), '\"')) ?
@@ -1858,7 +1909,7 @@ allcsv_export_database(FILE *out, struct db_enumerator e)
* TODO: Should get these atomatically from abook_fileds
* - JH
*/
- int allcsv_export_fields[] = {
+ int allcsv_export_fields[ITEM_FIELDS + 6] = { // only the 5 custom fields are allowed so far
NAME,
EMAIL,
ADDRESS,
@@ -1870,7 +1921,7 @@ allcsv_export_database(FILE *out, struct db_enumerator e)
PHONE,
WORKPHONE,
FAX,
- MOBILEPHONE, // spelled "mobile" in standard_fields
+ MOBILEPHONE, // spelt "mobile" in standard_fields
NICK,
URL,
NOTES,
@@ -1884,7 +1935,43 @@ allcsv_export_database(FILE *out, struct db_enumerator e)
while(allcsv_export_fields[i+1] != CSV_LAST) {
fprintf(out, "\"%s\",", standard_fields[i++].key);
}
- fprintf(out, "\"%s\"\n", standard_fields[i].key);
+ fprintf(out, "\"%s\"", standard_fields[i].key);
+
+ /*
+ Custom fields handling:
+ This loop appends custom fields' id at the end of allcsv_export_fields and shift
+ the CSV_LAST sentinel value each time one is found.
+ CUSTOM_FIELD_START_INDEX is added to these index values so csv_export_common()
+ can later recognize them and call db_fget_byid() instead of the traditional db_fget()
+
+ It only search for defined the [legacy?] "custom" fields.
+ */
+
+ // pointer to the end of the field list
+ int append_field = ITEM_FIELDS;
+ // custom field's trailing number (between 1 and 5)
+ int j;
+ // full custom field name, eg "custom4"
+ char custom_field_key[8];
+ // index used by custom_field_key
+ int field_no;
+ // name of the defined field as chosen by the user
+ char *custom_field_name;
+
+ for (j = 1; j <= 5; j++) {
+ snprintf(custom_field_key, 8, "custom%d", j++);
+ if(find_declared_field(custom_field_key)) {
+ find_field_number(custom_field_key, &field_no);
+ get_field_info(field_no, NULL, &custom_field_name, NULL);
+ // append the field to the list
+ allcsv_export_fields[append_field] = field_no + CUSTOM_FIELD_START_INDEX;
+ allcsv_export_fields[++append_field] = CSV_LAST;
+ // print column name
+ fprintf(out, ",\"%s\"", custom_field_name);
+ }
+ }
+ free(custom_field_name);
+ fprintf(out, "\n");
csv_export_common(out, e, allcsv_export_fields, NULL);
@@ -2006,6 +2093,13 @@ vcard_export_item(FILE *out, int item)
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",
@@ -2468,6 +2562,14 @@ bsdcal_export_database(FILE *out, struct db_enumerator e)
return 0;
}
+/*
+ * end of BSD calendar export filter
+ */
+
+/*
+ * custom export filter
+ */
+
static int
find_field_enum(char *s) {
int i = -1;
@@ -2552,8 +2654,7 @@ parse_custom_format(char *s, char *fmt_string, enum field_types *ft)
cannotparse:
fprintf(stderr, _("%s: invalid format, index %ld\n"), __FUNCTION__, (start - s));
- free(fmt_string);
- while(*ft) free(ft--);
+ free(ft);
exit(EXIT_FAILURE);
}
@@ -2561,10 +2662,12 @@ static int
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
@@ -2622,29 +2725,20 @@ custom_export_item(FILE *out, int item, char *fmt, enum field_types *ft)
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
*/
-