
    $g9                     ^   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 ddlZddlZdZd	Zd
Z ej        d          Z ej        d          Z ej        d          Z ej        d          ZdZ ej        d                    ej        d         ej        dd         dz  ej        d                             Z G d de          Zd Z G d d          Zd Zd Zd Z d Z!d*dZ"d+dZ#d*d Z$ G d! d"e          Z% G d# d$e          Z& G d% d&e&          Z' G d' d(e          Z(d) Z)dS ),a6  
SuperFences.

pymdownx.superfences
Nested Fenced Code Blocks

This is a modification of the original Fenced Code Extension.
Algorithm has been rewritten to allow for fenced blocks in blockquotes,
lists, etc.  And also , allow for special UML fences like 'flow' for flowcharts
and `sequence` for sequence diagrams.

Modified: 2014 - 2017 Isaac Muse <isaacmuse@gmail.com>
---

Fenced Code Extension for Python Markdown
=========================================

This extension adds Fenced Code Blocks to Python-Markdown.

See <https://pythonhosted.org/Markdown/extensions/fenced_code_blocks.html>
for documentation.

Original code Copyright 2007-2008 [Waylan Limberg](http://achinghead.com/).


All changes Copyright 2008-2014 The Python Markdown Project

License: [BSD](http://www.opensource.org/licenses/bsd-license.php)
    )	Extension)Preprocessor)CodeBlockProcessor)	get_attrs)utilN)> 	a  (?x)
    (?P<fence>~{3,}|`{3,})
    (?:[ \t]*\.?(?P<lang>[\w#.+-]+)(?=[\t ]|$))?                                           # Language
    (?:
        [ \t]*(\{(?P<attrs>[^\n]*)\}) |                                                    # Optional attributes or
        (?P<options>
            (?:
                (?:[ \t]*[a-zA-Z][a-zA-Z0-9_]*(?:=(?P<quot>"|').*?(?P=quot))?)(?=[\t ]|$)  # Options
            )+
        )
    )?[ \t]*$
    z3^(?P<hl_lines>\d+(?:-\d+)?(?:[ \t]+\d+(?:-\d+)?)*)$zS(?P<linestart>[\d]+)(?:[ \t]+(?P<linestep>[\d]+))?(?:[ \t]+(?P<linespecial>[\d]+))?zh(?x)
    (?:
        (?P<key>[a-zA-Z][a-zA-Z0-9_]*)(?:=(?P<quot>"|')(?P<value>.*?)(?P=quot))?
    )
    z	%s[ \t]*$z^([\> ]*){}({}){}$   z([0-9]+)c                       e Zd ZdZdS )SuperFencesExceptionz=Special exception to ensure one is raised when a fence fails.N)__name__
__module____qualname____doc__     T/var/www/html/netbox-4.1.3/venv/lib/python3.11/site-packages/pymdownx/superfences.pyr   r   P   s        GGGGr   r   c                     |                      dd          } |                      dd          } |                      dd          } | S )zBasic html escaping.&z&amp;<z&lt;r
   z&gt;)replace)txts    r   _escaper   T   sB     ++c7
#
#C
++c6
"
"C
++c6
"
"CJr   c                   8    e Zd ZdZd Zd Zd	dZd Zd Zd Z	dS )
	CodeStashz
    Stash code for later retrieval.

    Store original fenced code here in case we were
    too greedy and need to restore in an indented code
    block.
    c                     i | _         dS )Initialize.Nstashselfs    r   __init__zCodeStash.__init__f        


r   c                 *    t          | j                  S )zLength of stash.)lenr#   r$   s    r   __len__zCodeStash.__len__k   s     4:r   Nc                 <    | j                             ||          }|S )zGet the code from the key.)r#   get)r%   keydefaultcodes       r   r,   zCodeStash.getp   s     z~~c7++r   c                     | j         |= dS )zRemove the stashed code.Nr"   )r%   r-   s     r   removezCodeStash.removev   s     JsOOOr   c                     ||f| j         |<   dS )zStore the code in the stash.Nr"   )r%   r-   r/   indent_levels       r   storezCodeStash.store{   s      .
3r   c                     i | _         dS zClear the stash.Nr"   r$   s    r   clear_stashzCodeStash.clear_stash   r'   r   N)
r   r   r   r   r&   r*   r,   r1   r4   r7   r   r   r   r   r   ]   s}           
  
     
/ / /
    r   r   c                    |d         }|d         }|d         }|r|                     d|           |rd| dnd}|r(d                    d	                    |                    nd}|r4d	d	                    d
 |                                D                       z   nd}d                    |||t	          |                     S )zFormat source as code blocks.classesid_valueattrsr    id=""  class="{}"r   c              3   ,   K   | ]\  }}| d | dV  dS z="r>   Nr   .0kvs      r   	<genexpr>z$fence_code_format.<locals>.<genexpr>   2      BBDAqa<<1<<<BBBBBBr   z <pre{}{}{}><code>{}</code></pre>insertformatjoinitemsr   	sourcelanguage
class_nameoptionsmdkwargsr:   r;   r<   s	            r   fence_code_formatrU      s     YGj!H7OE &q*%%%&.6"x""""BH9@Hm""388G#4#4555bGFKSC#((BBEKKMMBBBBBBBQSE-44XwwW]___r   c                    |d         }|d         }|d         }|r|                     d|           |rd| dnd}|r(d                    d	                    |                    nd}|r4d	d	                    d
 |                                D                       z   nd}d                    |||t	          |                     S )zFormat source as div.r:   r;   r<   r   r=   r>   r?   r@   r   c              3   ,   K   | ]\  }}| d | dV  dS rB   r   rC   s      r   rG   z#fence_div_format.<locals>.<genexpr>   rH   r   z<div{}{}{}>{}</div>rI   rN   s	            r   fence_div_formatrX      s     YGj!H7OE &q*%%%&.6"x""""BH9@Hm""388G#4#4555bGFKSC#((BBEKKMMBBBBBBBQSE '''5'&//RRRr   c                 0   |j         d         j        }|                                D ]n\  }}d}|r^|                    d          r|||<   $dt          fdt
          fdfD ]/\  }	}
||	k    r$|dur |
|
                    |          	|||<   d} n0|s|||<   odS )zHighlight validator.fenced_code_blockFzdata-hl_lineslinenums)titleNT)preprocessorsuse_pygmentsrM   
startswithRE_HL_LINESRE_LINENUMSmatch)rP   inputsrR   r<   rS   r_   rE   rF   matchedopt	validators              r   highlight_validatorrh      s     #$78EL  1 		||G$$ a$.#<z;>WYh"i  Y88}})*;yq?Q?Q?]%&
"& 	E!H4r   c                 D    |                                 D ]
\  }}|||<   dS )zDefault validator.T)rM   )rP   rd   rR   r<   rS   rE   rF   s          r   default_validatorrj      s/       1a4r   c                 ^    |j         d                                           || ||||          S )zValidator wrapper.rZ   )r^   get_hl_settings)rP   rd   rR   r<   rS   rg   s         r   
_validatorrm      s7     ()99;;;9Xvwr:::r   r?   c                      || ||||fi |S )zFormatter wrapper.r   )srcrP   rR   rS   rQ   _fmtrT   s          r   
_formatterrq      s$     4Xz7BAA&AAAr   c                 "    |du p|dk    p| |k    S )zTest language.N*r   )rP   test_languages     r   _testru      s#     D UMS$8UH<UUr   c                   :     e Zd ZdZ fdZd Zd Zd Zd Z xZ	S )SuperFencesCodeExtensionz!SuperFences code block extension.c                 p    g | _         ddgg dgddgddgd| _         t                      j        |i | dS )	r!   Fz-Disable indented code blocks - Default: Falsez2Specify custom fences. Default: See documentation.r?   zwSet class name for wrapper element. The default of CodeHilite or Highlight will be usedif nothing is set. - Default: ''z(Preserve tabs in fences - Default: False)disable_indented_code_blockscustom_fences	css_classpreserve_tabsN)superfencesconfigsuperr&   )r%   argsrT   	__class__s      r   r&   z!SuperFencesCodeExtension.__init__   si     -24c,d "VW $%OP

 

 	$)&)))))r   c                     |t          j        t          |          ||d}|dk    r|| j        d<   dS | j                            |           dS )z@Extend SuperFences with the given name, language, and formatter.)rt   nametest	formatterrg   rs   r   N)	functoolspartialru   r}   append)r%   r   r   rg   objs        r   extend_super_fencesz,SuperFencesCodeExtension.extend_super_fences   sg     %e4@@@""	
 
 3;;"%DQ##C(((((r   c           
         |                     |            |                                 }| j                            ddt          dt          j        t          t                    d           |	                    dg           }|D ]}|	                    d          }|	                    d          }|	                    d	t                    }|	                    d
t                    }|L|J|                     |t          j        t          ||          t          j        t          |                     || _        |                                  t!                      | _        dS )z7Add fenced block preprocessor to the Markdown instance.r   r}   Nrg   r   rz   r   classrK   rg   )rQ   rp   )registerExtension
getConfigsr}   rJ   ru   r   r   rm   rh   r,   rU   rj   r   rq   rS   patch_fenced_ruler   r#   )	r%   rS   r~   rz   customr   rQ   fence_formatrg   s	            r   extendMarkdownz'SuperFencesCodeExtension.extendMarkdown   sU    	T""""" 	%!&.zEXYYY	 	
 	
 	
 

?B77# 
	 
	F::f%%DG,,J!::h0ABBL

;0ABBIJ$:((%jZl[[[%jIFFF      [[


r   c                    |                                  }t          | j                  }||_        | |_        | j        d         d         dk    r|j        | j        d         d<   | j        j                            |dd           t          | j        j
                  }||_        | |_        | j        j
        j                            |dd           |d	         r_t          | j                  }||_        | |_        | j        j                            |d
d           | j                            dgi            | j                            dgdddii           dS )a  
        Patch Python Markdown with our own fenced block extension.

        We don't attempt to protect against a user loading the `fenced_code` extension with this.
        Most likely they will have issues, but they shouldn't have loaded them together in the first place :).
        r   r   r}   r   rZ      r/   P   r|   fenced_raw_blockg?@zpymdownx._bypassnormzpymdownx.highlight_enabledFN)r   SuperFencesBlockPreprocessorrS   r~   	extensionr}   	highlightr^   registerSuperFencesCodeBlockProcessorparserblockprocessorsSuperFencesRawBlockPreprocessorregisterExtensions)r%   r~   fencedindented_code
raw_fenceds        r   r   z*SuperFencesCodeExtension.patch_fenced_rule!  sT    ""-dg66Av&-77/5/?DQ,&&v/BBGGG5dgnEE%"&&//vrJJJ/" 	E8AAJ &J#'J G!**:7I5QQQG&&(>'?DDD 	""$8#9<PS]_dRe;fgggggr   c                 8    | j                                          dS r6   )r#   r7   r$   s    r   resetzSuperFencesCodeExtension.resetB  s     	
     r   )
r   r   r   r   r&   r   r   r   r   __classcell__r   s   @r   rw   rw      s        ++* * * * *") ) )"! "! "!Hh h hB! ! ! ! ! ! !r   rw   c                        e Zd ZdZdZ f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d Zd Zd Zd Zd ZddZd Zd Zd Zd Z xZS )r   z
    Preprocessor to find fenced code blocks.

    Because this is done as a preprocessor, it might be too greedy.
    We will stash the blocks code and restore if we mistakenly processed
    text from an indented code block.
    z<pre%s><code%s>%s</code></pre>c                     t                                          |           | j        j        | _        d| _        i | _        dS )r!   FN)r   r&   rS   
tab_lengthtab_lenchecked_hl_settingscodehilite_conf)r%   rS   r   s     r   r&   z%SuperFencesBlockPreprocessor.__init__S  s?     	w)#( !r   c                 6    |                     | j                  S )zNormalize whitespace.)
expandtabsr   )r%   texts     r   normalize_wsz)SuperFencesBlockPreprocessor.normalize_ws[  s     t|,,,r   c                 F     d                      fd|D                       S )zDedent the fenced block lines.
c                 .    g | ]}|j         d          S r8   )ws_virtual_len)rD   liner%   s     r   
<listcomp>z>SuperFencesBlockPreprocessor.rebuild_block.<locals>.<listcomp>c  s'    GGG$t2334GGGr   )rL   r%   liness   ` r   rebuild_blockz*SuperFencesBlockPreprocessor.rebuild_block`  s,     yyGGGGGGGHHHr   c                    | j         sSd| _         d}d| _        | j        j        D ]H}|| _        	 |                                }|                                | _         n# t          $ r Y Ew xY wd| j        j        v | _	        | j
        d         }|r|n|d         | _        |                    dd          | _        |d         | _        |d         | _        |d         | _        |d	         | _        |d
         | _        |                    dd          | _        |                    dd
          | _        |                    dd          | _        |                    dd          | _        |                    dd          | _        |                    dd          | _        |                    di           | _        |                    dd          | _        |                    dd          | _        |                    dd          | _        |                    dd          | _        |                    dd          | _        |                    dd          | _        dS dS )z8Check for Highlight extension to get its configurations.TN	attr_listr{   extend_pygments_lang
guess_langpygments_styler_   	noclassesr\   linenums_styletablelinenums_classlinenums_specialr   language_prefixz	language-code_attr_on_preF
auto_titleauto_title_map
line_spansr?   line_anchorsanchor_linenumspygments_lang_classstripnldefault_lang) r   highlighterrS   registeredExtensionshighlight_extget_pymdownx_highlight_settingsget_pymdownx_highlighterAttributeErrortreeprocessorsr   r~   r{   r,   r   r   r   r_   r   r\   r   r   r   r   r   r   r   r   r   r   r   r   r   )r%   r~   extr{   s       r   rl   z,SuperFencesBlockPreprocessor.get_hl_settingse  sP    ' %	A'+D$F#Dw3  %(" @@BBF'*'C'C'E'ED$E%   D )DG,BBDNK0I*3LYY9LDN(.

3I4(P(PD%$\2DO"()9":D &~ 6D#K0DN":.DM"(**-=w"G"GD"(**-=z"J"JD$*JJ/A2$F$FD!#)::.?#M#MD $*JJ/A5$I$ID!$jju==DO"(**-=r"B"BD$jjr::DO &

>2 > >D#)::.?#G#GD '-zz2G'O'OD$!::i66DL &

>4 @ @DK%	A %	As   -A
A+*A+c                     d| _         d| _        d| _        d| _        d| _        d| _        g | _        d| _        d| _        i | _	        g | _
        d| _        i | _        d| _        dS )zReset the class variables.Nr   r?   )wsws_lenr   fencelangquote_levelr/   empty_lines	fence_endrR   r:   idr<   r   r$   s    r   clearz"SuperFencesBlockPreprocessor.clear  sm     
		
r   c                 <   ||z                                    dk    r/| xj        dz  c_        | j                            ||z              dS t	          |          | j        k    r|dk    r|                                  dS | j                            |          _|	                    d          sJ	 | 
                    ||||           dS # t          $ r  t          $ r |                                  Y dS w xY wd| _        | j                            ||z              dS )zEvaluate a normal fence.r?   r   N)r   r   r   )stripr   r/   r   r)   r   r   r   rc   r`   process_nested_blockr   	Exception)r%   r   contentstartends        r   
eval_fencez'SuperFencesBlockPreprocessor.eval_fence  s<    L!!R''!IR'\*****WW+++2JJLLLLL^!!'**6w?Q?QR]?^?^6))"gucBBBBB'      

  !DIR'\*****s   /C	 	(C54C5c                    || j         k    r|                                  dS || j         k    r|dk    r/| j                            ||z              | xj        dz  c_        dS t          |          | j        k     r|                                  dS | j        r!|| j         k     r|                                  dS | j                            |          J	 | 	                    ||||           dS # t          $ r  t          $ r |                                  Y dS w xY wd| _        | j                            ||z              dS dS )z#Evaluate fence inside a blockquote.r?   r   Nr   )r   r   r/   r   r   r)   r   r   rc   r   r   r   )r%   r   r   r   r   r   s         r   eval_quotedz(SuperFencesBlockPreprocessor.eval_quoted  sm    )))JJLLLLLD,,,"}}	  g...  A%    R4;&&

! /kD4D&D&D 

%%g..:!--b'5#FFFFF+     ! ! !JJLLLLLL! $% 	  g...../ -,s   C. .(DDc           	         ||                      |          z   | _        d}| j        h||z
  dz
  | _        |                     |                     | j                  | j        | j        | j        | j	        | j
        | j        r| j        ni           }|F|                     |                      d                    | j                            dz   |||           |                                  dS ))Process the contents of the nested block.N   )ro   rP   rS   rR   r:   r;   r<   r   )r   lastr   
line_countr   r/   r   rS   rR   r:   r   r   r<   _storerL   r   r%   r   r   r   r   r/   s         r   r   z1SuperFencesBlockPreprocessor.process_nested_block  s     **7333	>%!EkAoDO>>&&ty117$(N:djj "  D KK))$))DI*>*>??$FeUXYYY

r   c                 `    t          |          }|dk     rd}n|| j        k    r
| j        dz   }|S )a  
        Normalize highlight line number.

        Clamp outrages numbers. Numbers out of range will be only one increment out range.
        This prevents people from create massive buffers of line numbers that exceed real
        number of code lines.
        r   r   )intr   )r%   numbers     r   normalize_hl_linez.SuperFencesBlockPreprocessor.normalize_hl_line  s=     VA::FFdo%%_q(Fr   c           
          g }|r|                                 D ]} fd|                     d          D             }t          |          dk    rR|d         |d         k    r?|                    t          t	          |d         |d         dz                                  d|d         cxk    r j        k    rn |                    |           |S )zParse the lines to highlight.c                 :    g | ]}                     |          S r   )r   )rD   er%   s     r   r   z?SuperFencesBlockPreprocessor.parse_hl_lines.<locals>.<listcomp>  s'    RRRAd44Q77RRRr   -r   r   )splitr)   extendlistranger   )r%   r[   r   entry
line_ranges   `    r   parse_hl_linesz+SuperFencesBlockPreprocessor.parse_hl_lines  s      	-!)) - -RRRRSAQAQRRR
z??Q&&!!}
155T%
1z!}q?P*Q*Q%R%RSSS*Q-::::4?:::::LL,,,r   c                 (    |rt          |          ndS Parse line start.r   r   )r%   	linestarts     r   parse_line_startz-SuperFencesBlockPreprocessor.parse_line_start  s     "+2s9~~~2r   c                 <    |rt          |          nd}|dk    r|ndS )r  r   r   r  )r%   linestepsteps      r   parse_line_stepz,SuperFencesBlockPreprocessor.parse_line_step  s*     !)0s8}}}baxxttR'r   c                 (    |rt          |          ndS r  r  )r%   linespecials     r   parse_line_specialz/SuperFencesBlockPreprocessor.parse_line_special  s     $/6s;B6r   c                 B   d}d}g }d}|D ]v}|| j         k    r nh|t          vr n]|dz  }|dk    r0| j        || j        z  z
  }||z  }|                    d|z             nd}|dz  }|                    |           ||z  }wd                    |          ||d         fS )zParse fence line.r   r   r   r   r?   N)r   PREFIX_CHARSr   r   rL   )r%   r   r   r   r   indexctab_sizes           r   parse_fence_linez-SuperFencesBlockPreprocessor.parse_fence_line  s      	 	A!444$$aKFDyy<54<+?@(*		#.))))!#		!XEEwwr{{DM))r   c                    d| _         d| _        g }|D ]2}|t          vr n&| xj         dz  c_         |                    |           3|                     d                    |                    }t          |          | _        |S )z<Parse the whitespace (blockquote syntax is counted as well).r   r   r?   )r   r   r  r   r   rL   r)   )r%   r   r   r  s       r   parse_whitespacez-SuperFencesBlockPreprocessor.parse_whitespace5  s      	 	A$$KK1KKIIaLLLLrwwr{{++!"gg	r   c                    d}|                     d          r|                     d          | _        |                     d          }i | _        i | _        d| _        i }|rPt
                              |          D ]5}|                     d          }|                     d          }||}|||<   6t          | j        j	                  D ]} |d         | j                  ri }i }	|
                    dt          j        t          t          	                    }
	  |
| j        |||	| j                  }n# t           $ r  t"          $ r Y nw xY w|	rd}|r#|
                    d
          | _        || _         n|S )zGet options.Fr   rR   Nr-   valuer   rg   r   r   )groupr   rR   r<   r   
RE_OPTIONSfinditerreversedr   r}   r,   r   r   rm   rj   rS   r   r   )r%   mokaystringvaluesr-   r  r   rR   r<   rg   s              r   parse_optionsz*SuperFencesBlockPreprocessor.parse_optionsF  s    776?? 	(DI##
 	$((00 $ $ggenn((=E#s dn899 	 	EuV}TY'' !IIk93DZ[l3m3m3mnn	$9TYPPDD+       D ! D %*YY{%;%;DN#*DLEs   D44E
Ec                    d}t          |                    d                              dd| j        z                      }i | _        i | _        d| _        i }|D ]9\  }}|dk    r|| _        |dk    r| j        	                    |           4|||<   :|                    d          r|                    d          | _
        n(| j        r| j                            d	          nd
| _
        t          | j        j                  D ]} |d         | j
                  ri }i }	|                    dt!          j        t$          t&                              }
	  |
| j
        |||	| j                  }n# t*          $ r  t,          $ r Y nw xY w|r1|                    d          | _        || _        | j        r|	| _         n|S )zHandle attribute list.Fr<   r   r   Nr   .r   r   r?   r   rg   r   r   )r   r  r   r   rR   r<   r   r   r:   r   r   popr  r   r}   r,   r   r   rm   rj   rS   r   r   r   )r%   r  r  
attributesr!  rE   rF   r   rR   r<   rg   s              r   handle_attrsz)SuperFencesBlockPreprocessor.handle_attrsq  s    qwww//77cDL>PQQRR

 	 	DAqDyyc##A&&&&q		776?? 	DDII/3|C((+++DI dn899 	 	EuV}TY'' !IIk93DZ[l3m3m3mnn	$9TYPPDD+       D %*YY{%;%;DN#*DL~ +%*
Es   E00FFc                    d}|D ]}|                     d          }| j        .|                     |          }t                              || j                  }||                    d          r|                     |          }n|                     |          }|r|}|| 	                    |                    d                    z   | _
        || _        | j                            d          | _        d| _        |                    d          | _        t          j        t"          | j        z            | _        n|                                  n|                     |          \  }}|dz   }	|                    d          }
| j        r|                     |||
||	           n3|
dk    r|                     ||||	           n|                                  |dz  }|                     |          S )z Search for nested fenced blocks.r   Nr<   r
   r   r   )rstripr   r  RE_NESTED_FENCE_STARTrc   r   r  r'  r"  r   firstr   countr   r   recompileNESTED_FENCE_ENDr   r   r  r   r   
reassemble)r%   r   r-  r   r   r  r  r   r   r   r   s              r   search_nestedz*SuperFencesBlockPreprocessor.search_nested  s     7	 7	D ;;t$$Dz!**400 *//dkBB= www'' 5#0033#11!44 % %%'$*;*;AGGAJJ*G*G%G
"$+/7==+=+=(+,(%&WWW%5%5
)+4Dtz4Q)R)R 

 #33D99Gai hhsmm# 	!$$R+ucJJJJ A%%OOB<<<< JJLLLQJEEu%%%r   c                     t          | j                  rJ| j                                        \  }}}|d|         |gz   ||d         z   }t          | j                  J|S )Reassemble text.N)r)   stackr%  r%   r   r   r   r   s        r   r1  z'SuperFencesBlockPreprocessor.reassemble  sf     $*oo 	;!%!1!1FE3&5&MVH,uSTT{:E $*oo 	; r   r?   Nc                    |d         }|d         }|d         }|g }d}	d}
d}d}d}| j         rd|v r8t                              |d                   }|                    d          }|d= d|v rbt                              |d                   }|                    d          }
|                    d          }	|                    d	          }|d= d
|v r|d
         }|d
= |                     |	          }	|                     |
          }
|                     |          }|                     |          }| j	        xj
        dz  c_
        |                     | j        | j        | j         | j        | j        | j        | j        | j        | j        | j        | j        | j        | j        | j        | j        | j        | j        | j        | j                                      ||| j        ||
|	|||||| j	        j
                  }|S )z
        Syntax highlight the code block.

        If configuration is not empty, then the CodeHilite extension
        is enabled, so we call into it to highlight the code.
        r:   r;   r<   Nr[   r\   r  r
  r  r]   r   )r   r   r_   r   r\   r   r   r   r   r   r   r   r   r   r   r   r   r   r   )	r[   r  r
  r  r:   r;   r<   r]   code_block_count) r_   ra   rc   r  rb   r  r  r  r  r   pygments_code_blockr   r   r   r   r\   r   r   r   r   r   r   r   r   r   r   r   r   r   r   r   r{   )r%   ro   rP   rR   rS   rT   r:   r;   r<   r
  r  r  r[   r]   r  els                   r   r   z&SuperFencesBlockPreprocessor.highlight  s>    #*%w?G 	 	%W$$%%gj&9::77:..J'W$$%%gj&9::GGK00	77:..ggm44J''!!(G$''11)))44	--k::&&x00..!3...*n].!2.!%!: 0!2.* 0 $ 8L*'  
 
( )N#!/C  
 
) 	F 	r   c           	         | j         j                            |          }| j                            d                    | j        |          ||f           | j        sb| j        j	                            |dd         d                    | j
        |                     |          | j                  | j                   dS dS )
        Store the fenced blocks in the stack to be replaced when done iterating.

        Store the original text in case we need to restore if we are too greedy.
        {}{}r   r   {}
{}{}N)rS   	htmlStashr4   r5  r   rK   r   disabled_indentedr   r#   r,  r   r   r   r%   rO   r/   r   r   placeholders         r   r   z#SuperFencesBlockPreprocessor._store8  s     g'--d33
6==+>>sKLLL% 	 N &&AbD!!!$*d.?.?.G.GSS#    	 	r   c                 ~    g }|                     d          D ]$}||z
  }|                    ||d                    %|S z0Reindent the code to where it is supposed to be.r   N)r   r   r%   r   poslevelindentedr   r  s          r   reindentz%SuperFencesBlockPreprocessor.reindentJ  sO     JJt$$ 	* 	*D%KEOODL))))r   c                    g }|D ]}t                               |          }|r|                    d          }t          |                    d                    }d}| j        j                            |d          \  }}|K|                     |||          }	|                    |	           | j        j        	                    |           ||
                    |           |
                    |           |S ),Revert a prematurely converted fenced block.r   r   NNN)FENCED_BLOCK_RErc   r  r)   r   r#   r,   rI  r   r1   r   )
r%   r   	new_linesr   r  r-   r3   originalrF  r/   s
             r   restore_raw_textz-SuperFencesBlockPreprocessor.restore_raw_textS  s     	 	' 	'D%%d++A 'ggajj"1771:: $ 4 8 8l K K#'==3EED$$T***N(//444# $$T***  &&&&r   c                 B   |                                   |                                  g | _        | j                            dd          | _        | j                            dd          | _        | j        r|                     |          }|                     |          S )Search for fenced blocks.ry   Fr|   )	rl   r   r5  r~   r,   r@  r|   rP  r2  r   s     r   runz SuperFencesBlockPreprocessor.runm  s     	


!%1OQV!W!W![___eDD 	1))%00E!!%(((r   )r?   r?   NN)r   r   r   r   	CODE_WRAPr&   r   r   rl   r   r   r   r   r   r  r  r  r  r  r  r"  r'  r2  r1  r   r   rI  rP  rS  r   r   s   @r   r   r   H  s         1I" " " " "- - -
I I I
(A (A (AT  $+ + +./ / />  ,     3 3 3
( ( (7 7 7
* * *2  ") ) )V* * *X=& =& =&~	 	 	O O O Ob  $    4) ) ) ) ) ) )r   r   c                   *    e Zd ZdZd Zd Zd Zd ZdS )r   z@Special class for preserving tabs before normalizing whitespace.c                     ||                      |          z   | _        d                    | j                  }|                     |dz   |||           |                                  dS )r   r   N)r   r   rL   r/   r   r   r   s         r   r   z4SuperFencesRawBlockPreprocessor.process_nested_block~  s^     **7333	yy##D4Kuc222

r   c                 J   | j         j                            d          }| j                            d                    | j        |          ||f           | j        j                            |dd         d                    | j	        || j
                  | j                   dS )r<  r?   r=  r   r   r>  N)rS   r?  r4   r5  r   rK   r   r   r#   r,  r   r   rA  s         r   r   z&SuperFencesRawBlockPreprocessor._store  s     g'--b11
6==+>>sKLLL"""dj&$)<<	
 	
 	
 	
 	
r   c                 *   t          | j                  r~| j                                        \  }}}|d|         |                    t          j        t          d          dd         t          z   gz   ||d         z   }t          | j                  ~|S )r4  Nr   r   )r)   r5  r%  r   md_utilSTXSOHEOTr6  s        r   r1  z*SuperFencesRawBlockPreprocessor.reassemble  s     $*oo 	c!%!1!1FE3&5&MV^^GKa%H%H"%MPS%S$TTW\]`]a]aWbbE $*oo 	c r   c                     |                                   |                                  g | _        | j                            dd          | _        |                     |          S )rR  ry   F)rl   r   r5  r~   r,   r@  r2  r   s     r   rS  z#SuperFencesRawBlockPreprocessor.run  sX     	


!%1OQV!W!W!!%(((r   N)r   r   r   r   r   r   r1  rS  r   r   r   r   r   {  sV        JJ  
 
 
 	 	 	) ) ) ) )r   r   c                   *    e Zd ZdZd Zd Zd Zd ZdS )r   z_Process indented code blocks to see if we accidentally processed its content as a fenced block.c                     dS )z-Test method that is one day to be deprecated.Tr   )r%   parentblocks      r   r   z"SuperFencesCodeBlockProcessor.test  s	     tr   c                     g }|                     d          D ]$}||z
  }|                    ||d                    %d                    |          S rD  )r   r   rL   rE  s          r   rI  z&SuperFencesCodeBlockProcessor.reindent  s\     JJt$$ 	* 	*D%KEOODL))))yy"""r   c                 D   g }|                     d          D ]}t                              |          }|r|                    d          }t	          |                    d                    }d}| j        j                            |d          \  }}|K|                     |||          }	|	                    |	           | j        j        
                    |           ||	                    |           |	                    |           d                    |          S )rK  r   r   r   NrL  )r   rM  rc   r  r)   r   r#   r,   rI  r   r1   rL   )
r%   ra  	new_blockr   r  r-   r3   rO  rF  r/   s
             r   revert_greedy_fencesz2SuperFencesCodeBlockProcessor.revert_greedy_fences  s    	KK%% 	' 	'D%%d++A 'ggajj"1771:: $ 4 8 8l K K#'==3EED$$T***N(//444# $$T***  &&&&yy###r   c                    d}| j                             dd          sot          j        | ||d                   }|rQ| j                             dd          r|                     |d                   |d<   t          j        | ||          du}|S )zLook for and parse code block.Fry   r   nestedT)r~   r,   r   r   re  rS  )r%   r`  blockshandleds       r   rS  z!SuperFencesCodeBlockProcessor.run  s     {=uEE 	T(-dFF1IFFG T;??8T22 E $ 9 9&) D DF1I,0vvFFeSr   N)r   r   r   r   r   rI  re  rS  r   r   r   r   r     sV        ii  
# # #$ $ $4    r   r   c                      t          | i |S )zReturn extension.)rw   )r   rT   s     r   makeExtensionrk    s     $T4V444r   r8   )r?   r?   NNr?   N)*r   markdown.extensionsr   markdown.preprocessorsr   markdown.blockprocessorsr   markdown.extensions.attr_listr   markdownr   rY  r   r.  r[  r\  r  r/  r+  ra   rb   r  r0  rK   HTML_PLACEHOLDERrM  r   r   r   r   rU   rX   rh   rj   rm   rq   ru   rw   r   r   r   rk  r   r   r   <module>rr     s   < * ) ) ) ) ) / / / / / / 7 7 7 7 7 7 3 3 3 3 3 3 $ $ $ $ $ $     				"
   bjOPPbjoppRZ 
   "*   # 2&4 $  H H H H H9 H H H  & & & & & & & &R` ` `"S S S"  .  ; ; ; ;B B B BV V V Vk! k! k! k! k!y k! k! k!\p) p) p) p) p)< p) p) p)f-) -) -) -) -)&B -) -) -)`6 6 6 6 6$6 6 6 6r5 5 5 5 5r   