o
    .j|#                     @   s   d Z ddlZddlmZ ddlmZmZ ddlmZm	Z	m
Z
mZ ddlmZmZmZ edZedZd	Zed
ZddededefddZG dd deZG dd dee ZddgZdS )z'parsing and generation of content lines    N)
Parameters)unescape_backslashunescape_list_or_string)_escape_string_unescape_stringfoldlinevalidate_token)DEFAULT_ENCODING	ICAL_TYPE
to_unicodez
(?
)+[ 	]z\r?\nz 	z[ \t]*([;=])[ \t]*;=st
delimitersreturnc                    s  | s| S d| vrd| vr| S |dkr"d| vr"d| vr"t d|  S g g d}d}d d fd
d}| D ]x}|rH|  | d}d q7|dkr[|s[|  | d}d q7|dkro|so| }|  | d q7|s}|s}|tv r}| q7|s|s||v r  rd tv r  rd tv s| d q7|  | d q7r s d S )a>  Strip optional whitespace around delimiters outside of quoted sections,
    respecting backslash escapes so that escaped delimiters are not treated as
    separators.

    This is a lenient parsing helper (used when strict=False) to support
    iCalendar content lines that contain extra whitespace around tokens.
     	r   "\z\1Fr   Nc                      s"   sd S  s    d S N)extendclear last_was_delimiterout
pending_wsr   R/home/thesage/.local/lib/python3.10/site-packages/icalendar/parser/content_line.pyflush_pending1   s
   
z3_strip_ows_around_delimiters.<locals>.flush_pendingT )r   N)	OWS_AROUND_DELIMITERS_REsubstripappendOWSr   popr   join)r   r   	in_quotesescapedr   chr   r   r   _strip_ows_around_delimiters   s`   






r*   c                       sv   e Zd ZdZdZdef fdd	Ze	ddede	d	e
fd
dZdeee	ef fddZedddZdd Z  ZS )ContentlinezWA content line is basically a string that can be folded and parsed into
    parts.
    strictFc                    s4   t ||d}d|vsJ dt | |}||_|S )N)encoding
z;Content line can not contain unescaped new line characters.)r   super__new__r-   )clsvaluer-   r.   self	__class__r   r   r1   r   s   
zContentline.__new__Tnameparamssortedc                 C   s   t |tsJ t|dr| }nddlm} || }t|}t|}|r=t|j|d}|r=| | d| d| S | | d| S )z!Turn a parts into a content line.to_icalr   )vText)r9   ;:)
isinstancer   hasattrr:   icalendar.propr;   r   )r2   r7   r8   valuesr9   r;   r   r   r   
from_parts{   s   	

zContentline.from_partsr   c              
   C   sv  zd}d}d}d}t | D ]1\}}|dkr|s| }n!|dkr$|s$d}q|s<|s<|dv r2|du r2|}|dkr<|du r<|}d}q|sEt| }|rM| d| n| }| js[tdd	| }t| |rg|d
 |krktd| |d
 | }| jszt|}t	|}	t
j|	| jd}
t
dd t|
 D }
t| |d
 d }W n ty } ztd|  d| |d}~ww ||
|fS )a  Split the content line into ``name``, ``parameters``, and ``values`` parts.

        Properly handles escaping with backslashes and double-quote sections
        to avoid corrupting URL-encoded characters in values.

        Example with parameter:

        .. code-block:: ics

            DESCRIPTION;ALTREP="cid:part1.0001@example.org":The Fall'98 Wild

        Example without parameters:

        .. code-block:: ics

            DESCRIPTION:The Fall'98 Wild
        NFr   r   Tz:;r=   z[ \t]+r      zInvalid content liner,   c                 s   s$    | ]\}}t |t|fV  qd S r   )r   r   ).0keyr3   r   r   r   	<genexpr>   s
    
z$Contentline.parts.<locals>.<genexpr>z.Content line could not be parsed into parts: 'z': )	enumeratelenr-   rer!   r"   r   
ValueErrorr*   r   r   	from_icaliteritemsr   )r4   
name_splitvalue_splitr'   r(   ir)   r7   raw_param_str	param_strr8   rA   excr   r   r   parts   sV   

zContentline.partsc                 C   s   t |}| td||dS )zAUnfold the content lines in an iCalendar into long content lines.r   r,   )r   UFOLDr!   )r2   icalr-   r   r   r   rK      s   zContentline.from_icalc                 C   s   t | tS )zXLong content lines are folded so they are less than 75 characters
        wide.
        )r   encoder	   r4   r   r   r   r:      s   zContentline.to_ical)T)F)__name__
__module____qualname____doc__	__slots__r	   r1   classmethodr
   r   boolrB   tuplestrrT   rK   r:   __classcell__r   r   r5   r   r+   k   s"    	Jr+   c                   @   s$   e Zd ZdZdd Zedd ZdS )ContentlineszI assume that iCalendar files generally are a few kilobytes in size.
    Then this should be efficient. for Huge files, an iterator should probably
    be used instead.
    c                 C   s   d dd | D d S )zSimply join self.s   
c                 s   s    | ]	}|r|  V  qd S r   )r:   rD   liner   r   r   rF          z'Contentlines.to_ical.<locals>.<genexpr>)r&   rX   r   r   r   r:      s   zContentlines.to_icalc              
   C   s`   t |}ztd|}| dd t|D }|d W |S  ty/ } ztd|d}~ww )z#Parses a string into content lines.r   c                 s   s    | ]	}|rt |V  qd S r   )r+   rd   r   r   r   rF     rf   z)Contentlines.from_ical.<locals>.<genexpr>z&Expected StringType with content linesN)r   rU   r!   NEWLINEsplitr#   	ExceptionrJ   )r2   r   unfoldedlineser   r   r   rK      s   
zContentlines.from_icalN)rY   rZ   r[   r\   r:   r^   rK   r   r   r   r   rc      s
    rc   )r   )r\   rI   icalendar.parser.parameterr   icalendar.parser.propertyr   r   icalendar.parser.stringr   r   r   r   icalendar.parser_toolsr	   r
   r   compilerU   rg   r$   r    ra   r*   r+   listrc   __all__r   r   r   r   <module>   s    


U 