isplit the role of parsing and formatting through a simple TSV intermediate format - 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 37b4e99568c76d39376244f8f85fcf0dcfc95bd9 /scm/ics2txt/commit/37b4e99568c76d39376244f8f85fcf0dcfc95bd9.gph bitreich.org 70 1parent 7ef52e239bfc8757d45f3d868920dba32dcb5b61 /scm/ics2txt/commit/7ef52e239bfc8757d45f3d868920dba32dcb5b61.gph bitreich.org 70 hAuthor: Josuah Demangeon URL:mailto:me@josuah.net bitreich.org 70 iDate: Mon, 2 Mar 2020 01:15:03 +0100 Err bitreich.org 70 i Err bitreich.org 70 isplit the role of parsing and formatting through a simple TSV intermediate format Err bitreich.org 70 i Err bitreich.org 70 iDiffstat: Err bitreich.org 70 i M Makefile | 2 +- Err bitreich.org 70 i M README | 84 ++----------------------------- Err bitreich.org 70 i D ics2txt | 168 ------------------------------- Err bitreich.org 70 i A ics2txt-back | 81 ++++++++++++++++++++++++++++++ Err bitreich.org 70 i A ics2txt-ics | 91 +++++++++++++++++++++++++++++++ Err bitreich.org 70 i A ics2txt-tsv | 64 +++++++++++++++++++++++++++++++ Err bitreich.org 70 i A ics2txt-txt | 97 ++++++++++++++++++++++++++++++ Err bitreich.org 70 i M ics2txt.1 | 49 +++++++++++++++++++++++-------- Err bitreich.org 70 i Err bitreich.org 70 i8 files changed, 374 insertions(+), 262 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,4 +1,4 @@ Err bitreich.org 70 i-BIN = ics2txt 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 1diff --git a/README b/README /scm/ics2txt/file/README.gph bitreich.org 70 i@@ -1,83 +1,7 @@ Err bitreich.org 70 i-ics2txt Err bitreich.org 70 i-======= Err bitreich.org 70 i+sical Err bitreich.org 70 i+===== Err bitreich.org 70 i Err bitreich.org 70 i-*ics2txt* is an awk scripts to deal with iCal [1] format to publish, Err bitreich.org 70 i-display and convert *.ics files. Err bitreich.org 70 i+*sical* is set of awk scripts to deal with iCal [1] format to publish, Err bitreich.org 70 i+display and convert *.ics files, though a simple central TSV format. Err bitreich.org 70 i Err bitreich.org 70 i [1]: https://tools.ietf.org/rfc/rfc5545.txt Err bitreich.org 70 i- Err bitreich.org 70 i-Sample output: Err bitreich.org 70 i- Err bitreich.org 70 i-2019-02-02 Err bitreich.org 70 i- Err bitreich.org 70 i-07:30 Welcome to FOSDEM 2019 Err bitreich.org 70 i-07:55 Janson Err bitreich.org 70 i- FOSDEM welcome and opening talk. Err bitreich.org 70 i- Err bitreich.org 70 i-08:30 The State of Go Err bitreich.org 70 i-09:00 UD2.120 (Chavanne) Err bitreich.org 70 i- Go 1.12 is planned to be released in February 2019 and this talk Err bitreich.org 70 i- covers what's coming up with it.We'll talk about Go Modules, the Err bitreich.org 70 i- proposals for Go 2, and all of the new things you might have missed. Err bitreich.org 70 i- Err bitreich.org 70 i-09:30 HTTP/3 Err bitreich.org 70 i-10:30 UD2.208 (Decroly) Err bitreich.org 70 i- HTTP/3 is the next coming HTTP version. This time TCP is replaced by Err bitreich.org 70 i- the new transport protocol QUIC and things are different yet again! Err bitreich.org 70 i- Err bitreich.org 70 i-10:05 Minimalism matters Err bitreich.org 70 i-10:25 K.4.201 Err bitreich.org 70 i- Minimalism matters in computing. To trust systems we need to be able Err bitreich.org 70 i- to understand them completely. Openssl heartbleed disaster was caused Err bitreich.org 70 i- by code no longer being minimalistic, even if it is free and open Err bitreich.org 70 i- source software. Hardware manfucturers and proprietary closed source Err bitreich.org 70 i- solutions make things even worse with expectations of intrusion to Err bitreich.org 70 i- privacy and backdoors if we don't aim for free hardware, software and Err bitreich.org 70 i- minimalism. In this talk I will discuss minimalism in a broad context Err bitreich.org 70 i- and narrow down on what the free software community can aim for. Err bitreich.org 70 i- Err bitreich.org 70 i-2019-02-03 Err bitreich.org 70 i- Err bitreich.org 70 i-07:55 Microkernel virtualization under one roof Err bitreich.org 70 i-08:30 AW1.121 Err bitreich.org 70 i- Today's off-the-shell virtualization solution is ridden with Err bitreich.org 70 i- complexity. Application of virtualization call for trustworthy Err bitreich.org 70 i- solutions. Complexity defeats trust.Microkernels with virtualization Err bitreich.org 70 i- extensions and user-level VMMs on top are a approach to mitigate Err bitreich.org 70 i- complexity. Modern microkernels like seL4, the NOVA microhypervisor, Err bitreich.org 70 i- Genode's -hw- kernel or Fiasco.OC are such promising candidates. Err bitreich.org 70 i- Fortunately and unfortunately, the diversity come with fragmentation Err bitreich.org 70 i- of the small microkernel community. There are several VMMs for each Err bitreich.org 70 i- platform tight to a specific microkernel, rendering it unusable Err bitreich.org 70 i- across various kernels.Genode supports several kernels already, so Err bitreich.org 70 i- that unification of virtualization interfaces for VMMs across kernels Err bitreich.org 70 i- seem to come into reach. Does it ? The talk will cover the venture Err bitreich.org 70 i- and current state of harmonization hardware-assisted virtualization Err bitreich.org 70 i- interfaces to fit into the Genode OS framework. Err bitreich.org 70 i- Err bitreich.org 70 i-14:40 FOSDEM infrastructure review Err bitreich.org 70 i-14:55 H.2215 (Ferrer) Err bitreich.org 70 i- Informational and fun. Err bitreich.org 70 i- Err bitreich.org 70 i-15:00 2019 - Fifty years of Unix and Linux advances Err bitreich.org 70 i-15:50 Janson Err bitreich.org 70 i- 2019 marks the fiftieth anniversary of Unix, but it is also the Err bitreich.org 70 i- fiftieth anniversary of the ArpaNet/Internet, and people walking on Err bitreich.org 70 i- the moon. It marks the 50th anniversary of Woodstock, the beginning Err bitreich.org 70 i- of America's LGBTQ movement at the Stonewall Inn in New York City, Err bitreich.org 70 i- and maddog wrote his first program fifty years ago. It was also in Err bitreich.org 70 i- 1969 that he shaved for the last time.2019 marks the 30th year of the Err bitreich.org 70 i- World Wide Web, the 25th anniversary of V1.0 of the Linux kernel, and Err bitreich.org 70 i- of many GNU/Linux distributions starting. 2019 also marks the Err bitreich.org 70 i- twentieth anniversary of the Linux Professional Institute.All of Err bitreich.org 70 i- these years, and anniversaries.....but why has Unix (and its younger Err bitreich.org 70 i- offspring Linux) lasted so long? What was different about Unix that Err bitreich.org 70 i- caused it to survive and flourish? Why is it important today, and Err bitreich.org 70 i- how can we take it further? How should we celebrate 2019? While Err bitreich.org 70 i- maddog does not have all the answers, he tries to make the answers he Err bitreich.org 70 i- does have interesting and fun to know. Err bitreich.org 70 i- Err bitreich.org 70 i-15:55 Closing FOSDEM 2019 Err bitreich.org 70 i-16:00 Janson Err bitreich.org 70 i- Some closing words. Don't miss it! Err bitreich.org 70 i- Err bitreich.org 70 1diff --git a/ics2txt b/ics2txt /scm/ics2txt/file/ics2txt.gph bitreich.org 70 i@@ -1,168 +0,0 @@ Err bitreich.org 70 i-#!/usr/bin/awk -f Err bitreich.org 70 i- Err bitreich.org 70 i-# display iCal entries 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, offset) { 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- if (substr(str, 16, 1) == "Z") Err bitreich.org 70 i- return to_sec(yrs, mth, day, hrs, min, 0) Err bitreich.org 70 i- else Err bitreich.org 70 i- return to_sec(yrs, mth, day, hrs, min, 0) - offset Err bitreich.org 70 i-} Err bitreich.org 70 i- Err bitreich.org 70 i-function date_iso8601(date, offset) 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) - offset 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, offset) 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[++n] = sprintf("%d\t%d\t%s\t%s\t%s\t%s", Err bitreich.org 70 i- date_ical(event["DTSTART"], offset), Err bitreich.org 70 i- date_ical(event["DTEND"], offset), 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, n) Err bitreich.org 70 i- return n Err bitreich.org 70 i-} Err bitreich.org 70 i- Err bitreich.org 70 i-function print_fold(prefix, s, n) Err bitreich.org 70 i-{ Err bitreich.org 70 i- while (s != "") { Err bitreich.org 70 i- line = substr(s, 1, n) Err bitreich.org 70 i- if (length(s) > n) sub(" +[^ \t\r\n]*$", "", line) Err bitreich.org 70 i- print prefix line Err bitreich.org 70 i- s = substr(s, length(line) + 2) Err bitreich.org 70 i- } Err bitreich.org 70 i-} Err bitreich.org 70 i- Err bitreich.org 70 i-function print_entry(beg, end, summary, location, description, offset) Err bitreich.org 70 i-{ Err bitreich.org 70 i- b = to_date("%04d-%02d-%02d %02d:%02d", beg + offset) Err bitreich.org 70 i- e = to_date("%04d-%02d-%02d %02d:%02d", end + offset) Err bitreich.org 70 i- date = substr(b, 1, 10) Err bitreich.org 70 i- hour_beg = substr(b, 12) Err bitreich.org 70 i- hour_end = substr(e, 12) Err bitreich.org 70 i- Err bitreich.org 70 i- if (date != last_date) print "\n" date Err bitreich.org 70 i- print "\n" hour_beg "\t" summary Err bitreich.org 70 i- done = 0 Err bitreich.org 70 i- if (category) printf("%s\t%s\n", !done++ ? hour_end : "", category) Err bitreich.org 70 i- if (location) printf("%s\t%s\n", !done++ ? hour_end : "", location) Err bitreich.org 70 i- if (description) { Err bitreich.org 70 i- printf("%s", !done++ ? hour_end : "") Err bitreich.org 70 i- print_fold("\t", description, 70) Err bitreich.org 70 i- } Err bitreich.org 70 i- Err bitreich.org 70 i- last_date = date Err bitreich.org 70 i-} Err bitreich.org 70 i- Err bitreich.org 70 i-BEGIN { Err bitreich.org 70 i- "date +%z" | getline offset_str Err bitreich.org 70 i- close("date +%z") Err bitreich.org 70 i- Err bitreich.org 70 i- offset = substr(offset_str, 2, 2) * 3600 Err bitreich.org 70 i- offset += substr(offset_str, 4, 2) * 60 Err bitreich.org 70 i- if (substr(offset_str, 1, 1) == "-") Err bitreich.org 70 i- offset *= -1 Err bitreich.org 70 i- Err bitreich.org 70 i- n = parse_ical(list, offset) Err bitreich.org 70 i- for (i = 1; i <= n; i++) { Err bitreich.org 70 i- split(list[i], arr, "\t") Err bitreich.org 70 i- print_entry(arr[1], arr[2], arr[3], arr[4], arr[5], arr[6], offset) Err bitreich.org 70 i- } Err bitreich.org 70 i- print "" Err bitreich.org 70 i-} Err bitreich.org 70 1diff --git a/ics2txt-back b/ics2txt-back /scm/ics2txt/file/ics2txt-back.gph bitreich.org 70 i@@ -0,0 +1,81 @@ Err bitreich.org 70 i+#!/usr/bin/awk -f Err bitreich.org 70 i+ Err bitreich.org 70 i+function isleap(year) Err bitreich.org 70 i+{ Err bitreich.org 70 i+ return (year % 4 == 0) && (year % 100 != 0) || (year % 400 == 0) Err bitreich.org 70 i+} Err bitreich.org 70 i+ Err bitreich.org 70 i+function mdays(mon, year) Err bitreich.org 70 i+{ Err bitreich.org 70 i+ return (mon == 2) ? (28 + isleap(year)) : (30 + (mon + (mon > 7)) % 2) Err bitreich.org 70 i+} Err bitreich.org 70 i+ Err bitreich.org 70 i+function timegm(year, mon, mday, hour, min, sec) Err bitreich.org 70 i+{ Err bitreich.org 70 i+ while (--mon >= 1) Err bitreich.org 70 i+ mday += mdays(mon, year) Err bitreich.org 70 i+ while (--year >= 1970) Err bitreich.org 70 i+ mday += 365 + isleap(year) Err bitreich.org 70 i+ return (((((mday - 1) * 24) + hour) * 60) + min) * 60 + sec Err bitreich.org 70 i+} Err bitreich.org 70 i+ Err bitreich.org 70 i+function date_text(str, offset, Err bitreich.org 70 i+ year, mon, mday, hour, min) Err bitreich.org 70 i+{ Err bitreich.org 70 i+ year = substr(str, 1, 4) Err bitreich.org 70 i+ mon = substr(str, 6, 2) Err bitreich.org 70 i+ mday = substr(str, 9, 2) Err bitreich.org 70 i+ hour = substr(str, 12, 2) Err bitreich.org 70 i+ min = substr(str, 15, 2) Err bitreich.org 70 i+ return timegm(year, mon, mday, hour, min, 0) - offset Err bitreich.org 70 i+} Err bitreich.org 70 i+ Err bitreich.org 70 i+{ Err bitreich.org 70 i+ gsub(/\t/, " ") Err bitreich.org 70 i+} Err bitreich.org 70 i+ Err bitreich.org 70 i+/^TZ[+-]/ { Err bitreich.org 70 i+ hour = substr($0, 4, 2) Err bitreich.org 70 i+ min = substr($0, 6, 2) Err bitreich.org 70 i+ tzoffset = substr(zone, 3, 1) hour * 3600 + min * 60 Err bitreich.org 70 i+ next Err bitreich.org 70 i+} Err bitreich.org 70 i+ Err bitreich.org 70 i+/^[0-9]+-[0-9]+-[0-9]+ / { Err bitreich.org 70 i+ time = date_text($1 " " $2, tzoffset) Err bitreich.org 70 i+ row++ Err bitreich.org 70 i+} Err bitreich.org 70 i+ Err bitreich.org 70 i+/^ / { Err bitreich.org 70 i+ d = $0 Err bitreich.org 70 i+ sub(/^ */, "", d) Err bitreich.org 70 i+ des = des " " d Err bitreich.org 70 i+} Err bitreich.org 70 i+ Err bitreich.org 70 i+/^$/ { Err bitreich.org 70 i+ if (beg) Err bitreich.org 70 i+ printf "%d\t%d\t%s\t%s\t%s\t%s\n", beg, end, cat, loc, sum, des Err bitreich.org 70 i+ beg = end = cat = loc = sum = des = "" Err bitreich.org 70 i+} Err bitreich.org 70 i+ Err bitreich.org 70 i+row == 1 { Err bitreich.org 70 i+ beg = time Err bitreich.org 70 i+ sum = $0 Err bitreich.org 70 i+ sub(/^[^ ]+ +[^ ]+ +/, "", sum) Err bitreich.org 70 i+} Err bitreich.org 70 i+ Err bitreich.org 70 i+row == 2 { Err bitreich.org 70 i+ end = time Err bitreich.org 70 i+ Err bitreich.org 70 i+ line = $0 Err bitreich.org 70 i+ sub(/^[^ ]+ +[^ ]+ +/, "", line) Err bitreich.org 70 i+ Err bitreich.org 70 i+ cat = line Err bitreich.org 70 i+ sub(/\].*/, "", cat) Err bitreich.org 70 i+ sub(/^\[/, "", cat) Err bitreich.org 70 i+ Err bitreich.org 70 i+ loc = line Err bitreich.org 70 i+ sub(/[^]]*\] */, "", loc) Err bitreich.org 70 i+ Err bitreich.org 70 i+ row = 0 Err bitreich.org 70 i+} Err bitreich.org 70 1diff --git a/ics2txt-ics b/ics2txt-ics /scm/ics2txt/file/ics2txt-ics.gph bitreich.org 70 i@@ -0,0 +1,91 @@ Err bitreich.org 70 i+#!/usr/bin/awk -f Err bitreich.org 70 i+ Err bitreich.org 70 i+function isleap(year) Err bitreich.org 70 i+{ Err bitreich.org 70 i+ return (year % 4 == 0) && (year % 100 != 0) || (year % 400 == 0) Err bitreich.org 70 i+} Err bitreich.org 70 i+ Err bitreich.org 70 i+function mdays(mon, year) Err bitreich.org 70 i+{ Err bitreich.org 70 i+ return (mon == 2) ? (28 + isleap(year)) : (30 + (mon + (mon > 7)) % 2) Err bitreich.org 70 i+} Err bitreich.org 70 i+ Err bitreich.org 70 i+# Split the time in seconds since epoch into a table, with fields Err bitreich.org 70 i+# named as with gmtime(3): tm["year"], tm["mon"], tm["mday"], Err bitreich.org 70 i+# tm["hour"], tm["min"], tm["sec"] Err bitreich.org 70 i+function gmtime(sec, tm, Err bitreich.org 70 i+ s) Err bitreich.org 70 i+{ Err bitreich.org 70 i+ tm["year"] = 1970 Err bitreich.org 70 i+ while (sec >= (s = 86400 * (365 + isleap(tm["year"])))) { Err bitreich.org 70 i+ tm["year"]++ Err bitreich.org 70 i+ sec -= s Err bitreich.org 70 i+ } Err bitreich.org 70 i+ Err bitreich.org 70 i+ tm["mon"] = 1 Err bitreich.org 70 i+ while (sec >= (s = 86400 * mdays(tm["mon"], tm["year"]))) { Err bitreich.org 70 i+ tm["mon"]++ Err bitreich.org 70 i+ sec -= s Err bitreich.org 70 i+ } Err bitreich.org 70 i+ Err bitreich.org 70 i+ tm["mday"] = 1 Err bitreich.org 70 i+ while (sec >= (s = 86400)) { Err bitreich.org 70 i+ tm["mday"]++ Err bitreich.org 70 i+ sec -= s Err bitreich.org 70 i+ } Err bitreich.org 70 i+ Err bitreich.org 70 i+ tm["hour"] = 0 Err bitreich.org 70 i+ while (sec >= 3600) { Err bitreich.org 70 i+ tm["hour"]++ Err bitreich.org 70 i+ sec -= 3600 Err bitreich.org 70 i+ } Err bitreich.org 70 i+ Err bitreich.org 70 i+ tm["min"] = 0 Err bitreich.org 70 i+ while (sec >= 60) { Err bitreich.org 70 i+ tm["min"]++ Err bitreich.org 70 i+ sec -= 60 Err bitreich.org 70 i+ } Err bitreich.org 70 i+ Err bitreich.org 70 i+ tm["sec"] = sec Err bitreich.org 70 i+} Err bitreich.org 70 i+ Err bitreich.org 70 i+function print_fold(prefix, s, n) Err bitreich.org 70 i+{ Err bitreich.org 70 i+ while (s != "") { Err bitreich.org 70 i+ line = substr(s, 1, n) Err bitreich.org 70 i+ if (length(s) > n) sub(" +[^ \t\r\n]*$", "", line) Err bitreich.org 70 i+ print prefix line Err bitreich.org 70 i+ s = substr(s, length(line) + 2) Err bitreich.org 70 i+ } Err bitreich.org 70 i+} Err bitreich.org 70 i+ Err bitreich.org 70 i+BEGIN { Err bitreich.org 70 i+ print "BEGIN:VCALENDAR" Err bitreich.org 70 i+ print "VERSION:2.0" Err bitreich.org 70 i+ print "CALSCALE:GREGORIAN" Err bitreich.org 70 i+ print "METHOD:PUBLISH" Err bitreich.org 70 i+} Err bitreich.org 70 i+ Err bitreich.org 70 i+{ Err bitreich.org 70 i+ split($0, a, "\t") Err bitreich.org 70 i+ gmtime(a[1] + offset, beg) Err bitreich.org 70 i+ gmtime(a[2] + offset, end) Err bitreich.org 70 i+ cat = a[3]; loc = a[4]; sum = a[5]; des = a[6] Err bitreich.org 70 i+ Err bitreich.org 70 i+ print "" Err bitreich.org 70 i+ print "BEGIN:VEVENT" Err bitreich.org 70 i+ printf "DTSTART:%04d%02d%02dT%02d%02d00Z\n", Err bitreich.org 70 i+ beg["year"], beg["mon"], beg["mday"], beg["hour"], beg["min"] Err bitreich.org 70 i+ printf "DTEND:%04d%02d%02dT%02d%02d00Z\n", Err bitreich.org 70 i+ end["year"], end["mon"], end["mday"], end["hour"], end["min"] Err bitreich.org 70 i+ print "SUMMARY:" sum Err bitreich.org 70 i+ print "DESCRIPTION:" des Err bitreich.org 70 i+ print "CATEGORIES:" cat Err bitreich.org 70 i+ print "LOCATION:" loc Err bitreich.org 70 i+ print "END:VEVENT" Err bitreich.org 70 i+} Err bitreich.org 70 i+ Err bitreich.org 70 i+END { Err bitreich.org 70 i+ print "" Err bitreich.org 70 i+ print "END:VCALENDAR" Err bitreich.org 70 i+} Err bitreich.org 70 1diff --git a/ics2txt-tsv b/ics2txt-tsv /scm/ics2txt/file/ics2txt-tsv.gph bitreich.org 70 i@@ -0,0 +1,64 @@ Err bitreich.org 70 i+#!/usr/bin/awk -f Err bitreich.org 70 i+ Err bitreich.org 70 i+function isleap(year) Err bitreich.org 70 i+{ Err bitreich.org 70 i+ return (year % 4 == 0) && (year % 100 != 0) || (year % 400 == 0) Err bitreich.org 70 i+} Err bitreich.org 70 i+ Err bitreich.org 70 i+function mdays(mon, year) Err bitreich.org 70 i+{ Err bitreich.org 70 i+ return (mon == 2) ? (28 + isleap(year)) : (30 + (mon + (mon > 7)) % 2) Err bitreich.org 70 i+} Err bitreich.org 70 i+ Err bitreich.org 70 i+function timegm(year, mon, mday, hour, min, sec) Err bitreich.org 70 i+{ Err bitreich.org 70 i+ while (--mon >= 1) Err bitreich.org 70 i+ mday += mdays(mon, year) Err bitreich.org 70 i+ while (--year >= 1970) Err bitreich.org 70 i+ mday += 365 + isleap(year) Err bitreich.org 70 i+ return (((((mday - 1) * 24) + hour) * 60) + min) * 60 + sec Err bitreich.org 70 i+} Err bitreich.org 70 i+ Err bitreich.org 70 i+function date_ical(str, offset, Err bitreich.org 70 i+ year, mon, mday, hour, min) Err bitreich.org 70 i+{ Err bitreich.org 70 i+ year = substr(str, 1, 4) Err bitreich.org 70 i+ mon = substr(str, 5, 2) Err bitreich.org 70 i+ mday = substr(str, 7, 2) Err bitreich.org 70 i+ hour = substr(str, 10, 2) Err bitreich.org 70 i+ min = substr(str, 12, 2) Err bitreich.org 70 i+ offset = (substr(str, 16, 1) == "Z" ? 0 : offset) Err bitreich.org 70 i+ return timegm(year, mon, mday, hour, min, 0) - offset Err bitreich.org 70 i+} Err bitreich.org 70 i+ Err bitreich.org 70 i+BEGIN { Err bitreich.org 70 i+ "date +%z" | getline offset_str Err bitreich.org 70 i+ close("date +%z") Err bitreich.org 70 i+ hour = substr($0, 4, 2) Err bitreich.org 70 i+ min = substr($0, 6, 2) Err bitreich.org 70 i+ tzoffset = substr(zone, 3, 1) hour * 3600 + min * 60 Err bitreich.org 70 i+ Err bitreich.org 70 i+ FS = "[:;]" Err bitreich.org 70 i+} Err bitreich.org 70 i+ Err bitreich.org 70 i+{ Err bitreich.org 70 i+ gsub("\r", ""); gsub("\t", "\\\\t") Err bitreich.org 70 i+ gsub("^ *", ""); gsub(" *$", "") 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+ printf("%d\t%d\t%s\t%s\t%s\t%s\n", Err bitreich.org 70 i+ date_ical(event["DTSTART"], offset), Err bitreich.org 70 i+ date_ical(event["DTEND"], offset), Err bitreich.org 70 i+ event["CATEGORIES"], Err bitreich.org 70 i+ event["LOCATION"], Err bitreich.org 70 i+ event["SUMMARY"], Err bitreich.org 70 i+ event["DESCRIPTION"]) Err bitreich.org 70 i+} Err bitreich.org 70 1diff --git a/ics2txt-txt b/ics2txt-txt /scm/ics2txt/file/ics2txt-txt.gph bitreich.org 70 i@@ -0,0 +1,97 @@ Err bitreich.org 70 i+#!/usr/bin/awk -f Err bitreich.org 70 i+ Err bitreich.org 70 i+function isleap(year) Err bitreich.org 70 i+{ Err bitreich.org 70 i+ return (year % 4 == 0) && (year % 100 != 0) || (year % 400 == 0) Err bitreich.org 70 i+} Err bitreich.org 70 i+ Err bitreich.org 70 i+function mdays(mon, year) Err bitreich.org 70 i+{ Err bitreich.org 70 i+ return (mon == 2) ? (28 + isleap(year)) : (30 + (mon + (mon > 7)) % 2) Err bitreich.org 70 i+} Err bitreich.org 70 i+ Err bitreich.org 70 i+# Split the time in seconds since epoch into a table, with fields Err bitreich.org 70 i+# named as with gmtime(3): tm["year"], tm["mon"], tm["mday"], Err bitreich.org 70 i+# tm["hour"], tm["min"], tm["sec"] Err bitreich.org 70 i+function gmtime(sec, tm, Err bitreich.org 70 i+ s) Err bitreich.org 70 i+{ Err bitreich.org 70 i+ tm["year"] = 1970 Err bitreich.org 70 i+ while (sec >= (s = 86400 * (365 + isleap(tm["year"])))) { Err bitreich.org 70 i+ tm["year"]++ Err bitreich.org 70 i+ sec -= s Err bitreich.org 70 i+ } Err bitreich.org 70 i+ Err bitreich.org 70 i+ tm["mon"] = 1 Err bitreich.org 70 i+ while (sec >= (s = 86400 * mdays(tm["mon"], tm["year"]))) { Err bitreich.org 70 i+ tm["mon"]++ Err bitreich.org 70 i+ sec -= s Err bitreich.org 70 i+ } Err bitreich.org 70 i+ Err bitreich.org 70 i+ tm["mday"] = 1 Err bitreich.org 70 i+ while (sec >= (s = 86400)) { Err bitreich.org 70 i+ tm["mday"]++ Err bitreich.org 70 i+ sec -= s Err bitreich.org 70 i+ } Err bitreich.org 70 i+ Err bitreich.org 70 i+ tm["hour"] = 0 Err bitreich.org 70 i+ while (sec >= 3600) { Err bitreich.org 70 i+ tm["hour"]++ Err bitreich.org 70 i+ sec -= 3600 Err bitreich.org 70 i+ } Err bitreich.org 70 i+ Err bitreich.org 70 i+ tm["min"] = 0 Err bitreich.org 70 i+ while (sec >= 60) { Err bitreich.org 70 i+ tm["min"]++ Err bitreich.org 70 i+ sec -= 60 Err bitreich.org 70 i+ } Err bitreich.org 70 i+ Err bitreich.org 70 i+ tm["sec"] = sec Err bitreich.org 70 i+} Err bitreich.org 70 i+ Err bitreich.org 70 i+function print_fold(prefix, s, n) Err bitreich.org 70 i+{ Err bitreich.org 70 i+ while (s != "") { Err bitreich.org 70 i+ line = substr(s, 1, n) Err bitreich.org 70 i+ if (length(s) > n) sub(" +[^ \t\r\n]*$", "", line) Err bitreich.org 70 i+ print prefix line Err bitreich.org 70 i+ s = substr(s, length(line) + 2) Err bitreich.org 70 i+ } Err bitreich.org 70 i+} Err bitreich.org 70 i+ Err bitreich.org 70 i+BEGIN { Err bitreich.org 70 i+ cmd = "date +%z" Err bitreich.org 70 i+ cmd | getline zone Err bitreich.org 70 i+ close(cmd) Err bitreich.org 70 i+ Err bitreich.org 70 i+ hour = substr(zone, 2, 2) Err bitreich.org 70 i+ min = substr(zone, 4, 2) Err bitreich.org 70 i+ Err bitreich.org 70 i+ offset = (substr(zone, 1, 1) "1") * (hour * 3600 + min * 60) Err bitreich.org 70 i+ print "TZ" zone Err bitreich.org 70 i+} Err bitreich.org 70 i+ Err bitreich.org 70 i+{ Err bitreich.org 70 i+ split($0, a, "\t") Err bitreich.org 70 i+ gmtime(a[1] + offset, beg) Err bitreich.org 70 i+ gmtime(a[2] + offset, end) Err bitreich.org 70 i+ cat = a[3]; loc = a[4]; sum = a[5]; des = a[6] Err bitreich.org 70 i+ Err bitreich.org 70 i+ print "" Err bitreich.org 70 i+ printf "%04d-%02d-%02d %02d:%02d ", Err bitreich.org 70 i+ beg["year"], beg["mon"], beg["mday"], beg["hour"], beg["min"] Err bitreich.org 70 i+ print sum Err bitreich.org 70 i+ Err bitreich.org 70 i+ printf "%04d-%02d-%02d %02d:%02d ", Err bitreich.org 70 i+ end["year"], end["mon"], end["mday"], end["hour"], end["min"] Err bitreich.org 70 i+ print "[" cat "] " loc Err bitreich.org 70 i+ Err bitreich.org 70 i+ sub("^ *", "", des) Err bitreich.org 70 i+ sub(" *$", "", des) Err bitreich.org 70 i+ if (des) Err bitreich.org 70 i+ print_fold(" ", des, 80) Err bitreich.org 70 i+} Err bitreich.org 70 i+ Err bitreich.org 70 i+END { Err bitreich.org 70 i+ print "" 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@@ -1,4 +1,4 @@ Err bitreich.org 70 i-.Dd $Mdocdate: May 21 2018$ Err bitreich.org 70 i+.Dd $Mdocdate: Mar 1 2020$ Err bitreich.org 70 i .Dt ICS2TXT 1 Err bitreich.org 70 i .Os Err bitreich.org 70 i . Err bitreich.org 70 i@@ -6,32 +6,54 @@ 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 a simple plain text format Err bitreich.org 70 i+.Nd convert ics file to simpler tsv or txt formats 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 Ar ics-file... Err bitreich.org 70 i-. Err bitreich.org 70 i+.Nm ics2txt-tsv Ar file.tsv Err bitreich.org 70 i+.Nm ics2txt-txt Ar file.txt Err bitreich.org 70 i+.Nm ics2txt-ics Ar file.ics Err bitreich.org 70 i+.Nm ics2txt-back Ar 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-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+convert iCalendar Err bitreich.org 70 i+.Pq ical Err bitreich.org 70 i+.Ar file.ics Err bitreich.org 70 i+or stdin if not specified to a tab separated value format, with one Err bitreich.org 70 i+line per entry, and one column per field: Err bitreich.org 70 i+. Err bitreich.org 70 i+.Bl -offset 1n -width 1n -enum -compact Err bitreich.org 70 i+. Err bitreich.org 70 i+.It Err bitreich.org 70 i+Begining (epoch) Err bitreich.org 70 i . Err bitreich.org 70 i+.It Err bitreich.org 70 i+End (epoch) Err bitreich.org 70 i . Err bitreich.org 70 i-.Sh ENVIRONMENT Err bitreich.org 70 i+.It Err bitreich.org 70 i+Category Err bitreich.org 70 i . Err bitreich.org 70 i-.Bl -tag -width 6n Err bitreich.org 70 i+.It Err bitreich.org 70 i+Location 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+.It Err bitreich.org 70 i+Summary Err bitreich.org 70 i+. Err bitreich.org 70 i+.It 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+.Pp Err bitreich.org 70 i+The Err bitreich.org 70 i+.Sq \en Err bitreich.org 70 i+and Err bitreich.org 70 i+.Sq \et Err bitreich.org 70 i+charaters may represent newlines and tabs. 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@@ -39,6 +61,7 @@ Timezone to use for printing the dates. 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 STANDARDS Err bitreich.org 70 i . Err bitreich.org 70 i .Rs Err bitreich.org 70 i@@ -51,4 +74,4 @@ Timezone to use for printing the dates. 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 i+.An Josuah Demangeon Aq Mt me@josuah.net Err bitreich.org 70 .