
    ̆hD                        S r SSKJr  SSKrSSKJs  Jr  SSKJrJ	r	  SSK
Jr  SSK
Jr  \(       a  SSKJr  SS	 jrSS
 jr " S S\R"                  5      r " S S\5      r " S S\5      r " S S\5      rg)z
Tree processors manipulate the tree created by block processors. They can even create an entirely
new `ElementTree` object. This is an excellent place for creating summaries, adding collected
references, or last minute adjustments.

    )annotationsN)TYPE_CHECKINGAny   )util)inlinepatterns)Markdownc                    [         R                  " 5       nUR                  [        U 5      SS5        UR                  [	        U 5      SS5        UR                  [        U 5      SS5        U$ )z2Build the default  `treeprocessors` for Markdown. inline   prettify
   unescaper   )r   RegistryregisterInlineProcessorPrettifyTreeprocessorUnescapeTreeprocessor)mdkwargstreeprocessorss      O/opt/services/DDDS/venv/lib/python3.13/site-packages/markdown/treeprocessors.pybuild_treeprocessorsr   '   sZ    ]]_NOB/2>1"5z2F1"5z1E    c                b    [        U [        R                  5      (       d  [        U [        5      $ g)z^Return `True` if object is a string but not an  [`AtomicString`][markdown.util.AtomicString]. F)
isinstancer   AtomicStringstr)ss    r   isStringr    0   s%    a**++!S!!r   c                  "    \ rS rSrSrSS jrSrg)Treeprocessor7   z
`Treeprocessor`s are run on the `ElementTree` object before serialization.

Each `Treeprocessor` implements a `run` method that takes a pointer to an
`Element` and modifies it as necessary.

`Treeprocessors` must extend `markdown.Treeprocessor`.

c                    g)z
Subclasses of `Treeprocessor` should implement a `run` method, which
takes a root `Element`. This method can return another `Element`
object, and the existing root `Element` will be replaced, or it can
modify the current tree and return `None`.
N )selfroots     r   runTreeprocessor.runA   s     	r   r%   N)r'   etree.Elementreturnetree.Element | None)__name__
__module____qualname____firstlineno____doc__r(   __static_attributes__r%   r   r   r"   r"   7   s    r   r"   c                      \ rS rSrSrSS jrSS jrSS jrSS jrSSS jjr	SSS jjr
 S       SS	 jjr S         SS
 jjrSS jrSSS jjrSrg)r   K   zD
A `Treeprocessor` that traverses a tree, applying inline patterns.
c                $   [         R                  U l        [         R                  U l        S[        U R                  5      -   [        U R                  5      -   U l        [         R                  U l        Xl	        UR                  U l
        / U l        g )N   )r   INLINE_PLACEHOLDER_PREFIX$_InlineProcessor__placeholder_prefixETX$_InlineProcessor__placeholder_suffixlen$_InlineProcessor__placeholder_lengthINLINE_PLACEHOLDER_RE _InlineProcessor__placeholder_rer   inlinePatterns	ancestors)r&   r   s     r   __init__InlineProcessor.__init__P   sp    $($B$B!$(HH!$%D,E,E(F$F(+D,E,E(F%G! $ : : //$&r   c                ^    S[        U R                  5      -  n[        R                  U-  nX24$ )zGenerate a placeholder z%04d)r;   stashed_nodesr   INLINE_PLACEHOLDER)r&   typeidhashs       r   __makePlaceholder!InlineProcessor.__makePlaceholderZ   s.    c$,,--&&+xr   c                    U R                   R                  X5      nU(       a!  UR                  S5      UR                  5       4$ SUS-   4$ )z
Extract id from data string, start from index.

Arguments:
    data: String.
    index: Index, from which we start search.

Returns:
    Placeholder id and string index, after the found placeholder.

r   N)r>   searchgroupend)r&   dataindexms       r   __findPlaceholder!InlineProcessor.__findPlaceholder`   sD     !!((5771:quuw&&?"r   c                H    U R                  U5      u  p4XR                  U'   U$ )zAdd node to stash. )!_InlineProcessor__makePlaceholderrD   )r&   noderF   placeholderrG   s        r   __stashNodeInlineProcessor.__stashNoder   s(    006!%2r   c                    [        U[        R                  5      (       dR  Sn[        U R                  5      nX$:  a6  U R                  U R                  U   XU5      u  pnU(       d  US-  nX$:  a  M6  U$ )z
Process string with inline patterns and replace it with placeholders.

Arguments:
    data: A line of Markdown text.
    patternIndex: The index of the `inlinePattern` to start with.

Returns:
    String with placeholders.

r   r   )r   r   r   r;   r?   _InlineProcessor__applyPattern)r&   rO   patternIndex
startIndexcountmatcheds         r   __handleInlineInlineProcessor.__handleInlinex   sw     $ 1 122J++,E&,0,?,?''5t:-)z  A%L & r   c                4   U(       a  UR                   nSUl         OUR                  nSUl        U R                  XBU5      nU(       d"  XLa  [        U5      R	                  U5      S-   nOSnUR                  5         U H  nUR                  XgS   5        M     g)z
Process placeholders in `Element.text` or `Element.tail`
of Elements popped from `self.stashed_nodes`.

Arguments:
    node: Parent node.
    subnode: Processing node.
    isText: Boolean variable, True - it's text, False - it's a tail.

Nr   r   )texttail%_InlineProcessor__processPlaceholderslistrP   reverseinsert)r&   rV   subnodeisTextrc   childResultposnewChilds           r   __processElementText$InlineProcessor.__processElementText   s     <<DGL<<DGL00G$-t*""7+a/CC#HKKa[) $r   c                  ^^^ SUUU4S jjn/ mSnU(       Ga  UR                  U R                  U5      nUS:w  GaW  U R                  X5      u  pxXpR                  ;   Ga  U R                  R	                  U5      n	US:  a  XU n
U" U
5        [        U	[        5      (       d  U	/[        U	5      -    H  nUR                  (       a1  UR                  R                  5       (       a  U R                  XS5        UR                  (       d  MX  UR                  R                  5       (       d  My  U R                  X5        M     OU" U	5        UnGM;  UnTR                  XR                  SS 45        OhU[        U R                  5      -   nU" XU 5        UnOCXS n
[        U[        R                   5      (       a  [        R                   " U
5      n
U" U
5        SnU(       a  GM  T$ )ad  
Process string with placeholders and generate `ElementTree` tree.

Arguments:
    data: String with placeholders instead of `ElementTree` elements.
    parent: Element, which contains processing inline data.
    isText: Boolean variable, True - it's text, False - it's a tail.

Returns:
    List with `ElementTree` elements with applied inline patterns.

c                n  > U (       a  T(       aA  TS   S   R                   (       a  TS   S   =R                   U -  sl         g U TS   S   l         g T(       d/  TR                   (       a  T=R                   U -  sl         g U Tl         g TR                  (       a  T=R                  U -  sl        g U Tl        g g )Nr   )rd   rc   )rc   rj   parentresults    r   linkText7InlineProcessor.__processPlaceholders.<locals>.linkText   s    bz!}))r
1**d2*-1r
1*{{t+&*{{t+&* r   r   rr   FN )rc   
str | Noner+   None)findr8   !_InlineProcessor__findPlaceholderrD   getr   r   rf   rd   strip$_InlineProcessor__processElementTextrc   appendr@   r;   r   r   )r&   rO   rs   rj   ru   strartIndexrP   rG   
phEndIndexrV   rc   childrN   rt   s     ``         @r   __processPlaceholders%InlineProcessor.__processPlaceholders   s   $	+ 	+" IId77EE{!%!7!7!D+++--11"5Dqy#6 %dC00&*Vd4j%8E$zz#(::#3#3#5#5$($=$=(,U%&  %zzz#(::#3#3#5#5$($=$=e$K &9 !&0 ",KMM4):";<  #d&?&?"@@CTc23"%KL)dD$5$566,,T2DQ dT r   c                x   [        U[        R                  5      nUR                   H(  nUR	                  5       U R
                  ;   d  M#  USS4s  $    U(       aZ  SnUR                  5       R                  X$5       H4  nUR                  Xr5      u  pn
U	b  U
c  XGR                  S5      -  nSnM4    O)   O&UR                  5       R                  X$S 5      nUSU nU(       d  USS4$ U(       d3  UR                  U5      nUR                  S5      n	UR                  S5      n
Wc  USW
4$ [        U[        5      (       Gd  [        UR                  [        R                  5      (       d  U/[!        U5      -    H  n[#        U5      (       a  M  UR                  (       aq  U R
                  R%                  UR&                  R	                  5       5        U R)                  UR                  US-   5      Ul        U R
                  R+                  5         UR,                  (       d  M  U R)                  UR,                  U5      Ul        M     U R/                  XR1                  5       5      nU(       a  SR3                  USW	 XW
S 5      SS4$ SR3                  WUR5                  S5      XR7                  5       S   5      SS4$ )	ak  
Check if the line fits the pattern, create the necessary
elements, add it to `stashed_nodes`.

Arguments:
    data: The text to be processed.
    pattern: The pattern to be checked.
    patternIndex: Index of current pattern.
    startIndex: String index, from which we start searching.

Returns:
    String with placeholders instead of `ElementTree` elements.

Fr   NTr   z{}{}{}z{}{}{}{}rr   )r   r   r   ANCESTOR_EXCLUDESlowerr@   getCompiledRegExpfinditerhandleMatchrN   matchstartr   rc   r   r   rf   r    r   tag_InlineProcessor__handleInlinepoprd   _InlineProcessor__stashNoderF   formatrM   groups)r&   patternrO   r\   r]   	new_styleexcluder   rV   r   rN   leftDatar   rW   s                 r   __applyPatternInlineProcessor.__applyPattern   sc   * w(F(FG	00G}}$..0UA~% 1 E !224==dO#*#6#6u#C S=CK))A,.J E P --/55d;6GHEKZ(H>!&&u-DKKNE))A,C<s?"$$$dii):):;;"Vd4j0E#D>> :: NN11%))//2CD)-)<)< %

L1,<*EJ !NN..0 :::)-)<)< %

L*EJ 1 &&t\\^<??4<#.ST
<=A1E E $$X%*[[^%0,,.2DFGKQO Or   c                    / nUbL  Ub)  UR                  UR                  R                  5       5        U R                  R	                  U5      nUb  ML  UR                  5         UR                  U5        g)zBuild the ancestor list.N)r   r   r   
parent_mapr|   rg   extend)r&   rs   parentsr@   s       r   __build_ancestors!InlineProcessor.__build_ancestorsM  sd    	 !  !1!1!34__((0F   	y!r   Nc                   0 U l         Uc  / OUSS nUR                  5        VVs0 s H  oD  H  oUU_M     M     snnU l        X4/nU(       Ga  UR                  S5      u  pxXl        U R                  XpR                  5        / n	U GH  n
U
R                  (       a  [        U
R                  [        R                  5      (       d  U R                  R                  U
R                  R                  5       5        U
R                  nSU
l        U R                  U R                  U5      U
5      nU H  nXR                  US   '   M     Xl-  nU	R                  X45        U R                  R                  5         U
R                  (       a  U R                  U
R                  5      n[         R"                  " S5      nSU
l        U R                  XS5      nUR                  (       a  UR                  U
l        [%        U5      R'                  U
5      S-   nUR)                  5         U H)  nXpR                  US   '   UR+                  UUS   5        M+     [-        U
5      (       d  GM  XpR                  U
'   UR                  XR                  SS 45        GM     U	 H2  u  nn[/        U5       H  u  nnUS   nUR+                  UU5        M     M4     U(       a  GM  U$ s  snnf )a_  Apply inline patterns to a parsed Markdown tree.

Iterate over `Element`, find elements with inline tag, apply inline
patterns and append newly created Elements to tree.  To avoid further
processing of string with inline patterns, instead of normal string,
use subclass [`AtomicString`][markdown.util.AtomicString]:

    node.text = markdown.util.AtomicString("This will not be processed.")

Arguments:
    tree: `Element` object, representing Markdown tree.
    ancestors: List of parent tag names that precede the tree node (if needed).

Returns:
    An element tree object with applied inline patterns.

Nr   dFr   )rD   iterr   r   r@   !_InlineProcessor__build_ancestorsrc   r   r   r   r   r   r   re   r   rd   etreeElementrf   rP   rg   rh   r;   	enumerate)r&   treer@   tree_parentspcstackcurrElementr   insertQueuer   rc   lstitemrd   dumby
tailResultrl   rm   elementiobjs                         r   r(   InlineProcessor.runW  sd   $ >@ '.rIaL)-@Aaa4a1@%&#(99Q< K$N"";?K$::jJJ 1 1' ' NN))%))//*;< ::D!%EJ44++D15C !$38Q0 !$LE&&|4NN&&(::..uzz:D!MM#.E!%EJ!%!;!;D!OJzz%*ZZ
{+11%81<C&&($.7B4#**3< %/ u::-8OOE*LL%):!;<; %> !,'nFAs"1vHNN1h/ - !,M eT [ As   K)	__placeholder_length__placeholder_prefix__placeholder_re__placeholder_suffixr@   r?   r   r   rD   )r   r	   )rF   r   r+   ztuple[str, str])rO   r   rP   intr+   ztuple[str | None, int])rV   zetree.Element | strrF   r   r+   r   )r   )rO   r   r\   r   r+   r   )T)rV   r*   ri   r*   rj   boolr+   ry   )rO   rx   rs   r*   rj   r   r+   z%list[tuple[etree.Element, list[str]]])
r   zinlinepatterns.PatternrO   r   r\   r   r]   r   r+   ztuple[str, bool, int])rs   r,   r   z	list[str]r+   ry   N)r   r*   r@   zlist[str] | Noner+   r*   )r-   r.   r/   r0   r1   rA   rU   r{   r   r   r~   re   r[   r   r(   r2   r%   r   r   r   r   K   s    '#$.*B 	OO O 	O
 
/Ol NO'NO NO 	NO
 NO 
NO`"E Er   r   c                  ,    \ rS rSrSrSS jrSS jrSrg)	r   i  z&Add line breaks to the html document. c                \   SnU R                   R                  UR                  5      (       a  UR                  S;  a  UR                  (       a  UR                  R	                  5       (       dC  [        U5      (       a3  U R                   R                  US   R                  5      (       a  X!l        U H@  nU R                   R                  UR                  5      (       d  M/  U R                  U5        MB     UR                  (       a  UR                  R	                  5       (       d  X!l        gg)z7Recursively add line breaks to `ElementTree` children. 
)codeprer   N)r   is_block_levelr   rc   r}   r;   _prettifyETreerd   )r&   elemr   es       r   r   $PrettifyTreeprocessor._prettifyETree  s     77!!$((++0OIITYY__%6%6D		dgg&<&<T!W[[&I&I	77))!%%00''*  yy		 1 1I !2r   c                .   U R                  U5        UR                  S5      nU HP  nUR                  (       a  UR                  R                  5       (       d	  SUl        M<  SUR                  -  Ul        MR     UR                  S5      nU H  n[	        U5      (       d  M  US   R
                  S:X  d  M*  US   n[	        U5      (       a  MA  UR                  c  MP  [        R                  " UR                  R                  5       S-   5      Ul        M     g)z6Add line breaks to `Element` object and its children. brr   z
%sr   r   r   N)
r   r   rd   r}   r;   r   rc   r   r   rstrip)r&   r'   brsr   presr   r   s          r   r(   PrettifyTreeprocessor.run  s     	D! iioB77"''--// 277*	  yyC3xxCFJJ&01v4yyTYY%: $ 1 1$))2B2B2Dt2K LDI r   r%   N)r   r*   r+   ry   r'   r*   r+   ry   )r-   r.   r/   r0   r1   r   r(   r2   r%   r   r   r   r     s    1Mr   r   c                      \ rS rSrSr\R                  " SR                  \R                  \R                  5      5      rS	S jrS
S jrSS jrSrg)r   i  zRestore escaped chars z	{}(\d+){}c                H    [        [        UR                  S5      5      5      $ )Nr   )chrr   rM   )r&   rQ   s     r   	_unescapeUnescapeTreeprocessor._unescape  s    3qwwqz?##r   c                N    U R                   R                  U R                  U5      $ r   )REsubr   )r&   rc   s     r   r   UnescapeTreeprocessor.unescape  s    ww{{4>>400r   c                   UR                  5        H  nUR                  (       a0  UR                  S:X  d   U R                  UR                  5      Ul        UR                  (       a   U R                  UR                  5      Ul        UR                  5        H%  u  p4UR                  X0R                  U5      5        M'     M     g)z.Loop over all elements and unescape all text. r   N)r   rc   r   r   rd   itemsset)r&   r'   r   keyvalues        r   r(   UnescapeTreeprocessor.run  sz    IIKDyyV!3 MM$))4	yy MM$))4	"jjl
mmE23 +  r   r%   N)rQ   zre.Match[str]r+   r   )rc   r   r+   r   r   )r-   r.   r/   r0   r1   recompiler   r   STXr9   r   r   r   r(   r2   r%   r   r   r   r     s7    !	L''$((;	<B$14r   r   )r   r	   r   r   r+   zutil.Registry[Treeprocessor])r   objectr+   r   )r1   
__future__r   r   xml.etree.ElementTreer   ElementTreetypingr   r   rw   r   r   markdownr	   r   r    	Processorr"   r   r   r   r%   r   r   <module>r      sk   ( # 	 % % %  !DNN (Qm Qh
$MM $MN4M 4r   