Source code for icalendar.parser.xcal.parameters
from __future__ import annotations
from typing import TYPE_CHECKING
from icalendar.parser.parameter import Parameters
from icalendar.parser.xcal.base import XCalParser
if TYPE_CHECKING:
from xml.etree.ElementTree import Element
from icalendar.parser.xcal.adapter import ElementAdapter
from icalendar.prop.factory import TypesFactory
[docs]
class XCalParametersParser(XCalParser):
"""A parser for <parameters>.
Parameters:
element: The xCal element to parse.
types_factory: The types factory to use.
If ``None`` is passed, the default TypesFactory is used.
Example:
The parameter ``element`` can be a ``parameters`` tag as shown below:
.. code-block:: xml
<parameters>
<tzid>
<text>US/Eastern</text>
</tzid>
</parameters>
"""
def __init__(
self,
element: Element | ElementAdapter,
types_factory: TypesFactory | None = None,
) -> None:
from icalendar.prop.factory import TypesFactory
super().__init__(element)
self._types_factory = (
TypesFactory.instance() if types_factory is None else types_factory
)
self._parameters = Parameters()
[docs]
def parse_parameters(self) -> Parameters:
"""Parse all parameters until finished.
Parameters are parsed once and are the same for all
property values inside a property tag.
This method parses the whole ``parameters`` tag collects them
and returns them as a :class:`~icalendar.prop.parameters.Parameters` object.
Returns:
The parsed parameters.
Raises:
~icalendar.error.XCalParsingError: If the provided xCal is invalid.
"""
while not self.is_finished():
self.parse_parameter()
return self._parameters
[docs]
def parse_parameter(self) -> None:
"""Parse the next parameter that has not been parsed, yet.
This function only parses one parameter inside the parser's ``element``
parameter and adds it to the collected parameters.
Each call parses a single parameter.
Raises:
~icalendar.error.XCalParsingError: If the provided xCal is invalid.
~icalendar.parser.xcal.base.InvalidParserState:
If all parameters have been parsed.
Example:
The example below shows a ``parameters`` tag with a
``tzid`` parameter.
This function would only parse the ``tzid`` parameter.
.. code-block:: xml
<parameters>
<tzid>
<text>US/Eastern</text>
</tzid>
</parameters>
"""
parameters_parser = XCalParameterParser(self.child, self._types_factory)
values = []
while not parameters_parser.is_finished():
values.append(parameters_parser.parse_parameter())
if values:
self._parameters[self.child.tag] = values[0] if len(values) == 1 else values
self.done()
[docs]
class XCalParameterParser(XCalParser):
"""A parser for one parameter."""
def __init__(
self,
element: Element | ElementAdapter,
types_factory: TypesFactory | None = None,
) -> None:
from icalendar.prop.factory import TypesFactory
super().__init__(element)
self._types_factory = (
TypesFactory.instance() if types_factory is None else types_factory
)
self._element_is_parsed = False
[docs]
def parse_parameter(self) -> str:
"""Parse one parameter value if present.
Returns:
The parsed parameters.
Example:
.. code-block:: xml
<tzid>
<text>US/Eastern</text>
</tzid>
"""
child = self.parse_tag()
result = child.get_xsd_string()
if child.tag == "boolean":
result = result.upper()
return result