o
    „¿ÑgÞ“  ã                   @  s®  d Z ddlmZ ddlmZ ddlmZmZmZm	Z	 ddl
Z
ddlm  mZ zddlmZ W n ey<   ddlZY nw erEddlmZ dZd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Z 	 dZ!	 ed Z"	 dZ#	 e"Z$	 e#Z%	 d Z&	 d!Z'	 d"Z(	 d#Z)	 d$Z*	 d%Z+	 d[d(d)„Z,G d*d+„ d+e	ƒZ-G d,d-„ d-ƒZ.G d.d/„ d/e.ƒZ/G d0d1„ d1e.ƒZ0G d2d3„ d3e/ƒZ1G d4d5„ d5e/ƒZ2G d6d7„ d7e.ƒZ3G d8d9„ d9e/ƒZ4G d:d;„ d;e3ƒZ5G d<d=„ d=e4ƒZ6G d>d?„ d?e/ƒZ7G d@dA„ dAe3ƒZ8G dBdC„ dCe4ƒZ9G dDdE„ dEe/ƒZ:G dFdG„ dGe/ƒZ;G dHdI„ dIe;ƒZ<G dJdK„ dKe/ƒZ=G dLdM„ dMe=ƒZ>G dNdO„ dOe=ƒZ?G dPdQ„ dQe?ƒZ@G dRdS„ dSe?ƒZAG dTdU„ dUeAƒZBG dVdW„ dWe/ƒZCG dXdY„ dYe/ƒZDdS )\aB  
In version 3.0, a new, more flexible inline processor was added, [`markdown.inlinepatterns.InlineProcessor`][].   The
original inline patterns, which inherit from [`markdown.inlinepatterns.Pattern`][] or one of its children are still
supported, though users are encouraged to migrate.

The new `InlineProcessor` provides two major enhancements to `Patterns`:

1. Inline Processors no longer need to match the entire block, so regular expressions no longer need to start with
  `r'^(.*?)'` and end with `r'(.*?)%'`. This runs faster. The returned [`Match`][re.Match] object will only contain
   what is explicitly matched in the pattern, and extension pattern groups now start with `m.group(1)`.

2.  The `handleMatch` method now takes an additional input called `data`, which is the entire block under analysis,
    not just what is matched with the specified pattern. The method now returns the element *and* the indexes relative
    to `data` that the return element is replacing (usually `m.start(0)` and `m.end(0)`).  If the boundaries are
    returned as `None`, it is assumed that the match did not take place, and nothing will be altered in `data`.

    This allows handling of more complex constructs than regular expressions can handle, e.g., matching nested
    brackets, and explicit control of the span "consumed" by the processor.

é    )Úannotationsé   )Úutil)ÚTYPE_CHECKINGÚAnyÚ
CollectionÚ
NamedTupleN)Úentities)ÚMarkdownÚmdr
   Úkwargsr   Úreturnúutil.Registry[InlineProcessor]c                 K  sD  t  ¡ }| ttƒdd¡ | tt| ƒdd¡ | tt| ƒdd¡ | t	t
| ƒdd¡ | tt| ƒd	d
¡ | tt| ƒdd¡ | tt| ƒdd¡ | tt| ƒdd¡ | tt| ƒdd¡ | tt| ƒdd¡ | ttdƒdd¡ | tt| ƒdd¡ | tt| ƒdd¡ | ttƒdd¡ | tdƒdd ¡ | td!ƒd"d#¡ |S )$a  
    Build the default set of inline patterns for Markdown.

    The order in which processors and/or patterns are applied is very important - e.g. if we first replace
    `http://.../` links with `<a>` tags and _then_ try to replace inline HTML, we would end up with a mess. So, we
    apply the expressions in the following order:

    * backticks and escaped characters have to be handled before everything else so that we can preempt any markdown
      patterns by escaping them;

    * then we handle the various types of links (auto-links must be handled before inline HTML);

    * then we handle inline HTML.  At this point we will simply replace all inline HTML strings with a placeholder
      and add the actual HTML to a stash;

    * finally we apply strong, emphasis, etc.

    Úbacktické¾   Úescapeé´   Ú	referenceéª   Úlinké    Ú
image_linké–   Úimage_referenceéŒ   Úshort_referenceé‚   Úshort_image_refé}   Úautolinkéx   Úautomailén   ÚbrÚ	linebreakéd   ÚhtmléZ   ÚentityéP   Ú
not_strongéF   z\*Ú	em_strongé<   Ú_Ú
em_strong2é2   )r   ÚRegistryÚregisterÚBacktickInlineProcessorÚBACKTICK_REÚEscapeInlineProcessorÚ	ESCAPE_REÚReferenceInlineProcessorÚREFERENCE_REÚLinkInlineProcessorÚLINK_REÚImageInlineProcessorÚIMAGE_LINK_REÚImageReferenceInlineProcessorÚIMAGE_REFERENCE_REÚShortReferenceInlineProcessorÚ"ShortImageReferenceInlineProcessorÚAutolinkInlineProcessorÚAUTOLINK_REÚAutomailInlineProcessorÚAUTOMAIL_REÚSubstituteTagInlineProcessorÚLINE_BREAK_REÚHtmlInlineProcessorÚHTML_REÚ	ENTITY_REÚSimpleTextInlineProcessorÚNOT_STRONG_REÚAsteriskProcessorÚUnderscoreProcessor)r   r   ÚinlinePatterns© rO   úW/var/www/html/bloggers_ems/venv/lib/python3.10/site-packages/markdown/inlinepatterns.pyÚbuild_inlinepatterns8   s0   ÿÿÿrQ   z(?<!\!)z;(?:(?<!\\)((?:\\{2})+)(?=`+)|(?<!\\)(`+)(.+?)(?<!`)\2(?!`))z\\(.)z(\*)([^\*]+)\1z(\*{2})(.+?)\1z%(?<!\w)(_{2})(?!_)(.+?)(?<!_)\1(?!\w)z"(?<!\w)(_)(?!_)(.+?)(?<!_)\1(?!\w)z7(?<!\w)(\_)\1(?!\1)(.+?)(?<!\w)\1(?!\1)(.+?)\1{3}(?!\w)z(\*)\1{2}(.+?)\1(.*?)\1{2}z(_)\1{2}(.+?)\1(.*?)\1{2}z(\*)\1{2}(.+?)\1{2}(.*?)\1z(_)\1{2}(.+?)\1{2}(.*?)\1z&(\*)\1(?!\1)([^*]+?)\1(?!\1)(.+?)\1{3}z\[z\!\[z%((^|(?<=\s))(\*{1,3}|_{1,3})(?=\s|$))z+<((?:[Ff]|[Hh][Tt])[Tt][Pp][Ss]?://[^<>]*)>z<([^<> !]+@[^@<> ]+)>z;(<(\/?[a-zA-Z][^<>@ ]*( [^<>]*)?|!--(?:(?!<!--|-->).)*--)>)z-(&(?:\#[0-9]+|\#x[0-9a-fA-F]+|[a-zA-Z0-9]+);)z  \nÚstringÚstrc                 C  s8   |   d¡r
|  d¡s|   d¡r|  d¡r| dd… S | S )z#Remove quotes from around a string.ú"ú'r   éÿÿÿÿ)Ú
startswithÚendswith)rR   rO   rO   rP   Údequote®   s   ÿÿrY   c                   @  s*   e Zd ZU dZded< ded< ded< dS )ÚEmStrongItemzEmphasis/strong pattern item.zre.Pattern[str]ÚpatternrS   ÚbuilderÚtagsN)Ú__name__Ú
__module__Ú__qualname__Ú__doc__Ú__annotations__rO   rO   rO   rP   rZ   ·   s
   
 rZ   c                   @  sV   e Zd ZU dZeƒ Zded< 	 ddd	d
„Zddd„Zddd„Z	ddd„Z
ddd„ZdS )ÚPatternaí  
    Base class that inline patterns subclass.

    Inline patterns are handled by means of `Pattern` subclasses, one per regular expression.
    Each pattern object uses a single regular expression and must support the following methods:
    [`getCompiledRegExp`][markdown.inlinepatterns.Pattern.getCompiledRegExp] and
    [`handleMatch`][markdown.inlinepatterns.Pattern.handleMatch].

    All the regular expressions used by `Pattern` subclasses must capture the whole block.  For this
    reason, they all start with `^(.*)` and end with `(.*)!`.  When passing a regular expression on
    class initialization, the `^(.*)` and `(.*)!` are added automatically and the regular expression
    is pre-compiled.

    It is strongly suggested that the newer style [`markdown.inlinepatterns.InlineProcessor`][] that
    use a more efficient and flexible search approach be used instead. However, the older style
    `Pattern` remains for backward compatibility with many existing third-party extensions.

    zCollection[str]ÚANCESTOR_EXCLUDESNr[   rS   r   úMarkdown | Nonec                 C  s*   || _ t d| tjtjB ¡| _|| _dS )a!  
        Create an instant of an inline pattern.

        Arguments:
            pattern: A regular expression that matches a pattern.
            md: An optional pointer to the instance of `markdown.Markdown` and is available as
                `self.md` on the class instance.


        z^(.*?)%s(.*)$N)r[   ÚreÚcompileÚDOTALLÚUNICODEÚcompiled_rer   ©Úselfr[   r   rO   rO   rP   Ú__init__Ü   s
   

ÿ
zPattern.__init__r   ú
re.Patternc                 C  s   | j S )z' Return a compiled regular expression. )rj   ©rl   rO   rO   rP   ÚgetCompiledRegExpí   s   zPattern.getCompiledRegExpÚmúre.Match[str]úetree.Element | strc                 C  ó   dS )zóReturn a ElementTree element from the given match.

        Subclasses should override this method.

        Arguments:
            m: A match object containing a match of the pattern.

        Returns: An ElementTree Element object.

        NrO   ©rl   rq   rO   rO   rP   ÚhandleMatchñ   s   zPattern.handleMatchc                 C  s   | j jS )z+ Return class name, to define pattern type )Ú	__class__r^   ro   rO   rO   rP   Útypeþ   s   zPattern.typeÚtextc                   sD   z	| j jd j‰ W n ty   | Y S w ‡ fdd„}tj ||¡S )ú> Return unescaped text given text with an inline placeholder. Úinlinec                   s<   |   d¡}|ˆ v rˆ  |¡}t|tƒr|S d | ¡ ¡S d S )Nr   Ú )ÚgroupÚgetÚ
isinstancerS   ÚjoinÚitertext©rq   ÚidÚvalue©ÚstashrO   rP   Ú	get_stash	  s   


úz#Pattern.unescape.<locals>.get_stash©r   ÚtreeprocessorsÚstashed_nodesÚKeyErrorr   ÚINLINE_PLACEHOLDER_REÚsub©rl   ry   r‡   rO   r…   rP   Úunescape  s   ÿ	zPattern.unescape©N©r[   rS   r   re   )r   rn   )rq   rr   r   rs   )r   rS   )ry   rS   r   rS   )r^   r_   r`   ra   Útuplerd   rb   rm   rp   rv   rx   r   rO   rO   rO   rP   rc   Â   s   
 


rc   c                   @  s&   e Zd ZdZdddd„Zddd„ZdS )ÚInlineProcessorz¡
    Base class that inline processors subclass.

    This is the newer style inline processor that uses a more
    efficient and flexible search approach.

    Nr[   rS   r   re   c                 C  s,   || _ t |tjtjB ¡| _d| _|| _dS )a"  
        Create an instant of an inline processor.

        Arguments:
            pattern: A regular expression that matches a pattern.
            md: An optional pointer to the instance of `markdown.Markdown` and is available as
                `self.md` on the class instance.

        FN)r[   rf   rg   rh   ri   rj   Ú	safe_moder   rk   rO   rO   rP   rm     s   

zInlineProcessor.__init__rq   rr   Údatar   ú9tuple[etree.Element | str | None, int | None, int | None]c                 C  rt   )a™  Return a ElementTree element from the given match and the
        start and end index of the matched text.

        If `start` and/or `end` are returned as `None`, it will be
        assumed that the processor did not find a valid region of text.

        Subclasses should override this method.

        Arguments:
            m: A re match object containing a match of the pattern.
            data: The buffer currently under analysis.

        Returns:
            el: The ElementTree element, text or None.
            start: The start of the region that has been matched or None.
            end: The end of the region that has been matched or None.

        NrO   ©rl   rq   r•   rO   rO   rP   rv   /  s   zInlineProcessor.handleMatchr   r‘   )rq   rr   r•   rS   r   r–   ©r^   r_   r`   ra   rm   rv   rO   rO   rO   rP   r“     s    r“   c                   @  ó   e Zd ZdZd	dd„ZdS )
ÚSimpleTextPatternz2 Return a simple text of `group(2)` of a Pattern. rq   rr   r   rS   c                 C  s
   |  d¡S )z< Return string content of `group(2)` of a matching pattern. é   )r}   ru   rO   rO   rP   rv   G  s   
zSimpleTextPattern.handleMatchN)rq   rr   r   rS   ©r^   r_   r`   ra   rv   rO   rO   rO   rP   rš   E  ó    rš   c                   @  ó   e Zd ZdZddd	„Zd
S )rJ   z2 Return a simple text of `group(1)` of a Pattern. rq   rr   r•   rS   r   útuple[str, int, int]c                 C  s   |  d¡| d¡| d¡fS )z< Return string content of `group(1)` of a matching pattern. r   r   )r}   ÚstartÚendr—   rO   rO   rP   rv   N  s   z%SimpleTextInlineProcessor.handleMatchN©rq   rr   r•   rS   r   rŸ   rœ   rO   rO   rO   rP   rJ   L  r   rJ   c                   @  rž   )r5   z Return an escaped character. rq   rr   r•   rS   r   útuple[str | None, int, int]c                 C  sT   |  d¡}|| jjv rd tjt|ƒtj¡| d¡| 	d¡fS d| d¡| 	d¡fS )aµ  
        If the character matched by `group(1)` of a pattern is in [`ESCAPED_CHARS`][markdown.Markdown.ESCAPED_CHARS]
        then return the integer representing the character's Unicode code point (as returned by [`ord`][]) wrapped
        in [`util.STX`][markdown.util.STX] and [`util.ETX`][markdown.util.ETX].

        If the matched character is not in [`ESCAPED_CHARS`][markdown.Markdown.ESCAPED_CHARS], then return `None`.
        r   ú{}{}{}r   N)
r}   r   ÚESCAPED_CHARSÚformatr   ÚSTXÚordÚETXr    r¡   )rl   rq   r•   ÚcharrO   rO   rP   rv   V  s   
	(z!EscapeInlineProcessor.handleMatchN)rq   rr   r•   rS   r   r£   rœ   rO   rO   rO   rP   r5   S  ó    r5   c                   @  s$   e Zd ZdZddd„Zddd„ZdS )ÚSimpleTagPatternz]
    Return element of type `tag` with a text attribute of `group(3)`
    of a Pattern.

    r[   rS   Útagc                 C  ó   t  | |¡ || _dS )zµ
        Create an instant of an simple tag pattern.

        Arguments:
            pattern: A regular expression that matches a pattern.
            tag: Tag of element.

        N)rc   rm   r­   ©rl   r[   r­   rO   rO   rP   rm   l  ó   	zSimpleTagPattern.__init__rq   rr   r   úetree.Elementc                 C  s   t  | j¡}| d¡|_|S )z¤
        Return [`Element`][xml.etree.ElementTree.Element] of type `tag` with the string in `group(3)` of a
        matching pattern as the Element's text.
        é   )ÚetreeÚElementr­   r}   ry   )rl   rq   ÚelrO   rO   rP   rv   y  s   zSimpleTagPattern.handleMatchN©r[   rS   r­   rS   ©rq   rr   r   r±   r˜   rO   rO   rO   rP   r¬   f  ó    
r¬   c                   @  s$   e Zd ZdZddd„Zddd„ZdS )ÚSimpleTagInlineProcessorz]
    Return element of type `tag` with a text attribute of `group(2)`
    of a Pattern.

    r[   rS   r­   c                 C  r®   )z·
        Create an instant of an simple tag processor.

        Arguments:
            pattern: A regular expression that matches a pattern.
            tag: Tag of element.

        N)r“   rm   r­   r¯   rO   rO   rP   rm   ‰  r°   z!SimpleTagInlineProcessor.__init__rq   rr   r•   r   útuple[etree.Element, int, int]c                 C  s.   t  | j¡}| d¡|_|| d¡| d¡fS )z¤
        Return [`Element`][xml.etree.ElementTree.Element] of type `tag` with the string in `group(2)` of a
        matching pattern as the Element's text.
        r›   r   )r³   r´   r­   r}   ry   r    r¡   ©rl   rq   r•   rµ   rO   rO   rP   rv   –  s   z$SimpleTagInlineProcessor.handleMatchNr¶   ©rq   rr   r•   rS   r   rº   r˜   rO   rO   rO   rP   r¹   ƒ  r¸   r¹   c                   @  r™   )
ÚSubstituteTagPatternú3 Return an element of type `tag` with no children. rq   rr   r   r±   c                 C  s   t  | j¡S )úH Return empty [`Element`][xml.etree.ElementTree.Element] of type `tag`. )r³   r´   r­   ru   rO   rO   rP   rv   ¢  s   z SubstituteTagPattern.handleMatchNr·   rœ   rO   rO   rO   rP   r½      r   r½   c                   @  rž   )rE   r¾   rq   rr   r•   rS   r   rº   c                 C  s   t  | j¡| d¡| d¡fS )r¿   r   )r³   r´   r­   r    r¡   r—   rO   rO   rP   rv   ©  s   z(SubstituteTagInlineProcessor.handleMatchNr¼   rœ   rO   rO   rO   rP   rE   §  r   rE   c                   @  s"   e Zd ZdZdd„ Zdd
d„ZdS )r3   zA Return a `<code>` element containing the escaped matching text. c                 C  s.   t  | |¡ d tjtdƒtj¡| _d| _d S )Nr¤   ú\Úcode)	r“   rm   r¦   r   r§   r¨   r©   ÚESCAPED_BSLASHr­   )rl   r[   rO   rO   rP   rm   °  s   z BacktickInlineProcessor.__init__rq   rr   r•   rS   r   ú$tuple[etree.Element | str, int, int]c                 C  sn   |  d¡r$t | j¡}t t |  d¡ ¡ ¡¡|_|| 	d¡| 
d¡fS |  d¡ d| j¡| 	d¡| 
d¡fS )a€  
        If the match contains `group(3)` of a pattern, then return a `code`
        [`Element`][xml.etree.ElementTree.Element] which contains HTML escaped text (with
        [`code_escape`][markdown.util.code_escape]) as an [`AtomicString`][markdown.util.AtomicString].

        If the match does not contain `group(3)` then return the text of `group(1)` backslash escaped.

        r²   r   r   z\\)r}   r³   r´   r­   r   ÚAtomicStringÚcode_escapeÚstripry   r    r¡   ÚreplacerÂ   r»   rO   rO   rP   rv   ¶  s
   
	&z#BacktickInlineProcessor.handleMatchN)rq   rr   r•   rS   r   rÃ   r˜   rO   rO   rO   rP   r3   ®  s    r3   c                   @  r™   )
ÚDoubleTagPatternúfReturn a ElementTree element nested in tag2 nested in tag1.

    Useful for strong emphasis etc.

    rq   rr   r   r±   c                 C  sR   | j  d¡\}}t |¡}t ||¡}| d¡|_t| ¡ ƒdkr'| d¡|_	|S )z¬
        Return [`Element`][xml.etree.ElementTree.Element] in following format:
        `<tag1><tag2>group(3)</tag2>group(4)</tag2>` where `group(4)` is optional.

        ú,r²   é   é   )
r­   Úsplitr³   r´   Ú
SubElementr}   ry   ÚlenÚgroupsÚtail)rl   rq   Útag1Útag2Úel1Úel2rO   rO   rP   rv   Í  s   
zDoubleTagPattern.handleMatchNr·   rœ   rO   rO   rO   rP   rÈ   Ç  ó    rÈ   c                   @  rž   )ÚDoubleTagInlineProcessorrÉ   rq   rr   r•   rS   r   rº   c                 C  sd   | j  d¡\}}t |¡}t ||¡}| d¡|_t| ¡ ƒdkr'| d¡|_	|| 
d¡| d¡fS )z¬
        Return [`Element`][xml.etree.ElementTree.Element] in following format:
        `<tag1><tag2>group(2)</tag2>group(3)</tag2>` where `group(3)` is optional.

        rÊ   r›   r²   r   )r­   rÍ   r³   r´   rÎ   r}   ry   rÏ   rÐ   rÑ   r    r¡   )rl   rq   r•   rÒ   rÓ   rÔ   rÕ   rO   rO   rP   rv   â  s   
z$DoubleTagInlineProcessor.handleMatchNr¼   rœ   rO   rO   rO   rP   r×   Ü  rÖ   r×   c                   @  s*   e Zd ZdZddd	„Zd
d„ Zdd„ ZdS )rG   z1 Store raw inline html and return a placeholder. rq   rr   r•   rS   r   rŸ   c                 C  s:   |   |  | d¡¡¡}| jj |¡}|| d¡| d¡fS )zL Store the text of `group(1)` of a pattern and return a placeholder string. r   r   )Úbackslash_unescaper   r}   r   Ú	htmlStashÚstorer    r¡   )rl   rq   r•   ÚrawhtmlÚplace_holderrO   rO   rP   rv   ó  s   zHtmlInlineProcessor.handleMatchc                   sF   z	ˆ j jd j‰W n ty   | Y S w ‡ ‡fdd„}tj ||¡S )rz   r{   c                   sJ   |   d¡}ˆ |¡}|d ur#zˆ j |¡W S  ty"   d|  Y S w d S )Nr   z\%s)r}   r~   r   Ú
serializerÚ	Exceptionr‚   ©rl   r†   rO   rP   r‡      s   

ÿýz/HtmlInlineProcessor.unescape.<locals>.get_stashrˆ   rŽ   rO   rß   rP   r   ù  s   ÿ	zHtmlInlineProcessor.unescapec                 C  s>   z	| j jd j}W n ty   | Y S w dd„ }| ||¡S )zG Return text with backslash escapes undone (backslashes are restored). r   c                 S  s   t t|  d¡ƒƒS )Nr   )ÚchrÚintr}   )rq   rO   rO   rP   Ú	_unescape  s   z9HtmlInlineProcessor.backslash_unescape.<locals>._unescape)r   r‰   ÚREr‹   r   )rl   ry   rã   râ   rO   rO   rP   rØ     s   ÿz&HtmlInlineProcessor.backslash_unescapeNr¢   )r^   r_   r`   ra   rv   r   rØ   rO   rO   rO   rP   rG   ñ  s
    
rG   c                
   @  sÌ   e Zd ZdZee eejej	B ¡ddƒee e
ejej	B ¡ddƒee eejej	B ¡ddƒee eejej	B ¡ddƒee eejej	B ¡ddƒgZ	 d	d
„ Zdd„ Zdd„ Zddd„Zdd„ Zddd„ZdS )rL   zGEmphasis processor for handling strong and em matches inside asterisks.Údoubleú	strong,emú	em,strongÚdouble2ÚsingleÚstrongÚemc                 C  s(   t  |¡}| d¡}|  ||d|¡ |S )zReturn single tag.r›   N)r³   r´   r}   Úparse_sub_patterns)rl   rq   r­   ÚidxrÔ   ry   rO   rO   rP   Úbuild_single$  s   

zAsteriskProcessor.build_singlec           	      C  st   |  d¡\}}t |¡}t |¡}| d¡}|  ||d|¡ | |¡ t| ¡ ƒdkr8| d¡}|  ||||¡ |S )zReturn double tag.rÊ   r›   Nr²   )rÍ   r³   r´   r}   rë   ÚappendrÏ   rÐ   ©	rl   rq   r]   rì   rÒ   rÓ   rÔ   rÕ   ry   rO   rO   rP   Úbuild_double+  s   




zAsteriskProcessor.build_doublec           	      C  sd   |  d¡\}}t |¡}t |¡}| d¡}|  ||d|¡ | d¡}| |¡ |  ||d|¡ |S )zFReturn double tags (variant 2): `<strong>text <em>text</em></strong>`.rÊ   r›   Nr²   )rÍ   r³   r´   r}   rë   rî   rï   rO   rO   rP   Úbuild_double29  s   




zAsteriskProcessor.build_double2r   ÚNonec                 C  s  d}d}t |ƒ}||k rl| j ||¡rdd}t| jƒD ]B\}	}
|	|kr#q|
j ||¡}|r\||| d¡… }|rB|dur?||_n||_|  	||
j
|
j|	¡}| |¡ |}| d¡ }}d}q|sc|d7 }n|d7 }||k s||d… }|r‚|dur}||_dS ||_dS dS )a”  
        Parses sub patterns.

        `data` (`str`):
            text to evaluate.

        `parent` (`etree.Element`):
            Parent to attach text and sub elements to.

        `last` (`etree.Element`):
            Last appended child to parent. Can also be None if parent has no children.

        `idx` (`int`):
            Current pattern index that was used to evaluate the parent.

        r   FNTr   )rÏ   rj   ÚmatchÚ	enumerateÚPATTERNSr[   r    rÑ   ry   Úbuild_elementr\   r]   rî   r¡   )rl   r•   ÚparentÚlastrì   ÚoffsetÚposÚlengthÚmatchedÚindexÚitemrq   ry   rµ   rO   rO   rP   rë   F  sB   
€€à#

üz$AsteriskProcessor.parse_sub_patternsc                 C  s:   |dkr|   |||¡S |dkr|  |||¡S |  |||¡S )zElement builder.rç   rä   )rñ   rð   rí   )rl   rq   r\   r]   rý   rO   rO   rP   rö   †  s
   zAsteriskProcessor.build_elementrq   rr   r•   rS   ú3tuple[etree.Element | None, int | None, int | None]c           	      C  sn   d}d}d}t | jƒD ]&\}}|j || d¡¡}|r1| d¡}| d¡}|  ||j|j|¡} nq|||fS )zParse patterns.Nr   )	rô   rõ   r[   ró   r    r¡   rö   r\   r]   )	rl   rq   r•   rµ   r    r¡   rý   rþ   Úm1rO   rO   rP   rv     s   

ü
zAsteriskProcessor.handleMatchN)r   rò   ©rq   rr   r•   rS   r   rÿ   )r^   r_   r`   ra   rZ   rf   rg   ÚEM_STRONG_RErh   ri   ÚSTRONG_EM_REÚSTRONG_EM3_REÚ	STRONG_REÚEMPHASIS_RErõ   rí   rð   rñ   rë   rö   rv   rO   rO   rO   rP   rL     s    û
@
rL   c                
   @  s–   e Zd ZdZee eejej	B ¡ddƒee e
ejej	B ¡ddƒee eejej	B ¡ddƒee eejej	B ¡ddƒee eejej	B ¡ddƒgZd	S )
rM   zIEmphasis processor for handling strong and em matches inside underscores.rä   rå   ræ   rç   rè   ré   rê   N)r^   r_   r`   ra   rZ   rf   rg   ÚEM_STRONG2_RErh   ri   ÚSTRONG_EM2_REÚSMART_STRONG_EM_REÚSMART_STRONG_REÚSMART_EMPHASIS_RErõ   rO   rO   rO   rP   rM   ¡  s    ûrM   c                   @  sH   e Zd ZdZe dejejB ¡Ze d¡Z	dd
d„Z
dd„ Zdd„ ZdS )r9   z- Return a link element from the given match. z2\(\s*(?:(<[^<>]*>)\s*(?:('[^']*'|"[^"]*")\s*)?\))?z\srq   rr   r•   rS   r   rÿ   c           	      C  s|   |   || d¡¡\}}}|sdS |  ||¡\}}}}|sdS t d¡}||_| d|¡ |dur6| d|¡ || d¡|fS )zS Return an `a` [`Element`][xml.etree.ElementTree.Element] or `(None, None, None)`. r   ©NNNÚaÚhrefNÚtitle)ÚgetTextr¡   ÚgetLinkr³   r´   ry   Úsetr    )	rl   rq   r•   ry   rý   Úhandledr  r  rµ   rO   rO   rP   rv   ³  s   
zLinkInlineProcessor.handleMatchc                 C  sÐ  d}d}d}| j j||d}|r7| d¡r7| d¡dd…  ¡ }| d¡r.| d¡dd… }| d¡}d	}n|rHd}d}| ¡ }	|	}d}
d}d}d}d}d}d}d}d}t|t|ƒƒD ]Ð}|| }|d
krw|sn|d7 }nk|dkrv|d8 }nb|dkr¦|dkrƒ||ks‹|dkrŽ||krŽd}nK|s•|d8 }nD|dkr¥|d8 }|dkr¥|d }
n3|dv rÙ|s¹d	}|}d}|d }|}n ||krÆ|sÆ|d }|}n||krÏ|d }n
|rÙ||krÙ|d }|d7 }|dkr&|dkrþ||krþ||	|d … }d |||d … ¡}n&|dkr||kr||	|d … }d |||d … ¡}n||	|d … } n|dkr-|}q]|dkrD|dkrD||	|
d … }|
}d}|dk}|dur[| j 	dt
|  | ¡ ¡ƒ¡}|  |¡ ¡ }||||fS )z?Parse data between `()` of `[Text]()` allowing recursive `()`. r|   NF©rú   r   rV   r›   r   Tú(ú))rU   rT   ú )ÚRE_LINKró   r}   rÆ   r¡   ÚrangerÏ   r€   ÚRE_TITLE_CLEANr   rY   r   )rl   r•   rý   r  r  r  rq   Úbracket_countÚbacktrack_countÚstart_indexÚlast_bracketÚquoteÚstart_quoteÚ
exit_quoteÚignore_matchesÚ	alt_quoteÚstart_alt_quoteÚexit_alt_quoterø   rú   ÚcrO   rO   rP   r  È  sœ   


€ 
€


€
zLinkInlineProcessor.getLinkc                 C  sx   d}g }t |t|ƒƒD ]&}|| }|dkr|d8 }n|dkr"|d7 }|d7 }|dkr, n| |¡ qd |¡||dkfS )zsParse the content between `[]` of the start of an image or link
        resolving nested square brackets.

        r   ú]ú[r   r|   )r  rÏ   rî   r€   )rl   r•   rý   r  ry   rú   r&  rO   rO   rP   r  <  s   
zLinkInlineProcessor.getTextNr  )r^   r_   r`   ra   rf   rg   rh   ri   r  r  rv   r  r  rO   rO   rO   rP   r9   ®  s    

tr9   c                   @  rž   )r;   z. Return a `img` element from the given match. rq   rr   r•   rS   r   rÿ   c           	      C  sˆ   |   || d¡¡\}}}|sdS |  ||¡\}}}}|sdS t d¡}| d|¡ |dur3| d|¡ | d|  |¡¡ || d¡|fS )zU Return an `img` [`Element`][xml.etree.ElementTree.Element] or `(None, None, None)`. r   r  ÚimgÚsrcNr  Úalt)r  r¡   r  r³   r´   r  r   r    )	rl   rq   r•   ry   rý   r  r*  r  rµ   rO   rO   rP   rv   S  s   
z ImageInlineProcessor.handleMatchNr  rœ   rO   rO   rO   rP   r;   P  r«   r;   c                   @  sN   e Zd ZdZe dej¡Ze dejej	B ¡Z
dd
d„Zdd„ Zddd„ZdS )r7   z6 Match to a stored reference and return link element. z\s+z\s?\[([^\]]*)\]rq   rr   r•   rS   r   rÿ   c           
      C  s   |   || d¡¡\}}}|sdS |  |||¡\}}}|sdS | j d|¡}|| jjvr3d| d¡|fS | jj| \}}	|  ||	|¡| d¡|fS )zz
        Return [`Element`][xml.etree.ElementTree.Element] returned by `makeTag` method or `(None, None, None)`.

        r   r  r  N)	r  r¡   ÚevalIdÚNEWLINE_CLEANUP_REr   r   Ú
referencesr    ÚmakeTag)
rl   rq   r•   ry   rý   r  rƒ   r¡   r  r  rO   rO   rP   rv   n  s   z$ReferenceInlineProcessor.handleMatchc                 C  sL   | j j||d}|sd|dfS | d¡ ¡ }| d¡}|s!| ¡ }||dfS )z\
        Evaluate the id portion of `[ref][id]`.

        If `[ref][]` use `[ref]`.
        r  NFr   r   T)r  ró   r}   Úlowerr¡   )rl   r•   rý   ry   rq   rƒ   r¡   rO   rO   rP   r,  „  s   


zReferenceInlineProcessor.evalIdr  r  ry   r±   c                 C  s0   t  d¡}| d|¡ |r| d|¡ ||_|S )z; Return an `a` [`Element`][xml.etree.ElementTree.Element]. r  r  r  )r³   r´   r  ry   ©rl   r  r  ry   rµ   rO   rO   rP   r/  ”  s   
z ReferenceInlineProcessor.makeTagNr  ©r  rS   r  rS   ry   rS   r   r±   )r^   r_   r`   ra   rf   rg   Ú	MULTILINEr-  rh   ri   r  rv   r,  r/  rO   rO   rO   rP   r7   h  s    
r7   c                   @  ó   e Zd ZdZdd„ ZdS )r?   z%Short form of reference: `[google]`. c                 C  ó   |  ¡ |dfS ©zEvaluate the id of `[ref]`.  T©r0  ©rl   r•   rý   ry   rO   rO   rP   r,  ¢  ó   z$ShortReferenceInlineProcessor.evalIdN©r^   r_   r`   ra   r,  rO   rO   rO   rP   r?      ó    r?   c                   @  rž   )r=   z7 Match to a stored reference and return `img` element. r  rS   r  ry   r   r±   c                 C  s<   t  d¡}| d|¡ |r| d|¡ | d|  |¡¡ |S )z= Return an `img` [`Element`][xml.etree.ElementTree.Element]. r)  r*  r  r+  )r³   r´   r  r   r1  rO   rO   rP   r/  ª  s   
z%ImageReferenceInlineProcessor.makeTagNr2  )r^   r_   r`   ra   r/  rO   rO   rO   rP   r=   ¨  r   r=   c                   @  r4  )r@   z* Short form of image reference: `![ref]`. c                 C  r5  r6  r7  r8  rO   rO   rP   r,  ¶  r9  z)ShortImageReferenceInlineProcessor.evalIdNr:  rO   rO   rO   rP   r@   ´  r;  r@   c                   @  rž   )rA   zD Return a link Element given an auto-link (`<http://example/com>`). rq   rr   r•   rS   r   rº   c                 C  sJ   t  d¡}| d|  | d¡¡¡ t | d¡¡|_|| d¡| 	d¡fS )zI Return an `a` [`Element`][xml.etree.ElementTree.Element] of `group(1)`. r  r  r   r   )
r³   r´   r  r   r}   r   rÄ   ry   r    r¡   r»   rO   rO   rP   rv   ¾  s   
z#AutolinkInlineProcessor.handleMatchNr¼   rœ   rO   rO   rO   rP   rA   ¼  r   rA   c                   @  rž   )rC   zW
    Return a `mailto` link Element given an auto-mail link (`<foo@example.com>`).
    rq   rr   r•   rS   r   rº   c                   sž   t  d¡}|  | d¡¡}| d¡r|tdƒd… }dd„ ‰ ‡ fdd„|D ƒ}t d	 |¡¡|_	d| }d	 d
d„ |D ƒ¡}| 
d|¡ || d¡| d¡fS )za Return an [`Element`][xml.etree.ElementTree.Element] containing a `mailto` link  of `group(1)`. r  r   zmailto:Nc                 S  s,   t j | ¡}|rd tj|¡S dtj| f S )z=Return entity definition by code, or the code if not defined.z{}{};z%s#%d;)r	   Úcodepoint2namer~   r¦   r   ÚAMP_SUBSTITUTE)rÁ   r(   rO   rO   rP   r<  Ñ  s   z;AutomailInlineProcessor.handleMatch.<locals>.codepoint2namec                   s   g | ]}ˆ t |ƒƒ‘qS rO   )r¨   ©Ú.0Úletter©r<  rO   rP   Ú
<listcomp>Ù  s    z7AutomailInlineProcessor.handleMatch.<locals>.<listcomp>r|   c                 S  s   g | ]}t jd t|ƒ  ‘qS )z#%d;)r   r=  r¨   r>  rO   rO   rP   rB  Ý  s
    ÿ
ÿr  r   )r³   r´   r   r}   rW   rÏ   r   rÄ   r€   ry   r  r    r¡   )rl   rq   r•   rµ   ÚemailÚlettersÚmailtorO   rA  rP   rv   Ê  s   


ÿz#AutomailInlineProcessor.handleMatchNr¼   rœ   rO   rO   rO   rP   rC   Æ  s    rC   )r   r
   r   r   r   r   )rR   rS   r   rS   )Era   Ú
__future__r   r|   r   Útypingr   r   r   r   rf   Úxml.etree.ElementTreer³   ÚElementTreer&   r	   ÚImportErrorÚhtmlentitydefsÚmarkdownr
   rQ   ÚNOIMGr4   r6   r  r  r
  r  r	  r  r  r  r  r  r:   r<   r8   r>   rK   rB   rD   rH   rI   rF   rY   rZ   rc   r“   rš   rJ   r5   r¬   r¹   r½   rE   r3   rÈ   r×   rG   rL   rM   r9   r;   r7   r?   r=   r@   rA   rC   rO   rO   rO   rP   Ú<module>   s®   ÿ
0
	S0' 
 #8
