iadd a man page and a -1 flag - ics2txt - convert icalendar .ics file to plain text Err bitreich.org 70 hgit clone git://bitreich.org/ics2txt git://enlrupgkhuxnvlhsf6lc3fziv5h2hhfrinws65d7roiv6bfj7d652fid.onion/ics2txt URL:git://bitreich.org/ics2txt git://enlrupgkhuxnvlhsf6lc3fziv5h2hhfrinws65d7roiv6bfj7d652fid.onion/ics2txt bitreich.org 70 1Log /scm/ics2txt/log.gph bitreich.org 70 1Files /scm/ics2txt/files.gph bitreich.org 70 1Refs /scm/ics2txt/refs.gph bitreich.org 70 1Tags /scm/ics2txt/tag bitreich.org 70 1README /scm/ics2txt/file/README.md.gph bitreich.org 70 i--- Err bitreich.org 70 1commit 4bcfcc3e64d33c6e67b3f6f6359e859d2ee0ff6b /scm/ics2txt/commit/4bcfcc3e64d33c6e67b3f6f6359e859d2ee0ff6b.gph bitreich.org 70 1parent 8894359aa6ad4ccc485901a8af9db03d1a2b4d5f /scm/ics2txt/commit/8894359aa6ad4ccc485901a8af9db03d1a2b4d5f.gph bitreich.org 70 hAuthor: Josuah Demangeon URL:mailto:me@josuah.net bitreich.org 70 iDate: Sat, 19 Jun 2021 12:15:14 +0200 Err bitreich.org 70 i Err bitreich.org 70 iadd a man page and a -1 flag Err bitreich.org 70 i Err bitreich.org 70 iDiffstat: Err bitreich.org 70 i M Makefile | 4 ++-- Err bitreich.org 70 i A ics2tsv.1 | 150 +++++++++++++++++++++++++++++++ Err bitreich.org 70 i M ics2tsv.c | 22 ++++++++++++++++++++-- Err bitreich.org 70 i Err bitreich.org 70 i3 files changed, 172 insertions(+), 4 deletions(-) Err bitreich.org 70 i--- Err bitreich.org 70 1diff --git a/Makefile b/Makefile /scm/ics2txt/file/Makefile.gph bitreich.org 70 i@@ -11,7 +11,7 @@ SRC = ical.c base64.c util.c Err bitreich.org 70 i HDR = ical.h base64.h util.h Err bitreich.org 70 i OBJ = ${SRC:.c=.o} Err bitreich.org 70 i BIN = ics2tree ics2tsv Err bitreich.org 70 i-MAN1 = ics2txt.1 Err bitreich.org 70 i+MAN1 = ics2txt.1 ics2tsv.1 Err bitreich.org 70 i MAN5 = tcal.5 Err bitreich.org 70 i Err bitreich.org 70 i all: ${BIN} Err bitreich.org 70 i@@ -36,5 +36,5 @@ install: Err bitreich.org 70 i Err bitreich.org 70 i dist: clean Err bitreich.org 70 i mkdir -p ${NAME}-${VERSION} Err bitreich.org 70 i- cp -r README Makefile bin ${SRC} ${NAME}-${VERSION} Err bitreich.org 70 i+ cp -r README Makefile bin ${MAN1} ${MAN5} ${SRC} ${NAME}-${VERSION} Err bitreich.org 70 i tar -cf - ${NAME}-${VERSION} | gzip -c >${NAME}-${VERSION}.tar.gz Err bitreich.org 70 1diff --git a/ics2tsv.1 b/ics2tsv.1 /scm/ics2txt/file/ics2tsv.1.gph bitreich.org 70 i@@ -0,0 +1,150 @@ Err bitreich.org 70 i+.Dd $Mdocdate: Mar 1 2020$ Err bitreich.org 70 i+.Dt ICS2TSV 1 Err bitreich.org 70 i+.Os Err bitreich.org 70 i+. Err bitreich.org 70 i+. Err bitreich.org 70 i+.Sh NAME Err bitreich.org 70 i+. Err bitreich.org 70 i+.Nm ics2tsv Err bitreich.org 70 i+.Nd convert an icalendar.ics file to tsv Err bitreich.org 70 i+. Err bitreich.org 70 i+. Err bitreich.org 70 i+.Sh SYNOPSIS Err bitreich.org 70 i+. Err bitreich.org 70 i+.Nm ics2tsv Err bitreich.org 70 i+.Op Fl 1 Err bitreich.org 70 i+.Op Fl f Ar fields Err bitreich.org 70 i+.Op Fl s Ar subsep Err bitreich.org 70 i+.Op Fl t Ar timefmt Err bitreich.org 70 i+.Ar [file.ics...] >file.tsv Err bitreich.org 70 i+. Err bitreich.org 70 i+.Sh DESCRIPTION Err bitreich.org 70 i+. Err bitreich.org 70 i+.Nm Err bitreich.org 70 i+is a converter that parse icalendar format and produces lines of output. Err bitreich.org 70 i+Every line represents an element delimited by Err bitreich.org 70 i+.Dq BEGIN: Err bitreich.org 70 i+and Err bitreich.org 70 i+.Dq END: Err bitreich.org 70 i+among Err bitreich.org 70 i+.Dq VEVENT , Err bitreich.org 70 i+.Dq VTODO , Err bitreich.org 70 i+.Dq VJOURNAL , Err bitreich.org 70 i+.Dq VFREEBUSY , Err bitreich.org 70 i+and Err bitreich.org 70 i+.Dq VALARM . Err bitreich.org 70 i+. Err bitreich.org 70 i+.Pp Err bitreich.org 70 i+The lines are filled with tab-delimited fields, with the first ones: Err bitreich.org 70 i+. Err bitreich.org 70 i+.Bl -enum Err bitreich.org 70 i+. Err bitreich.org 70 i+.It Err bitreich.org 70 i+Element type, as encountered after Err bitreich.org 70 i+.Dq BEGIN Err bitreich.org 70 i+and Err bitreich.org 70 i+.Dq END ; Err bitreich.org 70 i+. Err bitreich.org 70 i+.It Err bitreich.org 70 i+Start date, present for Err bitreich.org 70 i+.Dq VEVENT , Err bitreich.org 70 i+.Dq VJOURNAL , Err bitreich.org 70 i+.Dq VFREEBUSY , Err bitreich.org 70 i+and Err bitreich.org 70 i+.Dq VALARM Err bitreich.org 70 i+types. Err bitreich.org 70 i+. Err bitreich.org 70 i+.It Err bitreich.org 70 i+End date, present for Err bitreich.org 70 i+.Dq VEVENT , Err bitreich.org 70 i+.Dq VTODO , Err bitreich.org 70 i+.Dq VFREEBUSY , Err bitreich.org 70 i+and Err bitreich.org 70 i+.Dq VALARM Err bitreich.org 70 i+types. Err bitreich.org 70 i+. Err bitreich.org 70 i+.It Err bitreich.org 70 i+Reserved for future use. Err bitreich.org 70 i+. Err bitreich.org 70 i+.El Err bitreich.org 70 i+. Err bitreich.org 70 i+.Pp Err bitreich.org 70 i+And the other fields starting from Err bitreich.org 70 i+.Pq 5. Err bitreich.org 70 i+chosen by the Err bitreich.org 70 i+.Fl f Err bitreich.org 70 i+flag. Err bitreich.org 70 i+By default: Err bitreich.org 70 i+.Dq "CATEGORIES,LOCATION,SUMMARY,DESCRIPTION" . Err bitreich.org 70 i+. Err bitreich.org 70 i+.Bl -tag Err bitreich.org 70 i+. Err bitreich.org 70 i+.It Fl 1 Err bitreich.org 70 i+Show the name of the columns on the first line before the content. Err bitreich.org 70 i+. Err bitreich.org 70 i+.It Fl f Ar field1,field2,field3... Err bitreich.org 70 i+Chooses the fields from the icalendar to display, in this order, Err bitreich.org 70 i+separated by a comma Err bitreich.org 70 i+.Pq Sq \&, Err bitreich.org 70 i+and case-insensitive Err bitreich.org 70 i+. Err bitreich.org 70 i+.It Fl s Ar subsep Err bitreich.org 70 i+When there are multiple fields with the same value, they are Err bitreich.org 70 i+concatenated with Err bitreich.org 70 i+.Ar subsep Err bitreich.org 70 i+separator, by default a comma Err bitreich.org 70 i+.Pq Sq \&, . Err bitreich.org 70 i+. Err bitreich.org 70 i+.It Fl t Ar timefmt Err bitreich.org 70 i+Dates from 2nd and 3rd fields are formatted with a Err bitreich.org 70 i+.Xr strftime 3 Err bitreich.org 70 i+string Err bitreich.org 70 i+.Ar timeftm , Err bitreich.org 70 i+by default in seconds since 1970/01/01. Err bitreich.org 70 i+. Err bitreich.org 70 i+.El Err bitreich.org 70 i+. Err bitreich.org 70 i+. Err bitreich.org 70 i+.Sh EXAMPLES Err bitreich.org 70 i+. Err bitreich.org 70 i+Convert a calendar from HTTP Err bitreich.org 70 i+.Pa .ics Err bitreich.org 70 i+to custom Err bitreich.org 70 i+.Pa .txt Err bitreich.org 70 i+sorted by start date: Err bitreich.org 70 i+.Dl curl "$url.ics" | ics2tsv | sort -n -k 1,1 | tsv2tsv Err bitreich.org 70 i+. Err bitreich.org 70 i+.Pp Err bitreich.org 70 i+. Err bitreich.org 70 i+.Pp Err bitreich.org 70 i+Split an Err bitreich.org 70 i+.ics Err bitreich.org 70 i+file according to the category, saved as Err bitreich.org 70 i+.Pa .tsv : Err bitreich.org 70 i+.Bd -literal Err bitreich.org 70 i+ics2tsv -f CATEGORIES icalendar.ics | awk -F '\et' '{ print >>($6".tsv") }\' Err bitreich.org 70 i+.Ed Err bitreich.org 70 i+. Err bitreich.org 70 i+. Err bitreich.org 70 i+.Sh SEE ALSO Err bitreich.org 70 i+. Err bitreich.org 70 i+.Xr awk 1 , Err bitreich.org 70 i+.Xr cal 1 , Err bitreich.org 70 i+.Xr calendar 1 , Err bitreich.org 70 i+.Xr date 1 , Err bitreich.org 70 i+.Xr sort 1 Err bitreich.org 70 i+. Err bitreich.org 70 i+. Err bitreich.org 70 i+.Sh STANDARDS Err bitreich.org 70 i+. Err bitreich.org 70 i+.Rs Err bitreich.org 70 i+.%A Desruisseaux Err bitreich.org 70 i+.%D September 2009 Err bitreich.org 70 i+.%T Internet Calendaring and Scheduling Core Object Specification (iCalendar) Err bitreich.org 70 i+.%R RFC 5545 Err bitreich.org 70 i+.Re Err bitreich.org 70 i+. Err bitreich.org 70 i+. Err bitreich.org 70 i+.Sh AUTHORS Err bitreich.org 70 i+. Err bitreich.org 70 i+.An Josuah Demangeon Aq Mt me@josuah.net Err bitreich.org 70 1diff --git a/ics2tsv.c b/ics2tsv.c /scm/ics2txt/file/ics2tsv.c.gph bitreich.org 70 i@@ -24,6 +24,7 @@ struct Block { Err bitreich.org 70 i char *fields[FIELDS_MAX]; Err bitreich.org 70 i }; Err bitreich.org 70 i Err bitreich.org 70 i+static int flag_1 = 0; Err bitreich.org 70 i static char default_fields[] = "CATEGORIES,LOCATION,SUMMARY,DESCRIPTION"; Err bitreich.org 70 i static char *flag_s = ","; Err bitreich.org 70 i static char *flag_t = NULL; Err bitreich.org 70 i@@ -46,6 +47,9 @@ fn_block_begin(IcalParser *p, char *name) Err bitreich.org 70 i (void)p; Err bitreich.org 70 i (void)name; Err bitreich.org 70 i Err bitreich.org 70 i+ if (p->blocktype == ICAL_BLOCK_OTHER) Err bitreich.org 70 i+ return 0; Err bitreich.org 70 i+ Err bitreich.org 70 i memset(&block, 0, sizeof block); Err bitreich.org 70 i return 0; Err bitreich.org 70 i } Err bitreich.org 70 i@@ -72,6 +76,9 @@ fn_block_end(IcalParser *p, char *name) Err bitreich.org 70 i printf("\t%s", buf); Err bitreich.org 70 i } Err bitreich.org 70 i Err bitreich.org 70 i+ /* reserved for recurring events */ Err bitreich.org 70 i+ printf("\t%s", "(null)"); Err bitreich.org 70 i+ Err bitreich.org 70 i for (int i = 0; fields[i] != NULL; i++) { Err bitreich.org 70 i fputc('\t', stdout); Err bitreich.org 70 i if (block.fields[i] != NULL) Err bitreich.org 70 i@@ -134,7 +141,8 @@ fn_field_value(IcalParser *p, char *name, char *value) Err bitreich.org 70 i static void Err bitreich.org 70 i usage(void) Err bitreich.org 70 i { Err bitreich.org 70 i- fprintf(stderr, "usage: %s [-f fields] [-s subsep] [-t timefmt] [file...]", arg0); Err bitreich.org 70 i+ fprintf(stderr,"usage: %s [-1] [-f fields] [-s subsep] [-t timefmt]" Err bitreich.org 70 i+ " [file...]\n", arg0); Err bitreich.org 70 i exit(1); Err bitreich.org 70 i } Err bitreich.org 70 i Err bitreich.org 70 i@@ -153,8 +161,11 @@ main(int argc, char **argv) Err bitreich.org 70 i p.fn_param_value = fn_param_value; Err bitreich.org 70 i p.fn_field_value = fn_field_value; Err bitreich.org 70 i Err bitreich.org 70 i- while ((c = getopt(argc, argv, "f:s:t:")) != -1) { Err bitreich.org 70 i+ while ((c = getopt(argc, argv, "1f:s:t:")) != -1) { Err bitreich.org 70 i switch (c) { Err bitreich.org 70 i+ case '1': Err bitreich.org 70 i+ flag_1 = 1; Err bitreich.org 70 i+ break; Err bitreich.org 70 i case 'f': Err bitreich.org 70 i flag_f = optarg; Err bitreich.org 70 i break; Err bitreich.org 70 i@@ -179,6 +190,13 @@ main(int argc, char **argv) Err bitreich.org 70 i } while ((fields[i++] = strsep(&flag_f, ",")) != NULL); Err bitreich.org 70 i fields[i] = NULL; Err bitreich.org 70 i Err bitreich.org 70 i+ if (flag_1) { Err bitreich.org 70 i+ printf("%s\t%s\t%s", "TYPE", "BEG", "END"); Err bitreich.org 70 i+ for (i = 0; fields[i] != NULL; i++) Err bitreich.org 70 i+ printf("\t%s", fields[i]); Err bitreich.org 70 i+ fputc('\n', stdout); Err bitreich.org 70 i+ } Err bitreich.org 70 i+ Err bitreich.org 70 i if (*argv == NULL || strcmp(*argv, "-") == 0) { Err bitreich.org 70 i debug("converting *stdin*"); Err bitreich.org 70 i if (ical_parse(&p, stdin) < 0) Err bitreich.org 70 .