U
    ShBR                     @  s  U d Z ddlmZ ddlmZmZ ddlmZmZm	Z	m
Z
mZ eG dd dZG dd dZeG d	d
 d
ZeG dd deZeG dd deZeG dd deZG dd deZeG dd dZdydddddddZdzddddddddZdddd d!d"Zddd#d$d%d&Zd{ddd(d)d*d+d,Zd|dd(d.d/d0d1Zddd2d3d4Zd}dd5d(d)d6d7d8Zdd(dd.d9d:d;Zddd.d<d=d>Zdd.d2d?d@ZddAdddBdCdDZ dddEd<dFdGZ!dddd#dHdIdJZ"ddKd2dLdMZ#dddNdOdPdQZ$dRZ%dSe&dT< dUZ'dSe&dV< dWZ(dSe&dX< dYZ)dSe&dZ< d[Z*dSe&d\< d]Z+dSe&d^< dRd_d`dadadbdcdddedfdgdhdidjdkdldmdndoZ,dpe&dq< drdsdtduZ-dve&dw< dxS )~a;  Parser for directive options.

This is a highly restricted parser for YAML,
which only allows a subset of YAML to be used for directive options:

- Only block mappings are allowed at the top level
- Mapping keys are parsed as strings (plain or quoted)
- Mapping values are parsed as strings (plain, quoted, literal `|`, folded `>`)
- `#` Comments are allowed and blank lines

Adapted from:
https://github.com/yaml/pyyaml/commit/957ae4d495cf8fcb5475c6c2f1bce801096b68a5

For a good description of multi-line YAML strings, see:
https://stackoverflow.com/a/21699210/5033292
    )annotations)	dataclassreplace)ClassVarFinalIterableLiteralcastc                   @  s*   e Zd ZU dZded< ded< ded< dS )Positionz$Position of a character in a stream.intindexlinecolumnN)__name__
__module____qualname____doc____annotations__ r   r   N/root/rtd-docs/venv/lib/python3.8/site-packages/myst_parser/parsers/options.pyr
      s   
r
   c                   @  s   e Zd ZdZddddZedddd	Zeddd
dZeddddZddddddZ	ddddddZ
ddddddZddddZdS ) StreamBufferz$A buffer for a stream of characters.str)streamc                 C  s    |t  | _d| _d| _d| _d S )Nr   )
_CHARS_END_buffer_index_line_column)selfr   r   r   r   __init__$   s    
zStreamBuffer.__init__r   returnc                 C  s   | j S N)r   r   r   r   r   r   *   s    zStreamBuffer.indexc                 C  s   | j S r"   )r   r#   r   r   r   r   .   s    zStreamBuffer.linec                 C  s   | j S r"   )r   r#   r   r   r   r   2   s    zStreamBuffer.columnr   )r   r!   c                 C  s   | j | j|  S r"   r   r   )r   r   r   r   r   peek6   s    zStreamBuffer.peek   )lengthr!   c                 C  s   | j | j| j|  S r"   r$   )r   r'   r   r   r   prefix9   s    zStreamBuffer.prefixNonec                 C  sx   |rt| j | j }|  jd7  _|dks>|dkrT| j | j dkrT|  jd7  _d| _n|dkrj|  jd7  _|d8 }q d S )Nr&   u	   
  
r      ﻿)r   r   r   r   )r   r'   chr   r   r   forward<   s    zStreamBuffer.forwardr
   c                 C  s   t | j| j| jS r"   )r
   r   r   r   r#   r   r   r   get_positionI   s    zStreamBuffer.get_positionN)r   )r&   )r&   )r   r   r   r   r   propertyr   r   r   r%   r(   r.   r/   r   r   r   r   r   !   s   r   c                   @  s.   e Zd ZU dZdZded< ded< ded< dS )	Tokenz.A parsed token from a directive option stream.z	<unknown>ClassVar[str]idr
   startendN)r   r   r   r   r3   r   r   r   r   r   r1   M   s   
r1   c                   @  s.   e Zd ZU dZded< ded< dZded< dS )	KeyTokenz<key>r2   r3   r   valueNzLiteral[(None, "'", '"')]styler   r   r   r3   r   r8   r   r   r   r   r6   V   s   
r6   c                   @  s.   e Zd ZU dZded< ded< dZded< dS )	
ValueTokenz<value>r2   r3   r   r7   Nz#Literal[(None, "'", '"', '|', '>')]r8   r9   r   r   r   r   r:   ^   s   
r:   c                   @  s   e Zd ZU dZded< dS )
ColonTokenz<colon>r2   r3   N)r   r   r   r3   r   r   r   r   r   r;   f   s   
r;   c                   @  sB   e Zd ZddddddddZd	d	d d
ddZddddZdS )TokenizeErrorNr   r
   z
str | NonezPosition | None)problemproblem_markcontextcontext_markc                 C  s   || _ || _|| _|| _dS )a  A YAML error with optional context.

        :param problem: The problem encountered
        :param problem_mark: The position of the problem
        :param context: The context of the error, e.g. the parent being scanned
        :param context_mark: The position of the context
        N)r?   r@   r=   r>   )r   r=   r>   r?   r@   r   r   r   r   l   s    zTokenizeError.__init__r   )line_offsetcolumn_offsetr!   c              	   C  sX   t | jt| j| jj| | jj| d| j| jdkr6dnt| j| jj| | jj| dS )z7Clone the error with the given line and column offsets.)r   r   N)r<   r=   r   r>   r   r   r?   r@   )r   rA   rB   r   r   r   clone   s     



zTokenizeError.cloner    c                 C  s   g }| j d k	r|| j  | jd k	rb| jj| jjksD| jj| jjkrb|d| jj d| jj  | jd k	rx|| j | jd k	r|d| jj d| jj  d|S )Nzat line z	, column r+   )r?   appendr@   r   r>   r   r=   join)r   linesr   r   r   __str__   s$    



zTokenizeError.__str__)NN)r   r   r   r   rC   rG   r   r   r   r   r<   k   s
     r<   c                   @  s   e Zd ZU dZded< dS )StateFboolhas_commentsN)r   r   r   rJ   r   r   r   r   r   rH      s   
rH   r   r   z#tuple[list[tuple[str, str]], State])textrA   rB   r!   c                 C  sH   g }t  }t| |||D ]&\}}||j|dk	r6|jndf q||fS )a  Parse a directive option block into (key, value) tuples.

    :param text: The directive option text.
    :param line_offset: The line offset to apply to the error positions.
    :param column_offset: The column offset to apply to the error positions.

    :raises: `TokenizeError`
    N )rH   
_to_tokensrD   r7   )rK   rA   rB   outputstate	key_tokenZvalue_tokenr   r   r   options_to_items   s    rQ   z,Iterable[tuple[KeyToken, ValueToken | None]])rK   rO   rA   rB   r!   c              
   c  s   d}ztt | |D ]R}t|tr6|dk	r0|dfV  |}qt|tr|dkrTtd|j||fV  d}q|dk	rv|dfV  W n: tk
r } z|s|r|||| W 5 d}~X Y nX dS )a   Parse a directive option, and yield key/value token pairs.

    :param text: The directive option text.
    :param line_offset: The line offset to apply to the error positions.
    :param column_offset: The column offset to apply to the error positions.

    :raises: `TokenizeError`
    Nzexpected key before value)	_tokenize
isinstancer6   r:   r<   r4   rC   )rK   rO   rA   rB   rP   tokenexcr   r   r   rM      s$    



rM   zIterable[Token])rK   rO   r!   c                 c  s:  t | }t|| | tkr"q6|jdks:td| | }|dkrft|tt	d |ddV  nt
||ddV  t|| | dkrtd| | }|  | }t||V  t|| | }|jdkrq|d	krt|tt	d	 ||V  q|dkr$t|tt	d |d
dV  qt
||d
dV  qdS )z,Yield tokens from a directive option stream.r   z!expected key to start at column 0)'")rW   rV   T)is_key:zexpected ':' after key)|>FN)r   _scan_to_next_tokenr%   r   r   r<   r/   _scan_flow_scalarr	   r   _scan_plain_scalarr.   r;   _scan_block_scalar)rK   rO   r   r-   
start_markend_markr   r   r   rR      s:    

 



rR   r)   )r   rO   r!   c                 C  sv   | j dkr|  dkr|   d}|sr|  dkr<|   q&|  dkrdd|_|  tkrd|   qNt| s"d}q"dS )zSkip spaces, line breaks and comments.

    The byte order mark is also stripped,
    if it's the first character in the stream.
    r   r,   F #TN)r   r%   r.   rJ   _CHARS_END_NEWLINE_scan_line_break)r   rO   foundr   r   r   r\     s    

r\   FrI   zKeyToken | ValueToken)r   rO   rX   r!   c           
      C  s  g }|   }|}|rdnd}g }d}|  dkr8d|_q| |}	|	tkst|rj|	dkrj| |d tkrjqt|d7 }q8|dkr~q|| || | | | |   }t| | d}|r|  dks| j	|k r |  dkrd|_qq |rt
||d|S t||d|S )Nr   r&   rc   TrY   )allow_newlinerL   )r/   r%   rJ   _CHARS_END_SPACE_TAB_NEWLINEextendrD   r(   r.   _scan_plain_spacesr   r6   rE   r:   )
r   rO   rX   chunksr`   ra   indentspacesr'   r-   r   r   r   r^   !  sD    



r^   Tz	list[str])r   rg   r!   c                 C  s   g }d}|  |dkr |d7 }q| |}| | |   }|r|tkrt| }g }|   tkr|   dkrv|   qT|t|  qT|dkr|| n|s|d || n|r|| |S )Nr   rb   r&   r+   )r%   r(   r.   _CHARS_NEWLINEre   _CHARS_SPACE_NEWLINErD   ri   )r   rg   rk   r'   whitespacesr-   
line_breakbreaksr   r   r   rj   J  s,    





rj   )r   r!   c                 C  sN   |   }|dkr6| ddkr*| d n|   dS |dkrJ|   |S dS )Nu   
   z
r+   u     rL   )r%   r(   r.   )r   r-   r   r   r   re   d  s    	re   zLiteral[("'", '"')])r   r8   rX   r!   c                 C  s   |dk}g }|   }|  }|   |t| || |  |krf|t| | |t| || q6|   |   }|rt||d||S t||d||S )NrW   rL   )	r/   r%   r.   ri   _scan_flow_scalar_non_spaces_scan_flow_scalar_spacesr6   rE   r:   )r   r8   rX   doublerk   r`   quotera   r   r   r   r]   z  s    r]   )r   rv   r`   r!   c                 C  s  g }d}|  |dt kr$|d7 }q|rB|| | | | |   }|sz|dkrz|  ddkrz|d | d q|r|dks|s|dkr|| |   q|r|dkr|   |   }|tkr|t|  |   n|tkrjt| }|   t|D ]6}|  |dkrtd	||  |f | 	 d
|qt
| |d}|t| | | n8|tkrt|  |t|  ntd| | 	 d
|q|S qd S )Nr   z'"\r&   rV   rs   z"\\0123456789ABCDEFabcdefz@expected escape sequence of %d hexadecimal numbers, but found %rz%while scanning a double-quoted scalar   z!found unknown escape character %r)r%   rh   rD   r(   r.   _ESCAPE_REPLACEMENTS_ESCAPE_CODESranger<   r/   r   chrrn   re   ri   _scan_flow_scalar_breaks)r   rv   r`   rk   r'   r-   kcoder   r   r   rt     s\    







rt   )r   r`   r!   c                 C  s   g }d}|  |dkr |d7 }q| |}| | |   }|tkrXtd|  d|nP|tkrt| }t| }|dkr|	| n|s|	d |
| n
|	| |S )Nr    	r&   zfound unexpected end of streamzwhile scanning a quoted scalarr+   rb   )r%   r(   r.   r   r<   r/   rn   re   r   rD   ri   )r   r`   rk   r'   rp   r-   rq   rr   r   r   r   ru     s0    




ru   c                 C  s@   g }|   dkr|   q|   tkr6|t|  q|S qd S )Nr   )r%   r.   rn   rD   re   )r   rk   r   r   r   r     s    
r   zLiteral[('|', '>')])r   r8   rO   r!   c                 C  s  d}|dk}g }|   }|   t| |\}}t| || |d }	|	dk rNd}	|d krpt| \}
}}t|	|}n|	| d }t| |\}
}d}| j|krl|  t	krl|
|
 |  dk}d}| |tkr|d7 }q|| | | | t| }t| |\}
}| j|krl|  t	krl|rZ|dkrZ|rZ|  dkrZ|
sd|d n
|| qqlq|dk	r|| |d	kr|
|
 t||d||S )
Nr   r[   r&   rL   r   r+   rb   FT)r/   r.   _scan_block_scalar_indicators_scan_block_scalar_ignored_line_scan_block_scalar_indentationmax_scan_block_scalar_breaksr   r%   r   ri   rd   rD   r(   re   r:   rE   )r   r8   rO   rl   foldedrk   r`   chomping	incrementZ
min_indentrr   
max_indentra   rq   Zleading_non_spacer'   r   r   r   r_     sX    







r_   ztuple[bool | None, int | None]c                 C  s   d }d }|   }|dkrd|dk}|   |   }|dkrt|}|dkrZtd|  d||   nR|dkrt|}|dkrtd|  d||   |   }|dkr|dk}|   |   }|tkrtd| |  d|||fS )Nz+-+
0123456789r   z<expected indentation indicator in the range 1-9, but found 0while scanning a block scalarz9expected chomping or indentation indicators, but found %r)r%   r.   r   r<   r/   _CHARS_END_SPACE_NEWLINE)r   r`   r   r   r-   r   r   r   r   '  sP    
r   )r   r`   rO   r!   c                 C  sp   |   dkr|   q |   dkr>d|_|   tkr>|   q(|   }|tkrdtd| |  d|t|  d S )Nrb   rc   Tz0expected a comment or a line break, but found %rr   )r%   r.   rJ   rd   r<   r/   re   )r   r`   rO   r-   r   r   r   r   T  s    

r   ztuple[list[str], int, Position]c                 C  sd   g }d}|   }|  tkrZ|  dkr@|t|  |   }q|   | j|kr| j}q|||fS )Nr   rb   )r/   r%   ro   rD   re   r.   r   )r   rk   r   ra   r   r   r   r   h  s    

r   ztuple[list[str], Position])r   rl   r!   c                 C  sx   g }|   }| j|k r,|  dkr,|   q|  tkrp|t|  |   }| j|k r,|  dkr,|   qNq,||fS )Nrb   )r/   r   r%   r.   rn   rD   re   )r   rl   rk   ra   r   r   r   r   y  s    
r    z
Final[str]r   u
   
  rn   u    
  rd   u    
  ro   u     
  r   u     	
  rh   	r+   r*   rb   rW   rx   /       u    u    )0abtr   nvfrerb   rW   rx   r   N_LPzFinal[dict[str, str]]r{   rs         )xuUzFinal[dict[str, int]]r|   N)r   r   )r   r   )F)T)F).r   
__future__r   dataclassesr   r   typingr   r   r   r   r	   r
   r   r1   r6   r:   r;   	Exceptionr<   rH   rQ   rM   rR   r\   r^   rj   re   r]   rt   ru   r   r_   r   r   r   r   r   r   rn   rd   ro   r   rh   r{   r|   r   r   r   r   <module>   s   ,;      / ) 5<-