# HG changeset patch # User Paul Boddie # Date 1342380517 -7200 # Node ID 166cffe7156305c24072cb105a328f3e817189f9 # Parent fb12a408f28b6fde88a1be69a652a482ff1dbc5b Removed merging of event details and metadata, renaming the setEventTimestamps function to getLatestEventTimestamp. Parameterised the formatting methods to permit the writing of content to other destinations than the request's writing stream. Changed the parser's formatting method signatures, adding write parameters and renaming formatText to formatForOutputType, since the text to be formatted is supplied when instantiating the parser. Renamed the parseEvents function's page parameter to event_page, making it more obvious that an EventPage is required. Added HTML output support to the formatEventForOutputType function. diff -r fb12a408f28b -r 166cffe71563 EventAggregatorSupport.py --- a/EventAggregatorSupport.py Wed Jul 11 00:46:55 2012 +0200 +++ b/EventAggregatorSupport.py Sun Jul 15 21:28:37 2012 +0200 @@ -325,15 +325,15 @@ # Event parsing from page texts. -def parseEvents(text, page): +def parseEvents(text, event_page): """ Parse events in the given 'text', returning a list of event objects for the - given 'page'. + given 'event_page'. """ details = {} - events = [Event(page, details)] + events = [Event(event_page, details)] for match in definition_list_regexp.finditer(text): @@ -384,7 +384,7 @@ # Make a new event. details = {} - events.append(Event(page, details)) + events.append(Event(event_page, details)) details[term] = desc @@ -1180,26 +1180,19 @@ return earliest, latest -def setEventTimestamps(request, events): +def getLatestEventTimestamp(events): """ - Using 'request', set timestamp details in the details dictionary of each of - the 'events'. - - Return the latest timestamp found. + Return the latest timestamp found from the given 'events'. """ latest = None for event in events: - event_details = event.getDetails() - - # Populate the details with event metadata. - - event_details.update(event.getMetadata()) - - if latest is None or latest < event_details["last-modified"]: - latest = event_details["last-modified"] + metadata = event.getMetadata() + + if latest is None or latest < metadata["last-modified"]: + latest = metadata["last-modified"] return latest @@ -3413,12 +3406,15 @@ # Event-only formatting. -def formatEvent(event, request, fmt): - - "Format the given 'event' using the 'request' and formatter 'fmt'." +def formatEvent(event, request, fmt, write=None): + + """ + Format the given 'event' using the 'request' and formatter 'fmt'. If the + 'write' parameter is specified, use it to write output. + """ event_details = event.getDetails() - write = request.write + write = write or request.write write(fmt.definition_list(on=1)) @@ -3437,7 +3433,7 @@ write(fmt.definition_list(on=0)) -def formatEventsForOutputType(events, request, mimetype, parent=None, descriptions=None, latest_timestamp=None): +def formatEventsForOutputType(events, request, mimetype, parent=None, descriptions=None, latest_timestamp=None, write=None): """ Format the given 'events' using the 'request' for the given 'mimetype'. @@ -3451,9 +3447,11 @@ The optional 'latest_timestamp' indicates the timestamp of the latest edit of the page or event collection. + + If the 'write' parameter is specified, use it to write output. """ - write = request.write + write = write or request.write # Start the collection. @@ -3498,7 +3496,7 @@ write('\r\n') write('\r\n') -def formatEventForOutputType(event, request, mimetype, parent=None, descriptions=None): +def formatEventForOutputType(event, request, mimetype, parent=None, descriptions=None, write=None): """ Format the given 'event' using the 'request' for the given 'mimetype'. @@ -3509,10 +3507,13 @@ The optional 'descriptions' indicates the nature of any description given for events in the output resource. + + If the 'write' parameter is specified, use it to write output. """ - write = request.write + write = write or request.write event_details = event.getDetails() + event_metadata = event.getMetadata() if mimetype == "text/calendar": @@ -3529,9 +3530,9 @@ write("BEGIN:VEVENT\r\n") write("UID:%s\r\n" % link) write("URL:%s\r\n" % link) - write("DTSTAMP:%04d%02d%02dT%02d%02d%02dZ\r\n" % event_details["created"].as_tuple()[:6]) - write("LAST-MODIFIED:%04d%02d%02dT%02d%02d%02dZ\r\n" % event_details["last-modified"].as_tuple()[:6]) - write("SEQUENCE:%d\r\n" % event_details["sequence"]) + write("DTSTAMP:%04d%02d%02dT%02d%02d%02dZ\r\n" % event_metadata["created"].as_tuple()[:6]) + write("LAST-MODIFIED:%04d%02d%02dT%02d%02d%02dZ\r\n" % event_metadata["last-modified"].as_tuple()[:6]) + write("SEQUENCE:%d\r\n" % event_metadata["sequence"]) start = event_details["start"] end = event_details["end"] @@ -3588,7 +3589,7 @@ if descriptions == "page": description = event_details.get("description", "") else: - description = event_details["last-comment"] + description = event_metadata["last-comment"] write('%s\r\n' % fmt.text(event_page.formatText(description, fmt))) @@ -3597,10 +3598,15 @@ write('%s\r\n' % fmt.text(event_page.formatText(topic, fmt))) - write('%s\r\n' % event_details["created"].as_HTTP_datetime_string()) - write('%s#%s\r\n' % (link, event_details["sequence"])) + write('%s\r\n' % event_metadata["created"].as_HTTP_datetime_string()) + write('%s#%s\r\n' % (link, event_metadata["sequence"])) write('\r\n') + elif mimetype == "text/html": + fmt = request.html_formatter + fmt.setPage(request.page) + formatEvent(event, request, fmt, write=write) + # iCalendar format helper functions. def write_calendar_datetime(request, datetime): diff -r fb12a408f28b -r 166cffe71563 actions/EventAggregatorSummary.py --- a/actions/EventAggregatorSummary.py Wed Jul 11 00:46:55 2012 +0200 +++ b/actions/EventAggregatorSummary.py Sun Jul 15 21:28:37 2012 +0200 @@ -288,7 +288,7 @@ events = getEventsFromResources(getEventPages(pages)) events += getEventsFromResources(getEventResources(remote_sources, calendar_start, calendar_end, request)) all_shown_events = getEventsInPeriod(events, getCalendarPeriod(calendar_start, calendar_end)) - latest_timestamp = setEventTimestamps(request, all_shown_events) + latest_timestamp = getLatestEventTimestamp(all_shown_events) # Output summary data... diff -r fb12a408f28b -r 166cffe71563 parsers/event.py --- a/parsers/event.py Wed Jul 11 00:46:55 2012 +0200 +++ b/parsers/event.py Sun Jul 15 21:28:37 2012 +0200 @@ -34,23 +34,31 @@ self.request = request #self.attrs = parseAttributes(kw.get("format_args", ""), False) - def format(self, fmt): + def format(self, fmt, write=None): - "Format an event using the given formatter 'fmt'." + """ + Format an event using the given formatter 'fmt'. If the 'write' + parameter is specified, use it to write output; otherwise, write output + using the request. + """ - events = parseEvents(self.raw, self.request.page) + events = parseEvents(self.raw, EventPage(self.request.page)) for event in events: - formatEvent(event, self.request, fmt) + formatEvent(event, self.request, fmt, write=write) # Extra API methods. - def formatText(self, text, mimetype): + def formatForOutputType(self, mimetype, write=None): - "Format the event 'text' for the given 'mimetype'." + """ + Format an event for the given 'mimetype'. If the 'write' parameter is + specified, use it to write output; otherwise, write output using the + request. + """ - events = parseEvents(text) - formatEventsForOutputType(events, self.request, mimetype) + events = parseEvents(self.raw, EventPage(self.request.page)) + formatEventsForOutputType(events, self.request, mimetype, write=write) # Class methods.