
    VhF                       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Z5ddZ6ddZ7	 	 	 	 ddZ8ddZ9ddZ:	 d 	 	 	 	 	 	 	 d!dZ;d"dZ<	 	 	 	 	 	 	 	 	 	 	 	 	 	 d#dZ=	 	 	 	 	 	 	 	 d$dZ>	 	 	 	 	 	 	 	 d%dZ?d&dZ@y)'zu
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   c                    t        | t              r| j                  d      } | j                  dd      j                  dd      j                  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datas    D/home/dcms/DCMS/lib/python3.12/site-packages/twisted/web/_flatten.pyescapeForContentr2   G   sK     ${{7#<<h'//g>FFtWUDK    c                H    t        | t              r| j                  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-   r/   s    r1   attributeEscapingDoneOutsider5   Z   s"     ${{7##Kr3   c                     d f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.
    c                H     t        |       j                  dd             y )N   "s   &quot;)r2   r.   )r0   writes    r1   _writez*writeWithAttributeEscaping.<locals>._write   s    t$,,T9=>r3   )r0   bytesreturnNone )r9   r:   s   ` r1   writeWithAttributeEscapingr?   m   s    R? Mr3   c                h    t        | t              r| j                  d      } | j                  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*   r/   s    r1   escapedCDATArB      s.     ${{7#<< 233r3   c                    t        | t              r| j                  d      } | j                  dd      } | r| dd dk(  r| dz  } | 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*   r/   s    r1   escapedCommentrH      sJ     ${{7#<<	*DRS	T!Kr3   c                \    t        |      D ]  }|| |v s||    c S  ||S t        |       )zK
    Find the value of the named slot in the given stack of slot data.
    )reversedr    )nameslotDatadefault	slotFrames       r1   _getSlotValuerO      sG     h' !	 TY%6T?"! N4  r3   c                b     t         fd      dfd}dfd} j                  ||       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                $    j                         S N)cancel)_ds    r1   <lambda>z_fork.<locals>.<lambda>   s     r3   c                *    j                  |        | S rR   )callback)resultd2s    r1   rX   z_fork.<locals>.callback   s    
Fr3   c                *    j                  |        | S rR   )errback)failurerZ   s    r1   r\   z_fork.<locals>.errback   s    


7r3   )rY   r$   r<   r$   )r]   r   r<   r   )r   addCallbacks)rU   rX   r\   rZ   s   `  @r1   _forkr_      s/    
 34B NN8W%Ir3   c           
   #     K   |||f	 	 	 	 	 	 	 	 	 d fddfd}t        |t        t        f      r | ||             yt        |t              r,t	        |j
                  |j                        } |       yt        |t              r, |d        |t        |j                                |d       yt        |t              r, |d        |t        |j                                |d       yt        |t              rÉj                  |j                         |j                  }|^|t!        d| d	      |j#                  d
      }	d|	_        |j%                  |      }
 |
 |	      } |       j'                          y|j(                  s |j*                         y |d       t        |j(                  t              r|j(                  j-                  d      }n|j(                  } ||       |j.                  j1                         D ]V  \  }}t        |t              r|j-                  d      } |d|z   dz           |t2        t5        |              |d       X |j*                  st7        |      t8        vr0 |d        |j*                  t:                |d|z   dz          y |d       yt        |t<        t>        t@        f      r|D ]  } |        yt        |tB              r(d|jD                  fz  } ||j-                  d             yt        |tF              r |tI        |             ytK        |      rE |tG        jL                  tO        tP        tF        tR           tT        tR        f   |                   ytW        jX                  |      r|j                         } ||       yt[        |      w)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.
    c                $    t        | |||      S rR   )_flattenElement)newRootdataEscaperrenderFactoryr9   requestrL   s       r1   	keepGoingz"_flattenElement.<locals>.keepGoing  s     WeX}k
 	
r3   c                &    | j                        S rR   )addCallback)rY   rg   s    r1   keepGoingAsyncz'_flattenElement.<locals>.keepGoingAsync  s    !!),,r3   s	   <![CDATA[rA   s   <!--rD   Nz$Tag wants to be rendered by method "z)" but is not contained in any IRenderableFr(   asciirG   s   =")r9   r8   r)   s   </s    />z&#%d;)re   )
rc   Flattenablerd   $Callable[[Union[bytes, str]], bytes]re   Optional[IRenderable]r9   Callable[[bytes], object]r<   z@Generator[Union[Flattenable, Deferred[Flattenable]], None, None])rY   Deferred[Flattenable]r<   rp   ).r+   r;   r,   r   rO   rK   rM   r   rB   r0   r   rH   r   appendrL   render
ValueErrorclonelookupRenderMethodpoptagNamechildrenr-   
attributesitemsr5   r?   r   r   r2   tuplelistr   r   ordinalr   r_   r   fromCoroutiner   r   rl   objectr"   
providedByr!   )rf   rootr9   rL   re   rd   rj   	slotValuerendererName	rootClonerenderMethodrY   rw   kvelementescapedrg   s   `  `             @r1   rb   rb      sn    b =H/<+0	

9
 -
 )	

 
J
- $%k$ 	D$	!$))Xt||D		""	D%	 ll499%&f	D'	"gnTYY'(f	D#	&{{#$ :<. I> ?  

5)I#I(;;LIL!'95FF##LLN||DMM**ddllC(ll))'2GllGgOO))+ 		DAq!S!HHW%$(U"# /7QRW7X  $K		 ==L1E$K DMM+;<<%'/D()&M	D5$6	7 	%GG$$	%	D'	"T\\O+gnnW%&	D(	#U4[))	T	""Yx4fkIJDQ
 	

 
			%W%d33d##s   OO$c           	     8  	
K   g 	d
d	
fd}d		
fdt        | ||g dt              g}|rD	 t        |d         }t        |t              r         | d{   }|j                  |       |rD         y7  # t        $ r |j                          Y (t        $ rt}g }|D ]7  }|j                  |j                  |j                  j                  d          9 |j                          t        ||t        t               d               d}~ww xY ww)
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   c                f    j                  |        t        |       z  t        k\  r         y y rR   )rq   lenBUFFER_SIZE)bsbufbufSizeflushBuffers    r1   bufferedWritez#_flattenTree.<locals>.bufferedWrite  s.    

23r7k!M "r3   c                 N    dkD  r dj                                 d d = dy y )Nr   r3   )join)r   r   r9   s   r1   r   z!_flattenTree.<locals>.flushBuffer  s+    Q;#((3- AG r3   NrE   r      )r   r;   r<   r=   )r<   r=   )rb   r2   nextr+   r   rq   StopIterationrv   	Exceptiongi_framef_localsr   r   r   )rf   r   r9   r   stackr   eroots	generatorr   r   r   s     `      @@@r1   _flattenTreer   s  s    ( CG 	}b$@PQ-E 	"59oG'8,  '- LL!% * M ( 	IIK 	FE" F	%%1LL!3!3!<!<V!DEF IIK E:hjm+DEE	FsS   ,D*B  A>B  "D6D>B   DDD#D7ADDDc                .    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   )rf   r   r9   s      r1   flattenr     s    2 ,we<==r3   c                    t               t        | |j                        }|j                  f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                $    j                         S rR   )getvalue)rT   ios    r1   rV   zflattenString.<locals>.<lambda>  s    BKKM r3   )r   r   r9   ri   r   r   r;   )rf   r   rU   r   s      @r1   flattenStringr     s<     
Brxx(AMM)*##r3   )r0   zUnion[bytes, str]r<   r;   )r9   ro   r<   zCallable[[bytes], None]rR   )rK   r,   rL   z-Sequence[Optional[Mapping[str, Flattenable]]]rM   zOptional[Flattenable]r<   rl   )rU   Deferred[T]r<   r   )rf   Optional[IRequest]r   rl   r9   ro   rL   z)List[Optional[Mapping[str, Flattenable]]]re   rn   rd   rm   r<   zMGenerator[Union[Generator[Any, Any, Any], Deferred[Flattenable]], None, None])rf   r   r   rl   r9   ro   r<   r=   )rf   r   r   rl   r9   ro   r<   zDeferred[None])rf   r   r   rl   r<   zDeferred[bytes])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   rl   r   r2   r5   r?   rB   rH   rO   r_   rb   r   r   r   r>   r3   r1   <module>r      s  
 #          < . * N N K K 2CL  			

#$	"D$./!"h+,f6JJK &&,$,,^4. &*!
!;! #! 	!"&N$N$
N$ %N$ 8	N$
 )N$ 6N$ SN$bEE'2E;TE	EP>>'2>;T>>8$r3   