Source code for icalendar.prop.xml_reference
"""XML-REFERENCE values from :rfc:`9253`."""
from typing import ClassVar
from urllib.parse import unquote, urlparse
from icalendar.compatibility import Self
from icalendar.prop.uri import vUri
[docs]
class vXmlReference(vUri):
"""An XML-REFERENCE.
The associated value references an associated XML artifact and
is a URI with an XPointer anchor value.
This is defined in :rfc:`9253`, Section 7.
"""
default_value: ClassVar[str] = "XML-REFERENCE"
@property
def xml_reference(self) -> str:
"""The XML reference URI of this property."""
return self.uri
@property
def x_pointer(self) -> str | None:
"""The XPointer of the URI.
The XPointer is defined in `W3C.WD-xptr-xpointer-20021219
<https://www.rfc-editor.org/rfc/rfc9253.html#W3C.WD-xptr-xpointer-20021219>`_,
and its use as an anchor is defined in `W3C.REC-xptr-framework-20030325
<https://www.rfc-editor.org/rfc/rfc9253.html#W3C.REC-xptr-framework-20030325>`_.
Returns:
The decoded x-pointer or ``None`` if no valid x-pointer is found.
"""
parsed = urlparse(self.xml_reference)
fragment = unquote(parsed.fragment)
if not fragment.startswith("xpointer(") or not fragment.endswith(")"):
return None
return fragment[9:-1]
[docs]
@classmethod
def examples(cls) -> list[Self]:
"""Examples of vXmlReference."""
return [cls("http://example.com/doc.xml#xpointer(/doc/element)")]
__all__ = ["vXmlReference"]