
    i7\                        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          T/var/www/html/tms-backend/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>   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 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   c                     [        5       e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$$'$ $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:   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                       \ rS rSr% \\   \S'   \\   \S'   S\S'   \\   \S'   \	S\
4S j5       r\	S\4S	 j5       rS\R                  4S
 jrSrg)BeautifulSoupNodeiC  r   stringr#   rD   r   r1   c                     U R                   c  U R                  c   eU R                   b  U R                   $ U R                  c   eU R                  $ ru   )r   r   rw   s    r=   r   BeautifulSoupNode.elementJ  sH    xx#t{{'>>>8888O;;***;;rU   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.nodeTypeS  s     "##rU   c                     [        5       eru   r   rw   s    r=   	cloneNodeBeautifulSoupNode.cloneNode_  s    !##rU   r\   N)r_   r`   ra   rb   r	   r!   rd   r    r   propertyr   r   r   r   treebuilder_baseNoder   rf   r\   rU   r=   r   r   C  so    	#_%%
&&   $# $ $$+00 $rU   r   c                   h   \ rS rSr% \\   \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   ic  r   r   rD   r#   c                     Xl         S U l        X l        X0l        [        R
                  R                  XR                  5        g ru   )r   r   rD   r   r   r   rp   r<   )r:   r   rD   r   s       r=   rp   Element.__init__f  s2     	"&&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                  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                  b7  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   r   rJ   rK   extractr   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.appendChildo  s   26/ $(;;.L5LLE (uc**LL  " $$):):TXX&&r*+>
 ((++B/K))..{/IJK$$[1-8II*$$$		,,T2
 xx#(9(9&*hh&?&?&F#**6
 '+ii&@&@&B#&*ll#II''hh<O ( rU   c                 J    U R                   c   e[        U R                   5      $ ru   )r   r   rw   s    r=   getAttributesElement.getAttributes  s!    xx###!!rU   _Html5libAttributeName_Html5libAttributes
attributesc                    U R                   c   e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   r   rJ   tupler   r   r   rD   builder$_replace_cdata_list_attribute_valuesr<   set_up_substitutions)r:   r   r<   r   new_namenormalized_attributesvalue_or_valuess          r=   setAttributesElement.setAttributes  s    xx###!c*o&9  $J$4$4$67dE**2D9H"(+0x(	  8 %))9:$F! IIBB		0 *..C.I.I.K)L%!0 *M II22488<; ':!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                 Z   U R                   c   e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    r   rD   r   r   insertr   )r:   r   refNoder
  old_nodenew_strs         r=   r  Element.insertBefore  s     xx###w//1!!TXX&&uqy12oE xx((3H>_444ii**8ll+BCG!!'*HHOOE<<0KrU   c                 8    UR                   R                  5         g ru   )r   r   r   s     r=   removeChildElement.removeChild  s    rU   c                    U R                   nUc   eUR                   nUc   e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.NFr   r   T)is_initializedaccept_self)
r   next_siblingr   r   r   r   previous_elementprevious_siblingr   r   )r:   	newParentr   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  s    (("""&]]!--- %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                 p    U R                   S L =(       d"    [        U R                   R                  5      S:  $ r   )r   r   r   rw   s    r=   
hasContentElement.hasContentG  s*    xx4=3txx'8'8#9A#==rU   c                    U R                   c   e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   )r   rD   r   r<   r   rs   r   )r:   r   r   keyr   s        r=   r   Element.cloneNodeL  si    xx###iit~~>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.getNameTupleT  s3    >>!f%tyy00>>499,,rU   )r   rD   r   r   )r   r   r1   Nru   )r   r   r  r   r1   Nr   )r  rs   r1   N)"r_   r`   ra   rb   r	   r   rd   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   c  s9   &&;;"1;>F}>U;3j"x " ).c5c?.B(CIC &**@#*E%FF=1D(E =$ =B -7J HL##'/0C'D#	#'2E	&N2l>D >
+00 -eH]$;S$@A - &IrU   rs   c                   &    \ rS rSrS\SS4S jrSrg)r   i]  r   rD   r#   c                 j    [         R                  R                  U S 5        S U l        Xl        X l        g ru   )r   r   rp   r   r   rD   )r:   r   rD   s      r=   rp   TextNode.__init___  s)    &&tT2	rU   )rD   r   r   N)r_   r`   ra   rb   r    rp   rf   r\   rU   r=   r   r   ]  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 +/\$(-- $@w' w't  rU   