
    e                        d Z ddlmZ ddlmZ ddlmZ ddlmZ ddl	m
Z
mZmZ dd	lmZmZ dd
lmZ ddlmZ ddlZddlmZmZmZ erddlmZ  G d de      Z G d de      Zd Zy)z
This extension adds Fenced Code Blocks to Python-Markdown.

See the [documentation](https://Python-Markdown.github.io/extensions/fenced_code_blocks)
for details.
    )annotations)dedent   )	Extension   )Preprocessor)
CodeHiliteCodeHiliteExtensionparse_hl_lines)	get_attrsAttrListExtension)parseBoolValue_escape_attrib_htmlN)TYPE_CHECKINGAnyIterable)Markdownc                  $     e Zd Z fdZd Z xZS )FencedCodeExtensionc                <    dddgi| _         	 t        |   di | y )Nlang_prefix	language-z6Prefix prepended to the language. Default: "language-" )configsuper__init__)selfkwargs	__class__s     A/usr/lib/python3/dist-packages/markdown/extensions/fenced_code.pyr   zFencedCodeExtension.__init__'   s,    K)ab
 	/"6"    c                    |j                  |        |j                  j                  t        || j	                               dd       y)z9 Add `FencedBlockPreprocessor` to the Markdown instance. fenced_code_block   N)registerExtensionpreprocessorsregisterFencedBlockPreprocessor
getConfigs)r   mds     r!   extendMarkdownz"FencedCodeExtension.extendMarkdown.   s9    
T"
!!"9"doo>O"PRegijr"   )__name__
__module____qualname__r   r,   __classcell__r    s   @r!   r   r   &   s    #kr"   r   c                       e Zd ZdZ ej
                   ed      ej                  ej                  z  ej                  z        Z
d fdZddZd	dZd
dZ xZS )r)   z& Find and extract fenced code blocks. a}  
            (?P<fence>^(?:~{3,}|`{3,}))[ ]*                          # opening fence
            ((\{(?P<attrs>[^\}\n]*)\})|                              # (optional {attrs} or
            (\.?(?P<lang>[\w#.+-]*)[ ]*)?                            # optional (.)lang
            (hl_lines=(?P<quot>"|')(?P<hl_lines>.*?)(?P=quot)[ ]*)?) # optional hl_lines)
            \n                                                       # newline (end of opening fence)
            (?P<code>.*?)(?<=\n)                                     # the code block
            (?P=fence)[ ]*$                                          # closing fence
        c                n    t         |   |       || _        d| _        i | _        d| _        g d| _        y )NF)linenums
guess_lang	noclassesuse_pygments)r   r   r   checked_for_depscodehilite_confuse_attr_listbool_options)r   r+   r   r    s      r!   r   z FencedBlockPreprocessor.__init__E   s9     %/1"
r"   c           	        | j                   s_| j                  j                  D ]?  }t        |t              r|j                         | _        t        |t              s9d| _        A d| _         dj                  |      }	 | j                  j                  |      }|rddg i f\  }}}}|j                  d      rJ| j                  t        |j                  d                  \  }}}t        |      rb|j!                  d      }nP|j                  d      r|j                  d      }|j                  d      rt#        |j                  d            |d<   | j                  r| j                  d	   r|j%                  d	d      r| j                  j'                         }	|	j)                  |       |r'd
j+                  dj                  |      |	d         |	d<   t-        |j                  d      f||	j!                  dd      d|	}
|
j/                  d      }ndx}x}x}}|r-| j0                  j%                  dd      }d| t3        |       d}|rdt3        dj                  |             d}|rdt3        |       d}| j                  r:|r8|j%                  d	d      s&dj                  d |j5                         D              }| j7                  |j                  d            }d| | d| | d| d	}| j                  j8                  j;                  |      }|d|j=                           d| d||j?                         d  }nn|jA                  d      S )z8 Match and store Fenced Code Blocks in the `HtmlStash`. T
N attrsr   langhl_linesr7   z{} {} 	css_classcodepygments_styledefault)r@   styleF)shebangr   r   z class=""z id="c              3  R   K   | ]  \  }}|d k7  sd| dt        |       d ! yw)r7   rB   z="rI   Nr   ).0kvs      r!   	<genexpr>z.FencedBlockPreprocessor.run.<locals>.<genexpr>   s8      +CG1a]^bp]pas"%8%;$<A>+s   ''z<prez><code>z</code></pre>)!r8   r+   registeredExtensions
isinstancer
   r*   r9   r   r:   joinFENCED_BLOCK_REsearchgrouphandle_attrsr   lenpopr   getcopyupdateformatr	   hiliter   r   items_escape	htmlStashstorestartendsplit)r   linesexttextmr@   idclassesr   local_config	highliterrD   id_attr	lang_attr
class_attrkv_pairsprefixplaceholders                     r!   runzFencedBlockPreprocessor.runS   sE    $$ww33 .c#67+.>>+;D(c#45)-D&	. %)D!yy$$++D1A,0"b",<)b'6777#*.*;*;IagggFV<W*X'B7|&{{1~wwv wwvwwz*-;AGGJ<O-Pz* ''D,@,@,PU[U_U_`nptUu#'#7#7#<#<#>L ''/ 4;NNHHW-(55[1 !+!!*../?K! '	!I %++E+:DBDDGDiD*x!%!L&.vh7J47P6QQR$S	'/0CCHHWDU0V/WWX%Y
$)*=b*A)B!"D))fVZZX]=^ $&77 +KQ<<>+ $  <<8D!':,fYKzQRSWRXXefD"gg//55d;z	*+2k]"T!%%'(^<LMu v zz$r"   c                    d}g }i }|D ]]  \  }}|dk(  r|}|dk(  r|j                  |       %|dk(  rt        |      ||<   9|| j                  v rt        |dd      ||<   Y|||<   _ |||fS )z6 Return tuple: `(id, [list, of, classes], {configs})` r>   ri   .rA   FT)fail_on_errorspreserve_none)appendr   r;   r   )r   r?   ri   rj   configsrL   rM   s          r!   rV   z$FencedBlockPreprocessor.handle_attrs   s     
	DAqDycq!j+A.
d'''+AeSWX


	 7G##r"   c                    |j                  dd      }|j                  dd      }|j                  dd      }|j                  dd      }|S )	z basic html escaping &z&amp;<z&lt;rO   z&gt;rI   z&quot;)replace)r   txts     r!   r_   zFencedBlockPreprocessor._escape   sG    kk#w'kk#v&kk#v&kk#x(
r"   )r+   r   r   zdict[str, Any])re   	list[str]returnr   )r?   zIterable[tuple[str, str]]r   z%tuple[str, list[str], dict[str, Any]])r~   strr   r   )r-   r.   r/   __doc__recompiler   	MULTILINEDOTALLVERBOSErS   r   rs   rV   r_   r0   r1   s   @r!   r)   r)   5   sT    0 bjj  	 	ryy 2::-O
I V$$r"   r)   c                     t        di | S )Nr   )r   )r   s    r!   makeExtensionr      s    (((r"   )r   
__future__r   textwrapr   r>   r   r'   r   
codehiliter	   r
   r   	attr_listr   r   utilr   serializersr   r   typingr   r   r   markdownr   r   r)   r   r   r"   r!   <module>r      sX    #   ( G G 3 ! - 	 / /!k) kAl AH)r"   