diff options
author | Paul McGuire <ptmcg@users.noreply.github.com> | 2018-01-06 23:38:53 -0600 |
---|---|---|
committer | GitHub <noreply@github.com> | 2018-01-06 23:38:53 -0600 |
commit | 430c5ad767cc946e9da7cd5f4673a4e3bd135a3c (patch) | |
tree | 5a7df11e0fd52ab320b0ef3e670e260f315ca9ae /examples/mozillaCalendarParser.py | |
parent | f1d12567a8da4d254e6d62bb0d650c87c7d0bb89 (diff) | |
parent | d953150a6db3ac247a64b047edc2df7156f3e56b (diff) | |
download | pyparsing-git-430c5ad767cc946e9da7cd5f4673a4e3bd135a3c.tar.gz |
Merge pull request #1 from cngkaygusuz/master
Add Scrutinizer-CI configuration and other niceties
Diffstat (limited to 'examples/mozillaCalendarParser.py')
-rw-r--r-- | examples/mozillaCalendarParser.py | 81 |
1 files changed, 81 insertions, 0 deletions
diff --git a/examples/mozillaCalendarParser.py b/examples/mozillaCalendarParser.py new file mode 100644 index 0000000..210f284 --- /dev/null +++ b/examples/mozillaCalendarParser.py @@ -0,0 +1,81 @@ +from pyparsing import Optional, oneOf, Dict, Literal, Word, printables, Group, OneOrMore, ZeroOrMore + +""" +A simple parser for calendar (*.ics) files, +as exported by the Mozilla calendar. + +Any suggestions and comments welcome. + +Version: 0.1 +Copyright: Petri Savolainen <firstname.lastname@iki.fi> +License: Free for any use +""" + + +# TERMINALS + +BEGIN = Literal("BEGIN:").suppress() +END = Literal("END:").suppress() +valstr = printables + "\xe4\xf6\xe5\xd6\xc4\xc5 " + +EQ = Literal("=").suppress() +SEMI = Literal(";").suppress() +COLON = Literal(":").suppress() + +EVENT = Literal("VEVENT").suppress() +CALENDAR = Literal("VCALENDAR").suppress() +ALARM = Literal("VALARM").suppress() + +# TOKENS + +CALPROP = oneOf("VERSION PRODID METHOD") +ALMPROP = oneOf("TRIGGER") +EVTPROP = oneOf("X-MOZILLA-RECUR-DEFAULT-INTERVAL \ + X-MOZILLA-RECUR-DEFAULT-UNITS \ + UID DTSTAMP LAST-MODIFIED X RRULE EXDATE") + +propval = Word(valstr) +typeval = Word(valstr) +typename = oneOf("VALUE MEMBER FREQ UNTIL INTERVAL") + +proptype = Group(SEMI + typename + EQ + typeval).suppress() + +calprop = Group(CALPROP + ZeroOrMore(proptype) + COLON + propval) +almprop = Group(ALMPROP + ZeroOrMore(proptype) + COLON + propval) +evtprop = Group(EVTPROP + ZeroOrMore(proptype) + COLON + propval).suppress() \ + | "CATEGORIES" + COLON + propval.setResultsName("categories") \ + | "CLASS" + COLON + propval.setResultsName("class") \ + | "DESCRIPTION" + COLON + propval.setResultsName("description") \ + | "DTSTART" + proptype + COLON + propval.setResultsName("begin") \ + | "DTEND" + proptype + COLON + propval.setResultsName("end") \ + | "LOCATION" + COLON + propval.setResultsName("location") \ + | "PRIORITY" + COLON + propval.setResultsName("priority") \ + | "STATUS" + COLON + propval.setResultsName("status") \ + | "SUMMARY" + COLON + propval.setResultsName("summary") \ + | "URL" + COLON + propval.setResultsName("url") \ + +calprops = Group(OneOrMore(calprop)).suppress() +evtprops = Group(OneOrMore(evtprop)) +almprops = Group(OneOrMore(almprop)).suppress() + +alarm = BEGIN + ALARM + almprops + END + ALARM +event = BEGIN + EVENT + evtprops + Optional(alarm) + END + EVENT +events = Group(OneOrMore(event)) +calendar = BEGIN + CALENDAR + calprops + ZeroOrMore(event) + END + CALENDAR +calendars = OneOrMore(calendar) + + +# PARSE ACTIONS + +def gotEvent(s,loc,toks): + for event in toks: + print(event.dump()) + +event.setParseAction(gotEvent) + + +# MAIN PROGRAM + +if __name__=="__main__": + + calendars.parseFile("mozilla.ics") |