3
ûâde�=  ã               @   s€  d dl mZmZmZ d dlmZ d dlZd dlmZm	Z	 ddl
mZmZmZ ddl
mZmZmZ ddlmZmZ d d	lmZ d
jeƒd Zejde d ƒZejde d ƒZi ZedƒdkZx€eejƒ ƒD ]p\Z Z!eräee!ƒdksÌe røee!ƒdkrøqÌe!dkrÌee!ƒdk�rej"e!ƒZ!ne#e!ƒZ!e!ek�s4e j$ƒ rÌe ee!< qÌW dd„ Z%ede%ƒ ddd„Z&G dd„ de'ƒZ(G dd„ de)ƒZ*dS )é    )Úabsolute_importÚdivisionÚunicode_literals)Ú	text_typeN)Úregister_errorÚxmlcharrefreplace_errorsé   )ÚvoidElementsÚbooleanAttributesÚspaceCharacters)ÚrcdataElementsÚentitiesÚxmlEntities)ÚtreewalkersÚ_utils)ÚescapeÚ z"'=<>`ú[ú]u_    	
 /`Â áš€á Žá �â€€â€�â€‚â€ƒâ€„â€…â€†â€‡â€ˆâ€‰â€Šâ€¨â€©â€¯â�Ÿã€€]u   ô�¿¿é   ú&c       
      C   s"  t | ttfƒ�rg }g }d}xˆt| j| j| j… ƒD ]n\}}|rFd}q4|| j }tj| j|t	| j|d gƒ… ƒr�tj
| j||d … ƒ}d}nt|ƒ}|j|ƒ q4W x^|D ]V}tj|ƒ}	|	rè|jdƒ |j|	ƒ |	jdƒsæ|jdƒ q¬|jdt|ƒdd …  ƒ q¬W dj|ƒ| jfS t| ƒS d S )NFr   Tr   ú;z&#x%s;r   )Ú
isinstanceÚUnicodeEncodeErrorÚUnicodeTranslateErrorÚ	enumerateÚobjectÚstartÚendr   ÚisSurrogatePairÚminÚsurrogatePairToCodepointÚordÚappendÚ_encode_entity_mapÚgetÚendswithÚhexÚjoinr   )
ÚexcÚresÚ
codepointsÚskipÚiÚcÚindexÚ	codepointÚcpÚe© r3   ú>/tmp/pip-build-red6nood/pip/pip/_vendor/html5lib/serializer.pyÚhtmlentityreplace_errors*   s0     
"




r5   ÚhtmlentityreplaceÚetreec             K   s$   t j|ƒ}tf |Ž}|j|| ƒ|ƒS )a˜  Serializes the input token stream using the specified treewalker

    :arg input: the token stream to serialize

    :arg tree: the treewalker to use

    :arg encoding: the encoding to use

    :arg serializer_opts: any options to pass to the
        :py:class:`html5lib.serializer.HTMLSerializer` that gets created

    :returns: the tree serialized as a string

    Example:

    >>> from html5lib.html5parser import parse
    >>> from html5lib.serializer import serialize
    >>> token_stream = parse('<html><body><p>Hi!</p></body></html>')
    >>> serialize(token_stream, omit_optional_tags=False)
    '<html><head></head><body><p>Hi!</p></body></html>'

    )r   ÚgetTreeWalkerÚHTMLSerializerÚrender)ÚinputÚtreeÚencodingÚserializer_optsÚwalkerÚsr3   r3   r4   Ú	serializeK   s    

rA   c               @   s~   e Zd ZdZdZdZdZdZdZdZ	dZ
dZdZdZdZdZdZd!Zdd„ Zdd„ Zdd„ Zd"dd„Zd#dd„Zd$dd „ZdS )%r9   Úlegacyú"TFÚquote_attr_valuesÚ
quote_charÚuse_best_quote_charÚomit_optional_tagsÚminimize_boolean_attributesÚuse_trailing_solidusÚspace_before_trailing_solidusÚescape_lt_in_attrsÚescape_rcdataÚresolve_entitiesÚalphabetical_attributesÚinject_meta_charsetÚstrip_whitespaceÚsanitizec          	   K   sz   t |ƒt | jƒ }t|ƒdkr2tdtt|ƒƒ ƒ‚d|kr@d| _x(| jD ]}t| ||j|t	| |ƒƒƒ qHW g | _
d| _dS )aB
  Initialize HTMLSerializer

        :arg inject_meta_charset: Whether or not to inject the meta charset.

            Defaults to ``True``.

        :arg quote_attr_values: Whether to quote attribute values that don't
            require quoting per legacy browser behavior (``"legacy"``), when
            required by the standard (``"spec"``), or always (``"always"``).

            Defaults to ``"legacy"``.

        :arg quote_char: Use given quote character for attribute quoting.

            Defaults to ``"`` which will use double quotes unless attribute
            value contains a double quote, in which case single quotes are
            used.

        :arg escape_lt_in_attrs: Whether or not to escape ``<`` in attribute
            values.

            Defaults to ``False``.

        :arg escape_rcdata: Whether to escape characters that need to be
            escaped within normal elements within rcdata elements such as
            style.

            Defaults to ``False``.

        :arg resolve_entities: Whether to resolve named character entities that
            appear in the source tree. The XML predefined entities &lt; &gt;
            &amp; &quot; &apos; are unaffected by this setting.

            Defaults to ``True``.

        :arg strip_whitespace: Whether to remove semantically meaningless
            whitespace. (This compresses all whitespace to a single space
            except within ``pre``.)

            Defaults to ``False``.

        :arg minimize_boolean_attributes: Shortens boolean attributes to give
            just the attribute value, for example::

              <input disabled="disabled">

            becomes::

              <input disabled>

            Defaults to ``True``.

        :arg use_trailing_solidus: Includes a close-tag slash at the end of the
            start tag of void elements (empty elements whose end tag is
            forbidden). E.g. ``<hr/>``.

            Defaults to ``False``.

        :arg space_before_trailing_solidus: Places a space immediately before
            the closing slash in a tag using a trailing solidus. E.g.
            ``<hr />``. Requires ``use_trailing_solidus=True``.

            Defaults to ``True``.

        :arg sanitize: Strip all unsafe or unknown constructs from output.
            See :py:class:`html5lib.filters.sanitizer.Filter`.

            Defaults to ``False``.

        :arg omit_optional_tags: Omit start/end tags that are optional.

            Defaults to ``True``.

        :arg alphabetical_attributes: Reorder attributes to be in alphabetical order.

            Defaults to ``False``.

        r   z2__init__() got an unexpected keyword argument '%s'rE   FN)Ú	frozensetÚoptionsÚlenÚ	TypeErrorÚnextÚiterrF   Úsetattrr%   ÚgetattrÚerrorsÚstrict)ÚselfÚkwargsÚunexpected_argsÚattrr3   r3   r4   Ú__init__‡   s    OzHTMLSerializer.__init__c             C   s*   t |tƒst‚| jr"|j| jdƒS |S d S )Nr6   )r   r   ÚAssertionErrorr=   Úencode)r\   Ústringr3   r3   r4   rb   à   s    zHTMLSerializer.encodec             C   s*   t |tƒst‚| jr"|j| jdƒS |S d S )Nr[   )r   r   ra   r=   rb   )r\   rc   r3   r3   r4   ÚencodeStrictç   s    zHTMLSerializer.encodeStrictNc             c   sò  || _ d}g | _|r0| jr0ddlm} |||ƒ}| jrJddlm} ||ƒ}| jrdddlm} ||ƒ}| j	r~ddl
m} ||ƒ}| jr˜ddlm} ||ƒ}�xR|D �]H}|d }|dk�r`d|d  }|d rÞ|d	|d  7 }n|d
 rî|d7 }|d
 �rJ|d
 jdƒdk�r0|d
 jdƒdk�r*| jdƒ d}nd}|d||d
 |f 7 }|d7 }| j|ƒV  q |d5k�rÆ|dk�sz|�r°|�rž|d jdƒdk�rž| jdƒ | j|d ƒV  n| jt|d ƒƒV  q |d6k�rò|d }	| jd|	 ƒV  |	tk�r| j �rd}n|�r| jdƒ �xš|d jƒ D �]ˆ\\}
}}|}|}| jdƒV  | j|ƒV  | j �s‚|tj|	tƒ ƒk�r"|tjdtƒ ƒk�r"| jdƒV  | jdk�s¨t|ƒdk�r®d}n@| jd k�rÊtj|ƒd k	}n$| jd!k�rætj|ƒd k	}ntd"ƒ‚|jd#d$ƒ}| j �r|jd%d&ƒ}|�rž| j!}| j"�rTd|k�r<d|k�r<d}nd|k�rTd|k�rTd}|dk�rl|jdd'ƒ}n|jdd(ƒ}| j|ƒV  | j|ƒV  | j|ƒV  n| j|ƒV  �q"W |	t#k�rä| j$�rä| j%�rØ| jd)ƒV  n| jd*ƒV  | jdƒV  q |d+k�r6|d }	|	tk�rd}n|�r$| jdƒ | jd,|	 ƒV  q |d-k�rx|d }|jd.ƒdk�rb| jd/ƒ | jd0|d  ƒV  q |d1k�rÜ|d }	|	d2 }|t&k�rª| jd3|	 ƒ | j'�rÆ|t(k�rÆt&| }nd4|	 }| j|ƒV  q | j|d ƒ q W d S )7NFr   )ÚFilterÚtypeÚDoctypez<!DOCTYPE %sÚnameÚpublicIdz PUBLIC "%s"ÚsystemIdz SYSTEMrC   r   ú'zBSystem identifier contains both single and double quote charactersz %s%s%sú>Ú
CharactersÚSpaceCharactersÚdataz</zUnexpected </ in CDATAÚStartTagÚEmptyTagz<%sTz+Unexpected child element of a CDATA elementú r   ú=ÚalwaysÚspecrB   z?quote_attr_values must be one of: 'always', 'spec', or 'legacy'r   z&amp;ú<z&lt;z&#39;z&quot;z /ú/ÚEndTagz</%s>ÚCommentz--zComment contains --z	<!--%s-->ÚEntityr   zEntity %s not recognizedz&%s;)rm   rn   )rp   rq   ))r=   rZ   rO   Úfilters.inject_meta_charsetre   rN   Úfilters.alphabeticalattributesrP   Úfilters.whitespacerQ   Úfilters.sanitizerrG   Úfilters.optionaltagsÚfindÚserializeErrorrd   rb   r   r   rL   ÚitemsrH   r
   r%   ÚtuplerD   rT   Ú_quoteAttributeSpecÚsearchÚ_quoteAttributeLegacyÚ
ValueErrorÚreplacerK   rE   rF   r	   rI   rJ   r   rM   r   )r\   Ú
treewalkerr=   Úin_cdatare   Útokenrf   ÚdoctyperE   rh   Ú_Ú	attr_nameÚ
attr_valueÚkÚvÚ
quote_attrro   Úkeyr3   r3   r4   rA   î   sØ    


















zHTMLSerializer.serializec             C   s2   |rdj t| j||ƒƒƒS dj t| j|ƒƒƒS dS )an  Serializes the stream from the treewalker into a string

        :arg treewalker: the treewalker to serialize

        :arg encoding: the string encoding to use

        :returns: the serialized tree

        Example:

        >>> from html5lib import parse, getTreeWalker
        >>> from html5lib.serializer import HTMLSerializer
        >>> token_stream = parse('<html><body>Hi!</body></html>')
        >>> walker = getTreeWalker('etree')
        >>> serializer = HTMLSerializer(omit_optional_tags=False)
        >>> serializer.render(walker(token_stream))
        '<html><head></head><body>Hi!</body></html>'

        ó    r   N)r(   ÚlistrA   )r\   r‰   r=   r3   r3   r4   r:   w  s    zHTMLSerializer.renderúXXX ERROR MESSAGE NEEDEDc             C   s   | j j|ƒ | jrt‚d S )N)rZ   r#   r[   ÚSerializeError)r\   ro   r3   r3   r4   r�   �  s    zHTMLSerializer.serializeError)rD   rE   rF   rG   rH   rI   rJ   rK   rL   rM   rN   rO   rP   rQ   )N)N)r–   )Ú__name__Ú
__module__Ú__qualname__rD   rE   rF   rG   rH   rI   rJ   rK   rL   rM   rN   rO   rP   rQ   rS   r`   rb   rd   rA   r:   r�   r3   r3   r3   r4   r9   h   s6        Y
 

r9   c               @   s   e Zd ZdZdS )r—   zError in serialized treeN)r˜   r™   rš   Ú__doc__r3   r3   r3   r4   r—   —  s   r—   )r7   N)+Ú
__future__r   r   r   Zpip._vendor.sixr   ÚreÚcodecsr   r   Ú	constantsr	   r
   r   r   r   r   r   r   r   Úxml.sax.saxutilsr   r(   Ú_quoteAttributeSpecCharsÚcompiler„   r†   r$   rT   Ú_is_ucs4r•   r‚   r�   r‘   r!   r"   Úislowerr5   rA   r   r9   Ú	Exceptionr—   r3   r3   r3   r4   Ú<module>   s<   
	

  1