o
    >Di                     @  s&  d Z ddlmZ ddlZddlZddlmZ ddlmZ ddl	m
Z
mZ ddlmZ e
rTddl	mZmZmZmZmZ d	d
lmZ eeegef ZededZedddZd=ddZd>d?ddZd@ddZ			 dAdBd(d)ZdCdDd-d.Zejd/d0G d1d2 d2ZdEd5d6ZG d7d dZ dFd;d<Z!dS )Gz&
Helper functions and data structures
    )annotationsN)partial)import_module)TYPE_CHECKINGoverload)Renderer)AnyCallable	ContainerIterableTypeVar   )Element	TRenderer)boundD_RendererDispatchernamestrreturnc                 C  s   d}d ttjt|| S )z5Takes a camelCased string and converts to snake_case.z[A-Z][a-z]+|[A-Z]+(?![a-z])_)joinmapr   lowerrefindall)r   pattern r   F/var/www/Datamplify/venv/lib/python3.10/site-packages/marko/helpers.pycamel_to_snake_case   s   r   ()textIterable[str]opencloseboolc                 C  sb   d}d}| D ]&}|rd}q|dkrd}q||kr|d7 }q||kr,|dkr( dS |d8 }q|dkS )zjCheck if the text only contains:
    1. blackslash escaped parentheses, or
    2. parentheses paired.
    r   F\Tr   r   )r"   r$   r%   countescapecr   r   r   	is_paired   s   
r+   labelc                 C  s   t dd|   S )z)Return the normalized form of link label.z\s+ )r   substripcasefold)r,   r   r   r   normalize_label4   s   r1   r   targetContainer[str]startintend
int | None
disallowedc                 C  sj   |du rt | }|}d}||k r3| | }|rd}n||v r|S ||v r%dS |dkr+d}|d7 }||k sdS )a   Find the next occurrence of target in text, and return the index
    Characters are escaped by backslash.
    Optional disallowed characters can be specified, if found, the search
    will fail with -2 returned. Otherwise, -1 is returned if not found.
    NFr'   Tr   )len)r"   r2   r4   r6   r8   iescapedr*   r   r   r   	find_next9   s"   r>    	spacestuple[str, str, str]c                 C  s   d }}t | D ]\}}||v r|dkrq|}q|dkr |} nq|dk r*| ddfS |dk r;| d| | |d dfS | d| | || | |d fS )zSplit the given text by spaces or tabs, and return a tuple of
    (start, delimiter, remaining). If spaces are not found, the latter
    two elements will be empty.
    r:   r    N)	enumerate)r"   r@   r4   r6   r<   r*   r   r   r   partition_by_spacesW   s   
"rD   T)frozenc                   @  sJ   e Zd ZU ejedZded< ejedZded< ejedZ	ded< dS )MarkoExtension)default_factoryz
list[type]parser_mixinsrenderer_mixinszlist[type[Element]]elementsN)
__name__
__module____qualname__dataclassesfieldlistrH   __annotations__rI   rJ   r   r   r   r   rF   l   s   
 rF   kwargsr   c              
   K  s   d}d| vrz	t d|  }W n	 ty   Y nw |du r9zt | }W n ty8 } z	td|  d|d}~ww z	|jdi |W S  tyR   td|  ddw )	zVLoad extension object from a string.
    First try `marko.ext.<name>` if possible
    N.z
marko.ext.z
Extension z cannot be importedzModule z+ does not have 'make_extension' attributte.r   )r   ImportErrormake_extensionAttributeError)r   rR   moduleer   r   r   load_extensions   s.   
rY   c                   @  sr   e Zd ZU ded< d%d	d
Zd&ddZd'ddZed(ddZd)ddZ	e
d*ddZe
d+d dZd,d#dZd$S )-r   r   r   types+type[Renderer] | tuple[type[Renderer], ...]funcRendererFuncr   Nonec                 C  s2   ddl m}m} ||i| _| j||f| j d S )Nr   )ASTRendererXMLRenderer)marko.ast_rendererr_   r`   _mapping
setdefault
render_ast)selfrZ   r\   r_   r`   r   r   r   __init__   s   
z_RendererDispatcher.__init__re   r   Callable[[RendererFunc], D]c                   s   d fdd}|S )Nr\   r]   r   r   c                   s   |  j <  S N)rb   r\   re   rZ   r   r   	decorator   s   
z/_RendererDispatcher.dispatch.<locals>.decorator)r\   r]   r   r   r   )re   rZ   rk   r   rj   r   dispatch   s   z_RendererDispatcher.dispatchownertypec                 C  s
   || _ d S rh   )r   )re   rm   r   r   r   r   __set_name__      
z _RendererDispatcher.__set_name__elementr   r   c                 C  s
   |  |S rh   )render_children)re   rq   r   r   r   rd      s   
z_RendererDispatcher.render_astrc                   sd    fddt | D }z
t| t|}W n ty(   tdt | dw t| j||S )z<Call on the next class in the MRO which has the same method.c                 3  s     | ]} j |jv r|V  qd S rh   )r   __dict__).0r*   re   r   r   	<genexpr>   s    z3_RendererDispatcher.super_render.<locals>.<genexpr>zUnsupported renderer N)rn   mronextStopIterationNotImplementedErrorgetattrr   )re   rs   rq   klassesparentr   rv   r   super_render   s   z _RendererDispatcher.super_renderobjc                 C     d S rh   r   re   r   rm   r   r   r   __get__      z_RendererDispatcher.__get__r   c                 C  r   rh   r   r   r   r   r   r      r   Renderer | NoneRendererFunc | Dc                 C  sD   |d u r| S | j  D ]\}}t||rt||  S qt| j|S rh   )rb   items
isinstancer   r   )re   r   rm   rZ   r\   r   r   r   r      s   
N)rZ   r[   r\   r]   r   r^   )re   r   rZ   r[   r   rg   )rm   rn   r   r   r   r^   )rq   r   r   r   )rs   r   rq   r   r   r   )re   r   r   r^   rm   rn   r   r   )re   r   r   r   rm   rn   r   r]   )re   r   r   r   rm   rn   r   r   )rK   rL   rM   rQ   rf   rl   ro   staticmethodrd   r   r   r   r   r   r   r   r      s   
 


	
rZ   r[   -Callable[[RendererFunc], _RendererDispatcher]c                   s   d fdd}|S )Nr\   r]   r   r   c                   s
   t  | S rh   )r   ri   rZ   r   r   rk      rp   z"render_dispatch.<locals>.decorator)r\   r]   r   r   r   )rZ   rk   r   r   r   render_dispatch   s   r   )r   r   r   r   )r    r!   )r"   r#   r$   r   r%   r   r   r&   )r,   r   r   r   )r   Nr   )r"   r   r2   r3   r4   r5   r6   r7   r8   r3   r   r5   )r?   )r"   r   r@   r   r   rA   )r   r   rR   r   r   rF   )rZ   r[   r   r   )"__doc__
__future__r   rN   r   	functoolsr   	importlibr   typingr   r   marko.rendererr   r   r	   r
   r   r   rq   r   r]   r   r   r   r+   r1   r>   rD   	dataclassrF   rY   r   r   r   r   r   r   <module>   s6    



5