irename the project ics2txt - 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 481f690766d5999510f088b675ee9038f2007754 /scm/ics2txt/commit/481f690766d5999510f088b675ee9038f2007754.gph bitreich.org 70 1parent d587bdf097f3d058457675df00434427fb664976 /scm/ics2txt/commit/d587bdf097f3d058457675df00434427fb664976.gph bitreich.org 70 hAuthor: Josuah Demangeon URL:mailto:mail@josuah.net bitreich.org 70 iDate: Sat, 5 May 2018 22:22:31 +0200 Err bitreich.org 70 i Err bitreich.org 70 irename the project ics2txt Err bitreich.org 70 i Err bitreich.org 70 i'agenda' was too generic (name clash?), and it is not only a one-way Err bitreich.org 70 iconversion tool so ics2txt explains everything in a breeze. Err bitreich.org 70 i Err bitreich.org 70 iDiffstat: Err bitreich.org 70 i M Makefile | 4 ++-- Err bitreich.org 70 i D agenda | 183 ------------------------------- Err bitreich.org 70 i D agenda.1 | 81 ------------------------------ Err bitreich.org 70 i A ics2txt | 183 +++++++++++++++++++++++++++++++ Err bitreich.org 70 i A ics2txt.1 | 81 ++++++++++++++++++++++++++++++ Err bitreich.org 70 i Err bitreich.org 70 i5 files changed, 266 insertions(+), 266 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@@ -1,5 +1,5 @@ Err bitreich.org 70 i-BIN = agenda Err bitreich.org 70 i-MAN1 = agenda.1 Err bitreich.org 70 i+BIN = ics2txt Err bitreich.org 70 i+MAN1 = ics2txt.1 Err bitreich.org 70 i Err bitreich.org 70 i all: Err bitreich.org 70 i Err bitreich.org 70 1diff --git a/agenda b/agenda /scm/ics2txt/file/agenda.gph bitreich.org 70 i@@ -1,183 +0,0 @@ Err bitreich.org 70 i-#!/usr/bin/awk -f Err bitreich.org 70 i- Err bitreich.org 70 i-# handle ical agenda and display them in plain text Err bitreich.org 70 i- Err bitreich.org 70 i-function leap(yrs) Err bitreich.org 70 i-{ Err bitreich.org 70 i- return (yrs % 4 == 0) && (yrs % 100 != 0) || (yrs % 400 == 0); Err bitreich.org 70 i-} Err bitreich.org 70 i- Err bitreich.org 70 i-function days_per_month(mth, yrs) Err bitreich.org 70 i-{ Err bitreich.org 70 i- if (mth == 2) Err bitreich.org 70 i- return 28 + leap(yrs); Err bitreich.org 70 i- else Err bitreich.org 70 i- return 30 + (mth - (mth > 7)) % 2; Err bitreich.org 70 i-} Err bitreich.org 70 i- Err bitreich.org 70 i-function to_sec(yrs, mth, day, hrs, min, sec) Err bitreich.org 70 i-{ Err bitreich.org 70 i- while (--mth >= 1) Err bitreich.org 70 i- day += days_per_month(mth, yrs); Err bitreich.org 70 i- while (--yrs >= 1970) Err bitreich.org 70 i- day += 365 + leap(yrs); Err bitreich.org 70 i- return (((((day - 1) * 24) + hrs) * 60) + min) * 60 + sec; Err bitreich.org 70 i-} Err bitreich.org 70 i- Err bitreich.org 70 i-function to_date(fmt, sec) Err bitreich.org 70 i-{ Err bitreich.org 70 i- for (yrs = 1970; sec >= (s = 3600 * 24 * (365 + leap(yrs))); yrs++) Err bitreich.org 70 i- sec -= s; Err bitreich.org 70 i- for (mth = 1; sec >= (s = 3600 * 24 * days_per_month(mth, yrs)); mth++) Err bitreich.org 70 i- sec -= s; Err bitreich.org 70 i- for (day = 1; sec >= (s = 3600 * 24); day++) Err bitreich.org 70 i- sec -= s; Err bitreich.org 70 i- for (hrs = 0; sec >= 3600; hrs++) Err bitreich.org 70 i- sec -= 3600; Err bitreich.org 70 i- for (min = 0; sec >= 60; min++) Err bitreich.org 70 i- sec -= 60; Err bitreich.org 70 i- return sprintf(fmt, yrs, mth, day, hrs, min, sec); Err bitreich.org 70 i-} Err bitreich.org 70 i- Err bitreich.org 70 i-function date_ical(str, off) { Err bitreich.org 70 i- yrs = substr(str, 1, 4); Err bitreich.org 70 i- mth = substr(str, 5, 2); Err bitreich.org 70 i- day = substr(str, 7, 2); Err bitreich.org 70 i- hrs = substr(str, 10, 2); Err bitreich.org 70 i- min = substr(str, 12, 2); Err bitreich.org 70 i- return to_sec(yrs, mth, day, hrs, min, 0) - off; Err bitreich.org 70 i-} Err bitreich.org 70 i- Err bitreich.org 70 i-function date_iso8601(date, off) Err bitreich.org 70 i-{ Err bitreich.org 70 i- yrs = substr(date, 1, 4); Err bitreich.org 70 i- mth = substr(date, 6, 2); Err bitreich.org 70 i- day = substr(date, 9, 2); Err bitreich.org 70 i- hrs = substr(date, 12, 2); Err bitreich.org 70 i- min = substr(date, 15, 2); Err bitreich.org 70 i- return to_sec(yrs, mth, day, hrs, min, 0) - off; Err bitreich.org 70 i-} Err bitreich.org 70 i- Err bitreich.org 70 i-function swap(array, a, b) Err bitreich.org 70 i-{ Err bitreich.org 70 i- tmp = array[a]; Err bitreich.org 70 i- array[a] = array[b]; Err bitreich.org 70 i- array[b] = tmp; Err bitreich.org 70 i-} Err bitreich.org 70 i- Err bitreich.org 70 i-function sort(array, beg, end) Err bitreich.org 70 i-{ Err bitreich.org 70 i- if (beg >= end) # end recursion Err bitreich.org 70 i- return; Err bitreich.org 70 i- Err bitreich.org 70 i- a = beg + 1; # #1 is the pivot Err bitreich.org 70 i- b = end; Err bitreich.org 70 i- while (a < b) { Err bitreich.org 70 i- while (a < b && array[a] <= array[beg]) # beg: skip lesser Err bitreich.org 70 i- a++; Err bitreich.org 70 i- while (a < b && array[b] > array[beg]) # end: skip greater Err bitreich.org 70 i- b--; Err bitreich.org 70 i- swap(array, a, b); # found 2 misplaced Err bitreich.org 70 i- } Err bitreich.org 70 i- Err bitreich.org 70 i- if (array[beg] > array[a]) # put the pivot back Err bitreich.org 70 i- swap(array, beg, a); Err bitreich.org 70 i- Err bitreich.org 70 i- sort(array, beg, a - 1); # sort lower half Err bitreich.org 70 i- sort(array, a, end); # sort higher half Err bitreich.org 70 i-} Err bitreich.org 70 i- Err bitreich.org 70 i-function parse_ical(list, off) Err bitreich.org 70 i-{ Err bitreich.org 70 i- FS = "[:;]"; Err bitreich.org 70 i- Err bitreich.org 70 i- while (getline) { Err bitreich.org 70 i- gsub("\r", " "); gsub("\\\\[ntr]", " "); gsub("\\\\", ""); Err bitreich.org 70 i- gsub("^ *", ""); gsub(" *$", ""); Err bitreich.org 70 i- gsub(" *<[a-zA-Z0-9/]*>* *", ""); Err bitreich.org 70 i- Err bitreich.org 70 i- if (match($0, "^ ")) { Err bitreich.org 70 i- event[type] = event[type] substr($0, 2, length($0) - 1); Err bitreich.org 70 i- } else { Err bitreich.org 70 i- type = $1; Err bitreich.org 70 i- i = index($0, ":"); Err bitreich.org 70 i- event[type] = substr($0, i + 1, length($0) - i); Err bitreich.org 70 i- } Err bitreich.org 70 i- Err bitreich.org 70 i- if ($0 ~ /END:VEVENT/) Err bitreich.org 70 i- list[++nb] = sprintf("%d\t%d\t%s\t%s\t%s\t%s", Err bitreich.org 70 i- date_ical(event["DTSTART"], off), Err bitreich.org 70 i- date_ical(event["DTEND"], off), Err bitreich.org 70 i- event["CATEGORIES"], Err bitreich.org 70 i- event["SUMMARY"], Err bitreich.org 70 i- event["LOCATION"], Err bitreich.org 70 i- event["DESCRIPTION"]); Err bitreich.org 70 i- } Err bitreich.org 70 i- sort(list, 1, nb); Err bitreich.org 70 i- return nb; Err bitreich.org 70 i-} Err bitreich.org 70 i- Err bitreich.org 70 i-function txt_one(beg, end, cat, sum, loc, des, off) { Err bitreich.org 70 i- b = to_date("%04d/%02d/%02d %02d:%02d", beg + off); Err bitreich.org 70 i- e = to_date("%04d/%02d/%02d %02d:%02d", end + off); Err bitreich.org 70 i- b_mth = substr(b, 1, 7); Err bitreich.org 70 i- b_day = substr(b, 9, 2); Err bitreich.org 70 i- e_day = substr(e, 9, 2); Err bitreich.org 70 i- b_hrs = substr(b, 12); Err bitreich.org 70 i- e_hrs = substr(e, 12); Err bitreich.org 70 i- Err bitreich.org 70 i- printf("%s\n%2s %2s %s\n%2s %2s %s%s\n", Err bitreich.org 70 i- (b_mth != l_mth) ? ("\n[" b_mth "]\n") : (""), Err bitreich.org 70 i- (b_day != l_day) ? (b_day) : (""), b_hrs, sum, Err bitreich.org 70 i- (b_day != e_day) ? (e_day) : (""), e_hrs, Err bitreich.org 70 i- (cat) ? ("[" cat "] ") : (""), loc); Err bitreich.org 70 i- Err bitreich.org 70 i- while ((line = substr(des, 1, 66)) != "") { Err bitreich.org 70 i- if (length(line) == 66) Err bitreich.org 70 i- sub(" +[^ ]*$", "", line); Err bitreich.org 70 i- des = substr(des, length(line) + 2); Err bitreich.org 70 i- sub("^ *", "", line); Err bitreich.org 70 i- sub("^ *", "", des); Err bitreich.org 70 i- printf(" %s\n", line); Err bitreich.org 70 i- } Err bitreich.org 70 i- l_mth = b_mth; Err bitreich.org 70 i- l_day = b_day; Err bitreich.org 70 i-} Err bitreich.org 70 i- Err bitreich.org 70 i-function txt(off) Err bitreich.org 70 i-{ Err bitreich.org 70 i- nb = parse_ical(list, off); Err bitreich.org 70 i- for (i = 1; i <= nb; i++) { Err bitreich.org 70 i- split(list[i], arr, "\t"); Err bitreich.org 70 i- txt_one(arr[1], arr[2], arr[3], arr[4], arr[5], arr[6]); Err bitreich.org 70 i- } Err bitreich.org 70 i-} Err bitreich.org 70 i- Err bitreich.org 70 i-function tsv(off) Err bitreich.org 70 i-{ Err bitreich.org 70 i- nb = parse_ical(list, off); Err bitreich.org 70 i- for (i = 0; i < nb; i++) Err bitreich.org 70 i- print(list[i]); Err bitreich.org 70 i-} Err bitreich.org 70 i- Err bitreich.org 70 i-function usage() Err bitreich.org 70 i-{ Err bitreich.org 70 i- print("usage: agenda txt file.ics..."); Err bitreich.org 70 i- print(" agenda tsv file.ics..."); Err bitreich.org 70 i-} Err bitreich.org 70 i- Err bitreich.org 70 i-BEGIN { Err bitreich.org 70 i- "date +%z" | getline off; Err bitreich.org 70 i- close("date +%z"); Err bitreich.org 70 i- off = substr(off, 1, 3) * 3600; Err bitreich.org 70 i- Err bitreich.org 70 i- if (ARGV[1] == "txt") { Err bitreich.org 70 i- ARGV[1] = ARGV[--ARGC]; Err bitreich.org 70 i- txt(off); Err bitreich.org 70 i- } else if (ARGV[1] == "tsv") { Err bitreich.org 70 i- ARGV[1] = ARGV[--ARGC]; Err bitreich.org 70 i- tsv(off); Err bitreich.org 70 i- } else { Err bitreich.org 70 i- usage(); Err bitreich.org 70 i- } Err bitreich.org 70 i-} Err bitreich.org 70 1diff --git a/agenda.1 b/agenda.1 /scm/ics2txt/file/agenda.1.gph bitreich.org 70 i@@ -1,81 +0,0 @@ Err bitreich.org 70 i-.Dd $Mdocdate: February 23 2018$ Err bitreich.org 70 i-.Dt AGENDA 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 agenda Err bitreich.org 70 i-.Nd plain text agenda with ical support 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 Ic txt Oo +- Oc Ns Ar offset Op Ar ics file... Err bitreich.org 70 i-.Nm Ic tsv Oo +- Oc Ns Ar offset Op Ar ics file... Err bitreich.org 70 i-. 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-displays iCalendar Err bitreich.org 70 i-.Pq ical, Pa .ics Err bitreich.org 70 i-.Ar file Err bitreich.org 70 i-or stdin if not specified in the format described by the command: Err bitreich.org 70 i-. Err bitreich.org 70 i-.Bl -tag -width indent Err bitreich.org 70 i-. Err bitreich.org 70 i-.It Ic txt Err bitreich.org 70 i-Display the agenda(s) Err bitreich.org 70 i-.Ar file Err bitreich.org 70 i-as plain text sorted by date. Err bitreich.org 70 i-. Err bitreich.org 70 i-.It Ic tsv Err bitreich.org 70 i-Display the agenda(s) Err bitreich.org 70 i-.Ar file Err bitreich.org 70 i-as a tab-separated values Err bitreich.org 70 i-.Pq tsv Err bitreich.org 70 i-one entry per line, with the following fields in order: Err bitreich.org 70 i-. Err bitreich.org 70 i-.Bl -tag -width xDESCRIPTIONx -compact Err bitreich.org 70 i-. Err bitreich.org 70 i-.It Dq Li DTSTART Err bitreich.org 70 i-begin date as an UNIX timestamp Err bitreich.org 70 i-. Err bitreich.org 70 i-.It Dq Li DTEND Err bitreich.org 70 i-end date as an UNIX timestamp Err bitreich.org 70 i-. Err bitreich.org 70 i-.It Dq Li CATEGORY Err bitreich.org 70 i-category Err bitreich.org 70 i-. Err bitreich.org 70 i-.It Dq Li SUMMARY Err bitreich.org 70 i-symmary Err bitreich.org 70 i-. Err bitreich.org 70 i-.It Dq Li LOCATION Err bitreich.org 70 i-location Err bitreich.org 70 i-. Err bitreich.org 70 i-.It Dq Li DESCRIPTION Err bitreich.org 70 i-description 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 ENVIRONMENT Err bitreich.org 70 i-. Err bitreich.org 70 i-.Bl -tag -width 6n Err bitreich.org 70 i-. Err bitreich.org 70 i-.It Ev TZ Err bitreich.org 70 i-Timezone to use for printing the dates. 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 SEE ALSO Err bitreich.org 70 i-. Err bitreich.org 70 i-.Xr calendar 1 , Err bitreich.org 70 i-.Xr date 1 , 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 mail@josuah.net Err bitreich.org 70 1diff --git a/ics2txt b/ics2txt /scm/ics2txt/file/ics2txt.gph bitreich.org 70 i@@ -0,0 +1,183 @@ Err bitreich.org 70 i+#!/usr/bin/awk -f Err bitreich.org 70 i+ Err bitreich.org 70 i+# handle ical agenda and display them in plain text Err bitreich.org 70 i+ Err bitreich.org 70 i+function leap(yrs) Err bitreich.org 70 i+{ Err bitreich.org 70 i+ return (yrs % 4 == 0) && (yrs % 100 != 0) || (yrs % 400 == 0); Err bitreich.org 70 i+} Err bitreich.org 70 i+ Err bitreich.org 70 i+function days_per_month(mth, yrs) Err bitreich.org 70 i+{ Err bitreich.org 70 i+ if (mth == 2) Err bitreich.org 70 i+ return 28 + leap(yrs); Err bitreich.org 70 i+ else Err bitreich.org 70 i+ return 30 + (mth - (mth > 7)) % 2; Err bitreich.org 70 i+} Err bitreich.org 70 i+ Err bitreich.org 70 i+function to_sec(yrs, mth, day, hrs, min, sec) Err bitreich.org 70 i+{ Err bitreich.org 70 i+ while (--mth >= 1) Err bitreich.org 70 i+ day += days_per_month(mth, yrs); Err bitreich.org 70 i+ while (--yrs >= 1970) Err bitreich.org 70 i+ day += 365 + leap(yrs); Err bitreich.org 70 i+ return (((((day - 1) * 24) + hrs) * 60) + min) * 60 + sec; Err bitreich.org 70 i+} Err bitreich.org 70 i+ Err bitreich.org 70 i+function to_date(fmt, sec) Err bitreich.org 70 i+{ Err bitreich.org 70 i+ for (yrs = 1970; sec >= (s = 3600 * 24 * (365 + leap(yrs))); yrs++) Err bitreich.org 70 i+ sec -= s; Err bitreich.org 70 i+ for (mth = 1; sec >= (s = 3600 * 24 * days_per_month(mth, yrs)); mth++) Err bitreich.org 70 i+ sec -= s; Err bitreich.org 70 i+ for (day = 1; sec >= (s = 3600 * 24); day++) Err bitreich.org 70 i+ sec -= s; Err bitreich.org 70 i+ for (hrs = 0; sec >= 3600; hrs++) Err bitreich.org 70 i+ sec -= 3600; Err bitreich.org 70 i+ for (min = 0; sec >= 60; min++) Err bitreich.org 70 i+ sec -= 60; Err bitreich.org 70 i+ return sprintf(fmt, yrs, mth, day, hrs, min, sec); Err bitreich.org 70 i+} Err bitreich.org 70 i+ Err bitreich.org 70 i+function date_ical(str, off) { Err bitreich.org 70 i+ yrs = substr(str, 1, 4); Err bitreich.org 70 i+ mth = substr(str, 5, 2); Err bitreich.org 70 i+ day = substr(str, 7, 2); Err bitreich.org 70 i+ hrs = substr(str, 10, 2); Err bitreich.org 70 i+ min = substr(str, 12, 2); Err bitreich.org 70 i+ return to_sec(yrs, mth, day, hrs, min, 0) - off; Err bitreich.org 70 i+} Err bitreich.org 70 i+ Err bitreich.org 70 i+function date_iso8601(date, off) Err bitreich.org 70 i+{ Err bitreich.org 70 i+ yrs = substr(date, 1, 4); Err bitreich.org 70 i+ mth = substr(date, 6, 2); Err bitreich.org 70 i+ day = substr(date, 9, 2); Err bitreich.org 70 i+ hrs = substr(date, 12, 2); Err bitreich.org 70 i+ min = substr(date, 15, 2); Err bitreich.org 70 i+ return to_sec(yrs, mth, day, hrs, min, 0) - off; Err bitreich.org 70 i+} Err bitreich.org 70 i+ Err bitreich.org 70 i+function swap(array, a, b) Err bitreich.org 70 i+{ Err bitreich.org 70 i+ tmp = array[a]; Err bitreich.org 70 i+ array[a] = array[b]; Err bitreich.org 70 i+ array[b] = tmp; Err bitreich.org 70 i+} Err bitreich.org 70 i+ Err bitreich.org 70 i+function sort(array, beg, end) Err bitreich.org 70 i+{ Err bitreich.org 70 i+ if (beg >= end) # end recursion Err bitreich.org 70 i+ return; Err bitreich.org 70 i+ Err bitreich.org 70 i+ a = beg + 1; # #1 is the pivot Err bitreich.org 70 i+ b = end; Err bitreich.org 70 i+ while (a < b) { Err bitreich.org 70 i+ while (a < b && array[a] <= array[beg]) # beg: skip lesser Err bitreich.org 70 i+ a++; Err bitreich.org 70 i+ while (a < b && array[b] > array[beg]) # end: skip greater Err bitreich.org 70 i+ b--; Err bitreich.org 70 i+ swap(array, a, b); # found 2 misplaced Err bitreich.org 70 i+ } Err bitreich.org 70 i+ Err bitreich.org 70 i+ if (array[beg] > array[a]) # put the pivot back Err bitreich.org 70 i+ swap(array, beg, a); Err bitreich.org 70 i+ Err bitreich.org 70 i+ sort(array, beg, a - 1); # sort lower half Err bitreich.org 70 i+ sort(array, a, end); # sort higher half Err bitreich.org 70 i+} Err bitreich.org 70 i+ Err bitreich.org 70 i+function parse_ical(list, off) Err bitreich.org 70 i+{ Err bitreich.org 70 i+ FS = "[:;]"; Err bitreich.org 70 i+ Err bitreich.org 70 i+ while (getline) { Err bitreich.org 70 i+ gsub("\r", " "); gsub("\\\\[ntr]", " "); gsub("\\\\", ""); Err bitreich.org 70 i+ gsub("^ *", ""); gsub(" *$", ""); Err bitreich.org 70 i+ gsub(" *<[a-zA-Z0-9/]*>* *", ""); Err bitreich.org 70 i+ Err bitreich.org 70 i+ if (match($0, "^ ")) { Err bitreich.org 70 i+ event[type] = event[type] substr($0, 2, length($0) - 1); Err bitreich.org 70 i+ } else { Err bitreich.org 70 i+ type = $1; Err bitreich.org 70 i+ i = index($0, ":"); Err bitreich.org 70 i+ event[type] = substr($0, i + 1, length($0) - i); Err bitreich.org 70 i+ } Err bitreich.org 70 i+ Err bitreich.org 70 i+ if ($0 ~ /END:VEVENT/) Err bitreich.org 70 i+ list[++nb] = sprintf("%d\t%d\t%s\t%s\t%s\t%s", Err bitreich.org 70 i+ date_ical(event["DTSTART"], off), Err bitreich.org 70 i+ date_ical(event["DTEND"], off), Err bitreich.org 70 i+ event["CATEGORIES"], Err bitreich.org 70 i+ event["SUMMARY"], Err bitreich.org 70 i+ event["LOCATION"], Err bitreich.org 70 i+ event["DESCRIPTION"]); Err bitreich.org 70 i+ } Err bitreich.org 70 i+ sort(list, 1, nb); Err bitreich.org 70 i+ return nb; Err bitreich.org 70 i+} Err bitreich.org 70 i+ Err bitreich.org 70 i+function txt_one(beg, end, cat, sum, loc, des, off) { Err bitreich.org 70 i+ b = to_date("%04d/%02d/%02d %02d:%02d", beg + off); Err bitreich.org 70 i+ e = to_date("%04d/%02d/%02d %02d:%02d", end + off); Err bitreich.org 70 i+ b_mth = substr(b, 1, 7); Err bitreich.org 70 i+ b_day = substr(b, 9, 2); Err bitreich.org 70 i+ e_day = substr(e, 9, 2); Err bitreich.org 70 i+ b_hrs = substr(b, 12); Err bitreich.org 70 i+ e_hrs = substr(e, 12); Err bitreich.org 70 i+ Err bitreich.org 70 i+ printf("%s\n%2s %2s %s\n%2s %2s %s%s\n", Err bitreich.org 70 i+ (b_mth != l_mth) ? ("\n[" b_mth "]\n") : (""), Err bitreich.org 70 i+ (b_day != l_day) ? (b_day) : (""), b_hrs, sum, Err bitreich.org 70 i+ (b_day != e_day) ? (e_day) : (""), e_hrs, Err bitreich.org 70 i+ (cat) ? ("[" cat "] ") : (""), loc); Err bitreich.org 70 i+ Err bitreich.org 70 i+ while ((line = substr(des, 1, 66)) != "") { Err bitreich.org 70 i+ if (length(line) == 66) Err bitreich.org 70 i+ sub(" +[^ ]*$", "", line); Err bitreich.org 70 i+ des = substr(des, length(line) + 2); Err bitreich.org 70 i+ sub("^ *", "", line); Err bitreich.org 70 i+ sub("^ *", "", des); Err bitreich.org 70 i+ printf(" %s\n", line); Err bitreich.org 70 i+ } Err bitreich.org 70 i+ l_mth = b_mth; Err bitreich.org 70 i+ l_day = b_day; Err bitreich.org 70 i+} Err bitreich.org 70 i+ Err bitreich.org 70 i+function txt(off) Err bitreich.org 70 i+{ Err bitreich.org 70 i+ nb = parse_ical(list, off); Err bitreich.org 70 i+ for (i = 1; i <= nb; i++) { Err bitreich.org 70 i+ split(list[i], arr, "\t"); Err bitreich.org 70 i+ txt_one(arr[1], arr[2], arr[3], arr[4], arr[5], arr[6]); Err bitreich.org 70 i+ } Err bitreich.org 70 i+} Err bitreich.org 70 i+ Err bitreich.org 70 i+function tsv(off) Err bitreich.org 70 i+{ Err bitreich.org 70 i+ nb = parse_ical(list, off); Err bitreich.org 70 i+ for (i = 0; i < nb; i++) Err bitreich.org 70 i+ print(list[i]); Err bitreich.org 70 i+} Err bitreich.org 70 i+ Err bitreich.org 70 i+function usage() Err bitreich.org 70 i+{ Err bitreich.org 70 i+ print("usage: ics2txt txt file.ics..."); Err bitreich.org 70 i+ print(" ics2txt tsv file.ics..."); Err bitreich.org 70 i+} Err bitreich.org 70 i+ Err bitreich.org 70 i+BEGIN { Err bitreich.org 70 i+ "date +%z" | getline off; Err bitreich.org 70 i+ close("date +%z"); Err bitreich.org 70 i+ off = substr(off, 1, 3) * 3600; Err bitreich.org 70 i+ Err bitreich.org 70 i+ if (ARGV[1] == "txt") { Err bitreich.org 70 i+ ARGV[1] = ARGV[--ARGC]; Err bitreich.org 70 i+ txt(off); Err bitreich.org 70 i+ } else if (ARGV[1] == "tsv") { Err bitreich.org 70 i+ ARGV[1] = ARGV[--ARGC]; Err bitreich.org 70 i+ tsv(off); Err bitreich.org 70 i+ } else { Err bitreich.org 70 i+ usage(); Err bitreich.org 70 i+ } Err bitreich.org 70 i+} Err bitreich.org 70 1diff --git a/ics2txt.1 b/ics2txt.1 /scm/ics2txt/file/ics2txt.1.gph bitreich.org 70 i@@ -0,0 +1,81 @@ Err bitreich.org 70 i+.Dd $Mdocdate: February 23 2018$ Err bitreich.org 70 i+.Dt AGENDA 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 ics2txt Err bitreich.org 70 i+.Nd convert ics file to plain text or 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 Ic txt Oo +- Oc Ns Ar offset Op Ar ics file... Err bitreich.org 70 i+.Nm Ic tsv Oo +- Oc Ns Ar offset Op Ar ics file... Err bitreich.org 70 i+. 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+displays iCalendar Err bitreich.org 70 i+.Pq ical, Pa .ics Err bitreich.org 70 i+.Ar file Err bitreich.org 70 i+or stdin if not specified in the format described by the command: Err bitreich.org 70 i+. Err bitreich.org 70 i+.Bl -tag -width indent Err bitreich.org 70 i+. Err bitreich.org 70 i+.It Ic txt Err bitreich.org 70 i+Display the ics2txt(s) Err bitreich.org 70 i+.Ar file Err bitreich.org 70 i+as plain text sorted by date. Err bitreich.org 70 i+. Err bitreich.org 70 i+.It Ic tsv Err bitreich.org 70 i+Display the ics2txt(s) Err bitreich.org 70 i+.Ar file Err bitreich.org 70 i+as a tab-separated values Err bitreich.org 70 i+.Pq tsv Err bitreich.org 70 i+one entry per line, with the following fields in order: Err bitreich.org 70 i+. Err bitreich.org 70 i+.Bl -tag -width xDESCRIPTIONx -compact Err bitreich.org 70 i+. Err bitreich.org 70 i+.It Dq Li DTSTART Err bitreich.org 70 i+begin date as an UNIX timestamp Err bitreich.org 70 i+. Err bitreich.org 70 i+.It Dq Li DTEND Err bitreich.org 70 i+end date as an UNIX timestamp Err bitreich.org 70 i+. Err bitreich.org 70 i+.It Dq Li CATEGORY Err bitreich.org 70 i+category Err bitreich.org 70 i+. Err bitreich.org 70 i+.It Dq Li SUMMARY Err bitreich.org 70 i+symmary Err bitreich.org 70 i+. Err bitreich.org 70 i+.It Dq Li LOCATION Err bitreich.org 70 i+location Err bitreich.org 70 i+. Err bitreich.org 70 i+.It Dq Li DESCRIPTION Err bitreich.org 70 i+description 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 ENVIRONMENT Err bitreich.org 70 i+. Err bitreich.org 70 i+.Bl -tag -width 6n Err bitreich.org 70 i+. Err bitreich.org 70 i+.It Ev TZ Err bitreich.org 70 i+Timezone to use for printing the dates. 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 SEE ALSO Err bitreich.org 70 i+. Err bitreich.org 70 i+.Xr calendar 1 , Err bitreich.org 70 i+.Xr date 1 , 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 mail@josuah.net Err bitreich.org 70 .