U
    ShK                     @  s  U d Z ddlmZ ddlmZ ddlZddlmZ G dd deZe	dZ
e	d	Ze	d
ZG dd dZG dd deZdddddZdddddddZdddddddZdddddddZdddddddZdddddddZdddddd d!Zdddddd"d#Zdddddd$d%Zdddddd&d'Zdddddd(d)Zejeejeejeejeejeej eej!eej"eej#eej$ei
Z%d*e&d+< dS ),a~  Parser for attributes::

    attributes { id = "foo", class = "bar baz",
                key1 = "val1", key2 = "val2" }

Adapted from:
https://github.com/jgm/djot/blob/fae7364b86bfce69bc6d5b5eede1f5196d845fd6/djot/attributes.lua#L1

syntax:

attributes <- '{' whitespace* attribute (whitespace attribute)* whitespace* '}'
attribute <- identifier | class | keyval
identifier <- '#' name
class <- '.' name
name <- (nonspace, nonpunctuation other than ':', '_', '-')+
keyval <- key '=' val
key <- (ASCII_ALPHANUM | ':' | '_' | '-')+
val <- bareval | quotedval
bareval <- (ASCII_ALPHANUM | ':' | '_' | '-')+
quotedval <- '"' ([^"] | '"') '"'
    )annotations)EnumN)Callablec                   @  s8   e Zd ZdZdZdZdZdZdZdZ	dZ
d	Zd
ZdZdS )Stater                           	   
   N)__name__
__module____qualname__STARTSCANNINGSCANNING_IDSCANNING_CLASSSCANNING_KEYSCANNING_VALUESCANNING_BARE_VALUESCANNING_QUOTED_VALUESCANNING_COMMENTSCANNING_ESCAPEDDONE r   r   N/root/rtd-docs/venv/lib/python3.8/site-packages/mdit_py_plugins/attrs/parse.pyr      s   r   z\sz"[\s!\"#$%&'()*+,./;<=>?@[\]^`{|}~]z[a-zA-Z\d_:-]c                   @  sj   e Zd ZddddZdddddZddd	dd
ddZd	ddddZd	dddZd	dddZdS )
TokenStateNone)returnc                 C  s   g | _ d| _d S )Nr   )_tokensstartselfr   r   r   __init__2   s    zTokenState.__init__int)r$   r"   c                 C  s
   || _ d S N)r$   )r&   r$   r   r   r   	set_start6   s    zTokenState.set_startstr)r$   endttyper"   c                 C  s   | j |||f d S r)   )r#   append)r&   r$   r,   r-   r   r   r   r.   9   s    zTokenState.appendzdict[str, str]stringr"   c           	      C  s   i }g }d}|t | jk r| j| \}}}|dkrD||| |d< n|dkr`||||  nv|dkr||| }|d t | jk r| j|d  \}}}|dkr|dkr||||  n||| ||< |d7 }|d7 }q|rd||d< |S )z$compile the tokens into a dictionaryr   idclasskeyr   value )lenr#   r.   join)	r&   r0   
attributesclassesidxr$   r,   r-   r3   r   r   r   compile<   s,    
zTokenState.compilec                 C  s
   t | jS r)   )r+   r#   r%   r   r   r   __str__V   s    zTokenState.__str__c                 C  s
   t | jS r)   )reprr#   r%   r   r   r   __repr__Y   s    zTokenState.__repr__N)	r   r   r   r'   r*   r.   r;   r<   r>   r   r   r   r   r    1   s   r    c                      s&   e Zd Zdddd fddZ  ZS )
ParseErrorr+   r(   r!   )msgposr"   c                   s    || _ t |d|   d S )Nz at position )rA   superr'   )r&   r@   rA   	__class__r   r   r'   ^   s    zParseError.__init__)r   r   r   r'   __classcell__r   r   rC   r   r?   ]   s   r?   r+   ztuple[int, dict[str, str]]r/   c                 C  s`   d}t j}t }|t| k rRt| | | ||}|t jkrH||| fS |d }q||| fS )zhParse attributes from start of string.

    :returns: (length of parsed string, dict of attributes)
    r   r   )r   r   r    r6   HANDLERSr   r;   )r0   rA   statetokensr   r   r   parsec   s    

rI   r(   )charrA   rH   r"   c                 C  s   | dkrt jS td|d S )N{zAttributes must start with '{')r   r   r?   rJ   rA   rH   r   r   r   handle_startt   s    rM   c                 C  s   | dks | dks | dks | dkr&t jS | dkr4t jS | dkrL|| t jS | dkrd|| t jS | dkr||| t jS t| r|| t j	S t
d	|  |d S )
Nr5   	
}#%.z&Unexpected character whilst scanning: )r   r   r   r*   r   r   r   REGEX_KEY_CHARACTERS	fullmatchr   r?   rL   r   r   r   handle_scanningz   s"     




rW   c                 C  s   | dkrt jS t jS )NrS   )r   r   r   rL   r   r   r   handle_scanning_comment   s    rX   c                 C  s   t | stjS | dkr@|d |jkr:||jd |d tjS t| rr|d |jkrl||jd |d tjS t	d|  |d S )NrQ   r   r1   z)Unexpected character whilst scanning id: )
REGEX_SPACE_PUNCTUATIONrV   r   r   r$   r.   r   REGEX_SPACEr   r?   rL   r   r   r   handle_scanning_id   s    

r[   c                 C  s   t | stjS | dkr@|d |jkr:||jd |d tjS t| rr|d |jkrl||jd |d tjS t	d|  |d S )NrQ   r   r2   z,Unexpected character whilst scanning class: )
rY   rV   r   r   r$   r.   r   rZ   r   r?   rL   r   r   r   handle_scanning_class   s    

r\   c                 C  sB   | dkr| |j|d tjS t| r.tjS td|  |d S )N=r3   z*Unexpected character whilst scanning key: )r.   r$   r   r   rU   rV   r   r?   rL   r   r   r   handle_scanning_key   s    
r^   c                 C  sF   | dkr| | tjS t| r2| | tjS td|  |d S )N"z,Unexpected character whilst scanning value: )r*   r   r   rU   rV   r   r?   rL   r   r   r   handle_scanning_value   s    


r`   c                 C  sb   t | rtjS | dkr.||j|d tjS t| rN||j|d tjS t	d|  |d S )NrQ   r4   z1Unexpected character whilst scanning bare value: )
rU   rV   r   r   r.   r$   r   rZ   r   r?   rL   r   r   r   handle_scanning_bare_value   s    

ra   c                 C  s   t jS r)   )r   r   rL   r   r   r   handle_scanning_escaped   s    rb   c                 C  sx   | dkr"| |jd |d tjS | dkr0tjS | dks@| dkrPtd|  || dkrr| |jd |d tjS tjS )	Nr_   r   r4   \rK   rQ   z3Unexpected character whilst scanning quoted value: rO   )r.   r$   r   r   r   r?   r   rL   r   r   r   handle_scanning_quoted_value   s     rd   z4dict[State, Callable[[str, int, TokenState], State]]rF   )'__doc__
__future__r   enumr   retypingr   r   r;   rZ   rY   rU   r    	Exceptionr?   rI   rM   rW   rX   r[   r\   r^   r`   ra   rb   rd   r   r   r   r   r   r   r   r   r   r   rF   __annotations__r   r   r   r   <module>   sT   


,          