
    /Vhl                         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_and_remainder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     O/home/dcms/DCMS/lib/python3.12/site-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                  |      }d}	 | j                  j                  ||      }|rddg i f\  }}}}	|j                  d      rct        |j                  d            \  }
}|r|j                  d      }m| j                  |
      \  }}}	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|}|j1                  d      }ndx}x}x}}|r-| j2                  j'                  dd      }d| t5        |       d}|rdt5        dj                  |             d}|rdt5        |       d}| j                  r:|	r8|	j'                  d
d      s&dj                  d |	j7                         D              }| j9                  |j                  d            }d| | d| | d| d	}| j                  j:                  j=                  |      }|d|j?                           d| d||j                         d  }|j?                         dz   t!        |      z   }nn|jA                  d      S )z8 Match and store Fenced Code Blocks in the `HtmlStash`. T
r   r   N attrs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groupr   endhandle_attrslenpopr   getcopyupdateformatr	   hiliter   r   items_escape	htmlStashstorestartsplit)r   linesexttextindexmr@   idclassesr   r?   	remainderlocal_config	highliterrD   id_attr	lang_attr
class_attrkv_pairsprefixplaceholders                        r!   runzFencedBlockPreprocessor.runS   s    $$ww33 .c#67+.>>+;D(c#45)-D&	. %)D!yy$$++D%8A,0"b",<)b'6777#'>qwww?O'P$E9  !g *.*;*;E*B'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	AK(88A B 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>   rj   .rA   FT)fail_on_errorspreserve_none)appendr   r;   r   )r   r?   rj   rk   configsrL   rM   s          r!   rW   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   ru   rW   r`   r0   r1   s   @r!   r)   r)   5   sT    0 bjj  	 	ryy 2::-O
P d$$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 A ! - 	 / /!k) kHl HV)r"   