
    ei+              	         d Z ddlmZ ddlmZ ddlmZ ddlmc m	Z ddl
mZ ddlZddlZddlZddlZddlmZmZ ddlmZ dd	lmZ ddlZdd
lmZmZmZ  ej8                  d      Z ej8                  d      Z ej8                  d      Z ej8                  d      Z ejB                  jE                  d      rdZ#nejB                  dk(  rdZ#ndZ#dejH                  k  Z%dejH                  k  Z&d(dZ'd)dZ(d)dZ)d)dZ*d*dZ+d+dZ,d,dZ-d-dZ.d.dZ/d/dZ0d0d Z1 G d! d" ed"g d#            Z2 G d$ d%e      Z3d1d2d&Z4d1d3d'Z5y)4zW
General utilities.

MIT license.

Copyright (c) 2017 Isaac Muse <isaacmuse@gmail.com>
    )annotations)Markdown)InlineProcessorN)
namedtuple)pathname2urlurl2pathname)urlparsewraps)SequenceCallableAnyz
^[A-Za-z]$z^[A-Za-z]:(?:\\.*)?$z!(http|ftp)s?|data|mailto|tel|newsz^///[A-Za-z]:(?:/.*)?$winwindowsdarwinosxlinux)   	   )r      c                r    ||t        t        | |      |      S |t        | |      S |t        | |      S | S )z1Clamp the value to the given minimum and maximum.)maxmin)valuemnmxs      O/var/www/html/glpi_dashboard/venv/lib/python3.12/site-packages/pymdownx/util.pyclampr   '   sG     
~".3ub>2&&	5"~	5"~    c                     t         dk(  S )zIs Windows.r   	_PLATFORM r   r   is_winr$   4   s     	!!r   c                     t         dk(  S )z	Is Linux.r   r!   r#   r   r   is_linuxr&   :   s     r   c                     t         dk(  S )z	Is macOS.r   r!   r#   r   r   is_macr(   @   s     r   c                    t        |       S )zPath to URL.)r   )paths    r   url2pathr+   F   s     r   c                    t        |       }t               r(t        j                  |      r|j	                  ddd      }t
        r|j	                  dd      }|S )zURL to path.z///    /)r   r$   RE_WIN_DEFAULT_PROTOCOLmatchreplacePY314)urlr*   s     r   path2urlr5   L   sK     Dx+11$7||E2q)||E3'Kr   c                    t        |       S )zGet the Unicode code points.)list)ss    r   get_code_pointsr9   X   s     7Nr   c                    t        |       S )zGet Unicode ord.)ord)cs    r   get_ordr=   ^   s     q6Mr   c                    t        |       S )zGet the Unicode char.)chr)r   s    r   get_charr@   d   s     u:r   c                    t        j                   | j                        }|D ]  }||vs|j                  |        || _        y)z
    Add chars to the escape list.

    Don't just append as it modifies the global list permanently.
    Make a copy and extend **that** copy so that only this Markdown
    instance gets modified.
    N)copyESCAPED_CHARSappend)mdechrsescapedecs       r   escape_charsrI   j   sE     ii(()G WNN2 Br   c                   d}d}t        t        j                  |             \  }}}}}}t        j	                  |      rd}n	|dk(  r|dk(  r|dk(  rd}n|dk(  r2t
        j	                  |      rd||z   j                  dd      z   }d}d}n|dk(  r+|j                  d      r||z   j                  dd      }d}d}n|dk(  rd}nt        j	                  |      r)dj                  ||j                  dd            }d}d}d}nJ|dk(  r%|dk7  r | j                  d      rd|z   |z   }d}d}d}n |dk7  r|dk7  rd}n|j                  d	      rd}||||||||fS )
a  
    Parse the URL.

    Try to determine if the following is a file path or
    (as we will call anything else) a URL.

    We return it slightly modified and combine the path parts.

    We also assume if we see something like c:/ it is a Windows path.
    We don't bother checking if this **is** a Windows system, but
    'nix users really shouldn't be creating weird names like c: for their folder.
    FTr-   filer/   \z/{}:{}z//)r/   rL   )
r	   htmlunescapeRE_URLr1   RE_WIN_DRIVE_PATHr2   
startswithRE_WIN_DRIVE_LETTERformat)	r4   is_urlis_absoluteschemenetlocr*   paramsqueryfragments	            r   	parse_urlr[   z   s{    FK4<T]]3=O4P1FFD&%||F	2&B,42:	6	066v>ftm,,T377	6	f//5&&tS1	6			"	"6	*vt||D#'>?	2&B,3>>$+?f}t#	2&B,		%FD&%6;OOr   c                  &     e Zd ZdZdd fdZ xZS )
PatSeqItemzPattern sequence item item.c                *    t         |   | ||||      S )zCreate object.)super__new__)clspatternbuildertagsfull_recursion	__class__s        r   r`   zPatSeqItem.__new__   s     wsGWdNKKr   )F)
rb   zre.Pattern[str]rc   strrd   rg   re   boolreturnr]   )__name__
__module____qualname____doc__r`   __classcell__)rf   s   @r   r]   r]      s    %L Lr   r]   )rb   rc   rd   re   c                      e Zd ZdZg Zd	dZd
dZd
dZ	 	 	 	 	 	 	 	 	 	 	 	 ddZ	 	 	 	 	 	 	 	 	 	 	 	 ddZ		 	 	 	 	 	 ddZ
y)PatternSequenceProcessorzMProcessor for handling complex nested patterns such as strong and em matches.c                |    t        j                  |      }|j                  d      }| j                  ||d||       |S )zReturn single tag.   N)etreeElementgroupparse_sub_patterns)selfmtagre   idxel1texts          r   build_singlez%PatternSequenceProcessor.build_single   s8    mmC wwqzc4E
r   c                t   |j                  d      \  }}t        j                  |      }t        j                  |      }|j                  d      }	| j	                  |	|d||       |j                  |       t        |j                               dk(  r&|j                  d      }	| j	                  |	||||       |S )zReturn double tag.,rr   Nr   )splitrs   rt   ru   rv   rD   lengroups
rw   rx   rd   re   rz   tag1tag2r{   el2r|   s
             r   build_doublez%PatternSequenceProcessor.build_double   s     ZZ_
dmmD!mmD!wwqzc4E

3qxxz?a771:D##D#sNCH
r   c                <   |j                  d      \  }}t        j                  |      }t        j                  |      }|j                  d      }	| j	                  |	|d||       |j                  d      }	|j                  |       | j	                  |	|d||       |S )zFReturn double tags (variant 2): `<strong>text <em>text</em></strong>`.r   rr   Nr   )r   rs   rt   ru   rv   rD   r   s
             r   build_double2z&PatternSequenceProcessor.build_double2   s     ZZ_
dmmD!mmD!wwqzc4Ewwqz

3c4E
r   c                L   d}d}t        |      }||k  r| j                  j                  ||      rd}	t        | j                        D ]  \  }
}|s|
|k  r|j
                  j                  ||      }|s-|||j                  d       }|r|||_        n||_        | j                  ||j                  |j                  |j                  |
      }|j                  |       |}|j                  d      x}}d}	 |	s|dz  }n|dz  }||k  r||d }|r|||_        y||_        yy)a  
        Parses sub patterns.

        `data` (`str`):
            text to evaluate.

        `parent` (`etree.Element`):
            Parent to attach text and sub elements to.

        `last` (`etree.Element`):
            Last appended child to parent. Can also be None if parent has no children.

        `idx` (`int`):
            Current pattern index that was used to evaluate the parent.

        r   FNTr.   )r   compiled_rer1   	enumeratePATTERNSrb   starttailr|   build_elementrc   rd   re   rD   end)rw   dataparentlastre   rz   offsetposlengthmatchedindexitemrx   r|   els                  r   rv   z+PatternSequenceProcessor.parse_sub_patterns   sC   2 TFl%%dC0#,T]]#; 'KE4)esl **45A
  $F1771:6#/,0	.2!//4<<DL_L_afgb)!'(uuQx/"&+', 1HC qA FlF FG} 	"	 r   c                    |dk(  r| j                  ||||      S |dk(  r| j                  ||||      S | j                  ||||      S )zElement builder.double2double)r   r   r}   )rw   rx   rc   rd   re   r   s         r   r   z&PatternSequenceProcessor.build_element,  sY     i%%a~uEE $$QneDD$$QneDDr   c                Z   d}d}d}t        | j                        D ]  \  }}|j                  j                  ||j	                  d            }|s4|j	                  d      }|j                  d      }| j                  ||j                  |j                  |j                  |      } n |||fS )zParse patterns.Nr   )
r   r   rb   r1   r   r   r   rc   rd   re   )	rw   rx   r   r   r   r   r   r   m1s	            r   handleMatchz$PatternSequenceProcessor.handleMatch=  s     $T]]3 	KE4##D!''!*5BffQi''DLL$))TEXEXZ_`	 5#~r   N)
rx   re.Match[str]ry   rg   re   rh   rz   intri   etree.Element)
rx   r   rd   rg   re   rh   rz   r   ri   r   )r   rg   r   r   r   zNone | etree.Elementre   rh   rz   r   ri   None)rx   r   rc   rg   rd   rg   re   rh   r   r   ri   r   )rx   r   r   rg   ri   z3tuple[etree.Element | None, int | None, int | None])rj   rk   rl   rm   r   r}   r   r   rv   r   r   r#   r   r   rp   rp      s    WHE#E# E# #	E#
 E# E# 
E#NEE E 	E
 E E 
E"  
=	r   rp   c                     d fd}|S )z
    Raise a `DeprecationWarning` when wrapped function/method is called.

    Usage:

        @deprecated("This method will be removed in version X; use Y instead.")
        def some_method()"
            pass
    c                6     t               d fd       }|S )Nc                 l    t        j                  dj                   d t                | i |S )N'z' is deprecated. category
stacklevel)warningswarnrj   DeprecationWarning)argskwargsfuncmessager   s     r   _deprecated_funcz6deprecated.<locals>._wrapper.<locals>._deprecated_func^  s<    MMDMM?"3G9=+%
 (((r   )r   r   r   r   ri   r   r
   )r   r   r   r   s   ` r   _wrapperzdeprecated.<locals>._wrapper]  s!    	t	) 
	)  r   )r   Callable[..., Any]ri   r   r#   )r   r   r   s   `` r   
deprecatedr   R  s    	  Or   c                <    t        j                  | t        |       y)zWarn deprecated.r   N)r   r   r   )r   r   s     r   warn_deprecatedr   j  s     MM#r   )r   floatr   r   r   r   ri   r   )ri   rh   )r*   rg   ri   rg   )r4   rg   ri   rg   )r8   rg   ri   z	list[str])r<   rg   ri   r   )r   r   ri   rg   )rE   r   rF   zSequence[str]ri   r   )r4   rg   ri   z/tuple[str, str, str, str, str, str, bool, bool])rr   )r   rg   r   r   ri   r   )r   rg   r   r   ri   r   )6rm   
__future__r   markdownr   markdown.inlinepatternsr   xml.etree.ElementTreers   ElementTreecollectionsr   sysrB   rerM   urllib.requestr   r   urllib.parser	   	functoolsr   r   typingr   r   r   compilerR   rP   rO   r0   platformrQ   r"   version_infoPY39r3   r   r$   r&   r(   r+   r5   r9   r=   r@   rI   r[   r]   rp   r   r   r#   r   r   <module>r      s7   #  3 % % " 
  	  5 !   * * bjj/ BJJ67 	7	8$"**%>? <<5!I\\XII!!!3###
" 	 8PvLL*Z[ LQ Qh0r   