;ò ' YCc@sOdZdkZdkZdklZdZydklZWndfd„ƒYZnXdfd„ƒYZd efd „ƒYZ d „Z d „Z d „Z d„Z d„Zd„Zd„Zd„Zd„Zdfd„ƒYZdfd„ƒYZdfd„ƒYZdfd„ƒYZdefd„ƒYZdefd„ƒYZdS( s\ SchoolTool calendaring stuff. $Id: parser.py,v 1.4 2005/01/25 01:03:38 dreamcatcher Exp $ N(sSeti(s Persistents PersistentcBstZRS(N(s__name__s __module__(((sT/mnt/gmirror/ports/www/zope-calendaring/work/Calendaring-0.3.0/Calendaring/parser.pys Persistent4ss DateRangecBs,tZd„Zd„Zd„Zd„ZRS(NcCs=||_||_||jotd||fƒ‚ndS(Ns$Last date %r less than first date %r(sfirstsselfslasts ValueError(sselfsfirstslast((sT/mnt/gmirror/ports/www/zope-calendaring/work/Calendaring-0.3.0/Calendaring/parser.pys__init__9s   ccs9|i}x)||ijo|V|tii7}q WdS(N(sselfsfirstsdateslastsdatetimes resolution(sselfsdate((sT/mnt/gmirror/ports/www/zope-calendaring/work/Calendaring-0.3.0/Calendaring/parser.pys__iter__As  cCs|i|iidSdS(Ni(sselfslastsfirstsdays(sself((sT/mnt/gmirror/ports/www/zope-calendaring/work/Calendaring-0.3.0/Calendaring/parser.pys__len__GscCs%|i|jo |ijnSdS(N(sselfsfirstsdateslast(sselfsdate((sT/mnt/gmirror/ports/www/zope-calendaring/work/Calendaring-0.3.0/Calendaring/parser.pys __contains__Js(s__name__s __module__s__init__s__iter__s__len__s __contains__(((sT/mnt/gmirror/ports/www/zope-calendaring/work/Calendaring-0.3.0/Calendaring/parser.pys DateRange7s   sICalParseErrorcBstZdZRS(s$Invalid syntax in an iCalendar file.(s__name__s __module__s__doc__(((sT/mnt/gmirror/ports/www/zope-calendaring/work/Calendaring-0.3.0/Calendaring/parser.pysICalParseErrorSs cCsÏd|jo|Sng}d}x‰to|id|ƒ}|djoPn|i|||!ƒ||ddjo|idƒn|i||dƒ|d}q$W|i||ƒdi|ƒSd S( sÅParse iCalendar TEXT value. >>> parse_text('Foo') 'Foo' >>> parse_text('\\\\') '\\' >>> parse_text('\\;') ';' >>> parse_text('\\,') ',' >>> parse_text('\\n') '\n' >>> parse_text('A string with\\; some\\\\ characters\\nin\\Nit') 'A string with; some\\ characters\nin\nit' >>> parse_text('Unterminated \\') Traceback (most recent call last): ... IndexError: string index out of range s\iiÿÿÿÿisnNs isN(svaluesoutsprevsTruesfindsidxsappendsjoin(svaluesprevsidxsout((sT/mnt/gmirror/ports/www/zope-calendaring/work/Calendaring-0.3.0/Calendaring/parser.pys parse_textWs"  cCsD|iddƒiddƒiddƒiddƒidd ƒSd S( s Format value according to iCalendar TEXT escaping rules. >>> ical_text('Foo') 'Foo' >>> ical_text('\\') '\\\\' >>> ical_text(';') '\\;' >>> ical_text(',') '\\,' >>> ical_text('\n') '\\n' >>> ical_text('\r\n') '\\n' s\s\\s;s\;s,s\,s s s\nN(svaluesreplace(svalue((sT/mnt/gmirror/ports/www/zope-calendaring/work/Calendaring-0.3.0/Calendaring/parser.pys ical_text}sc Csld}d}d||f}d}tid||fƒ}|i|ƒ} | t jot d|ƒ‚n| i ƒ\} } }}} }| otidt| ƒƒ}n¡|t jo$|t jo| t jo |t jot d|ƒ‚ntidt|pd ƒd t|pd ƒd t| pd ƒd t|pd ƒƒ}| d jo | }n|SdS(s‡Parse iCalendar DURATION value. Returns a timedelta instance. >>> parse_duration('+P11D') datetime.timedelta(11) >>> parse_duration('-P2W') datetime.timedelta(-14) >>> parse_duration('P1DT2H3M4S') datetime.timedelta(1, 7384) >>> parse_duration('P1DT2H3M') datetime.timedelta(1, 7380) >>> parse_duration('P1DT2H') datetime.timedelta(1, 7200) >>> parse_duration('PT2H') datetime.timedelta(0, 7200) >>> parse_duration('PT2H3M4S') datetime.timedelta(0, 7384) >>> parse_duration('PT3M4S') datetime.timedelta(0, 184) >>> parse_duration('PT22S') datetime.timedelta(0, 22) >>> parse_duration('') Traceback (most recent call last): ... ValueError: Invalid iCalendar duration: '' >>> parse_duration('xyzzy') Traceback (most recent call last): ... ValueError: Invalid iCalendar duration: 'xyzzy' >>> parse_duration('P') Traceback (most recent call last): ... ValueError: Invalid iCalendar duration: 'P' >>> parse_duration('P1WT2H') Traceback (most recent call last): ... ValueError: Invalid iCalendar duration: 'P1WT2H' s(\d+)Ds"T(?:(\d+)H)?(?:(\d+)M)?(?:(\d+)S)?s(?:%s)?(?:%s)?s(\d+)Ws([-+]?)P(?:%s|%s)$sInvalid iCalendar duration: %rsweekssdaysishourssminutesssecondss-N(s date_parts time_parts datetime_parts weeks_partsrescompiles duration_rxsmatchsvaluesNones ValueErrorsgroupsssignsweekssdaysshourssminutesssecondssdatetimes timedeltasint( svalues datetime_parts time_partssecondssdayss duration_rxs weeks_partshourss date_partsweeksssignsminutessmatch((sT/mnt/gmirror/ports/www/zope-calendaring/work/Calendaring-0.3.0/Calendaring/parser.pysparse_duration‘s*% 4  cCsd}|idjo d}nd}|ioŽd}|id}|idd}|id}|o|d|7}n|p |o|o|d|7}n|o|d |7}q¾n|idjo|od ||fSnd |t|iƒ|fSd S( s±Format a timedelta as an iCalendar DURATION value. >>> ical_duration(datetime.timedelta(11)) 'P11D' >>> ical_duration(datetime.timedelta(-14)) '-P14D' >>> ical_duration(datetime.timedelta(1, 7384)) 'P1DT2H3M4S' >>> ical_duration(datetime.timedelta(1, 7380)) 'P1DT2H3M' >>> ical_duration(datetime.timedelta(1, 7200)) 'P1DT2H' >>> ical_duration(datetime.timedelta(0, 7200)) 'PT2H' >>> ical_duration(datetime.timedelta(0, 7384)) 'PT2H3M4S' >>> ical_duration(datetime.timedelta(0, 184)) 'PT3M4S' >>> ical_duration(datetime.timedelta(0, 22)) 'PT22S' >>> ical_duration(datetime.timedelta(0, 3622)) 'PT1H0M22S' sis-sTii<s%dHs%dMs%dSs%sP%ss%sP%dD%sN(ssignsvaluesdaysstimepartssecondsshourssminutessabs(svaluestimepartssignshoursssecondssminutes((sT/mnt/gmirror/ports/www/zope-calendaring/work/Calendaring-0.3.0/Calendaring/parser.pys ical_durationÑs&    cCs§t|ƒdjotd|ƒ‚nyCt|dd!ƒt|dd!ƒt|dd!ƒf\}}}Wn#tj otd|ƒ‚nXti|||ƒSdS(sÿParse iCalendar DATE value. Returns a date instance. >>> parse_date('20030405') datetime.date(2003, 4, 5) >>> parse_date('20030405T060708') Traceback (most recent call last): ... ValueError: Invalid iCalendar date: '20030405T060708' >>> parse_date('') Traceback (most recent call last): ... ValueError: Invalid iCalendar date: '' >>> parse_date('yyyymmdd') Traceback (most recent call last): ... ValueError: Invalid iCalendar date: 'yyyymmdd' isInvalid iCalendar date: %riiiN( slensvalues ValueErrorsintsysmsdsdatetimesdate(svaluesdsmsy((sT/mnt/gmirror/ports/www/zope-calendaring/work/Calendaring-0.3.0/Calendaring/parser.pys parse_dateþsCc Cs¤tidƒ}|i|ƒ} | tjotd|ƒ‚n| iƒ\}}}}}}}tit|ƒt|ƒt|ƒt|ƒt|ƒt|ƒƒSdS(s Parse iCalendar DATE-TIME value. Returns a datetime instance. >>> parse_date_time('20030405T060708') datetime.datetime(2003, 4, 5, 6, 7, 8) >>> parse_date_time('20030405T060708Z') datetime.datetime(2003, 4, 5, 6, 7, 8) >>> parse_date_time('20030405T060708A') Traceback (most recent call last): ... ValueError: Invalid iCalendar date-time: '20030405T060708A' >>> parse_date_time('') Traceback (most recent call last): ... ValueError: Invalid iCalendar date-time: '' s0(\d{4})(\d{2})(\d{2})T(\d{2})(\d{2})(\d{2})(Z?)$sInvalid iCalendar date-time: %rN(srescompiles datetime_rxsmatchsvaluesNones ValueErrorsgroupssysmsdshhsmmssssutcsdatetimesint( svaluesutcsdsmmsmshhs datetime_rxsyssssmatch((sT/mnt/gmirror/ports/www/zope-calendaring/work/Calendaring-0.3.0/Calendaring/parser.pysparse_date_times !!cCs»|idƒ}t|ƒdjotd|ƒ‚nyNt|dƒ}yt|dƒ}Wn#tj ot|dƒ}nXWn#tj otd|ƒ‚nXt ||ƒSdS(sšParse iCalendar PERIOD value. Returns a Period instance. >>> p = parse_period('20030405T060708/20030405T060709') >>> print repr(p).replace('),', '),\n ') Period(datetime.datetime(2003, 4, 5, 6, 7, 8), datetime.datetime(2003, 4, 5, 6, 7, 9)) >>> parse_period('20030405T060708/PT1H1M1S') Period(datetime.datetime(2003, 4, 5, 6, 7, 8), datetime.timedelta(0, 3661)) >>> parse_period('xyzzy') Traceback (most recent call last): ... ValueError: Invalid iCalendar period: 'xyzzy' >>> parse_period('foo/foe') Traceback (most recent call last): ... ValueError: Invalid iCalendar period: 'foo/foe' s/isInvalid iCalendar period: %riiN( svaluessplitspartsslens ValueErrorsparse_date_timesstartsend_or_durationsparse_durationsPeriod(svaluesend_or_durationsstartsparts((sT/mnt/gmirror/ports/www/zope-calendaring/work/Calendaring-0.3.0/Calendaring/parser.pys parse_period4scCsDg}x3|D]+\}}|it||idƒƒƒq W|SdS(s–Parse list of attendees. Return list of person instances. >>> attendees = [('mailto:sidnei@awkly.org', ... {'RSVP': 'FALSE', ... 'ROLE': 'REQ-PARTICIPANT', ... 'PARTSTAT': 'ACCEPTED', ... 'CN': 'Sidnei da Silva'}), ... ('mailto:paul@zope-europe.org', ... {'RSVP': 'FALSE', ... 'ROLE': 'REQ-PARTICIPANT', ... 'PARTSTAT': 'TENTATIVE', ... 'CN': 'Paul Everitt'})] >>> parse_attendee(attendees) [Person('sidnei@awkly.org', 'Sidnei da Silva'), Person('paul@zope-europe.org', 'Paul Everitt')] sCNN(sressvaluesksvsappendsPersonsget(svaluesressksv((sT/mnt/gmirror/ports/www/zope-calendaring/work/Calendaring-0.3.0/Calendaring/parser.pysparse_attendeeTs  #cCs/gi}|D]\}}||ƒq~SdS(söParse list of categories. Return list of category strings. >>> categories = [('testing', ... {}), ... ('another', ... {})] >>> parse_categories(categories) ['testing', 'another'] N(sappends_[1]svaluesksv(svalues_[1]sksv((sT/mnt/gmirror/ports/www/zope-calendaring/work/Calendaring-0.3.0/Calendaring/parser.pysparse_categoriesis sPersoncBs)tZdZd„Zd„Zd„ZRS(s A person cCsd|iƒ}d|j o d}ntt|idƒƒ}|o|dpd|_||_dS(Nsmailto:si(smailslowersfiltersNonessplitsselfsname(sselfsmailsname((sT/mnt/gmirror/ports/www/zope-calendaring/work/Calendaring-0.3.0/Calendaring/parser.pys__init__xs   cCsd|i|iffSdS(NsPerson%r(sselfsmailsname(sself((sT/mnt/gmirror/ports/www/zope-calendaring/work/Calendaring-0.3.0/Calendaring/parser.pys__repr__scCsNt|tƒ otd|ƒ‚nt|i|if|i|ifƒSdS(NsCannot compare Person with %r(s isinstancesothersPersonsNotImplementedErrorscmpsselfsmailsname(sselfsother((sT/mnt/gmirror/ports/www/zope-calendaring/work/Calendaring-0.3.0/Calendaring/parser.pys__cmp__„s(s__name__s __module__s__doc__s__init__s__repr__s__cmp__(((sT/mnt/gmirror/ports/www/zope-calendaring/work/Calendaring-0.3.0/Calendaring/parser.pysPersonus  sPeriodcBs2tZdZd„Zd„Zd„Zd„ZRS(sA period of timecCsˆ||_||_t|tiƒo ||_|i|i|_n||_|i|i|_|i|ijotdƒ‚ndS(Ns#Start time is greater than end time( sstartsselfsend_or_durations isinstancesdatetimes timedeltasdurationsends ValueError(sselfsstartsend_or_duration((sT/mnt/gmirror/ports/www/zope-calendaring/work/Calendaring-0.3.0/Calendaring/parser.pys__init__s    cCsd|i|ifSdS(NsPeriod(%r, %r)(sselfsstartsend_or_duration(sself((sT/mnt/gmirror/ports/www/zope-calendaring/work/Calendaring-0.3.0/Calendaring/parser.pys__repr__™scCsNt|tƒ otd|ƒ‚nt|i|if|i|ifƒSdS(NsCannot compare Period with %r(s isinstancesothersPeriodsNotImplementedErrorscmpsselfsstartsend(sselfsother((sT/mnt/gmirror/ports/www/zope-calendaring/work/Calendaring-0.3.0/Calendaring/parser.pys__cmp__œscCs[|i|ijo|i|ƒSn|i|ijo |ijnotSntSdS(N(sselfsstartsothersoverlapssendsTruesFalse(sselfsother((sT/mnt/gmirror/ports/www/zope-calendaring/work/Calendaring-0.3.0/Calendaring/parser.pysoverlaps¡s '(s__name__s __module__s__doc__s__init__s__repr__s__cmp__soverlaps(((sT/mnt/gmirror/ports/www/zope-calendaring/work/Calendaring-0.3.0/Calendaring/parser.pysPeriodŠs   sVEventcBsÐtZdZhdd<dd<dd<dd<dd<dd<dd <d d<d d <d d <dd <dd<dd<dd<dd<dd<dd<ddtZdZd„Zd„ZeeƒZd„Zd„ZRS(sœAn object which reads in an iCal. Short grammar of iCalendar files (RFC 2445 is the full spec): contentline = name *(";" param ) ":" value CRLF ; content line first must be unfolded by replacing CRLF followed by a ; single WSP with an empty string name = x-name / iana-token x-name = "X-" [vendorid "-"] 1*(ALPHA / DIGIT / "-") iana-token = 1*(ALPHA / DIGIT / "-") vendorid = 3*(ALPHA / DIGIT) param = param-name "=" param-value *("," param-value) param-name = iana-token / x-token param-value = paramtext / quoted-string paramtext = *SAFE-CHAR value = *VALUE-CHAR quoted-string = DQUOTE *QSAFE-CHAR DQUOTE NON-US-ASCII = %x80-F8 QSAFE-CHAR = WSP / %x21 / %x23-7E / NON-US-ASCII ; Any character except CTLs and DQUOTE SAFE-CHAR = WSP / %x21 / %x23-2B / %x2D-39 / %x3C-7E / NON-US-ASCII ; Any character except CTLs, DQUOTE, ";", ":", "," VALUE-CHAR = WSP / %x21-7E / NON-US-ASCII ; anything except CTLs CR = %x0D LF = %x0A CRLF = CR LF CTL = %x00-08 / %x0A-1F / %x7F ALPHA = %x41-5A / %x61-7A ; A-Z / a-z DIGIT = %x30-39 ; 0-9 DQUOTE = %x22 ; Quotation Mark WSP = SPACE / HTAB SPACE = %x20 HTAB = %x09 cCs ||_dS(N(sfilesself(sselfsfile((sT/mnt/gmirror/ports/www/zope-calendaring/work/Calendaring-0.3.0/Calendaring/parser.pys__init__îsc sÃtˆƒ}|i} ‡d†}yq| ƒ}d}x2|iƒp |djo||7}| ƒ}q6W| o|dƒn|i ƒ}h}xÔ|djoÆ| ƒ}d}x2|iƒp |djo||7}| ƒ}q²W| o|dƒn|i ƒ}|djo|dƒng}x t o| ƒ}|d jor| ƒ}d} x8|d jo|d d fjo| |7} | ƒ}qYW|d jo|d ƒn| ƒ}nWd} xA|d jo|d d dd dfjo| |7} | ƒ}qÂW| i ƒ} |i| ƒ|djoPq*q*Wt|ƒdjo|||>> ICalReader._parseRow('foo:bar') ('FOO', 'bar', {}) >>> ICalReader._parseRow('foo;value=bar:BAZFOO') ('FOO', 'BAZFOO', {'VALUE': 'BAR'}) cstd|ˆfƒ‚dS(Ns%s in line: %s(sICalParseErrorsmsgs record_str(smsg(s record_str(sT/mnt/gmirror/ports/www/zope-calendaring/work/Calendaring-0.3.0/Calendaring/parser.pyserr sss-sMissing property names;sMissing parameter names=s Expected '='s"s ss Expected '"'s:s,iis Expected ':'s Syntax errorN(siters record_strsitsnextsgetCharserrscskeysisalnumsuppersparamssparamspvaluessTruespvaluesappendslensjoinsvalues StopIteration( s record_strsvaluescspvaluesserrsitsparamssparamskeyspvaluesgetChar((s record_strsT/mnt/gmirror/ports/www/zope-calendaring/work/Calendaring-0.3.0/Calendaring/parser.pys _parseRowñsx                  )      ccs÷g}xÉ|iiƒD]¸}|iƒ oqn|ddjo|d}n(|o |idi|ƒƒVg}n|idƒo|i |d ƒq|idƒo|i |d ƒq|i |ƒqW|o|idi|ƒƒVnd S( sdA generator that returns one record at a time, as a tuple of (name, value, params). is iss iþÿÿÿs iÿÿÿÿN( srecordsselfsfiles readlinesslinesstrips _parseRowsjoinsendswithsappend(sselfsrecordsline((sT/mnt/gmirror/ports/www/zope-calendaring/work/Calendaring-0.3.0/Calendaring/parser.pys_iterRowMs$ ccså|iƒ}yH|iƒ\}}}|||fddhfjotdƒ‚nWntj o ‚nXdg}t }xK|D]C\}}}|djou|t j o|i ƒ|Vt }n| o |djotdƒ‚n|djo t ƒ}n|i|ƒqƒ|djoi|t j o |djo|i ƒ|Vt }n| p|d|jotdƒ‚n|iƒqƒ|t j o|i|||ƒqƒ| otdƒ‚qƒqƒW|otd ƒ‚nd S( s5Iterate over all VEVENT objects in an ICalendar file.sBEGINs VCALENDARsThis is not iCalendars Text outside VCALENDAR componentsVEVENTsENDiÿÿÿÿsMismatched BEGIN/ENDsUnterminated componentsN(sselfs_iterRowsiteratorsnextskeysvaluesparamssICalParseErrors StopIterationscomponent_stacksNonesobjsvalidatesVEventsappendspopsadd(sselfsobjsiteratorscomponent_stacksvaluesparamsskey((sT/mnt/gmirror/ports/www/zope-calendaring/work/Calendaring-0.3.0/Calendaring/parser.pys iterEventsesH            (s__name__s __module__s__doc__s__init__s _parseRows staticmethods_iterRows iterEvents(((sT/mnt/gmirror/ports/www/zope-calendaring/work/Calendaring-0.3.0/Calendaring/parser.pys ICalReaderÈs $  Z  s CalendarEventcBs2tZeed„Zd„Zd„Zd„ZRS(NcCs1||_||_||_||_||_dS(N(sdtsselfsdtstartsdurationstitlesownerscontext(sselfsdtsdurationstitlesownerscontext((sT/mnt/gmirror/ports/www/zope-calendaring/work/Calendaring-0.3.0/Calendaring/parser.pys__init__™s     cCsŠt|tƒ otd|ƒ‚nt|i|i|it |i ƒt |i ƒf|i|i|it |i ƒt |i ƒfƒSdS(Ns$Cannot compare CalendarEvent with %r( s isinstancesothers CalendarEventsNotImplementedErrorscmpsselfsdtstartstitlesdurationshashsownerscontext(sselfsother((sT/mnt/gmirror/ports/www/zope-calendaring/work/Calendaring-0.3.0/Calendaring/parser.pys__cmp__¡s0cCs,t|i|i|i|i|ifƒSdS(N(shashsselfsdtstartstitlesdurationsownerscontext(sself((sT/mnt/gmirror/ports/www/zope-calendaring/work/Calendaring-0.3.0/Calendaring/parser.pys__hash__ªscCs-d|i|i|i|i|iffSdS(NsCalendarEvent%r(sselfsdtstartsdurationstitlesownerscontext(sself((sT/mnt/gmirror/ports/www/zope-calendaring/work/Calendaring-0.3.0/Calendaring/parser.pys__repr__®s(s__name__s __module__sNones__init__s__cmp__s__hash__s__repr__(((sT/mnt/gmirror/ports/www/zope-calendaring/work/Calendaring-0.3.0/Calendaring/parser.pys CalendarEvent—s sCalendarcBsPtZd„Zd„Zd„Zd„Zd„Zd„Zd„Zd„Z RS( NcCs"tƒ|_t|_t|_dS(N(sSetsselfs_eventssNones__name__s __parent__(sself((sT/mnt/gmirror/ports/www/zope-calendaring/work/Calendaring-0.3.0/Calendaring/parser.pys__init__µs  cCst|iƒSdS(N(sitersselfs_events(sself((sT/mnt/gmirror/ports/www/zope-calendaring/work/Calendaring-0.3.0/Calendaring/parser.pys__iter__ºscCst|iƒ|SdS(N(slistsselfs_eventssidx(sselfsidx((sT/mnt/gmirror/ports/www/zope-calendaring/work/Calendaring-0.3.0/Calendaring/parser.pys __getitem__¾scCsrtƒ}x^|D]V}|iiƒ}|i|iiƒ}||jo ||jo|i |ƒqqW|SdS(N( sCalendarscalsselfseventsdtstartsdates event_startsdurations event_endsaddEvent(sselfsdates event_ends event_startscalsevent((sT/mnt/gmirror/ports/www/zope-calendaring/work/Calendaring-0.3.0/Calendaring/parser.pysbyDateÁs cCs |ii|ƒ|i|_dS(N(sselfs_eventssaddsevent(sselfsevent((sT/mnt/gmirror/ports/www/zope-calendaring/work/Calendaring-0.3.0/Calendaring/parser.pysaddEventÊscCs |ii|ƒ|i|_dS(N(sselfs_eventssremovesevent(sselfsevent((sT/mnt/gmirror/ports/www/zope-calendaring/work/Calendaring-0.3.0/Calendaring/parser.pys removeEventÎscCs1x|D]}|ii|ƒqW|i|_dS(N(scalendarseventsselfs_eventssadd(sselfscalendarsevent((sT/mnt/gmirror/ports/www/zope-calendaring/work/Calendaring-0.3.0/Calendaring/parser.pysupdateÒscCs|iiƒ|i|_dS(N(sselfs_eventssclear(sself((sT/mnt/gmirror/ports/www/zope-calendaring/work/Calendaring-0.3.0/Calendaring/parser.pysclear×s ( s__name__s __module__s__init__s__iter__s __getitem__sbyDatesaddEvents removeEventsupdatesclear(((sT/mnt/gmirror/ports/www/zope-calendaring/work/Calendaring-0.3.0/Calendaring/parser.pysCalendar³s      (s__doc__sresdatetimessetssSets Persistents Persistences DateRanges ExceptionsICalParseErrors parse_texts ical_textsparse_durations ical_durations parse_datesparse_date_times parse_periodsparse_attendeesparse_categoriessPersonsPeriodsVEvents ICalReaders CalendarEventsCalendar(s ICalReaders DateRangesdatetimes CalendarEventsICalParseErrors parse_textsVEventsres ical_textsparse_durationsparse_date_times ical_durations PersistentsPersonsparse_categoriessSetsparse_attendees parse_periodsPeriods parse_datesCalendar((sT/mnt/gmirror/ports/www/zope-calendaring/work/Calendaring-0.3.0/Calendaring/parser.pys?*s4    &  @ -    ÿ Ï