X-Git-Url: https://git.deb.at/w?a=blobdiff_plain;f=filter.c;h=67494902c65b3984102f570c2cf64522e8706275;hb=7c54e85b04f6d030ae47dd880d0391f6e35d1634;hp=9549017727ec0d0c7f1aa26770425180af014347;hpb=addc54efb596b39b0e4e6ce219ee0f1506337475;p=pkg%2Fabook.git diff --git a/filter.c b/filter.c index 9549017..6749490 100644 --- a/filter.c +++ b/filter.c @@ -1,6 +1,6 @@ /* - * $Id: filter.c,v 1.38 2005/08/13 14:10:57 jheinonen Exp $ + * $Id: filter.c,v 1.48.2.1 2005/10/26 19:45:23 jheinonen Exp $ * * by JH * @@ -19,9 +19,11 @@ #include "abook.h" #include "database.h" #include "edit.h" +#include "gettext.h" #include "list.h" #include "misc.h" #include "options.h" +#include "ui.h" #include "xmalloc.h" #include @@ -42,6 +44,7 @@ static int mutt_parse_file(FILE *in); static int pine_parse_file(FILE *in); static int csv_parse_file(FILE *in); static int allcsv_parse_file(FILE *in); +static int palmcsv_parse_file(FILE *in); /* * export filter prototypes @@ -58,34 +61,37 @@ static int mutt_alias_export(FILE *out, struct db_enumerator e); static int elm_alias_export(FILE *out, struct db_enumerator e); static int text_export_database(FILE *out, struct db_enumerator e); static int spruce_export_database(FILE *out, struct db_enumerator e); +static int wl_export_database(FILE *out, struct db_enumerator e); /* * end of function declarations */ struct abook_input_filter i_filters[] = { - { "abook", "abook native format", parse_database }, - { "ldif", "ldif / Netscape addressbook", ldif_parse_file }, - { "mutt", "mutt alias", mutt_parse_file }, - { "pine", "pine addressbook", pine_parse_file }, - { "csv", "comma separated values", csv_parse_file }, - { "allcsv", "comma separated all values", allcsv_parse_file }, + { "abook", N_("abook native format"), parse_database }, + { "ldif", N_("ldif / Netscape addressbook"), ldif_parse_file }, + { "mutt", N_("mutt alias"), mutt_parse_file }, + { "pine", N_("pine addressbook"), pine_parse_file }, + { "csv", N_("comma separated values"), csv_parse_file }, + { "allcsv", N_("comma separated values (all fields)"), allcsv_parse_file }, + { "palmcsv", N_("Palm comma separated values"), palmcsv_parse_file }, { "\0", NULL, NULL } }; struct abook_output_filter e_filters[] = { - { "abook", "abook native format", write_database }, - { "ldif", "ldif / Netscape addressbook (.4ld)", ldif_export_database }, - { "mutt", "mutt alias", mutt_alias_export }, - { "html", "html document", html_export_database }, - { "pine", "pine addressbook", pine_export_database }, - { "gcrd", "GnomeCard (VCard) addressbook", gcrd_export_database }, - { "csv", "comma separated values", csv_export_database }, - { "allcsv", "comma separated all values", allcsv_export_database }, - { "palmcsv", "Palm comma separated values", palm_export_database}, - { "elm", "elm alias", elm_alias_export }, - { "text", "plain text", text_export_database }, - { "spruce", "Spruce address book", spruce_export_database }, + { "abook", N_("abook native format"), write_database }, + { "ldif", N_("ldif / Netscape addressbook (.4ld)"), ldif_export_database }, + { "mutt", N_("mutt alias"), mutt_alias_export }, + { "html", N_("html document"), html_export_database }, + { "pine", N_("pine addressbook"), pine_export_database }, + { "gcrd", N_("GnomeCard (VCard) addressbook"), gcrd_export_database }, + { "csv", N_("comma separated values"), csv_export_database }, + { "allcsv", N_("comma separated values (all fields)"), allcsv_export_database }, + { "palmcsv", N_("Palm comma separated values"), palm_export_database}, + { "elm", N_("elm alias"), elm_alias_export }, + { "text", N_("plain text"), text_export_database }, + { "wl", N_("Wanderlust address book"), wl_export_database }, + { "spruce", N_("Spruce address book"), spruce_export_database }, { "\0", NULL, NULL } }; @@ -98,17 +104,17 @@ print_filters() { int i; - puts("input:"); + puts(_("input:")); for(i=0; *i_filters[i].filtname ; i++) printf("\t%s\t%s\n", i_filters[i].filtname, - i_filters[i].desc); + gettext(i_filters[i].desc)); putchar('\n'); - puts("output:"); + puts(_("output:")); for(i=0; *e_filters[i].filtname ; i++) printf("\t%s\t%s\n", e_filters[i].filtname, - e_filters[i].desc); + gettext(e_filters[i].desc)); putchar('\n'); } @@ -170,17 +176,17 @@ import_screen() clear(); refresh_statusline(); - headerline("import database"); + headerline(_("import database")); - mvaddstr(3, 1, "please select a filter"); + mvaddstr(3, 1, _("please select a filter")); for(i=0; *i_filters[i].filtname ; i++) mvprintw(5 + i, 6, "%c -\t%s\t%s\n", 'a' + i, i_filters[i].filtname, - i_filters[i].desc); + gettext(i_filters[i].desc)); - mvprintw(6 + i, 6, "x -\tcancel"); + mvprintw(6 + i, 6, _("x -\tcancel")); } int @@ -201,16 +207,16 @@ import_database() mvaddstr(5+filter, 2, "->"); - filename = ask_filename("Filename: "); + filename = ask_filename(_("Filename: ")); if(!filename) { refresh_screen(); return 2; } if(i_read_file(filename, i_filters[filter].func )) - statusline_msg("Error occured while opening the file"); + statusline_msg(_("Error occured while opening the file")); else if(tmp == items) - statusline_msg("Hmm.., file seems not to be a valid file"); + statusline_msg(_("File does not seem to be a valid addressbook")); refresh_screen(); free(filename); @@ -287,17 +293,17 @@ export_screen() refresh_statusline(); - headerline("export database"); + headerline(_("export database")); - mvaddstr(3, 1, "please select a filter"); + mvaddstr(3, 1, _("please select a filter")); for(i = 0; *e_filters[i].filtname ; i++) mvprintw(5 + i, 6, "%c -\t%s\t%s\n", 'a' + i, e_filters[i].filtname, - e_filters[i].desc); + gettext(e_filters[i].desc)); - mvprintw(6 + i, 6, "x -\tcancel"); + mvprintw(6 + i, 6, _("x -\tcancel")); } int @@ -316,29 +322,33 @@ export_database() return 1; } - mvaddstr(5+filter, 2, "->"); + mvaddstr(5 + filter, 2, "->"); if(selected_items()) { - statusline_addstr("Export All/Selected/Cancel (A/s/c)"); - switch( tolower(getch()) ) { - case 's': + switch(statusline_askchoice( + _("Export ll, export elected, or ancel?"), + S_("keybindings:all/selected/cancel|asc"), 3)) { + case 1: + break; + case 2: enum_mode = ENUM_SELECTED; break; - case 'c': - clear_statusline(); + case 0: + case 3: + refresh_screen(); return 1; } clear_statusline(); } - filename = ask_filename("Filename: "); + filename = ask_filename(_("Filename: ")); if(!filename) { refresh_screen(); return 2; } if( e_write_file(filename, e_filters[filter].func, enum_mode)) - statusline_msg("Error occured while exporting"); + statusline_msg(_("Error occured while exporting")); refresh_screen(); free(filename); @@ -601,7 +611,7 @@ ldif_fix_string(char *str) { int i, j; - for( i = 0, j = 0; j < (int)strlen(str); i++, j++) + for(i = 0, j = 0; j < (int)strlen(str); i++, j++) str[i] = ( str[j] == (char)0xc3 ? (char) str[++j] + (char) 0x40 : str[j] ); @@ -785,7 +795,7 @@ ldif_export_database(FILE *out, struct db_enumerator e) int j; get_first_email(email, e.item); - tmp = mkstr("cn=%s,mail=%s", database[e.item][NAME], email); + tmp = strdup_printf("cn=%s,mail=%s", database[e.item][NAME], email); ldif_fput_type_and_value(out, "dn", tmp); free(tmp); @@ -816,7 +826,7 @@ ldif_export_database(FILE *out, struct db_enumerator e) * html export filter */ -static void html_export_write_head(FILE *out, int extra_column); +static void html_export_write_head(FILE *out, int extra); static void html_export_write_tail(FILE *out); extern int extra_column; @@ -825,14 +835,15 @@ static int html_export_database(FILE *out, struct db_enumerator e) { char tmp[MAX_EMAILSTR_LEN]; + int extra; if(items < 1) return 2; - extra_column = (extra_column > 2 && extra_column < ITEM_FIELDS) ? + extra = (extra_column > 2 && extra_column < ITEM_FIELDS) ? extra_column : PHONE; - html_export_write_head(out, extra_column); + html_export_write_head(out, extra); db_enumerate_items(e) { get_first_email(tmp, e.item); @@ -846,7 +857,7 @@ html_export_database(FILE *out, struct db_enumerator e) fprintf(out, "%s\n%s\n", database[e.item][EMAIL], - safe_str(database[e.item][extra_column]) ); + safe_str(database[e.item][extra]) ); fprintf(out, "\n\n"); } @@ -857,7 +868,7 @@ html_export_database(FILE *out, struct db_enumerator e) static void -html_export_write_head(FILE *out, int extra_column) +html_export_write_head(FILE *out, int extra) { char *realname = get_real_name(); @@ -869,7 +880,7 @@ html_export_write_head(FILE *out, int extra_column) fprintf(out, "\n"); fprintf(out, "\n\n\n", - abook_fields[extra_column].name); + abook_fields[extra].name); free(realname); } @@ -1043,6 +1054,8 @@ pine_export_database(FILE *out, struct db_enumerator e) */ #define CSV_COMMENT_CHAR '#' +#define CSV_DUPLICATE_SEPARATOR " " +#define CSV_TABLE_SIZE(t) (sizeof (t) / sizeof *(t)) static int csv_conv_table[] = { NAME, @@ -1075,6 +1088,28 @@ static int allcsv_conv_table[] = { CUSTOM5, }; +static int palmcsv_conv_table[] = { + NAME, /* Last name */ + NAME, /* First name */ + NOTES, /* Title */ + NICK, /* Company */ + WORKPHONE, + PHONE, + FAX, + MOBILEPHONE, + EMAIL, + ADDRESS, + CITY, + STATE, + ZIP, + COUNTRY, + CUSTOM1, + CUSTOM2, + CUSTOM3, + CUSTOM4, + CUSTOM5, +}; + static void csv_convert_emails(char *s) { @@ -1084,7 +1119,7 @@ csv_convert_emails(char *s) if(s == NULL) return; - for(i = 1; ( tmp = strchr(s, ',') ) != NULL ; i++, s = tmp + 1 ) + for(i = 1; ( tmp = strchr(s, ',') ) != NULL ; i++, s = tmp + 1) if(i > MAX_EMAILS - 1) { *tmp = 0; break; @@ -1118,27 +1153,17 @@ csv_remove_quotes(char *s) return xstrdup(s); } -static void -csv_store_field(list_item item, char *s, int field) +static int +csv_field_to_item(int *table_base, size_t table_size, int field) { - char *newstr = NULL; - - if(!s || !*s) - return; - - if( !(newstr = csv_remove_quotes(s)) ) - return; + if(field < table_size) + return table_base[field]; - if(field < (int)(sizeof(csv_conv_table) / sizeof(*csv_conv_table)) - && csv_conv_table[field] >= 0) { - item[csv_conv_table[field]] = newstr; - } else { - xfree(newstr); - } + return -1; } static void -allcsv_store_field(list_item item, char *s, int field) +csv_store_item(list_item item, int i, char *s) { char *newstr = NULL; @@ -1148,9 +1173,17 @@ allcsv_store_field(list_item item, char *s, int field) if( !(newstr = csv_remove_quotes(s)) ) return; - if(field < (int)(sizeof(allcsv_conv_table) / sizeof(*allcsv_conv_table)) - && allcsv_conv_table[field] >= 0) { - item[allcsv_conv_table[field]] = newstr; + if(i >= 0) { + if (item[i] != NULL) { + char *oldstr = item[i]; + + item[i] = strconcat(newstr, CSV_DUPLICATE_SEPARATOR, + oldstr, NULL); + xfree(newstr); + xfree(oldstr); + } else { + item[i] = newstr; + } } else { xfree(newstr); } @@ -1186,7 +1219,7 @@ csv_is_valid_quote_start(char *p) } static void -csv_parse_line(char *line) +csv_parse_line(char *line, int *table_base, size_t table_size) { char *p, *start; int field; @@ -1205,9 +1238,13 @@ csv_parse_line(char *line) in_quote = TRUE; } - if( *p == ',' && !in_quote) { + if(*p == ',' && !in_quote) { *p = 0; - csv_store_field(item, start, field); + csv_field_to_item(table_base, table_size, field); + csv_store_item(item, + csv_field_to_item(table_base, + table_size, field), + start); field++; start = p + 1; } @@ -1215,51 +1252,15 @@ csv_parse_line(char *line) /* * store last field */ - csv_store_field(item, start, field); + csv_store_item(item, csv_field_to_item(table_base, table_size, field), + start); csv_convert_emails(item[EMAIL]); add_item2database(item); } -static void -allcsv_parse_line(char *line) -{ - char *p, *start; - int field; - bool in_quote = FALSE; - list_item item; - - memset(item, 0, sizeof(item)); - - for(p = start = line, field = 0; *p; p++) { - if(in_quote) { - if(csv_is_valid_quote_end(p)) - in_quote = FALSE; - } else { - if ( (((p - start) / sizeof (char)) < 2 ) && - csv_is_valid_quote_start(p) ) - in_quote = TRUE; - } - - if( *p == ',' && !in_quote) { - *p = 0; - allcsv_store_field(item, start, field); - field++; - start = p + 1; - } - } - /* - * store last field - */ - allcsv_store_field(item, start, field); - - csv_convert_emails(item[EMAIL]); - add_item2database(item); -} - - static int -csv_parse_file(FILE *in) +csv_parse_file_common(FILE *in, int *conv_table, size_t table_size) { char *line = NULL; @@ -1267,7 +1268,7 @@ csv_parse_file(FILE *in) line = getaline(in); if(line && *line && *line != CSV_COMMENT_CHAR) - csv_parse_line(line); + csv_parse_line(line, conv_table, table_size); xfree(line); } @@ -1276,20 +1277,24 @@ csv_parse_file(FILE *in) } static int -allcsv_parse_file(FILE *in) +csv_parse_file(FILE *in) { - char *line = NULL; - - while(!feof(in)) { - line = getaline(in); - - if(line && *line && *line != CSV_COMMENT_CHAR) - allcsv_parse_line(line); + return csv_parse_file_common(in, csv_conv_table, + CSV_TABLE_SIZE(csv_conv_table)); +} - xfree(line); - } +static int +allcsv_parse_file(FILE *in) +{ + return csv_parse_file_common(in, allcsv_conv_table, + CSV_TABLE_SIZE(allcsv_conv_table)); +} - return 0; +static int +palmcsv_parse_file(FILE *in) +{ + return csv_parse_file_common(in, palmcsv_conv_table, + CSV_TABLE_SIZE(palmcsv_conv_table)); } /* @@ -1812,3 +1817,34 @@ spruce_export_database (FILE *out, struct db_enumerator e) * end of Spruce export filter */ +/* + * wanderlust addressbook export filter + */ + +static int +wl_export_database(FILE *out, struct db_enumerator e) +{ + char emails[MAX_EMAILS][MAX_EMAIL_LEN]; + + fprintf (out, "# Wanderlust address book written by %s\n\n", PACKAGE); + db_enumerate_items(e) { + split_emailstr(e.item, emails); + if (**emails) { + fprintf(out, + "%s\t\"%s\"\t\"%s\"\n", + *emails, + safe_str(database[e.item][NICK]), + safe_str(database[e.item][NAME]) + ); + } + } + + fprintf (out, "\n# End of address book file.\n"); + + return 0; +} + +/* + * end of wanderlust addressbook export filter + */ +
NameE-mail address(es)%s