
    F2j|#                         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j        d          Z ej        d          Zd	Z ej        d
          ZddededefdZ G d de          Z G 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 d| vrd| vr| S |dk    r5d| vr1d| vr-t                               d|                                           S g g d}d}ddfd
}| D ]1}|r$ |                                 |           d}d)|dk    r&|s$ |                                 |           d}dU|dk    r'|s%| } |                                 |           d|s!|s|t          v r                    |           |si|sg||v rc                                 r4d         t          v r%                                 rd         t          v %                    |           d |                                 |           d3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                  f    sd S  s                                                                 d S N)extendclear)last_was_delimiterout
pending_wss   e/home/thesage/.hermes/hermes-agent/venv/lib/python3.11/site-packages/icalendar/parser/content_line.pyflush_pendingz3_strip_ows_around_delimiters.<locals>.flush_pending1   sB     	F! 	#JJz"""    T )r   N)	OWS_AROUND_DELIMITERS_REsubstripappendOWSr   popr   join)	r   r   	in_quotesescapedr   chr   r   r   s	         @@@r   _strip_ows_around_delimitersr,      sm     	 "}}R	 TcmmB'++E266<<>>>CJIG         *# *# 	MOOOJJrNNNG!& ::i:MOOOJJrNNNG!& 99W9%IMOOOJJrNNN!&  	 	R3YYb!!!  	 	R:-=-= #b'S..			  #b'S..JJrNNN!% 	

2" , 

:773<<r   c                        e Zd ZdZdZdef fd	Ze	 ddede	de
fd	            Zd
eee	ef         fdZedd            Zd Z xZS )ContentlinezWA content line is basically a string that can be folded and parsed into
    parts.
    strictFc                     t          ||          }d|vs
J d            t                                          | |          }||_        |S )N)encoding
z;Content line can not contain unescaped new line characters.)r   super__new__r0   )clsvaluer0   r2   self	__class__s        r   r5   zContentline.__new__r   sV    584445   I !   wwsE**r   Tnameparamssortedc                    t          |t                    sJ t          |d          r|                                }n#ddlm}  ||                                          }t          |          }t          |          }|r8t          |                    |                    }|r | | d| d|           S  | | d|           S )z!Turn a parts into a content line.to_icalr   )vText)r<   ;:)
isinstancer   hasattrr>   icalendar.propr?   r   )r6   r:   r;   valuesr<   r?   s         r   
from_partszContentline.from_parts{   s     &*-----69%% 	-^^%%FF,,,,,,U6]]**,,F $F## 	8f = =>>F 8sd66V66f66777sd%%V%%&&&r   r   c                 $   	 d}d}d}d}t          |           D ]4\  }}|dk    r|s| }n!|dk    r|sd}|s|s|dv r||}|dk    r||}d}5|st          |           }|r
| d|         n| }| j        s(t          j        dd	|                                          }t          |           |r	|d
z   |k    rt          d          | |d
z   |         }| j        st          |          }t          |          }	t          j        |	| j                  }
t          d t          |
                                          D                       }
t          | |d
z   d                   }n(# t          $ r}t          d|  d|           |d}~ww xY 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:;rA   z[ \t]+r!      zInvalid content liner/   c              3   X   K   | ]%\  }}t          |          t          |          fV  &d S r   )r   r   ).0keyr7   s      r   	<genexpr>z$Contentline.parts.<locals>.<genexpr>   sP          C "#&&(?(F(FG           r   z.Content line could not be parsed into parts: 'z': )	enumeratelenr0   rer#   r$   r	   
ValueErrorr,   r   r   	from_icaliteritemsr   )r8   
name_splitvalue_splitr)   r*   ir+   r:   raw_param_str	param_strr;   rE   excs                r   partszContentline.parts   s$   $5	%)J&*K#I!G"4    299W9$-II4ZZ	Z"G" (7 (Tzzj&8%&
Syy[%8&'  (!$ii )3<4$$D; ;viTZZ\\::4    9a;!>!> !7888 !a+!=>M; L <] K K&}55I))DKHHHF    "&v||~~"6"6       F
 ([1_->->(?@@FF 	 	 	OOO#OO 	 ff%%s   E"E% %
F
/FF
c                 l    t          |          } | t                              d|          |          S )zAUnfold the content lines in an iCalendar into long content lines.r!   r/   )r   UFOLDr#   )r6   icalr0   s      r   rQ   zContentline.from_ical   s4     $s599R&&v6666r   c                 P    t          |                               t                    S )zXLong content lines are folded so they are less than 75 characters
        wide.
        )r   encoder
   r8   s    r   r>   zContentline.to_ical   s     ~~$$%5666r   )T)F)__name__
__module____qualname____doc__	__slots__r
   r5   classmethodr   r   boolrF   tuplestrrZ   rQ   r>   __classcell__)r9   s   @r   r.   r.   k   s          I#(3C        ' '' '
 ' ' ' [':H&uS*c12 H& H& H& H&T 7 7 7 [77 7 7 7 7 7 7r   r.   c                   .    e Zd ZdZd Ze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                 F    d                     d | D                       dz   S )zSimply join self.s   
c              3   B   K   | ]}||                                 V  d S r   )r>   rJ   lines     r   rL   z'Contentlines.to_ical.<locals>.<genexpr>   s/      DDttDDLLNNDDDDDDr   )r(   r`   s    r   r>   zContentlines.to_ical   s(    ||DDtDDDDDwNNr   c                 &   t          |          }	 t                              d|          } | d t                              |          D                       }|                    d           n"# t          $ r}t          d          |d}~ww xY w|S )z#Parses a string into content lines.r!   c              3   8   K   | ]}|t          |          V  d S r   )r.   ro   s     r   rL   z)Contentlines.from_ical.<locals>.<genexpr>  s0      VVdQUVD))VVVVVVr   z&Expected StringType with content linesN)r   r\   r#   NEWLINEsplitr%   	ExceptionrP   )r6   r   unfoldedlineses        r   rQ   zContentlines.from_ical   s     ^^	NyyR((HCVVgmmH6M6MVVVVVELL 	N 	N 	NEFFAM	Ns   AA/ /
B9B		BN)ra   rb   rc   rd   r>   rf   rQ    r   r   rl   rl      sK         
O O O 
 
 [
 
 
r   rl   )r   )rd   rO   icalendar.parser.parameterr   icalendar.parser.propertyr   r   icalendar.parser.stringr   r   r   r	   icalendar.parser_toolsr
   r   r   compiler\   rs   r&   r"   ri   r,   r.   listrl   __all__ry   r   r   <module>r      s~   - - 				 1 1 1 1 1 1 Q Q Q Q Q Q Q Q            K J J J J J J J J J
?##
"*X

%2:&;<< R  R S R c R S R  R  R  R jC7 C7 C7 C7 C7# C7 C7 C7L    4$   0 .
)r   