+++ /dev/null
-#!/usr/bin/python3
-
-import sys
-import os
-from icalendar import Calendar, Event
-from textwrap import fill, indent
-
-FIELDS = ('summary','location','organiser',
- 'flags','uid','rrule')
-COLSEP = ': '
-
-COLUMNS = int(os.getenv('COLUMNS', 80))-10
-WIDTH = max(len(i) for i in FIELDS)
-INDENT = WIDTH + len(COLSEP)
-
-def dtstrs(event):
- start, end = event.get('dtstart').dt, event.get('dtend')
- if not end:
- duration = event.get('duration').dt
- end = start + duration
- else:
- end = end.dt
-
- def strftime(dt, strf):
- return dt.astimezone().strftime(strf)
-
- ret = []
- if start.tzinfo == end.tzinfo:
- ret.append(strftime(start, '%F %R'))
-
- else:
- ret.append(strftime(start, '%F %R %Z'))
-
- if start.date() == end.date():
- ret.append(strftime(end, '%T %Z'))
-
- else:
- ret.append(strftime(end, '%F %R %Z'))
-
- return ret
-
-def parse_ics_file(fp):
- cal = Calendar.from_ical(fp.read())
-
- for event in cal.walk():
- if event.name != "VEVENT": continue
- print('{} → {}'.format(*dtstrs(event)))
- flags = []
- for k in ('status', 'class', 'transp', 'priority'):
- t = event.get(k)
- if t: flags.append((k, t))
- event['flags'] = ' '.join('{}:{}'.format(*f) for f in flags)
- for label in FIELDS:
- if label in event:
- text = fill(str(event[label]), width=COLUMNS-INDENT,
- initial_indent='', subsequent_indent=' '*INDENT)
- print(f'{label.capitalize():>{WIDTH}s}{COLSEP}{text}')
-
- if 'description' in event:
- output = ['']
- lines = event['description'].split('\n')
- for line in lines:
- output.append(fill(line, width=COLUMNS, initial_indent=' ',
- subsequent_indent=' '))
- print('\n'.join(output))
-
-if __name__ == '__main__':
-
- if len(sys.argv) > 1 and sys.argv[1] != '-':
- for f in sys.argv[1:]:
- with open(f) as fp:
- parse_ics_file(fp)
- else:
- parse_ics_file(sys.stdin)