Source code for icalendar.parser.ical.calendar
"""Special parsing for calendar components."""
from .component import ComponentIcalParser
[docs]
class CalendarIcalParser(ComponentIcalParser):
"""A parser for calendar components."""
[docs]
def prepare_components(self) -> None:
"""Prepare the parsed components.
This handles timezone forward references.
"""
all_timezones_so_far = True
for comp in self._components:
for component in comp.subcomponents:
if component.name == "VTIMEZONE":
if not all_timezones_so_far:
# If a preceding component refers to a VTIMEZONE
# defined later in the source string (forward
# references are allowed by RFC 5545), then the
# earlier component may have the wrong timezone
# attached.
# However, during computation of comps, all VTIMEZONEs
# observed do end up in the timezone cache. So simply
# re-running from_ical will rely on the cache for those
# forward references to produce the correct result.
# See test_create_america_new_york_forward_reference.
self.initialize_parsing()
self.parse_content_lines()
return
else:
all_timezones_so_far = False
__all__ = ["CalendarIcalParser"]