ó Šç\c@`sydZddlmZddlmZddlmZddlZddlZddlmZddl m Z ej d ƒZ d „Z d d!d „ƒYZd efd„ƒYZdefd„ƒYZdefd„ƒYZdefd„ƒYZdefd„ƒYZdefd„ƒYZdefd„ƒYZdefd„ƒYZdefd„ƒYZdefd „ƒYZdS("uë CORE MARKDOWN BLOCKPARSER =========================================================================== This parser handles basic parsing of Markdown blocks. It doesn't concern itself with inline elements such as **bold** or *italics*, but rather just catches blocks, lists, quotes, etc. The BlockParser is made up of a bunch of BlockProssors, each handling a different type of block. Extensions may add/replace/remove BlockProcessors as they need to alter how markdown blocks are parsed. i(tabsolute_import(tdivision(tunicode_literalsNi(tutil(t BlockParseruMARKDOWNcK`sÎt|ƒ}t|ƒ|jd(RRR+tli((s</usr/lib/python2.7/site-packages/markdown/blockprocessors.pyRCÀscC`sæ|jj|ƒ}|r7t|jdƒƒ|j}nd}|jjjdƒr[d}nd}xx||krÛ|j|ƒ}|dk r×|j |j ks¯|j |j kr×|j |j krÎ|d7}n|}qdPqdW||fS(u* Get level of indent based on list level. iiulistN( R4tmatchRtgroupRRR6R7RRR8R:R9(RRR+tmt indent_levelR(tchild((s</usr/lib/python2.7/site-packages/markdown/blockprocessors.pyR<Ås 0  ( R/R0R1R9R:RR,R.RCR<(((s</usr/lib/python2.7/site-packages/markdown/blockprocessors.pyRs     $ RcB`s eZdZd„Zd„ZRS(u Process code blocks. cC`s|jd|jƒS(Nu (RR(RRR+((s</usr/lib/python2.7/site-packages/markdown/blockprocessors.pyR,äscC`s|j|ƒ}|jdƒ}d}|dk r¥|jdkr¥t|ƒr¥|djdkr¥|d}|j|ƒ\}}tjd|j|j ƒfƒ|_n[tj j |dƒ}tj j |dƒ}|j|ƒ\}}tjd|j ƒƒ|_|r|j d|ƒndS(Niuupreucodeu%s %s u%s ( RR;RR8RR&Rt AtomicStringR"trstripR?RGRA(RRR-RER+ttheResttcodetpre((s</usr/lib/python2.7/site-packages/markdown/blockprocessors.pyR.çs' ((R/R0R1R,R.(((s</usr/lib/python2.7/site-packages/markdown/blockprocessors.pyRás RcB`s2eZejdƒZd„Zd„Zd„ZRS(u(^|\n)[ ]{0,3}>[ ]?(.*)cC`st|jj|ƒƒS(N(tbooltREtsearch(RRR+((s</usr/lib/python2.7/site-packages/markdown/blockprocessors.pyR,sc C`s|jdƒ}|jj|ƒ}|rŽ||jƒ }|jj||gƒdjg||jƒjdƒD]}|j|ƒ^qmƒ}n|j |ƒ}|dk rÁ|j dkrÁ|}nt j j|dƒ}|jjjdƒ|jj||ƒ|jjjƒdS(Niu u blockquote(R;RTRUtstartRR>R!RtcleanRRR8RR?RGR6R=RBRD( RRR-R+RKtbeforeR%REtquote((s</usr/lib/python2.7/site-packages/markdown/blockprocessors.pyR.s 8 cC`sC|jj|ƒ}|jƒdkr(dS|r;|jdƒS|SdS(u( Remove ``>`` from beginning of a line. u>uiN(RTRIR RJ(RR%RK((s</usr/lib/python2.7/site-packages/markdown/blockprocessors.pyRWs  (R/R0R2R3RTR,R.RW(((s</usr/lib/python2.7/site-packages/markdown/blockprocessors.pyRs  R cB`sneZdZdZejdƒZejdƒZejdƒZdZ ddgZ d„Z d„Z d „Z RS( u Process ordered list blocks. uolu^[ ]{0,3}\d+\.[ ]+(.*)u ^[ ]{0,3}((\d+\.)|[*+-])[ ]+(.*)u^[ ]{4,7}((\d+\.)|[*+-])[ ]+.*u1uulcC`st|jj|ƒƒS(N(RSRTRI(RRR+((s</usr/lib/python2.7/site-packages/markdown/blockprocessors.pyR,:sc C`sU|j|jdƒƒ}|j|ƒ}|dk r]|j|jkr]|}|djržtjj dƒ}|dj|_d|d_|dj d|ƒn|j|dƒ}|dk rý|j rýtjj |ddƒ}|j j ƒ|_d|_ ntjj |dƒ}|jjjdƒ|jdƒ} |jj|| gƒ|jjjƒnb|jd kru|}nJtjj ||jƒ}|jjj r¿|jd kr¿|j|jd RDtTAGRtlazy_olt STARTSWITHtattribRR( RRR-titemsREtlstRFtlchRHt firstitemtitem((s</usr/lib/python2.7/site-packages/markdown/blockprocessors.pyR.=s>     cC`s g}x|jdƒD]ï}|jj|ƒ}|r–| r}|jdkr}tjdƒ}|j|jdƒƒjƒ|_n|j|jdƒƒq|j j|ƒrí|dj d|j ƒrÝd|d|f|d#{1,6})(?P
.*?)#*(\n|$)cC`st|jj|ƒƒS(N(RSRTRU(RRR+((s</usr/lib/python2.7/site-packages/markdown/blockprocessors.pyR, scC`s×|jdƒ}|jj|ƒ}|rÂ||jƒ }||jƒ}|rf|jj||gƒntjj |dt |j dƒƒƒ}|j dƒj ƒ|_ |rÓ|jd|ƒqÓntjd|ƒdS(Niuh%duleveluheaderuWe've got a problem header: %r(R;RTRURVtendRR>RR?RGRRJR R"RAtloggertwarn(RRR-R+RKRXtafterth((s</usr/lib/python2.7/site-packages/markdown/blockprocessors.pyR.£s((R/R0R1R2R3RTR,R.(((s</usr/lib/python2.7/site-packages/markdown/blockprocessors.pyR šs R cB`s5eZdZejdejƒZd„Zd„ZRS(u Process Setext-style Headers. u^.*?\n[=-]+[ ]*(\n|$)cC`st|jj|ƒƒS(N(RSRTRI(RRR+((s</usr/lib/python2.7/site-packages/markdown/blockprocessors.pyR,¿scC`sœ|jdƒjdƒ}|djdƒr4d}nd}tjj|d|ƒ}|djƒ|_t|ƒdkr˜|j ddj |dƒƒndS(Niu iu=iuh%d( R;RRRR?RGR R"RRAR!(RRR-R$R(Rm((s</usr/lib/python2.7/site-packages/markdown/blockprocessors.pyR.Âs ( R/R0R1R2R3t MULTILINERTR,R.(((s</usr/lib/python2.7/site-packages/markdown/blockprocessors.pyR ¹s R cB`s;eZdZdZejeejƒZd„Zd„Z RS(u Process Horizontal Rules. uB^[ ]{0,3}((-+[ ]{0,2}){3,}|(_+[ ]{0,2}){3,}|(\*+[ ]{0,2}){3,})[ ]*cC`sW|jj|ƒ}|rS|jƒt|ƒksF||jƒdkrS||_tStS(Nu (t SEARCH_RERURiRRItTruetFalse(RRR+RK((s</usr/lib/python2.7/site-packages/markdown/blockprocessors.pyR,×s 4 cC`s–|jdƒ}||jjƒ jdƒ}|rJ|jj||gƒntjj|dƒ||jj ƒj dƒ}|r’|j d|ƒndS(Niu uhr( R;RIRVRORR>RR?RGRiR]RA(RRR-R+tprelinest postlines((s</usr/lib/python2.7/site-packages/markdown/blockprocessors.pyR.âs( R/R0R1RTR2R3RnRoR,R.(((s</usr/lib/python2.7/site-packages/markdown/blockprocessors.pyR Ðs  RcB`s eZdZd„Zd„ZRS(u< Process blocks that are empty or start with an empty line. cC`s| p|jdƒS(Nu (R(RRR+((s</usr/lib/python2.7/site-packages/markdown/blockprocessors.pyR,öscC`s¾|jdƒ}d}|rGd}|d}|rG|jd|ƒqGn|j|ƒ}|dk rº|jdkrºt|ƒrº|djdkrºtjd|dj|fƒ|d_ndS(Niu u iupreucodeu%s%s( R;RARRR8RRRNR"(RRR-R+tfillerRPRE((s</usr/lib/python2.7/site-packages/markdown/blockprocessors.pyR.ùs :(R/R0R1R,R.(((s</usr/lib/python2.7/site-packages/markdown/blockprocessors.pyRós RcB`s eZdZd„Zd„ZRS(u Process Paragraph blocks. cC`stS(N(Rp(RRR+((s</usr/lib/python2.7/site-packages/markdown/blockprocessors.pyR,scC`sÜ|jdƒ}|jƒrØ|jjjdƒr±|j|ƒ}|dk r}|jrmd|j|f|_q®d||_qÕ|jrŸd|j|f|_qÕ|j ƒ|_qØt j j |dƒ}|j ƒ|_ndS(Niulistu%s %su %sup( R;R RR6R7RRR\R"R]RR?RG(RRR-R+RERF((s</usr/lib/python2.7/site-packages/markdown/blockprocessors.pyR.s     (R/R0R1R,R.(((s</usr/lib/python2.7/site-packages/markdown/blockprocessors.pyR s ((R1t __future__RRRtloggingR2tRt blockparserRt getLoggerRjRRRRRR R R R R RR(((s</usr/lib/python2.7/site-packages/markdown/blockprocessors.pyt s(   X`(k#