source: spip-zone/_plugins_/latexwheel/trunk/latexwheel_fonctions.php @ 89876

Last change on this file since 89876 was 89876, checked in by dorch@…, 4 years ago

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

File size: 5.5 KB
Line 
1<?php
2
3function 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;
28
29}
30function 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];
37}
38
39function propre_latex($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;
55}
56
57function latex_proteger_index($texte){
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
63}
64
65function latex_echappe_coloration($texte){
66    //var_dump($texte);
67    return appliquer_regles_wheel($texte,array('latex/latex-code.yaml'));
68}
69
70function appliquer_regles_wheel($texte,$regles){
71    $ruleset = SPIPTextWheelRuleset::loader(
72            $regles
73        );
74    $wheel = new TextWheel($ruleset);
75    return  $wheel->text($texte);
76}
77
78function latex_recuperer_php($t){
79
80    return str_replace('&lt;?','<?',$t);
81
82}
83
84function latex_traiter_modeles($texte) {
85    /* Je reprend le code des spip2latex_traiter_modeles du plugin spip2latex/*
86    include_spip('inc/lien');
87
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>');
95
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) {
99
100            /*
101             * Seront traites plus tard.
102             */
103            if (in_array(trim($reg[0]), $modeles_builtin))
104                continue;
105
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;
126}
127
128
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
176?>
Note: See TracBrowser for help on using the repository browser.