All patches and comments are welcome. Please squash your changes to logical
commits before using git-format-patch and git-send-email to
patches@git.madduck.net.
If you'd read over the Git project's submission guidelines and adhered to them,
I'd be especially grateful.
   5 from icalendar import Calendar, Event
 
   6 from textwrap import fill, indent
 
   8 FIELDS = ('summary','location','organiser',
 
  12 COLUMNS = int(os.getenv('COLUMNS', 80))-10
 
  13 WIDTH = max(len(i) for i in FIELDS)
 
  14 INDENT = WIDTH + len(COLSEP)
 
  17     start, end = event.get('dtstart').dt, event.get('dtend')
 
  19         duration = event.get('duration').dt
 
  20         end = start + duration
 
  24     def strftime(dt, strf):
 
  25         return dt.astimezone().strftime(strf)
 
  28     if start.tzinfo == end.tzinfo:
 
  29         ret.append(strftime(start, '%F %R'))
 
  32         ret.append(strftime(start, '%F %R %Z'))
 
  34     if start.date() == end.date():
 
  35         ret.append(strftime(end, '%T %Z'))
 
  38         ret.append(strftime(end, '%F %R %Z'))
 
  42 def parse_ics_file(fp):
 
  43     cal = Calendar.from_ical(fp.read())
 
  45     for event in cal.walk():
 
  46         if event.name != "VEVENT": continue
 
  47         print('{} → {}'.format(*dtstrs(event)))
 
  49         for k in ('status', 'class', 'transp', 'priority'):
 
  51             if t: flags.append((k, t))
 
  52         event['flags'] = ' '.join('{}:{}'.format(*f) for f in flags)
 
  55                 text = fill(str(event[label]), width=COLUMNS-INDENT,
 
  56                             initial_indent='', subsequent_indent=' '*INDENT)
 
  57                 print(f'{label.capitalize():>{WIDTH}s}{COLSEP}{text}')
 
  59         if 'description' in event:
 
  61             lines = event['description'].split('\n')
 
  63                 output.append(fill(line, width=COLUMNS, initial_indent=' ',
 
  64                                    subsequent_indent=' '))
 
  65             print('\n'.join(output))
 
  67 if __name__ == '__main__':
 
  69     if len(sys.argv) > 1 and sys.argv[1] != '-':
 
  70         for f in sys.argv[1:]:
 
  74         parse_ics_file(sys.stdin)