
    giy                        d Z ddlmZ ddlZddlmZmZmZ ddlm	Z	  G d d          Z
dd	lmZmZmZmZ er)eej                 Zeej                 Zeej                 ZdS dS )
z
Base parser
    )annotationsN)TYPE_CHECKINGTypecast   )Sourcec                  R    e Zd Z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S )!Parsera=  
    All elements defined in CommonMark's spec are included in the parser
    by default.

    Attributes:
        block_elements(dict): a dict of name: block_element pairs
        inline_elements(dict): a dict of name: inline_element pairs

    :param \*extras: extra elements to be included in parsing process.
    returnNonec                    i | _         i | _        t          j        d t          j        D             d t          j        D                       D ]}|                     |           d S )Nc              3  @   K   | ]}t          t          |          V  d S N)getattrblock.0names     d/var/www/development/aibuddy-work/election-extract/venv/lib/python3.11/site-packages/marko/parser.py	<genexpr>z"Parser.__init__.<locals>.<genexpr>   s,      <<dWUD!!<<<<<<    c              3  @   K   | ]}t          t          |          V  d S r   )r   inliner   s     r   r   z"Parser.__init__.<locals>.<genexpr>   s,      >>tWVT"">>>>>>r   )block_elementsinline_elements	itertoolschainr   __all__r   add_element)selfels     r   __init__zParser.__init__   sv    ;==?/<<em<<<>>v~>>>
 
 	! 	!B R    		! 	!r   elementElementTypec                    i }t          |t          j                  r| j        }n1t          |t          j                  r| j        }nt          d          || |j                    <   dS )zAdd an element to the parser.

        :param element: the element class.

        .. note:: If one needs to call it inside ``__init__()``, please call it after
             ``super().__init__()`` is called.
        zMThe element should be a subclass of either `BlockElement` or `InlineElement`.N)	
issubclassr   InlineElementr   r   BlockElementr   	TypeErrorget_type)r    r#   dests      r   r   zParser.add_element#   s|     (*gv344 	'DD!344 	&DD#   $+W   r   textstrblock.Documentc                F   t          |          }| |_        t          t          j         | j        d                               }|                    |          5  |                     |          |_        | 	                    ||           ddd           n# 1 swxY w Y   |S )zDo the actual parsing and returns an AST or parsed element.

        :param text: the text to parse.
        :returns: the parsed root element
        DocumentN)
r   parserr   r   r0   r   under_stateparse_sourcechildrenparse_inline)r    r,   sourcedocs       r   parsezParser.parse7   s     5>#B4#6z#B#D#DEE$$ 	+ 	+,,V44CLc6***	+ 	+ 	+ 	+ 	+ 	+ 	+ 	+ 	+ 	+ 	+ 	+ 	+ 	+ 	+ 
s   1BBBr6   r   list[block.BlockElement]c                   |                                  }g }|j        si|D ]^}|                    |          rG|                    |          }t	          |d          s ||          }|                    |            n_n|j        i|S )z/Parse the source into a list of block elements.priority)_build_block_element_list	exhaustedmatchr8   hasattrappend)r    r6   element_listastele_typeresults         r   r3   zParser.parse_sourceE   s    5577(*" 	(  >>&)) %^^F33F"6:66 2 "*&!1!1JJv&&&E  " 	 
r   block.BlockElementc                    |j         r)|                     |j         |          |_        d|_         dS |j        D ]2}t          |t          j                  r|                     ||           3dS )z^Inline parsing is postponed so that all link references
        are seen before that.
         N)inline_body_parse_inliner4   
isinstancer   r(   r5   )r    r#   r6   childs       r   r5   zParser.parse_inlineY   s      	5#11'2EvNNG"$G ) 5 5eU%788 5%%eV4445 5r   list[inline.InlineElement]c                p    |                                  }t          j        ||| j        d         |          S )a   Parses text into inline elements.
        RawText is not considered in parsing but created as a wrapper of holes
        that don't match any other elements.

        :param text: the text to be parsed.
        :returns: a list of inline elements.
        RawText)fallbackr6   )_build_inline_element_listinline_parserr8   r   )r    r,   r6   rA   s       r   rI   zParser._parse_inlinef   sA     6688",)=i)HQW
 
 
 	
r   list[BlockElementType]c                j    t          d | j                                        D             d d          S )zIReturn a list of block elements, ordered from highest priority to lowest.c              3  (   K   | ]}|j         	|V  d S r   virtualr   es     r   r   z3Parser._build_block_element_list.<locals>.<genexpr>v   s)      FF1AIFQFFFFFFr   c                    | j         S r   )r;   )rX   s    r   <lambda>z2Parser._build_block_element_list.<locals>.<lambda>w   s    !* r   T)keyreverse)sortedr   valuesr    s    r   r<   z Parser._build_block_element_lists   sB    FF+2244FFF$$
 
 
 	
r   list[InlineElementType]c                H    d | j                                         D             S )zcReturn a list of elements, each item is a list of elements
        with the same priority.
        c                     g | ]}|j         	|S  rU   rW   s     r   
<listcomp>z5Parser._build_inline_element_list.<locals>.<listcomp>   s    JJJa	JJJJr   )r   r^   r_   s    r   rP   z!Parser._build_inline_element_list{   s(     KJ4/6688JJJJr   N)r   r   )r#   r$   r   r   )r,   r-   r   r.   )r6   r   r   r9   )r#   rE   r6   r   r   r   )r,   r-   r6   r   r   rL   )r   rR   )r   r`   )__name__
__module____qualname____doc__r"   r   r8   r3   r5   rI   r<   rP   rc   r   r   r
   r
      s        	 	! ! ! !+ + + +(      (5 5 5 5
 
 
 

 
 
 
K K K K K Kr   r
   )r   r#   r   rQ   )rh   
__future__r   r   typingr   r   r   r6   r   r
   rG   r   r#   r   rQ   r(   BlockElementTyper'   InlineElementTypeElementr$   rc   r   r   <module>rn      s     # " " " " "     , , , , , , , , , ,      rK rK rK rK rK rK rK rKj 4 3 3 3 3 3 3 3 3 3 3 3 (E./V12w'KKK( (r   