summaryrefslogtreecommitdiff
path: root/.config/aerc/filters/calendar
diff options
context:
space:
mode:
authorMichael Hunteman <michael@huntm.net>2023-08-31 18:56:05 -0500
committerMichael Hunteman <michael@huntm.net>2023-08-31 18:56:22 -0500
commitbc79a9f65ba9f9fdb308b4a8eb75d0ca4e692463 (patch)
treeb73f2c388c73ef5f3f5c62ed48f4748744b6de11 /.config/aerc/filters/calendar
parenta35c727df4d1c3bfbb9b8b7908ed202319e4d62a (diff)
Add aerc filters
Diffstat (limited to '.config/aerc/filters/calendar')
-rwxr-xr-x.config/aerc/filters/calendar270
1 files changed, 270 insertions, 0 deletions
diff --git a/.config/aerc/filters/calendar b/.config/aerc/filters/calendar
new file mode 100755
index 0000000..2808e13
--- /dev/null
+++ b/.config/aerc/filters/calendar
@@ -0,0 +1,270 @@
+#!/usr/bin/awk -f
+# ex: ft=awk
+#
+# awk filter for aerc to parse text/calendar mime-types
+#
+# Based on the ical2org.awk script by Eric S Fraga and updated by Guide Van
+# Hoecke. Adapted to aerc by Koni Marti <koni.marti@gmail.com>
+#
+
+BEGIN {
+ UIDS[0];
+ people_attending[0];
+ people_partstat[0];
+ people_rsvp[0];
+
+ # use a colon to separate the type of data line from the actual contents
+ FS = ":";
+}
+
+{
+ # remove carriage return from every line
+ gsub(/\r/, "")
+}
+
+/^[ ]/ {
+ # this block deals with the continuation lines that start with a whitespace
+ #
+ line = $0
+ # remove trailing whitespaces
+ gsub(/^[ ]/, "", line)
+
+ # assumes continuation lines start with a space
+ if (indescription) {
+ entry = entry line
+ } else if (insummary) {
+ summary = summary line
+ } else if (inattendee) {
+ attendee = attendee line
+ } else if (inorganizer) {
+ organizer = organizer line
+ } else if (inlocation) {
+ location = location unescape(line, 0)
+ }
+}
+
+/^BEGIN:VALARM/,/^END:VALARM/ {
+ next
+}
+
+/^BEGIN:VEVENT/ {
+ # start of an event: initialize global values used for each event
+ start_date = "";
+ end_date = "";
+ entry = ""
+ id = ""
+
+ indescription = 0;
+ insummary = 0
+ inattendee = 0
+ inorganizer = 0
+ inlocation = 0
+
+ location = ""
+ status = ""
+ summary = ""
+ attendee = ""
+ organizer = ""
+
+ rrend = ""
+ rcount = ""
+ intfreq = ""
+ idx = 0
+
+ delete people_attending;
+ delete people_partstat;
+ delete people_rsvp;
+}
+
+/^[A-Z]/ {
+ if (attendee != "" && inattendee==1)
+ add_attendee(attendee)
+
+ if (organizer != "" && inorganizer==1)
+ organizer = find_full_name(organizer)
+
+ indescription = 0;
+ insummary = 0;
+ inattendee = 0;
+ inorganizer = 0;
+ inlocation = 0;
+}
+
+/^DTSTART[:;]/ {
+ tz = get_value($0, "TZID=[^:;]*", "=")
+ start_date = datetimestring($2, tz);
+}
+
+/^DTEND[:;]/ {
+ tz = get_value($0, "TZID=[^:;]*", "=")
+ end_date = datetimestring($2, tz);
+}
+
+/^RRULE[:]/ {
+ freq = get_value($0, "FREQ=[^:;]*", "=")
+ interval = get_value($0, "INTERVAL=[^:;]*", "=")
+ rrend = get_value($0, "UNTIL=[^:;]*", "=")
+ rcount = get_value($0, "COUNT=[^:;]*", "=")
+ intfreq = tolower(freq)
+ if (interval != "")
+ intfreq = " +" interval intfreq
+}
+
+/^METHOD/ {
+ method = $2
+}
+
+/^UID/ {
+ line = prepare($0)
+ id = line
+}
+
+/^STATUS/ {
+ line = prepare($0)
+ status = line
+}
+
+/^DESCRIPTION/ {
+ line = prepare($0)
+ entry = entry line
+ indescription = 1;
+}
+
+/^SUMMARY/ {
+ line = prepare($0)
+ summary = line
+ insummary = 1;
+}
+
+/^ORGANIZER/ {
+ organizer = $0
+ inorganizer = 1;
+}
+
+/^LOCATION/ {
+ line = prepare($0)
+ location = unescape(line, 0);
+ inlocation = 1;
+}
+
+/^ATTENDEE/ {
+ attendee = $0
+ inattendee = 1;
+}
+
+/^END:VEVENT/ {
+ #output event
+ if (method != "") {
+ printf "\n This is a meeting %s\n\n", method
+ }
+ fmt = " %-14s%s\n"
+ is_duplicate = (id in UIDS);
+ if(is_duplicate == 0) {
+ printf fmt, "SUMMARY", unescape(summary, 0)
+ if(location != "")
+ printf fmt, "LOCATION", location
+ if(organizer != "")
+ printf fmt, "ORGANIZER", organizer
+ for (idx in people_attending) {
+ printf fmt, "ATTENDEE [" idx "]", people_attending[idx]
+ partstat = people_partstat[idx]
+ if (partstat != "") {
+ printf fmt, "", "STATUS\t" partstat
+ }
+ rsvp = people_rsvp[idx]
+ if (rsvp != "") {
+ printf fmt, "", "RSVP\t" rsvp
+ }
+ }
+ printf fmt, "START", start_date
+ printf fmt, "END", end_date
+ if (intfreq != "") {
+ printf "\n"fmt, "RECURRENCE", intfreq
+ if (rcount != "")
+ printf fmt, "COUNTS", rcount
+ if (rrend != "")
+ printf fmt, "END DATE", rrend
+
+ }
+ if(entry != "")
+ print "\n" unescape(entry, 1);
+ UIDS[id] = 1;
+ }
+}
+
+func prepare(line) {
+ gsub($1, "", line)
+ gsub(/^[: ]/, "", line)
+ return line
+}
+
+function unescape(input, preserve_newlines)
+{
+ ret = input
+ gsub(/\\,/, ",", ret)
+ gsub(/\\;/, ";", ret)
+ if (preserve_newlines)
+ gsub(/\\n/, "\n", ret)
+ else
+ gsub(/\\n/, " ", ret)
+ return ret
+}
+
+
+function datetimestring(input, tzInput)
+{
+ timestr = input
+ pos = index(timestr, "T")
+ if (pos < 0) {
+ return timestr
+ }
+
+ date = substr(timestr, 1, pos)
+ time = substr(timestr, pos+1, length(timestr))
+
+ year = substr(date, 1, 4)
+ month = substr(date, 5, 2)
+ day = substr(date, 7, 2)
+
+ hour = substr(time, 1, 2)
+ min = substr(time, 3, 2)
+ sec = substr(time, 5, 2)
+
+ return sprintf("%4d/%02d/%02d %02d:%02d:%02d %s", year, month, day, hour, min, sec, tzInput)
+}
+
+function add_attendee(attendee)
+{
+ CN = find_full_name(attendee)
+ if (CN != "") {
+ idx = idx + 1
+ people_attending[idx] = CN;
+ people_partstat[idx] = get_value(attendee, "PARTSTAT=[^;:]+", "=")
+ people_rsvp[idx] = get_value(attendee, "RSVP=[^;:]+", "=")
+ }
+}
+
+function find_full_name(line)
+{
+ name = get_value(line, "CN=[^;:]+", "=")
+ gsub(/"[^"]*"/,"",line)
+ email = get_value(line, "(mailto|MAILTO):[^;]+", ":")
+
+ if (name == "") {
+ return sprintf("<%s>", email)
+ } else {
+ return sprintf("%s <%s>", name, email)
+ }
+}
+
+function get_value(line, regexp, sep) {
+ value = ""
+ match(line, regexp)
+ {
+ z = split(substr(line,RSTART,RLENGTH),data,sep)
+ if (z > 1) {
+ value = data[2]
+ }
+ }
+ return value
+}