o
    >hF                     @  s  d Z ddlmZ ddlmZ ddlmZ ddlmZ ddl	m
Z
 ddlmZ ddlmZmZmZmZmZmZmZmZmZmZmZmZ dd	lmZmZ dd
lmZ ddlm Z  ddl!m"Z"m#Z#m$Z$m%Z%m&Z&m'Z' ddl(m)Z)m*Z*m+Z+ ddl,m-Z-m.Z. edZ/eZ0	 ee1e2e&e"e$e%ee0df ee0 ee0ddf e#ee0 eee0 e3e0f e-f Z4	 dZ5dEddZ6dEddZ7dFddZ8dEd d!Z9dEd"d#Z:	dGdHd+d,Z;dId/d0Z<dJd:d;Z=dKd=d>Z>dLd@dAZ?dMdCdDZ@dS )Nzu
Context-free flattener/serializer for rendering Python objects, possibly
complex or arbitrarily nested, as strings.
    )annotations)iscoroutine)BytesIO)exc_info)
extract_tb)GeneratorType)AnyCallable	Coroutine	GeneratorListMappingOptionalSequenceTupleTypeVarUnioncast)DeferredensureDeferred)nativeString)Failure)CDATACharRefCommentTagslotvoidElements)FlattenerErrorUnfilledSlotUnsupportedType)IRenderableIRequestT.Ni   dataUnion[bytes, str]returnbytesc                 C  s4   t | tr
| d} | dddddd} | S )a  
    Escape some character or UTF-8 byte data for inclusion in an HTML or XML
    document, by replacing metacharacters (C{&<>}) with their entity
    equivalents (C{&amp;&lt;&gt;}).

    This is used as an input to L{_flattenElement}'s C{dataEscaper} parameter.

    @param data: The string to escape.

    @return: The quoted form of C{data}.  If C{data} is L{str}, return a utf-8
        encoded string.
    utf-8   &s   &amp;   <s   &lt;   >s   &gt;
isinstancestrencodereplacer$    r2   t/var/www/vedio/testing/chatpythonscript.ninositsolution.com/env/lib/python3.10/site-packages/twisted/web/_flatten.pyescapeForContentG   s   

r4   c                 C  s   t | tr
| dS | S )aG  
    Escape some character or UTF-8 byte data for inclusion in the top level of
    an attribute.  L{attributeEscapingDoneOutside} actually passes the data
    through unchanged, because L{writeWithAttributeEscaping} handles the
    quoting of the text within attributes outside the generator returned by
    L{_flattenElement}; this is used as the C{dataEscaper} argument to that
    L{_flattenElement} call so that that generator does not redundantly escape
    its text output.

    @param data: The string to escape.

    @return: The string, unchanged, except for encoding.
    r(   )r-   r.   r/   r1   r2   r2   r3   attributeEscapingDoneOutsideZ   s   

r5   writeCallable[[bytes], object]Callable[[bytes], None]c                   s   d fdd}|S )	aU  
    Decorate a C{write} callable so that all output written is properly quoted
    for inclusion within an XML attribute value.

    If a L{Tag <twisted.web.template.Tag>} C{x} is flattened within the context
    of the contents of another L{Tag <twisted.web.template.Tag>} C{y}, the
    metacharacters (C{<>&"}) delimiting C{x} should be passed through
    unchanged, but the textual content of C{x} should still be quoted, as
    usual.  For example: C{<y><x>&amp;</x></y>}.  That is the default behavior
    of L{_flattenElement} when L{escapeForContent} is passed as the
    C{dataEscaper}.

    However, when a L{Tag <twisted.web.template.Tag>} C{x} is flattened within
    the context of an I{attribute} of another L{Tag <twisted.web.template.Tag>}
    C{y}, then the metacharacters delimiting C{x} should be quoted so that it
    can be parsed from the attribute's value.  In the DOM itself, this is not a
    valid thing to do, but given that renderers and slots may be freely moved
    around in a L{twisted.web.template} template, it is a condition which may
    arise in a document and must be handled in a way which produces valid
    output.  So, for example, you should be able to get C{<y attr="&lt;x /&gt;"
    />}.  This should also be true for other XML/HTML meta-constructs such as
    comments and CDATA, so if you were to serialize a L{comment
    <twisted.web.template.Comment>} in an attribute you should get C{<y
    attr="&lt;-- comment --&gt;" />}.  Therefore in order to capture these
    meta-characters, flattening is done with C{write} callable that is wrapped
    with L{writeWithAttributeEscaping}.

    The final case, and hopefully the much more common one as compared to
    serializing L{Tag <twisted.web.template.Tag>} and arbitrary L{IRenderable}
    objects within an attribute, is to serialize a simple string, and those
    should be passed through for L{writeWithAttributeEscaping} to quote
    without applying a second, redundant level of quoting.

    @param write: A callable which will be invoked with the escaped L{bytes}.

    @return: A callable that writes data with escaping.
    r$   r'   r&   Nonec                   s    t | dd d S )N   "s   &quot;)r4   r0   r1   r6   r2   r3   _write   s   z*writeWithAttributeEscaping.<locals>._writeN)r$   r'   r&   r9   r2   )r6   r<   r2   r;   r3   writeWithAttributeEscapingm   s   )r=   c                 C  s    t | tr
| d} | ddS )z
    Escape CDATA for inclusion in a document.

    @param data: The string to escape.

    @return: The quoted form of C{data}. If C{data} is unicode, return a utf-8
        encoded string.
    r(      ]]>s   ]]]]><![CDATA[>r,   r1   r2   r2   r3   escapedCDATA   s   
	
r?   c                 C  s@   t | tr
| d} | dd} | r| dd dkr| d7 } | S )a  
    Within comments the sequence C{-->} can be mistaken as the end of the comment.
    To ensure consistent parsing and valid output the sequence is replaced with C{--&gt;}.
    Furthermore, whitespace is added when a comment ends in a dash. This is done to break
    the connection of the ending C{-} with the closing C{-->}.

    @param data: The string to escape.

    @return: The quoted form of C{data}. If C{data} is unicode, return a utf-8
        encoded string.
    r(      -->s   --&gt;N   -    r,   r1   r2   r2   r3   escapedComment   s   

rD   namer.   slotData-Sequence[Optional[Mapping[str, Flattenable]]]defaultOptional[Flattenable]Flattenablec                 C  s>   t |D ]}|dur| |v r||    S q|dur|S t| )zK
    Find the value of the named slot in the given stack of slot data.
    N)reversedr   )rE   rF   rH   	slotFramer2   r2   r3   _getSlotValue   s   rM   dDeferred[T]c                   s<   t  fdddfdd}dfd
d} || S )z
    Create a new L{Deferred} based on C{d} that will fire and fail with C{d}'s
    result or error, but will not modify C{d}'s callback type.
    c                         S N)cancel_)rN   r2   r3   <lambda>       z_fork.<locals>.<lambda>resultr#   r&   c                        |  | S rQ   )callbackrW   d2r2   r3   rY         
z_fork.<locals>.callbackfailurer   c                   rX   rQ   )errback)r^   r[   r2   r3   r_      r]   z_fork.<locals>.errbackN)rW   r#   r&   r#   )r^   r   r&   r   )r   addCallbacks)rN   rY   r_   r2   )rN   r\   r3   _fork   s
   ra   requestOptional[IRequest]root)List[Optional[Mapping[str, Flattenable]]]renderFactoryOptional[IRenderable]dataEscaper$Callable[[Union[bytes, str]], bytes]MGenerator[Union[Generator[Any, Any, Any], Deferred[Flattenable]], None, None]c                 #  s   |||fd$fdd d% fdd}t |ttfr#||| dS t |tr7t|j|j} |V  dS t |trM|d |t|j	 |d dS t |t
rc|d |t|j	 |d dS t |tr|j |j}|dur|du rtd| d|d}	d|	_||}
|
|	} |V    dS |js |jV  dS |d t |jtr|jd}n|j}|| |j D ]$\}}t |tr|d}|d| d   |tt|dV  |d q|jst|tvr|d  |jtV  |d | d  dS |d! dS t |ttt fr'|D ]} |V  qdS t |t!r<d"|j"f }||d dS t |t#rK|t$|V  dS t%|rd|t#&t't(t#t) t*t)f |V  dS t+,|rx|} ||d#V  dS t-|)&at  
    Make C{root} slightly more flat by yielding all its immediate contents as
    strings, deferreds or generators that are recursive calls to itself.

    @param request: A request object which will be passed to
        L{IRenderable.render}.

    @param root: An object to be made flatter.  This may be of type C{unicode},
        L{str}, L{slot}, L{Tag <twisted.web.template.Tag>}, L{tuple}, L{list},
        L{types.GeneratorType}, L{Deferred}, or an object that implements
        L{IRenderable}.

    @param write: A callable which will be invoked with each L{bytes} produced
        by flattening C{root}.

    @param slotData: A L{list} of L{dict} mapping L{str} slot names to data
        with which those slots will be replaced.

    @param renderFactory: If not L{None}, an object that provides
        L{IRenderable}.

    @param dataEscaper: A 1-argument callable which takes L{bytes} or
        L{unicode} and returns L{bytes}, quoted as appropriate for the
        rendering context.  This is really only one of two values:
        L{attributeEscapingDoneOutside} or L{escapeForContent}, depending on
        whether the rendering context is within an attribute or not.  See the
        explanation in L{writeWithAttributeEscaping}.

    @return: An iterator that eventually writes L{bytes} to C{write}.
        It can yield other iterators or L{Deferred}s; if it yields another
        iterator, the caller will iterate it; if it yields a L{Deferred},
        the result of that L{Deferred} will be another generator, in which
        case it is iterated.  See L{_flattenTree} for the trampoline that
        consumes said values.
    newRootrJ   rh   ri   rf   rg   r6   r7   r&   @Generator[Union[Flattenable, Deferred[Flattenable]], None, None]c                   s   t  | |||S rQ   )_flattenElement)rk   rh   rf   r6   )rb   rF   r2   r3   	keepGoing  s   z"_flattenElement.<locals>.keepGoingrW   Deferred[Flattenable]c                   s
   |   S rQ   )addCallbackrZ   )rn   r2   r3   keepGoingAsync  s   
z'_flattenElement.<locals>.keepGoingAsyncs	   <![CDATA[r>   s   <!--r@   Nz$Tag wants to be rendered by method "z)" but is not contained in any IRenderableFr*   asciirC   s   ="r;   r:   r+   s   </s    />z&#%d;)rf   )
rk   rJ   rh   ri   rf   rg   r6   r7   r&   rl   )rW   ro   r&   ro   ).r-   r'   r.   r   rM   rE   rH   r   r?   r$   r   rD   r   appendrF   render
ValueErrorclonelookupRenderMethodpoptagNamechildrenr/   
attributesitemsr5   r=   r   r   r4   tuplelistr   r   ordinalr   ra   r   fromCoroutiner   r
   rJ   objectr!   
providedByr    )rb   rd   r6   rF   rf   rh   rq   	slotValuerendererName	rootClonerenderMethodrW   ry   kvelementescapedr2   )rn   rb   rF   r3   rm      s   1















rm   r9   c           	   
     s  g  dd fdd}d fdd	t | ||g d
tg}|r|zt|d }t|tr7  |I d
H }W n< tyE   |  Y n5 tyt } z$g }|D ]}|jd
ur`|	|jj
d  qP|  t||tt d d
}~ww |	| |s#  d
S )a  
    Make C{root} into an iterable of L{bytes} and L{Deferred} by doing a depth
    first traversal of the tree.

    @param request: A request object which will be passed to
        L{IRenderable.render}.

    @param root: An object to be made flatter.  This may be of type C{unicode},
        L{bytes}, L{slot}, L{Tag <twisted.web.template.Tag>}, L{tuple},
        L{list}, L{types.GeneratorType}, L{Deferred}, or something providing
        L{IRenderable}.

    @param write: A callable which will be invoked with each L{bytes} produced
        by flattening C{root}.

    @return: A C{Deferred}-returning coroutine that resolves to C{None}.
    r   bsr'   r&   r9   c                   s,     |  t| 7 tkr  d S d S rQ   )rs   lenBUFFER_SIZE)r   )bufbufSizeflushBufferr2   r3   bufferedWrite  s
   

z#_flattenTree.<locals>.bufferedWritec                     s,   dkrd    d d = dd S d S )Nr       )joinr2   )r   r   r6   r2   r3   r     s
   
z!_flattenTree.<locals>.flushBufferNrA   rd      )r   r'   r&   r9   )r&   r9   )rm   r4   nextr-   r   StopIterationrx   	Exceptiongi_framers   f_localsr   r   r   )	rb   rd   r6   r   stackr   eroots	generatorr2   )r   r   r   r6   r3   _flattenTrees  s:   




r   Deferred[None]c                 C  s   t t| ||S )a  
    Incrementally write out a string representation of C{root} using C{write}.

    In order to create a string representation, C{root} will be decomposed into
    simpler objects which will themselves be decomposed and so on until strings
    or objects which can easily be converted to strings are encountered.

    @param request: A request object which will be passed to the C{render}
        method of any L{IRenderable} provider which is encountered.

    @param root: An object to be made flatter.  This may be of type L{str},
        L{bytes}, L{slot}, L{Tag <twisted.web.template.Tag>}, L{tuple},
        L{list}, L{types.GeneratorType}, L{Deferred}, or something that
        provides L{IRenderable}.

    @param write: A callable which will be invoked with each L{bytes} produced
        by flattening C{root}.

    @return: A L{Deferred} which will be called back with C{None} when C{root}
        has been completely flattened into C{write} or which will be errbacked
        if an unexpected exception occurs.
    )r   r   )rb   rd   r6   r2   r2   r3   flatten  s   r   Deferred[bytes]c                   s4   t   t| | j}| fdd ttt |S )a  
    Collate a string representation of C{root} into a single string.

    This is basically gluing L{flatten} to an L{io.BytesIO} and returning
    the results. See L{flatten} for the exact meanings of C{request} and
    C{root}.

    @return: A L{Deferred} which will be called back with a single UTF-8 encoded
        string as its result when C{root} has been completely flattened or which
        will be errbacked if an unexpected exception occurs.
    c                   rP   rQ   )getvaluerS   ior2   r3   rU     rV   zflattenString.<locals>.<lambda>)r   r   r6   rp   r   r   r'   )rb   rd   rN   r2   r   r3   flattenString  s   r   )r$   r%   r&   r'   )r6   r7   r&   r8   rQ   )rE   r.   rF   rG   rH   rI   r&   rJ   )rN   rO   r&   rO   )rb   rc   rd   rJ   r6   r7   rF   re   rf   rg   rh   ri   r&   rj   )rb   rc   rd   rJ   r6   r7   r&   r9   )rb   rc   rd   rJ   r6   r7   r&   r   )rb   rc   rd   rJ   r&   r   )A__doc__
__future__r   inspectr   r   r   sysr   	tracebackr   typesr   typingr   r	   r
   r   r   r   r   r   r   r   r   r   twisted.internet.deferr   r   twisted.python.compatr   twisted.python.failurer   twisted.web._stanr   r   r   r   r   r   twisted.web.errorr   r   r    twisted.web.iwebr!   r"   r#   FlattenableRecursiver'   r.   r   rJ   r   r4   r5   r=   r?   rD   rM   ra   rm   r   r   r   r2   r2   r2   r3   <module>   s`   8 




/


 

H