
    $gl                         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dS )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                R    dddgi| _         	  t                      j        di | d S )Nlang_prefix	language-z6Prefix prepended to the language. Default: "language-" )configsuper__init__)selfkwargs	__class__s     _/var/www/html/netbox-4.1.3/venv/lib/python3.11/site-packages/markdown/extensions/fenced_code.pyr   zFencedCodeExtension.__init__'   s?    K)ab
 	/""6"""""    c                    |                     |            |j                            t          ||                                           dd           dS )z9 Add `FencedBlockPreprocessor` to the Markdown instance. fenced_code_block   N)registerExtensionpreprocessorsregisterFencedBlockPreprocessor
getConfigs)r   mds     r!   extendMarkdownz"FencedCodeExtension.extendMarkdown.   sN    
T"""
!!"9"doo>O>O"P"PRegijjjjjr"   )__name__
__module____qualname__r   r,   __classcell__r    s   @r!   r   r   &   sN        # # # # #k k k k k k 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
        r+   r   r   dict[str, Any]c                    t                                          |           || _        d| _        i | _        d| _        g d| _        d S )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   sT     %/1"
 
 
r"   lines	list[str]returnc           	     &   | j         s`| j        j        D ]L}t          |t                    r|                                | _        t          |t                    rd| _        Md| _         d	                    |          }d}	 | j
                            ||          }|r]ddg i f\  }}}}	|                    d          r{t          |                    d                    \  }
}|r|                    d          }||                     |
          \  }}}	t!          |          r|                    d          }nd|                    d          r|                    d          }|                    d	          r%t%          |                    d	                    |	d	<   | j        r| j        d
         r|	                    d
d          r| j                                        }|                    |	           |r2d                    d	                    |          |d                   |d<   t/          |                    d          f||                    dd          d|}|                    d          }ndx}x}x}}|r0| j                            dd          }d| t5          |           d}|r&dt5          d	                    |                     d}|rdt5          |           d}| j        rI|	rG|	                    d
d          s1d	                    d |	                                D                       }|                     |                    d                    }d| | d| | d| d	}| j        j                            |          }|d|                                          d| d||                                d          }|                                dz   t!          |          z   }nn~|                     d          S )z8 Match and store Fenced Code Blocks in the `HtmlStash`. T
r   r   N attrslanghl_linesr8   z{} {} 	css_classcodepygments_styledefault)rD   styleF)shebangr   r   z class=""z id="c              3  T   K   | ]#\  }}|d k    d| dt          |           dV  $dS )r8   rF   z="rM   Nr   ).0kvs      r!   	<genexpr>z.FencedBlockPreprocessor.run.<locals>.<genexpr>   sX       + +CG1a]^bp]p]p>>>%8%;%;>>>]p]p]p]p+ +r"   z<prez><code>z</code></pre>)!r9   r+   registeredExtensions
isinstancer
   r*   r:   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   r=   exttextindexmrD   idclassesr   rC   	remainderlocal_config	highliterrH   id_attr	lang_attr
class_attrkv_pairsprefixplaceholders                        r!   runzFencedBlockPreprocessor.runS   sq    $ 	)w3 . .c#677 <+.>>+;+;D(c#455 .)-D&$(D!yy@	$++D%88A >,0"b",<)b'6777## Q'>qwww?O?O'P'P$E9  ! !g *.*;*;E*B*B'B7|| .&{{1~~wwv / wwvwwz** Q-;AGGJ<O<O-P-Pz* ' $gD,@,P $gU[U_U_`nptUuUu $g#'#7#<#<#>#>L ''///  4;NNHHW--(55 5[1 !+!!*../?KK! ! '	! !I %++E+::DDBDDGDiD*x T!%!L!L$Sv$S7J47P7P$S$S$S	 Z%Y0CCHHWDUDU0V0V%Y%Y%Y
 E"D*=b*A*A"D"D"D) f VZZX]=^=^  $&77 + +KQ<<>>+ + + $ $  <<88Df'f:ffYfffSWfffD"g/55d;;z		z*MMkMMT!%%''((^MM		AK(8(88A@	B zz$r"   rC   Iterable[tuple[str, str]]%tuple[str, list[str], dict[str, Any]]c                    d}g }i }|D ]g\  }}|dk    r|}|dk    r|                     |           *|dk    rt          |          ||<   C|| j        v rt          |dd          ||<   b|||<   h|||fS )z6 Return tuple: `(id, [list, of, classes], {configs})` rB   rm   .rE   FT)fail_on_errorspreserve_none)appendr   r<   r   )r   rC   rm   rn   configsrP   rQ   s          r!   r[   z$FencedBlockPreprocessor.handle_attrs   s     
	 
	DAqDyycq!!!!j+A..

d'''+AeSWXXX



7G##r"   txtstrc                    |                     dd          }|                     dd          }|                     dd          }|                     dd          }|S )	z basic html escaping &z&amp;<z&lt;rS   z&gt;rM   z&quot;)replace)r   r   s     r!   rd   zFencedBlockPreprocessor._escape   sS    kk#w''kk#v&&kk#v&&kk#x((
r"   )r+   r   r   r3   )r=   r>   r?   r>   )rC   ry   r?   rz   )r   r   r?   r   )r-   r.   r/   __doc__recompiler   	MULTILINEDOTALLVERBOSErW   r   rx   r[   rd   r0   r1   s   @r!   r)   r)   5   s        00 bj  	 	 	ry 2:- O
 
 
 
 
 
P  P  P  P d$ $ $ $$       r"   r)   c                     t          di | S )Nr   )r   )r   s    r!   makeExtensionr      s    (((((r"   )r   
__future__r   textwrapr   rB   r   r'   r   
codehiliter	   r
   r   	attr_listr   r   utilr   serializersr   r   typingr   r   r   markdownr   r   r)   r   r   r"   r!   <module>r      sr    # " " " " "             ( ( ( ( ( ( G G G G G G G G G G A A A A A A A A ! ! ! ! ! ! - - - - - - 				 / / / / / / / / / / "!!!!!!k k k k k) k k kH H H H Hl H H HV) ) ) ) )r"   