Changeset 89876 in spip-zone


Ignore:
Timestamp:
Jun 3, 2015, 3:49:04 PM (4 years ago)
Author:
dorch@…
Message:

Ajout de la prise en charge des équations au format LaTeX (cf. http://contrib.spip.net/Reference-de-LaTeXWheel#comment482309)

Location:
_plugins_/latexwheel/trunk
Files:
2 edited

Legend:

Unmodified
Added
Removed
  • _plugins_/latexwheel/trunk/latexwheel_fonctions.php

    r59849 r89876  
    22
    33function latex_copier_img($img,$dossier,$chemin=''){
    4         // Convertir puis copier une image, en retournant le chemin à partir du fichier .tex principal
    5        
    6         /* Récupération de l'ext*/
    7        
    8         $match = array();
    9         if (preg_match(",\.([^.]+)$,", $img, $match)){
    10                 $ext = $match[1];
    11         }
    12        
    13         /* Cas particulier des .gif qui seront converti en .png*/
    14         if ($ext == 'gif'){
    15                 include_spip('filtres/images_transforme');
    16                 $img = image_format($img);     
    17                 $ext = 'png';
    18         }
    19         /*Préparation de l'adresse final*/
    20         if ($chemin ==''){
    21                 $final = md5($img).'.'.$ext;
    22         }
    23         else{
    24                 $final = $chemin.'/'.md5($img).'.'.$ext;
    25         }
    26         zippeur_copier_fichier($img,$dossier.'/'.$final);
    27         return $final;
     4    // Convertir puis copier une image, en retournant le chemin à partir du fichier .tex principal
     5
     6    /* Récupération de l'ext*/
     7
     8    $match = array();
     9    if (preg_match(",\.([^.]+)$,", $img, $match)){
     10        $ext = $match[1];
     11    }
     12
     13    /* Cas particulier des .gif qui seront converti en .png*/
     14    if ($ext == 'gif'){
     15        include_spip('filtres/images_transforme');
     16        $img = image_format($img);
     17        $ext = 'png';
     18    }
     19    /*Préparation de l'adresse final*/
     20    if ($chemin ==''){
     21        $final = md5($img).'.'.$ext;
     22    }
     23    else{
     24        $final = $chemin.'/'.md5($img).'.'.$ext;
     25    }
     26    zippeur_copier_fichier($img,$dossier.'/'.$final);
     27    return $final;
    2828
    2929}
    3030function lang_polyglossia($lang){
    31         // function permettant de convertir une #LANG en nom du package polyglossia
    32         $tableau = array(
    33                 'en' => 'english',
    34                 'es' => 'spanish',
    35                 'fr' => 'french');
    36         return $tableau[$lang];         
     31    // function permettant de convertir une #LANG en nom du package polyglossia
     32    $tableau = array(
     33        'en' => 'english',
     34        'es' => 'spanish',
     35        'fr' => 'french');
     36    return $tableau[$lang];
    3737}
    3838
    3939function propre_latex($t) {
    40        
    41         $t = latex_echappe_coloration($t);
    42        
    43         $t = echappe_html($t);
    44        
    45         $t = appliquer_regles_wheel($t,array('latex/latex.yaml'));
    46         $t = latex_traiter_modeles($t);
    47         $t = echappe_retour(echappe_retour($t),'latex');
    48         $t = appliquer_regles_wheel($t,array('latex/latex-retour.yaml'));
    49         return $t;
     40
     41    $t = latex_echappe_equation($t,true);
     42
     43    $t = latex_echappe_coloration($t);
     44
     45    $t = echappe_html($t);
     46
     47    $t = appliquer_regles_wheel($t,array('latex/latex.yaml'));
     48    $t = latex_traiter_modeles($t);
     49    $t = echappe_retour(echappe_retour($t),'latex');
     50    $t = appliquer_regles_wheel($t,array('latex/latex-retour.yaml'));
     51
     52    $t = latex_echappe_equation($t,false);
     53
     54    return $t;
    5055}
    5156
    5257function latex_proteger_index($texte){
    53         // Function qui sert à protéger les ! et @ dans une donnée à indexer, en remplacant par \textexclam et \textat (à définir)
    54         $texte = str_replace('!','\textexclam{}',$texte);
    55         $texte = str_replace('@','\textat{}',$texte);
    56         return $texte;
    57                
     58    // Function qui sert à protéger les ! et @ dans une donnée à indexer, en remplacant par \textexclam et \textat (à définir)
     59    $texte = str_replace('!','\textexclam{}',$texte);
     60    $texte = str_replace('@','\textat{}',$texte);
     61    return $texte;
     62
    5863}
    5964
    6065function latex_echappe_coloration($texte){
    61         //var_dump($texte);
    62         return appliquer_regles_wheel($texte,array('latex/latex-code.yaml'));
     66    //var_dump($texte);
     67    return appliquer_regles_wheel($texte,array('latex/latex-code.yaml'));
    6368}
    6469
    6570function appliquer_regles_wheel($texte,$regles){
    66         $ruleset = SPIPTextWheelRuleset::loader(
    67                         $regles
    68                 );
    69         $wheel = new TextWheel($ruleset);
    70         return  $wheel->text($texte);
     71    $ruleset = SPIPTextWheelRuleset::loader(
     72            $regles
     73        );
     74    $wheel = new TextWheel($ruleset);
     75    return  $wheel->text($texte);
    7176}
    7277
    7378function latex_recuperer_php($t){
    74        
    75         return str_replace('&lt;?','<?',$t);
    76        
    77 }       
     79
     80    return str_replace('&lt;?','<?',$t);
     81
     82}
    7883
    7984function latex_traiter_modeles($texte) {
    80         /* Je reprend le code des spip2latex_traiter_modeles du plugin spip2latex/*
    81         include_spip('inc/lien');
     85    /* Je reprend le code des spip2latex_traiter_modeles du plugin spip2latex/*
     86    include_spip('inc/lien');
    8287
    83         /*
    84         * code, cadre/frame et math sont deja traites et sont base64-encodes
    85         * On ne devrait pas les voir ici.
    86         */
    87         $modeles_builtin = array('<sc>', '<sup>', '<sub>', '<del>', '<quote>',
    88                                 '<cadre>', '<frame>', '<poesie>', '<poetry>',
    89                                 '<code>', '<math>');
     88    /*
     89    * code, cadre/frame et math sont deja traites et sont base64-encodes
     90    * On ne devrait pas les voir ici.
     91    */
     92    $modeles_builtin = array('<sc>', '<sup>', '<sub>', '<del>', '<quote>',
     93                '<cadre>', '<frame>', '<poesie>', '<poetry>',
     94                '<code>', '<math>');
    9095
    91         $modele_regex = sprintf("@%s@is", _RACCOURCI_MODELE);
    92         if (preg_match_all($modele_regex, $texte, $regs, PREG_SET_ORDER)) {
    93                 foreach ($regs as $reg) {
    94                        
    95                         /*
    96                          * Seront traites plus tard.
    97                          */
    98                         if (in_array(trim($reg[0]), $modeles_builtin))
    99                                 continue;
     96    $modele_regex = sprintf("@%s@is", _RACCOURCI_MODELE);
     97    if (preg_match_all($modele_regex, $texte, $regs, PREG_SET_ORDER)) {
     98        foreach ($regs as $reg) {
    10099
    101                         /*     
    102                          * Supprimer les echappements dans l'appel du
    103                          * modele.
    104                          * XXX seulement _ ?
    105                          */
    106                         $modele = sprintf("<latex_%s",
    107                                           substr($reg[0], 1));
    108                         $s = array("@\\_");
    109                         $r = array("_");
    110                         $modele = str_replace($s, $r, $modele);
    111                        
    112                         $search[] = $reg[0];
    113                         $replace[] = $modele;
    114                 }
    115        
    116                 $texte = str_replace($search, $replace, $texte);
    117                 $texte = traiter_modeles($texte);
    118         }
     100            /*
     101             * Seront traites plus tard.
     102             */
     103            if (in_array(trim($reg[0]), $modeles_builtin))
     104                continue;
    119105
    120         return $texte;
     106            /*
     107             * Supprimer les echappements dans l'appel du
     108             * modele.
     109             * XXX seulement _ ?
     110             */
     111            $modele = sprintf("<latex_%s",
     112                      substr($reg[0], 1));
     113            $s = array("@\\_");
     114            $r = array("_");
     115            $modele = str_replace($s, $r, $modele);
     116
     117            $search[] = $reg[0];
     118            $replace[] = $modele;
     119        }
     120
     121        $texte = str_replace($search, $replace, $texte);
     122        $texte = traiter_modeles($texte);
     123    }
     124
     125    return $texte;
    121126}
    122127
    123128
     129/**
     130 * Echappement des équations au format LaTeX qui sont encadrées entre les balises <math>...</math> et les symboles $ ou $$.
     131 * Supprime les balises <math></math> et encode les équations en base64 pour qu'elles ne subissent aucune transformation durant
     132 * les traitements effectués par LaTeXWheel. Il faut ensuite appeler la fonction avec $bEchappe=false pour retrouver les équations
     133 * @param $bEchappe true pour échapper, false pour reconvertir les équations à leur état initial
     134 * @author David Dorchies dorch[at]dorch[dot]fr
     135 * @date 03/06/2015
     136 */
     137function latex_echappe_equation($t,$bEchappe) {
     138    if($bEchappe) {
     139        // Protection des équations
     140        $t = preg_replace_callback(
     141            '#(<math>.*?</math>)#is', // On extrait d'abord ce qui se trouve entre les balises <math>...</math>
     142            function ($matches) {
     143                $t = str_replace(array('<math>','</math>'),'',$matches[0]); // On supprime les balises <math>
     144                $t = preg_replace_callback(
     145                    '#(\$\$.*?\$\$)#is', // On encode les équations entre $$...$$
     146                    function ($matches) {
     147                        return '£'.base64_encode($matches[0]).'£'; // Avec des séparateurs £ pour éviter de traiter les chaînes entre deux équations
     148                    },
     149                    $t
     150                );
     151                $t = preg_replace_callback(
     152                    '#(\$.*?\$)#is', // On encode les équations entre $...$
     153                    function ($matches) {
     154                        return '£'.base64_encode($matches[0]).'£'; // Avec des séparateurs £ pour éviter de traiter les chaînes entre deux équations
     155                    },
     156                    $t
     157                );
     158                return $t;
     159            },
     160            $t
     161        );
     162        return $t;
     163    } else {
     164        // On remet les équations à leur état d'origine après traitement
     165        $t = preg_replace_callback(
     166            '#(\£.*?\£)#',
     167            function ($matches) {
     168                return base64_decode(substr($matches[0],1,-1));
     169            },
     170            $t
     171        );
     172        return $t;
     173    }
     174}
     175
    124176?>
  • _plugins_/latexwheel/trunk/paquet.xml

    r84603 r89876  
    11<paquet
    2         prefix="latexwheel"
    3         categorie="edition"
    4         version="1.0.2"
    5         compatibilite="[3.0.0;3.0.*]"
    6         logo="spiplatex.png"
    7         documentation="http://contrib.spip.net/Livre-avec-SPIP"
    8         etat="test">
    9         <nom>LaTeXWheel</nom>
    10         <auteur lien="http://www.maieul.net">Maïeul Rouquette</auteur>
    11         <licence lien="http://www.gnu.org/licenses/gpl-3.0.html">GPL</licence>
    12         <necessite nom="tw" />
    13         <utilise nom="zippeur" compatibilite="[2.0.0;[" />
     2    prefix="latexwheel"
     3    categorie="edition"
     4    version="1.0.3"
     5    compatibilite="[3.0.0;3.0.*]"
     6    logo="spiplatex.png"
     7    documentation="http://contrib.spip.net/Livre-avec-SPIP"
     8    etat="test">
     9    <nom>LaTeXWheel</nom>
     10    <auteur lien="http://www.maieul.net">Maïeul Rouquette</auteur>
     11    <licence lien="http://www.gnu.org/licenses/gpl-3.0.html">GPL</licence>
     12    <necessite nom="tw" />
     13    <utilise nom="zippeur" compatibilite="[2.0.0;[" />
    1414</paquet>
Note: See TracChangeset for help on using the changeset viewer.