Changeset 82487 in spip-zone


Ignore:
Timestamp:
May 17, 2014, 10:24:41 AM (5 years ago)
Author:
cedric@…
Message:

bugfix : echappement du code markdown, mais ne pas echapper les balise <code> etc de SPIP dans le markdown

Location:
_plugins_/markdown/branches/v0.12.0
Files:
2 edited

Legend:

Unmodified
Added
Removed
  • _plugins_/markdown/branches/v0.12.0/markdown_options.php

    r82486 r82487  
    1515$GLOBALS['spip_pipeline']['pre_propre'] = (isset($GLOBALS['spip_pipeline']['pre_propre'])?$GLOBALS['spip_pipeline']['pre_propre']:'').'||markdown_pre_propre';
    1616
     17// echapper les blocs <md>...</md> avant les autres blocs html
     18define('_PROTEGE_BLOCS', ',<(md|html|code|cadre|frame|script)(\s[^>]*)?>(.*)</\1>,UimsS');
     19define('_PROTEGE_BLOCS_SPIP', ',<(html|code|cadre|frame|script)(\s[^>]*)?>(.*)</\1>,UimsS');
     20
     21// fonction appelee par echappe_html sur les balises <md></md>
     22function traiter_echap_md_dist($regs){
     23        // echapons le code dans le markdown
     24        $texte = markdown_echappe_code($regs[3]);
     25        return "<md".$regs[2].">$texte</md>";
     26}
     27
     28function markdown_echappe_code($texte){
     29        $texte = echappe_retour($texte);
     30        // tous les paragraphes indentes par 4 espaces ou une tabulation
     31        // mais qui ne sont pas la suite d'une liste ou d'un blockquote
     32        preg_match_all(",(^(    |\t|\*|\+|-|>|\d+\.)(.*)$(\s*^(    |\t).*$)*?),Uims",$texte,$matches,PREG_SET_ORDER);
     33        foreach($matches as $match){
     34                if (!strlen(trim($match[2]))){
     35                        //var_dump($match[0]);
     36                        $p = strpos($texte,$match[0]);
     37                        $texte = substr_replace($texte,code_echappement($match[0], '', true),$p,strlen($match[0]));
     38                }
     39        }
     40
     41
     42        if (strpos($texte,"```")!==false){
     43                //var_dump(preg_match(',^```\w+?\s.*\s```,Uims',$texte,$m));
     44                //var_dump($m);
     45                $texte = echappe_html($texte,'md',true,',^```\w+?\s.*\s```,Uims');
     46        }
     47        if (strpos($texte,"`")!==false){
     48                $texte = echappe_html($texte,'md',true,',`.*`,Uims');
     49        }
     50        return "$texte";
     51}
     52
     53
    1754/**
    1855 * Appliquer un filtre aux portions <md>...</md> du texte
     
    3370}
    3471
     72
     73function markdown_pre_liens($texte){
     74        // si pas de base64 dans le texte, rien a faire
     75        if (strpos($texte,"base64")!==false) {
     76                // on des-echappe : on recupere tout a l'identique
     77                // sauf le code du markdown echappe
     78                $texte = echappe_retour($texte);
     79                // on reechappe les blocs html
     80                // dans le code SPIP uniquement
     81                // sans transformation cette fois, puisque deja faite
     82                if (strpos($texte,"<md>")===false){
     83                        $texte = echappe_html($texte,'',true,_PROTEGE_BLOCS_SPIP);
     84                }
     85                else {
     86                        $splits = preg_split(",(<md>.*</md>),Uims",$texte,-1,PREG_SPLIT_DELIM_CAPTURE);
     87                        foreach($splits as $k=>$s){
     88                                if (strlen($s) AND strncmp($s,"<md>",4)!==0)
     89                                        $splits[$k] = echappe_html($s,'',true,_PROTEGE_BLOCS_SPIP);
     90                        }
     91                        $texte = implode('',$splits);
     92                }
     93        }
     94
     95        // ici on a le html du code SPIP echappe, mais sans avoir touche au code MD qui est echappe aussi
     96        return $texte;
     97}
     98
    3599/**
    36100 * Pre typo : echapper le code pour le proteger des corrections typo
     
    39103 */
    40104function markdown_pre_typo($texte){
    41         return markdown_filtre_portions_md($texte,"markdown_echappe_code");
    42 }
    43 function markdown_echappe_code($texte){
    44         if (strpos($texte,"```")!==false){
    45                 //var_dump(preg_match(',^```\w+?\s.*\s```,Uims',$texte,$m));
    46                 //var_dump($m);
    47                 $texte = echappe_html($texte,'md',true,',^```\w+?\s.*\s```,Uims');
    48         }
    49         if (strpos($texte,"`")!==false){
    50                 $texte = echappe_html($texte,'md',true,',`.*`,Uims');
    51         }
    52         return "<md>$texte</md>";
     105        return $texte;
    53106}
    54107
     
    91144
    92145        // tous les &truc; sont masques pour ne pas etre transformes en &amp;
    93         if (strpos($md,'&') !== false)
    94                 $md = preg_replace(',&(#?[a-z0-9]+;),iS', "\x1"."$1", $md);
     146        //if (strpos($md,'&') !== false)
     147        //      $md = preg_replace(',&(#?[a-z0-9]+;),iS', "\x1"."$1", $md);
    95148
    96149        // parser le markdown
    97150        $md = Parsedown::instance()->parse($md);
    98151
     152        $md = corriger_toutes_entites_html($md);
     153
    99154        // retablir les &
    100         if (strpos($md,"\x1") !== false)
    101                 $md = str_replace("\x1","&", $md);
     155        #if (strpos($md,"\x1") !== false)
     156        #       $md = str_replace("\x1","&", $md);
    102157
    103158        // class spip sur ul et ol et retablir les ul/ol explicites d'origine
  • _plugins_/markdown/branches/v0.12.0/paquet.xml

    r82486 r82487  
    22        prefix="markdown"
    33        categorie="edition"
    4         version="0.3.0"
     4        version="0.4.0"
    55        etat="experimental"
    66        compatibilite="[3.0.0;3.0.*]"
     
    1818        <licence>GNU/GPL</licence>
    1919
     20        <pipeline nom="pre_liens" />
    2021        <pipeline nom="pre_typo" />
    2122        <pipeline nom="post_typo" />
Note: See TracChangeset for help on using the changeset viewer.