Changeset 82531 in spip-zone


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

Le plugin necessite SPIP 3.0.16 ce qui permet un peu de nettoyage de code, mais on reintroduit une fonction de contournement de bug pour le traitement de <math> et <? ... ?> qui ne sera plus necessaire en 3.0.17
version 0.12.0

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

Legend:

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

    r82530 r82531  
    1616$GLOBALS['spip_pipeline']['post_propre'] = (isset($GLOBALS['spip_pipeline']['post_propre'])?$GLOBALS['spip_pipeline']['post_propre']:'').'||markdown_post_propre';
    1717
    18 // echapper les blocs <md>...</md> avant les autres blocs html
    19 // permet de prendre la main en tout debut de traitement, lors de l'echappement des <md></md>
    20 define('_PROTEGE_BLOCS', ',<(md|html|code|cadre|frame|script)(\s[^>]*)?>(.*)</\1>,UimsS');
    21 
    22 // echappement normal pour SPIP, que l'on refait ici
    23 define('_PROTEGE_BLOCS_SPIP', ',<(html|code|cadre|frame|script)(\s[^>]*)?>(.*)</\1>,UimsS');
     18/* Compat SPIP < 3.0.17 */
     19
     20// - pour $source voir commentaire infra (echappe_retour)
     21// - pour $no_transform voir le filtre post_autobr dans inc/filtres
     22// http://doc.spip.org/@echappe_html
     23function echappe_html_3017($letexte, $source='', $no_transform=false,
     24$preg='') {
     25        if (!is_string($letexte) or !strlen($letexte))
     26                return $letexte;
     27
     28        // si le texte recu est long PCRE risque d'exploser, on
     29        // fait donc un mic-mac pour augmenter pcre.backtrack_limit
     30        if (($len = strlen($letexte)) > 100000) {
     31                if (!$old = @ini_get('pcre.backtrack_limit')) $old = 100000;
     32                if ($len > $old) {
     33                        $a = @ini_set('pcre.backtrack_limit', $len);
     34                        spip_log("ini_set pcre.backtrack_limit=$len ($old)");
     35                }
     36        }
     37
     38        if (($preg OR strpos($letexte,"<")!==false)
     39          AND preg_match_all($preg ? $preg : _PROTEGE_BLOCS, $letexte, $matches, PREG_SET_ORDER)) {
     40                foreach ($matches as $regs) {
     41                        // echappements tels quels ?
     42                        if ($no_transform) {
     43                                $echap = $regs[0];
     44                        }
     45
     46                        // sinon les traiter selon le cas
     47                        else if (function_exists($f = 'traiter_echap_'.strtolower($regs[1])))
     48                                $echap = $f($regs);
     49                        else if (function_exists($f = $f.'_dist'))
     50                                $echap = $f($regs);
     51
     52                        $p = strpos($letexte,$regs[0]);
     53                        $letexte = substr_replace($letexte,code_echappement($echap, $source, $no_transform),$p,strlen($regs[0]));
     54                }
     55        }
     56
     57        if ($no_transform)
     58                return $letexte;
     59
     60        // Gestion du TeX
     61        // code mort sauf si on a personalise _PROTEGE_BLOCS sans y mettre <math>
     62        // eviter la rupture de compat en branche 3.0
     63        // a supprimer en branche 3.1
     64        if (strpos($preg ? $preg : _PROTEGE_BLOCS,'code')!==false){
     65                if (strpos($letexte, "<math>") !== false) {
     66                        include_spip('inc/math');
     67                        $letexte = traiter_math($letexte, $source);
     68                }
     69        }
     70
     71        // Echapper le php pour faire joli (ici, c'est pas pour la securite)
     72        // seulement si on a echappe les <script>
     73        // (derogatoire car on ne peut pas faire passer < ? ... ? >
     74        // dans une callback autonommee
     75        if (strpos($preg ? $preg : _PROTEGE_BLOCS,'script')!==false){
     76                if (strpos($letexte,"<"."?")!==false AND preg_match_all(',<[?].*($|[?]>),UisS',
     77                $letexte, $matches, PREG_SET_ORDER))
     78                foreach ($matches as $regs) {
     79                        $letexte = str_replace($regs[0],
     80                                code_echappement(highlight_string($regs[0],true), $source),
     81                                $letexte);
     82                }
     83        }
     84
     85        return $letexte;
     86}
     87/* Fin Compat SPIP < 3.0.17 */
    2488
    2589function markdown_pre_echappe_html_propre($texte){
     
    49113        }
    50114
    51         // echapper les blocs <md>...</md> car on ne veut pas toucher au <html>, <code>, <script> qui sont dedans !
    52         $texte = echappe_html($texte,"mdblocs",false,',<(md)(\s[^>]*)?>(.*)</\1>,UimsS');
     115        if (strpos($texte,"<md>")!==false){
     116                // Compat SPIP <3.0.17
     117                if (!function_exists("traiter_echap_math_dist")){
     118                        $texte = echappe_html_3017($texte,"mdblocs",false,',<(md)(\s[^>]*)?'.'>(.*)</\1>,UimsS');
     119                }
     120                else {
     121                        // echapper les blocs <md>...</md> car on ne veut pas toucher au <html>, <code>, <script> qui sont dedans !
     122                        $texte = echappe_html($texte,"mdblocs",false,',<(md)(\s[^>]*)?'.'>(.*)</\1>,UimsS');
     123                }
     124        }
     125
    53126
    54127        return $texte;
     
    167240/**
    168241 * Avant le traitemept typo et liens :
    169  * - des-echapper tous les blocs de _PROTEGE_BLOCS qui ont ete echappes au tout debut
    170  * - re-echapper les blocs de _PROTEGE_BLOCS_SPIP dans tout le contenu SPIP (hors <md></md>)
     242 * - des-echapper les blocs <md> qui ont ete echappes au tout debut
    171243 *
    172244 * @param string $texte
     
    175247function markdown_pre_liens($texte){
    176248        // si pas de base64 dans le texte, rien a faire
    177         if (strpos($texte,"base64")!==false) {
    178                 // si on est passe par le pipeline _pre_echappe_html_propre_ok
     249        if (strpos($texte,"base64mdblocs")!==false) {
    179250                // il suffit de desechapper les blocs <md> (mais dont on a echappe le code)
    180                 if (defined('_pre_echappe_html_propre_ok')){
    181                         $texte = echappe_retour($texte,'mdblocs');
    182                 }
    183                 else {
    184                         // sinon un peu plus complique :
    185                         // on des-echappe : on recupere tout a l'identique
    186                         // sauf le code du markdown echappe
    187                         $texte = echappe_retour($texte);
    188                         // on reechappe les blocs html
    189                         // dans le code SPIP uniquement
    190                         // sans transformation cette fois, puisque deja faite
    191                         if (strpos($texte,"<md>")===false){
    192                                 $texte = echappe_html($texte,'',true,_PROTEGE_BLOCS_SPIP);
    193                         }
    194                         else {
    195                                 $splits = preg_split(",(<md>.*</md>),Uims",$texte,-1,PREG_SPLIT_DELIM_CAPTURE);
    196                                 foreach($splits as $k=>$s){
    197                                         if (strlen($s) AND strncmp($s,"<md>",4)!==0)
    198                                                 $splits[$k] = echappe_html($s,'',true,_PROTEGE_BLOCS_SPIP);
    199                                 }
    200                                 $texte = implode('',$splits);
    201                         }
    202 
    203                 }
     251                $texte = echappe_retour($texte,'mdblocs');
    204252        }
    205253
     
    357405        }
    358406
     407        // blocs <md></md> echappes
    359408        if (strpos($texte,'<div class="base64md')!==false){
    360409                $texte = echappe_retour($texte,"md");
    361410        }
     411
    362412
    363413        // la globale $GLOBALS['markdown_inh_hreplace'] permet d'inhiber le replace
  • _plugins_/markdown/branches/v0.12.0/paquet.xml

    r82530 r82531  
    22        prefix="markdown"
    33        categorie="edition"
    4         version="0.11.0"
     4        version="0.12.0"
    55        etat="experimental"
    6         compatibilite="[3.0.0;3.0.*]"
     6        compatibilite="[3.0.16;3.0.*]"
    77        logo="prive/themes/spip/images/markdown-32.png"
    88        documentation="https://github.com/Cerdic/markdown/blob/master/README.md"
Note: See TracChangeset for help on using the changeset viewer.