mozillaCalendarParser.py 2.6 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081
  1. from pyparsing import Optional, oneOf, Literal, Word, printables, Group, OneOrMore, ZeroOrMore
  2. """
  3. A simple parser for calendar (*.ics) files,
  4. as exported by the Mozilla calendar.
  5. Any suggestions and comments welcome.
  6. Version: 0.1
  7. Copyright: Petri Savolainen <firstname.lastname@iki.fi>
  8. License: Free for any use
  9. """
  10. # TERMINALS
  11. BEGIN = Literal("BEGIN:").suppress()
  12. END = Literal("END:").suppress()
  13. valstr = printables + "\xe4\xf6\xe5\xd6\xc4\xc5 "
  14. EQ = Literal("=").suppress()
  15. SEMI = Literal(";").suppress()
  16. COLON = Literal(":").suppress()
  17. EVENT = Literal("VEVENT").suppress()
  18. CALENDAR = Literal("VCALENDAR").suppress()
  19. ALARM = Literal("VALARM").suppress()
  20. # TOKENS
  21. CALPROP = oneOf("VERSION PRODID METHOD")
  22. ALMPROP = oneOf("TRIGGER")
  23. EVTPROP = oneOf("X-MOZILLA-RECUR-DEFAULT-INTERVAL \
  24. X-MOZILLA-RECUR-DEFAULT-UNITS \
  25. UID DTSTAMP LAST-MODIFIED X RRULE EXDATE")
  26. propval = Word(valstr)
  27. typeval = Word(valstr)
  28. typename = oneOf("VALUE MEMBER FREQ UNTIL INTERVAL")
  29. proptype = Group(SEMI + typename + EQ + typeval).suppress()
  30. calprop = Group(CALPROP + ZeroOrMore(proptype) + COLON + propval)
  31. almprop = Group(ALMPROP + ZeroOrMore(proptype) + COLON + propval)
  32. evtprop = Group(EVTPROP + ZeroOrMore(proptype) + COLON + propval).suppress() \
  33. | "CATEGORIES" + COLON + propval.setResultsName("categories") \
  34. | "CLASS" + COLON + propval.setResultsName("class") \
  35. | "DESCRIPTION" + COLON + propval.setResultsName("description") \
  36. | "DTSTART" + proptype + COLON + propval.setResultsName("begin") \
  37. | "DTEND" + proptype + COLON + propval.setResultsName("end") \
  38. | "LOCATION" + COLON + propval.setResultsName("location") \
  39. | "PRIORITY" + COLON + propval.setResultsName("priority") \
  40. | "STATUS" + COLON + propval.setResultsName("status") \
  41. | "SUMMARY" + COLON + propval.setResultsName("summary") \
  42. | "URL" + COLON + propval.setResultsName("url") \
  43. calprops = Group(OneOrMore(calprop)).suppress()
  44. evtprops = Group(OneOrMore(evtprop))
  45. almprops = Group(OneOrMore(almprop)).suppress()
  46. alarm = BEGIN + ALARM + almprops + END + ALARM
  47. event = BEGIN + EVENT + evtprops + Optional(alarm) + END + EVENT
  48. events = Group(OneOrMore(event))
  49. calendar = BEGIN + CALENDAR + calprops + ZeroOrMore(event) + END + CALENDAR
  50. calendars = OneOrMore(calendar)
  51. # PARSE ACTIONS
  52. def gotEvent(s,loc,toks):
  53. for event in toks:
  54. print(event.dump())
  55. event.setParseAction(gotEvent)
  56. # MAIN PROGRAM
  57. if __name__=="__main__":
  58. calendars.parseFile("mozilla.ics")