
    gi                    x   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
r:d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          Z edd          Zd6dZd7d8dZd9dZ	 	 	 d:d;d%Zd<d=d)Z ej        d*+           G d, d-                      Zd>d0Z G d1 d          Z d?d5Z!dS )@z&
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           	         d}d                     t          t          j        t	          j        ||                               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   patterns     e/var/www/development/aibuddy-work/election-extract/venv/lib/python3.11/site-packages/marko/helpers.pycamel_to_snake_caser       s1    ,G88C	2:gt#<#<==>>>    ()textIterable[str]opencloseboolc                |    d}d}| D ]0}|rd}|dk    rd}||k    r|dz  }||k    r|dk    r dS |dz  }1|dk    S )zjCheck if the text only contains:
    1. blackslash escaped parentheses, or
    2. parentheses paired.
    r   F\Tr    )r$   r&   r'   countescapecs         r   	is_pairedr/      s}    
 EF 
 
 		FF$YYFF$YYQJEE%ZZzzuuQJEA:r!   labelc                v    t          j        dd|                                                                           S )z)Return the normalized form of link label.z\s+ )r   substripcasefold)r0   s    r   normalize_labelr6   4   s.    6&#u%%++--66888r!   r+   targetContainer[str]startintend
int | None
disallowedc                    |t          |           }|}d}||k     r,| |         }|rd}n||v r|S ||v rdS |dk    rd}|dz  }||k     ,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$   r7   r9   r;   r=   iescapedr.   s           r   	find_nextrD   9   s     {$iiAG
c''G 	GG&[[H*__2$YYG	Q c'' 2r!    	spacestuple[str, str, str]c                    dx}}t          |           D ]\  }}||v r
|dk    r|}|dk    r|} n|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$   rF   r9   r;   rB   r.   s         r   partition_by_spacesrK   W   s    
 EC$  1;;zzEEaZZCE  qyyR|
QwwFUF|T%&&\2--<eCi$stt*44r!   T)frozenc                      e Zd ZU  ej        e          Zded<    ej        e          Zded<    ej        e          Z	ded<   dS )MarkoExtension)default_factoryz
list[type]parser_mixinsrenderer_mixinszlist[type[Element]]elementsN)
__name__
__module____qualname__dataclassesfieldlistrP   __annotations__rQ   rR   r+   r!   r   rN   rN   l   su          1 1$ G G GMGGGG"3+"3D"I"I"IOIIII$5K$5d$K$K$KHKKKKKKr!   rN   kwargsr	   c                (   d}d| vr$	 t          d|            }n# t          $ r Y nw xY w|7	 t          |           }n&# t          $ r}t          d|  d          |d}~ww xY w	  |j        di |S # t          $ r t          d|  d          dw xY 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   rZ   modulees       r   load_extensionrb   s   s    F
$	"#6#6#677FF 	 	 	D	~	M"4((FF 	M 	M 	MD4DDDEE1L	M$v$..v...   GdGGG
 
	s-    
((> 
A!AA!%A2 2Bc                      e Zd ZU ded<   dd	Zd dZd!dZed"d            Zd#dZ	e
d$d            Ze
d%d            Zd&dZdS )'r   r   r   types+type[Renderer] | tuple[type[Renderer], ...]funcRendererFuncr   Nonec                l    ddl m}m} ||i| _        | j                            ||f| j                   d S )Nr   )ASTRendererXMLRenderer)marko.ast_rendererrj   rk   _mapping
setdefault
render_ast)selfrd   rf   rj   rk   s        r   __init__z_RendererDispatcher.__init__   sM     	@???????  +{!;T_MMMMMr!   rp   r   Callable[[RendererFunc], D]c                     d fd}|S )Nrf   rg   r   r   c                    | j         <   S N)rm   )rf   rp   rd   s    r   	decoratorz/_RendererDispatcher.dispatch.<locals>.decorator   s    #'DM% Kr!   )rf   rg   r   r   r+   )rp   rd   rv   s   `` r   dispatchz_RendererDispatcher.dispatch   s/    	 	 	 	 	 	 	 r!   ownertypec                    || _         d S ru   )r   )rp   rx   r   s      r   __set_name__z _RendererDispatcher.__set_name__   s    			r!   elementr   r	   c                ,    |                      |          S ru   )render_children)rp   r|   s     r   ro   z_RendererDispatcher.render_ast   s    ##G,,,r!   rc                6     fdt          |                                          D             }	 t          |           t          |          } t          | j                  ||          S # t
          $ r! t          dt          |                     dw xY w)z<Call on the next class in the MRO which has the same method.c              3  8   K   | ]}j         |j        v |V  d S ru   )r   __dict__).0r.   rp   s     r   	<genexpr>z3_RendererDispatcher.super_render.<locals>.<genexpr>   s1      GGtyAJ/F/F1/F/F/F/FGGr!   zUnsupported renderer N)ry   mronextgetattrr   StopIterationNotImplementedError)rp   r   r|   klassesparents   `    r   super_renderz _RendererDispatcher.super_render   s    GGGGd1ggkkmmGGG	:MMM']]F .7649--a999  	S 	S 	S%&Gd1gg&G&GHHdR	Ss   A- -+Bobjc                    d S ru   r+   rp   r   rx   s      r   __get__z_RendererDispatcher.__get__   s    7:sr!   r   c                    d S ru   r+   r   s      r   r   z_RendererDispatcher.__get__   s    FIcr!   Renderer | NoneRendererFunc | Dc                    || S | j                                         D ]'\  }}t          ||          rt          ||          c S (t          | j        |          S ru   )rm   items
isinstancer   r   )rp   r   rx   rd   rf   s        r   r   z_RendererDispatcher.__get__   sm    ;K=..00 	* 	*KE4#u%% *tS)))))*t(#...r!   N)rd   re   rf   rg   r   rh   )rp   r   rd   re   r   rr   )rx   ry   r   r   r   rh   )r|   r   r   r	   )r   r	   r|   r   r   r	   )rp   r   r   rh   rx   ry   r   r   )rp   r   r   r   rx   ry   r   rg   )rp   r   r   r   rx   ry   r   r   )rS   rT   rU   rY   rq   rw   r{   staticmethodro   r   r   r   r+   r!   r   r   r      s         IIIN N N N       - - - \-	: 	: 	: 	: ::: X:III XI/ / / / / /r!   rd   re   -Callable[[RendererFunc], _RendererDispatcher]c                     d fd}|S )Nrf   rg   r   r   c                $    t          |           S ru   )r   )rf   rd   s    r   rv   z"render_dispatch.<locals>.decorator   s    "5$///r!   )rf   rg   r   r   r+   )rd   rv   s   ` r   render_dispatchr      s)    0 0 0 0 0 0 r!   )r   r   r   r   )r"   r#   )r$   r%   r&   r   r'   r   r   r(   )r0   r   r   r   )r   Nr+   )r$   r   r7   r8   r9   r:   r;   r<   r=   r8   r   r:   )rE   )r$   r   rF   r   r   rG   )r   r   rZ   r	   r   rN   )rd   re   r   r   )"__doc__
__future__r   rV   r   	functoolsr   	importlibr   typingr   r   marko.rendererr   r	   r
   r   r   r   r|   r   rg   r   r   r    r/   r6   rD   rK   	dataclassrN   rb   r   r   r+   r!   r   <module>r      s,    # " " " " "     				       # # # # # # * * * * * * * * # # # # # # 2BBBBBBBBBBBBBB      S'NC/0L<888I0111A? ? ? ?    *9 9 9 9 !#    <5 5 5 5 5* d###L L L L L L L $#L   02/ 2/ 2/ 2/ 2/ 2/ 2/ 2/j     r!   