U .e=@szddlmZmZmZddlmZddlZddlmZm Z ddl m Z m Z m Z ddl mZmZmZddlmZmZdd lmZd e d Zed ed Zed edZiZeddkZeeD]n\Z Z!eree!dksesee!dkrqe!dkree!dkre"e!Z!ne#e!Z!e!eks0e $re ee!<qddZ%ede%dddZ&Gddde'Z(Gddde)Z*dS))absolute_importdivisionunicode_literals) text_typeN)register_errorxmlcharrefreplace_errors) voidElementsbooleanAttributesspaceCharacters)rcdataElementsentities xmlEntities) treewalkers_utils)escapez"'=<>`[]u_  /`  ᠎᠏           

   ]u􏿿&c Cst|ttfrg}g}d}t|j|j|jD]n\}}|rDd}q2||j}t|j|t |j|dgrt |j||d}d}nt |}| |q2|D]V}t |} | r| d| | | ds| dq| dt|ddqd||jfSt|SdS)NFrTr;z&#x%s;r) isinstanceUnicodeEncodeErrorUnicodeTranslateError enumerateobjectstartendrZisSurrogatePairminsurrogatePairToCodepointordappend_encode_entity_mapgetendswithhexjoinr) excresZ codepointsskipicindexZ codepointZcper/C/usr/lib/python3.8/site-packages/pip/_vendor/html5lib/serializer.pyhtmlentityreplace_errors*s0 "      r1htmlentityreplaceetreecKs$t|}tf|}||||S)aSerializes 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('

Hi!

') >>> serialize(token_stream, omit_optional_tags=False) '

Hi!

' )rZ getTreeWalkerHTMLSerializerrender)inputZtreeencodingZserializer_optsZwalkersr/r/r0 serializeKs  r9c@s~eZdZdZdZdZdZdZdZdZ dZ dZ dZ dZ dZdZdZdZddZdd Zd d Zdd dZdddZdddZd S)r4legacy"TF)quote_attr_values quote_charuse_best_quote_charomit_optional_tagsminimize_boolean_attributesuse_trailing_solidusspace_before_trailing_solidusescape_lt_in_attrs escape_rcdataresolve_entitiesalphabetical_attributesinject_meta_charsetstrip_whitespacesanitizec Ksvt|t|j}t|dkr2tdtt|d|kr@d|_|jD]}t||||t ||qFg|_ d|_ dS)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 < > & " ' 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:: becomes:: 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. ``
``. 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. ``
``. 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``. rz2__init__() got an unexpected keyword argument '%s'r=FN) frozensetoptionslen TypeErrornextiterr>setattrr$getattrerrorsstrict)selfkwargsZunexpected_argsattrr/r/r0__init__sO  zHTMLSerializer.__init__cCs*t|tst|jr"||jdS|SdS)Nr2rrAssertionErrorr7encoderTstringr/r/r0rZszHTMLSerializer.encodecCs*t|tst|jr"||jdS|SdS)NrSrXr[r/r/r0 encodeStrictszHTMLSerializer.encodeStrictNccs||_d}g|_|r0|jr0ddlm}|||}|jrJddlm}||}|jrdddlm}||}|j r~ddl m}||}|j rddl m}||}|D]>}|d}|dkr\d|d}|dr|d |d7}n|d r|d 7}|d rF|d  d d kr,|d  dd kr&|dd}nd }|d||d |f7}|d7}||Vq|dkr|dksv|r|r|d dd kr|d||dVn|t|dVq|dkr|d} |d| V| tkr|jsd}n|r |d|dD]\\} } } | } | }|dV|| V|jrv| t| tkr| tdtkr|dV|jdkst|d krd}n@|jdkrt|dk }n$|jd krt|dk }ntd!|d"d#}|j r|d$d%}|r|j!}|j"rHd|kr0d |kr0d }nd |krHd|krHd}|dkr`|dd&}n |d d'}||V||V||Vn ||Vq| t#kr|j$r|j%r|d(Vn |d)V|dVq|d*kr(|d} | tkrd}n|r|d|d+| Vq|d,krj|d}| d-d krT|d.|d/|dVq|d0kr|d} | d1}|t&kr|d2| |j'r|t(krt&|}nd3| }||Vq||dqdS)4NFr)FiltertypeZDoctypez )Z CharactersSpaceCharactersrcdatazCommentz--zComment contains --z ZEntityrzEntity %s not recognizedz&%s;))r7rRrGZfilters.inject_meta_charsetr^rFZfilters.alphabeticalattributesrHZfilters.whitespacerIZfilters.sanitizerr?Zfilters.optionaltagsfindserializeErrorr]rZrr rDitemsr@r r$tupler<rL_quoteAttributeSpecsearch_quoteAttributeLegacy ValueErrorreplacerCr=r>r rArBr rEr)rT treewalkerr7Zin_cdatar^tokenr_Zdoctyper=r`_Z attr_nameZ attr_valuekvZ quote_attrrdkeyr/r/r0r9s                                    zHTMLSerializer.serializecCs2|rdt|||Sdt||SdS)anSerializes 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('Hi!') >>> walker = getTreeWalker('etree') >>> serializer = HTMLSerializer(omit_optional_tags=False) >>> serializer.render(walker(token_stream)) 'Hi!' rN)r'listr9)rTrur7r/r/r0r5wszHTMLSerializer.renderXXX ERROR MESSAGE NEEDEDcCs|j||jrtdS)N)rRr"rSSerializeError)rTrdr/r/r0rms zHTMLSerializer.serializeError)N)N)r})__name__ __module__ __qualname__r<r=r>r?r@rArBrCrDrErFrGrHrIrKrWrZr]r9r5rmr/r/r/r0r4hs,Y  r4c@seZdZdZdS)r~zError in serialized treeN)rrr__doc__r/r/r/r0r~sr~)r3N)+Z __future__rrrZpip._vendor.sixrrecodecsrrZ constantsr r r r r rrrrZxml.sax.saxutilsrr'Z_quoteAttributeSpecCharscompilerprrr#rLZ_is_ucs4r|rnrxryr r!islowerr1r9rr4 Exceptionr~r/r/r/r0sD          1