
    (ph>Y                        S r S/rSSKJrJrJrJrJrJrJ	r	J
r
Jr  SSKJr  SSKJrJrJrJrJrJr  SSKrSSKJrJrJrJrJr  SSKJrJrJr  SSK r SS	K!J"r"  SS
KJ#r#J$r$J%r%J&r&  \	(       a  SSK'J(r(  SSK)J*r+   " S S\5      r, " S S\+RZ                  5      r. " S S\/5      r0 " S S\+Rb                  5      r2 " S S\25      r3 " S S\25      r4g)MITHTML5TreeBuilder    )	AnycastDictIterableOptionalSequenceTYPE_CHECKINGTupleUnion)	TypeAlias)_AttributeValue_AttributeValues	_Encoding
_Encodings_NamespaceURL
_RawMarkupN)DetectsXMLParsedAsHTML
PERMISSIVEHTMLHTML_5HTMLTreeBuilder)NamespacedAttributePageElementnonwhitespace_re)
namespaces)CommentDoctypeNavigableStringTagBeautifulSoup)basec                       \ rS rSr% SrSr\\S'   \\\	\
/r\\   \S'   Sr\\S'   S\S	'   \\   \S
'      SS\S
\\   S\\   S\\   S\\\\\   \\   \4      4
S jjrS\SS4S jrS\SS4S jrS\S\4S jrSrg)r   ;   a>  Use `html5lib <https://github.com/html5lib/html5lib-python>`_ to
build a tree.

Note that `HTML5TreeBuilder` does not support some common HTML
`TreeBuilder` features. Some of these features could theoretically
be implemented, but at the very least it's quite difficult,
because html5lib moves the parse tree around as it's being built.

Specifically:

* This `TreeBuilder` doesn't use different subclasses of
  `NavigableString` (e.g. `Script`) based on the name of the tag
  in which the string was found.
* You can't use a `SoupStrainer` to parse only part of a document.
html5libNAMEfeaturesTTRACKS_LINE_NUMBERSTreeBuilderForHtml5libunderlying_builderuser_specified_encodingNmarkupdocument_declared_encodingexclude_encodingsreturnc              #      #    X l         US4US44 H*  u  pVU(       d  M  [        R                  " SU SU S3SS9  M,     [        R                  " USS9  US S S4v   g 7f)	Nr/   r0   zYou provided a value for z0, but the html5lib tree builder doesn't support .   
stacklevelF)r-   warningswarnr   warn_if_markup_looks_like_xml)selfr.   r-   r/   r0   variablenames          H/var/www/html/venv/lib/python3.13/site-packages/bs4/builder/_html5lib.pyprepare_markupHTML5TreeBuilder.prepare_markupW   s}      (?$ ()EF 34
NH x/v5efjekklm 
 	<<VPQRtT5))s
   A>Ac                 8   U R                   b,  U R                   R                  b  [        R                  " SSS9  [        R
                  " U R                  S9nU R                  c   eX R                  l        [        5       n[        U[        5      (       d  U R                  US'   UR                  " U40 UD6n[        U[        5      (       a  SUl        O5UR                  R                   R"                  S   nUR$                  nXTl        SU R                  l        g)zyRun some incoming markup through some parsing process,
populating the `BeautifulSoup` object in `HTML5TreeBuilder.soup`.
NzYou provided a value for parse_only, but the html5lib tree builder doesn't support parse_only. The entire document will be parsed.   r5   )treeoverride_encodingr   )soup
parse_onlyr7   r8   r'   
HTMLParsercreate_treebuilderr,   parserdict
isinstancestrr-   parseoriginal_encoding	tokenizerstreamcharEncodingr<   )r:   r.   rH   extra_kwargsdocrM   s         r=   feedHTML5TreeBuilder.feedu   s     99 TYY%9%9%EMM U $$$*A*AB&&222)/&v&#&& 150L0LL,-ll62\2 fc"" %)C! & 0 0 7 7 D DQ G !2 6 6$5!)-&    namespaceHTMLElementsc                 `    [        XR                  U R                  S9U l        U R                  $ )zCalled by html5lib to instantiate the kind of class it
calls a 'TreeBuilder'.

:param namespaceHTMLElements: Whether or not to namespace HTML elements.

:meta private:
)store_line_numbers)r+   rD   rX   r,   )r:   rV   s     r=   rG   #HTML5TreeBuilder.create_treebuilder   s.     #9!99AXAX#
 &&&rU   fragmentc                     SU-  $ )zSee `TreeBuilder`.z)<html><head></head><body>%s</body></html> )r:   rZ   s     r=   test_fragment_to_document*HTML5TreeBuilder.test_fragment_to_document   s    :XEErU   )r,   r-   )NNN)__name__
__module____qualname____firstlineno____doc__r(   rK   __annotations__r   r   r   r)   r
   r*   boolr	   r   r   r   r   r   r>   rS   rG   r]   __static_attributes__r\   rU   r=   r   r   ;   s      D##Z>Hhsm> !%$00%i00
 8<:>26** "*)!4* %-Y$7	*
 $J/* 
%
HY$7)9LdRS	T*<#.: #.$ #.J'%)'	!'F# F# FrU   c            	         ^  \ rS rSr% S\S'   \\R                     \S'     SS\S\S   S\S\	4U 4S	 jjjr
SS jrS\\\	4   S
S4S jrS\S\S
S4S jrS\S
S4S jrSS jrSS jrSS jrSS jrSSS
\4S jrSrU =r$ ) r+      r#   rD   rH   NrV   rX   kwargsc                    > U(       a  X l         O0[        R                  " S[        SS9  SSKJn  U"  SSU0UD6U l         [        [        U ]#  U5        S U l	        X0l
        g )NaK  The optionality of the 'soup' argument to the TreeBuilderForHtml5lib constructor is deprecated as of Beautiful Soup 4.13.0: 'soup' is now required. If you can't pass in a BeautifulSoup object here, or you get this warning and it seems mysterious to you, please contact the Beautiful Soup developer team for possible un-deprecation.   r5   r   r"   rX   ) zhtml.parser)rD   r7   r8   DeprecationWarningbs4r#   superr+   __init__rH   rX   )r:   rV   rD   rX   ri   r#   	__class__s         r=   rp   TreeBuilderForHtml5lib.__init__   sm     IMM ^"
 *
 &!6HLRDI 	$d45JK "4rU   r1   Elementc                 x    U R                   R                  5         [        U R                   U R                   S 5      $ N)rD   resetrs   r:   s    r=   documentClass$TreeBuilderForHtml5lib.documentClass   s'    		tyy$))T22rU   tokenc                     [        [        US   5      n[        [        [           US   5      n[        [        [           US   5      n[        R                  " X#U5      nU R
                  R                  U5        g )Nr<   publicIdsystemId)r   rK   r	   r   for_name_and_idsrD   object_was_parsed)r:   rz   r<   r|   r}   doctypes         r=   insertDoctype$TreeBuilderForHtml5lib.insertDoctype   s`    eFm,"&x}eJ6G"H"&x}eJ6G"H**48D		##G,rU   r<   	namespacec                    S nS nU R                   bK  U R                  (       a:  U R                   R                  R                  R	                  5       u  p4Uc   eUS-
  nU R
                  R                  XX4S9n[        XPR
                  U5      $ )N   )
sourceline	sourcepos)rH   rX   rN   rO   positionrD   new_tagrs   )r:   r<   r   r   r   tags         r=   elementClass#TreeBuilderForHtml5lib.elementClass   s    $(
#'	;;"t'>'> %)KK$9$9$@$@$I$I$K!J(((!AIii
   
 sIIy11rU   dataTextNodec                 @    [        [        U5      U R                  5      $ ru   )r   r   rD   )r:   r   s     r=   commentClass#TreeBuilderForHtml5lib.commentClass   s    tyy11rU   c                     [        5       e)zThis is only used by html5lib HTMLParser.parseFragment(),
which is never used by Beautiful Soup, only by the html5lib
unit tests. Since we don't currently hook into those tests,
the implementation is left blank.
NotImplementedErrorrw   s    r=   fragmentClass$TreeBuilderForHtml5lib.fragmentClass   s     "##rU   c                     [        5       ezThis is only used by the html5lib unit tests. Since we
don't currently hook into those tests, the implementation is
left blank.
r   rw   s    r=   getFragment"TreeBuilderForHtml5lib.getFragment       
 "##rU   c                 N    U R                   R                  UR                  5        g ru   )rD   appendelementr:   nodes     r=   appendChild"TreeBuilderForHtml5lib.appendChild  s     			&rU   c                     U R                   $ ru   )rD   rw   s    r=   getDocument"TreeBuilderForHtml5lib.getDocument
  s    yyrU   r   c                     [        5       er   r   r:   r   s     r=   testSerializer%TreeBuilderForHtml5lib.testSerializer  r   rU   )rH   rD   rX   )NT)r1   rs   r   rs   r1   N)r1   r#   )r_   r`   ra   rb   rd   r	   r'   rF   re   r   rp   rx   r   rK   r   r   r   r   r   r   r   r   rf   __classcell__)rq   s   @r=   r+   r+      s    
X(())
 +/#'	5#5 '5 !	5
 5 5B3-4S> -d -2 2 2 2 2 2 2$$'$i $C $ $rU   r+   c                       \ rS rSr% Sr\\S'   \\S'   S\4S jrS\	\
\\4      4S jrS\S	\SS
4S jrS\	\
\\4      4S jrS\	\   4S jrS\4S jrS\S\4S jrS\S\4S jrSrg
)AttrListi  z@Represents a Tag's attributes in a way compatible with html5lib.r   attrsc                 X    Xl         [        U R                   R                  5      U l        g ru   )r   rI   r   r   s     r=   rp   AttrList.__init__  s    $,,,,-
rU   r1   c                 d    [        U R                  R                  5       5      R                  5       $ ru   )listr   items__iter__rw   s    r=   r   AttrList.__iter__  s#    DJJ$$&'0022rU   r<   valueNc                    U R                   R                  =(       d    0 nXR                  S/ 5      ;   dC  U R                   R                  U;   a  XR                  U R                   R                  / 5      ;   a[  [	        U[
        5      (       dF  [	        U[        5      (       d   eU R                   R                  [        R                  " U5      5      nX R                   U'   g )N*)
r   cdata_list_attributesgetr<   rJ   r   rK   attribute_value_list_classr   findall)r:   r<   r   	list_attrs       r=   __setitem__AttrList.__setitem__"  s     LL66<"	==b))LL*dll&7&7<< eT**!%----??$,,U3 #TrU   c                 H    [        U R                  R                  5       5      $ ru   )r   r   r   rw   s    r=   r   AttrList.items3  s    DJJ$$&''rU   c                 H    [        U R                  R                  5       5      $ ru   r   r   keysrw   s    r=   r   AttrList.keys6  s    DJJOO%&&rU   c                 ,    [        U R                  5      $ ru   )lenr   rw   s    r=   __len__AttrList.__len__9  s    4::rU   c                      U R                   U   $ ru   )r   r:   r<   s     r=   __getitem__AttrList.__getitem__<  s    zz$rU   c                 N    U[        U R                  R                  5       5      ;   $ ru   r   r   s     r=   __contains__AttrList.__contains__?  s    tDJJOO-...rU   )r   r   )r_   r`   ra   rb   rc   r!   rd   r   rp   r   r   rK   r   r   r   r   r   intr   r   re   r   rf   r\   rU   r=   r   r     s    JL. .3(5o)=#>? 3# #O # #"(xc?&: ;< ('hsm '      / / /rU   r   c                   t    \ rS rSr% \\S'   S\S'   \\   \S'   \S\	4S j5       r
S\R                  4S jrS	rg
)BeautifulSoupNodeiC  r   r#   rD   r   r1   c                     [        5       e)zReturn the html5lib constant corresponding to the type of
the underlying DOM object.

NOTE: This property is only accessed by the html5lib test
suite, not by Beautiful Soup proper.
r   rw   s    r=   nodeTypeBeautifulSoupNode.nodeTypeH  s     "##rU   c                     [        5       eru   r   rw   s    r=   	cloneNodeBeautifulSoupNode.cloneNodeT  s    !##rU   r\   N)r_   r`   ra   rb   r   rd   r	   r   propertyr   r   treebuilder_baseNoder   rf   r\   rU   r=   r   r   C  sE    
&&$# $ $$+00 $rU   r   c                   r   \ rS rSr% \\S'   \\   \S'   S\SSS\\   4S jrSS
 jr	S\
4S jr\\\\\4   4   r\\S'   \\\4   r\\S'   S\\   SS	4S jr\" \\5      r SS\S\S   SS	4S jjr      SS jrSS jrSS jrS\4S jrS\R:                  4S jrS\\\   \4   4S jr\" \5      r Sr!g	)rs   iX  r   r   rD   r#   c                 z    [         R                  R                  XR                  5        Xl        X l        X0l        g ru   )r   r   rp   r<   r   rD   r   )r:   r   rD   r   s       r=   rp   Element.__init__\  s+     	&&t\\:	"rU   r   r1   Nc                    S n[        UR                  5      [        L a  UR                  =p#OUR                  nXl        Ub<  UR                  b/  [	        U[
        5      (       d  UR                  R                  5         Ub  U R                  R                  (       a  [        U R                  R                  S   5      [        L aX  U R                  R                  S   nU R                  R                  XB-   5      nUR                  U5        XPR                  l        g [	        U[
        5      (       a  U R                  R                  U5      nU R                  R                  (       a  U R                  R                  S5      nO>U R                  R                  b  U R                  R                  5       nOU R                  nU R                  R                  X0R                  US9  g )NF)parentmost_recent_element)typer   r    r   rJ   rK   extractcontentsrD   
new_stringreplace_with_most_recent_element_last_descendantnext_elementr   )r:   r   string_childchildold_elementnew_elementr   s          r=   r   Element.appendChildd  sn   260#'<</L5LLE (uc**LL  " $%%T\\**2./?B
 ,,//3K))..{/IJK$$[1-8II*$$$		,,T2
 ||$$&*ll&C&CE&J#**6
 '+ii&@&@&B#&*ll#II''ll@S ( rU   c                 n    [        U R                  [        5      (       a  0 $ [        U R                  5      $ ru   )rJ   r   r   r   rw   s    r=   getAttributesElement.getAttributes  s'    dllG,,I%%rU   _Html5libAttributeName_Html5libAttributes
attributesc                    Ub  [        U5      S:  a  [        UR                  5       5       H*  u  p#[        U[        5      (       d  M  [        U6 nX	 X1U'   M,     [        [        U5      nU R                  R                  R                  U R                  U5        [        UR                  5       5       H  u  p&X`R                  U'   M     U R                  R                  R                  U R                  5        g g g Nr   )r   r   r   rJ   tupler   r   r   rD   builder$_replace_cdata_list_attribute_valuesr<   r   set_up_substitutions)r:   r   r<   r   new_namenormalized_attributesvalue_or_valuess          r=   setAttributesElement.setAttributes  s    !c*o&9  $J$4$4$67dE**2D9H"(+0x(	  8 %))9:$F! IIBB		0 *..C.I.I.K)L%%4T" *M II224<<@; ':!rU   r   insertBeforec                     [        U R                  R                  U5      U R                  5      nU(       a  U R                  X25        g U R	                  U5        g ru   )r   rD   r   r  r   )r:   r   r  texts       r=   
insertTextElement.insertText  sB     		,,T2DII>d1T"rU   c                 <   U R                   R                  UR                   5      n[        UR                   5      [        L a  U R                   R                  (       a  [        U R                   R                  US-
     5      [        L ai  U R                   R                  US-
     n[        U5      [        L d   eU R
                  R                  XAR                   -   5      nUR                  U5        g U R                   R                  X1R                   5        Xl	        g )Nr   )
r   indexr   r    r   rD   r   r   insertr   )r:   r   refNoder  old_nodenew_strs         r=   r  Element.insertBefore  s     ""7??3/1%%T\\**51956/I ||,,UQY7H>_444ii**8ll+BCG!!'*LL||4KrU   c                 8    UR                   R                  5         g ru   )r   r   r   s     r=   removeChildElement.removeChild  s    rU   c                 l   U R                   nUR                   nUR                  nUR                  SS5      n[        UR                  5      S:  a!  Uc   eUR                  S   nUR
                  nOSnUR
                  nUR                  n[        U5      S:  ad  US   n	Ub  XYl        OX9l        Xil        Ub  Xl        OXl        Ub  Xl        US   R                  SSS9n
U
c   eUU
l        Ub  U
Ul        SU
l        U H$  nX;l        UR                  R                  U5        M&     / Ul        XBl        g)z1Move all of this tag's children into another tag.Fr   Nr   T)is_initializedaccept_self)
r   next_siblingr   r   r   r   previous_elementprevious_siblingr   r   )r:   
new_parentr   new_parent_elementfinal_next_elementnew_parents_last_descendantnew_parents_last_child(new_parents_last_descendant_next_element	to_appendfirst_childlast_childs_last_descendantr   s               r=   reparentChildrenElement.reparentChildren  sv    ,,'// %11&8&I&I%QV&W#!**+a/ /:::%7%@%@%D"+88 5
 &*"7I7V7V4$$	y>A $A,K*6/J,/A,+A(*6;F82=/%16A3 +4B-*H*H$$ +I +' /:::8 (4 8C 0 9I 8<'4E-L''..u5 
 1rU   c                 F    [        U R                  R                  5      S:  $ r   )r   r   r   rw   s    r=   
hasContentElement.hasContent7  s    4<<(()A--rU   c                     U R                   R                  U R                  R                  U R                  5      n[        XR                   U R                  5      nU R                   H  u  p4XBR                  U'   M     U$ ru   )rD   r   r   r<   r   rs   r   )r:   r   r   keyr   s        r=   r   Element.cloneNode<  s[    ii 1 14>>BsIIt~~6//JC#(OOC  *rU   c                 v    U R                   c  [        S   U R                  4$ U R                   U R                  4$ )Nhtml)r   r   r<   rw   s    r=   getNameTupleElement.getNameTupleC  s3    >>!f%tyy00>>499,,rU   )r   r   rD   )r   r   r1   Nru   )r   r   r
  r   r1   Nr   )r  rs   r1   N)"r_   r`   ra   rb   r!   rd   r	   r   rp   r   r   r   r   rK   r   r   r   r   r   r   r   r   r  r  r  r   re   r#  r   r   r   r*  	nameTuplerf   r\   rU   r=   rs   rs   X  sA   L&&##"1#>F}>U#1f&x & ).c5c?.B(CIC &**@#*E%FFA1D(E A$ A@ -7J HL##'/0C'D#	#'2E	$L2h.D .
+00 -eH]$;S$@A - &IrU   rs   c                   2    \ rS rSr% \\S'   S\SS4S jrSrg)r   iL  r   rD   r#   c                 \    [         R                  R                  U S 5        Xl        X l        g ru   )r   r   rp   r   rD   )r:   r   rD   s      r=   rp   TextNode.__init__O  s"    &&tT2	rU   )r   rD   N)r_   r`   ra   rb   r    rd   rp   rf   r\   rU   r=   r   r   L  s      rU   r   )5__license____all__typingr   r   r   r   r	   r
   r   r   r   typing_extensionsr   bs4._typingr   r   r   r   r   r   r7   bs4.builderr   r   r   r   r   bs4.elementr   r   r   r'   html5lib.constantsr   r   r   r    r!   rn   r#   html5lib.treebuildersr$   r   r   TreeBuilderr+   objectr   r   r   rs   r   r\   rU   r=   <module>r;     s    
 
 
 (    
   ! :pF pFfd$-99 d$N+/v +/\$(-- $*q' q'h  rU   