source: spip-zone/_plugins_/chmlatex/trunk/formulaires/fchmlatex.php @ 103513

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

On limite la compatibilité aux branches testées et on respecte un peu les règles de codage de spip en utilisant les tabs pour l'indentation.
Merci Franck de veiller au grain :)

File size: 14.2 KB
Line 
1<?php
2if (!defined("_ECRIRE_INC_VERSION")) return;
3include_spip('inc/yaml');
4include_spip('inc/headers');
5
6function formulaires_fchmlatex_charger_dist($self)
7{
8        if (isset($_GET['num']))
9        {
10                //si il y a un parametre num dans l'url alors nous ne plus au début de l'execution du script
11                $num = _request('num');
12                $sDirExport = getDirExport();
13                $data = yaml_decode_file($sDirExport.'liste.yaml');
14                $a = $data[$num];
15                $max = count($data);
16
17                if ($max != 0) $avancement = round($num*100/count($data),0);
18
19                $format = _request('format');
20
21                if($num<$max)
22                {
23                        $code = recuperer_fond('inc/chmlatex_progression', array(
24                                'boite_titre' => _T("chmlatex:generation_$format"),
25                                'titre_objet' => _T('public:'.$a['type']).' '.$a['id'].' : '.$a['titre'],
26                                'progression' => $avancement)
27                        );
28
29                        echo $code;
30
31                        $secteur = _request('secteur');
32                        $sFunctionAction = $format.'_export';
33                        $sFunctionAction($a,$num,$secteur,_request('langue'));
34                        $num = $num + 1;
35                        $url = parametre_url($self, 'num', $num);
36                        $url = str_replace('&amp;','&',$url);
37                        echo '<script>window.location = "'.$url.'"</script>';
38                }
39                elseif($num==$max)
40                {
41                        $sZipFileName = getZipFileName();
42                        zipDir($sDirExport ,$sZipFileName);
43                        return array(
44                                'message_ok'=>"<a href='$sZipFileName'>"._T("chmlatex:telecharger_$format")."</a>",
45                                'format'    => $format,
46                                'langue'    => _request('langue'));
47                }
48        }
49        return array();
50}
51
52
53function formulaires_fchmlatex_verifier_dist()
54{
55        $erreurs = array();
56        // verifier que les champs obligatoires sont bien la :
57        foreach(array('secteur_region') as $obligatoire)
58                if (!_request($obligatoire)) $erreurs[$obligatoire] = 'Ce champ est obligatoire';
59
60        if (count($erreurs))
61                        $erreurs['message_erreur'] = 'Votre saisie contient des erreurs !';
62        return $erreurs;
63}
64
65
66/**
67 * Traitement du formulaire CVT :
68 * Préparation de l'export et rechargement javascript de la page pour traiter le premier objet
69 * @param $self adresse de la page du formulaire
70 * @author Hicham Gartit, David Dorchies
71 */
72function formulaires_fchmlatex_traiter_dist($self)
73{
74        $format = _request('format_export');
75        $langue = _request('langue_export');
76        $secteur = _request('secteur_region');
77
78        // Suppression du dossier d'export
79        $sDirExport = getDirExport('format_export','langue_export');
80        //~ spip_log($sDirExport,'chm');
81        if (file_exists($sDirExport)) delTree($sDirExport);
82        // Suppression du ZIP
83        $sZipFileName = getZipFileName('format_export','langue_export');
84        if (file_exists($sZipFileName)) unlink($sZipFileName);
85        // Suppression du YAML
86        if (file_exists($sDirExport.'liste.yaml')) unlink($sDirExport.'liste.yaml');
87        // Suppression du log
88        if (file_exists($sDirExport.'export.log')) unlink($sDirExport.'export.log');
89        // Création des dossiers d'export
90        if (!file_exists($sDirExport)) mkdir($sDirExport, 0777);
91        if (!file_exists($sDirExport.'images')) mkdir($sDirExport.'images', 0777);
92        if ($format=='tex' && !file_exists($sDirExport.'inclus'))
93                mkdir($sDirExport.'inclus', 0777);
94        // Création du fichier YAML contenant la liste des rubriques et articles du secteur
95        cree_yaml($sDirExport,$langue,$secteur);
96        // Construction de l'URL de rechargement javascript du formulaire
97        $url = parametre_url($self, 'num', '0');
98        $url = parametre_url($url, 'format', $format);
99        $url = parametre_url($url, 'secteur', $secteur);
100        $url = parametre_url($url, 'langue', $langue);
101        $url = str_replace('&amp;','&',$url);
102        echo'<script>window.location = "'.$url.'"</script>';
103        return array();
104}
105
106
107/**
108 * Fonction pour transformer les balises img en \includegraphics
109 */
110function tex_img2includegraphics($matches)
111{
112        $chemin = $matches[1];
113
114        if(substr($chemin, 0, strlen('../')) === '../' || substr($chemin, 0, strlen('http')) === 'http')
115        {
116                $chemin = str_replace(' ','%20', $chemin);
117                $source = $chemin;
118        }
119        else
120        {
121                $source = '../'.$chemin;
122        }
123        return '\includegraphics{'.$source.'}';
124}
125
126
127/**
128 * Traitement des balises latex includegraphics - copie des images
129 */
130function tex_copie_images($matches)
131{
132        $d = getDirExport()."images/";
133        $nomimg = pathinfo($matches[1], PATHINFO_FILENAME);
134        $extimg = pathinfo($matches[1], PATHINFO_EXTENSION);
135        $ext = substr($extimg , 0, 3);
136        $chemin = str_replace($extimg,$ext,$matches[1]);
137        $nm = $nomimg.'.'.$ext;
138        $nom = str_replace("\\", "", $nm);
139
140        if(strstr($chemin, '}'))
141        {
142                $chemin = substr($chemin, 0, strpos($chemin, "}"));
143        }
144
145        $chemin = str_replace('%20',' ', $chemin);
146        if(strstr($nom, '}'))
147        {
148                $nom = substr($nom, 0, strpos($nom, "}"));
149        }
150        $dest = $d.$nom;
151        $chemin = str_replace("\\_",'_',$chemin);
152
153        copy($chemin,$dest);
154        if ($ext == 'gif')
155        {
156                $ext = 'png';
157                $n = $nomimg.'.png';
158                $n1 = str_replace("\\", "", $n);
159                if (imagepng(imagecreatefromstring(file_get_contents($d.$nom)), $d.$n1))
160                        {
161                                unlink($d.$nom);
162                        }
163        }
164        $nm = $nomimg.'.'.$ext;
165        $nom = str_replace("\\", "", $nm);
166        if(strstr($nom, '}'))
167        {
168                $nom = substr($nom, 0, strpos($nom, "}"));
169        }
170        $copie = 'images/'.$nom;
171        $include = str_replace('includegraphics{','includegraphics[max width=\textwidth]{',$matches[0]);
172        return str_replace($matches[1],$nom,$include);
173}
174
175
176/**
177 * Post-traitement d'une page pour l'export Latex
178 * @param $code code de la page à traiter
179 * @return Code traité
180 */
181function tex_post_traitement($code) {
182        //Traitement des images
183        $code = preg_replace_callback('#<img.*src="(.*)".*>#iU','tex_img2includegraphics',$code);
184        $code = preg_replace_callback("#<img.*src='(.*)'.*>#iU",'tex_img2includegraphics',$code);
185        $code = preg_replace_callback("#\\includegraphics{(.*)}#i",'tex_copie_images',$code);
186        $code = str_replace("\\\\includegraphics{",'\\includegraphics{',$code);
187        return $code;
188}
189
190
191/**
192 * Renvoie le dossier d'exportation
193 * @author David Dorchies
194 * @date 09/06/2015
195 */
196function getDirExport($format = 'format', $langue = 'langue') {
197        $s = _DIR_RACINE . _NOM_TEMPORAIRES_INACCESSIBLES;
198        $s .= _request($format).'_'._request($langue).'/';
199        return $s;
200}
201
202
203/**
204 * Renvoie le nom du fichier ZIP
205 * @author David Dorchies
206 * @date 09/06/2015
207 */
208function getZipFileName($format = 'format', $langue = 'langue') {
209        $s = _DIR_RACINE . _NOM_TEMPORAIRES_ACCESSIBLES;
210        $s .= _request($format).'_'._request($langue).'.zip';
211        return $s;
212}
213
214
215/**
216 * Traitement des balises img pour export HTML/CHM.
217 * Copie du fichier image dans le dossier d'export et modification du ilen
218 * @param $matches [0]: balise img, [1]: lien vers l'image
219 * @return lien modifié pour pointer vers le dossier d'export
220 * @author Hicham Gartit
221 */
222function html_image($matches)
223{
224        $chemin = $matches[1];
225        $nomimg = pathinfo($chemin, PATHINFO_FILENAME);
226        $extimg = pathinfo($chemin, PATHINFO_EXTENSION);
227        $nom = $nomimg.'.'.$extimg;
228        //~ spip_log($chemin,'html_image');
229        if(substr($chemin, 0, strlen('../')) === '../' || substr($chemin, 0, strlen('http')) === 'http')
230        {
231                $chemin = str_replace(' ','%20', $chemin);
232                $source = $chemin;
233        }
234        else
235        {
236                $source = '../'.$chemin;
237        }
238        $dest = getDirExport().'images/'.$nom;
239        $copie = 'images/'.$nom;
240        $ret = str_replace($matches[1],$copie,$matches[0]);
241        copy($source,$dest);
242        if(!file_exists($dest)) {
243                file_put_contents(getDirExport().'export.log',
244                        'Image not found: '.$source."\n",FILE_APPEND);
245        }
246        return $ret;
247}
248
249
250/**
251 * Traitement des liens entre articles et rubriques pour l'export HTML/CHM
252 * Transforme les liens du type /?exec=article&id_article=nnn et /?exec=rubrique&id_rubrique=nnn
253 * en lien articlennn.html et rubriquennn.html
254 * @param $matches lien absolu ou relatif
255 * @author Hicham Gartit, David Dorchies
256 */
257function html_lien($matches)
258{
259        $chemin = $matches[1];
260        $nomf = pathinfo($chemin, PATHINFO_FILENAME);
261        $ext = pathinfo($chemin, PATHINFO_EXTENSION);
262        $nom = $nomf.'.'.$ext;
263        $id = 0;
264
265        if(substr($chemin, 0, strlen('../')) === '../' || substr($chemin, 0, strlen('http')) === 'http')
266        {
267                if(substr($chemin, 0, strlen($GLOBALS['meta']['adresse_site'].'/ecrire/?exec=')) === $GLOBALS['meta']['adresse_site'].'/ecrire/?exec=')
268                {
269                        $tAncre = explode('#',$chemin); // Traitement des ancres
270                        $chemin = $tAncre[0];
271                        if(strstr($chemin, 'exec=article'))
272                        {
273                                $id = substr(strstr($chemin, "id_article="),11);
274                                // Il faut s'assurer que l'id correspond à la traduction de la langue en cours
275                                $art = sql_fetsel(array('id_trad','lang'), 'spip_articles', "id_article=$id");
276                                $langue = _request('langue');
277                                if($art['lang']!=$langue) {
278                                        // Le lien ne pointe pas vers la bonne traduction de l'article
279                                        $art2 = sql_fetsel('id_article', 'spip_articles',
280                                                array('id_trad='.$art['id_trad'],"lang='$langue'",'statut="publie"'));
281                                                //~ spip_log(sql_get_select('id_article', 'spip_articles',
282                                                //~ array('id_trad='.$art['id_trad'],array('id_trad='.$art['id_trad'],"lang='$langue'",'statut="publie"'))),'lien');
283                                        if(isset($art2['id_article'])) {
284                                                // La bonne traduction existe
285                                                $id = $art2['id_article'];
286                                        } elseif($art['id_trad']!=0) {
287                                                // La bonne traduction n'existe pas, on utilise l'article de référence
288                                                $id = $art['id_trad'];
289                                        }
290                                }
291                                $type = 'article';
292                        }
293                        else if(strstr($chemin, 'exec=rubrique'))
294                        {
295                                $id = substr(strstr($chemin, "id_rubrique="),12);
296                                $type = 'rubrique';
297                        }
298                        $nom = $type.$id.'.html';
299                        if(isset($tAncre[1])) $nom .= '#'.$tAncre[1]; // Rajout de l'ancre si elle existe
300
301                        return str_replace($matches[1],$nom,$matches[0]);
302                }
303        }
304        return $matches[0];
305}
306
307
308/**
309 * Ecriture de la liste des articles et rubriques dans liste.yaml
310 */
311function cree_yaml($sDirExport,$langue,$secteur)
312{
313                                $yaml = recuperer_fond("yaml/index", array('id_rubrique' => $secteur,'lang' => $langue,));
314                                file_put_contents($sDirExport.'liste.yaml',$yaml);
315}
316
317
318/**
319 * Export HTML/CHM
320 */
321function html_export($a,$num,$secteur,$langue)
322{
323         $sDirExport = getDirExport();
324         if ($num == 0)
325        {
326                // Rubrique parente
327                $t = recuperer_fond("chm/index", array('id_rubrique' => $secteur,'lang' => $langue,));
328                $rubriqueParent = $sDirExport."rubrique$secteur.html";
329                file_put_contents($rubriqueParent ,$t);
330                copy($rubriqueParent,$sDirExport.'index.html');
331
332                // Fichiers HHC, HHK et HHP
333                $t = recuperer_fond("hhc/index", array('id_rubrique' => $secteur,'lang' => $langue,));
334                file_put_contents($sDirExport.'chmlatex.hhc',$t);
335                $t = recuperer_fond("chm/hhk", array('id_rubrique' => $secteur,'lang' => $langue,));
336                file_put_contents($sDirExport.'chmlatex.hhk',$t);
337                $t = recuperer_fond("chm/hhp", array('id_rubrique' => $secteur,'lang' => $langue,));
338                file_put_contents($sDirExport.'chmlatex.hhp',$t);
339
340                // fichier chm/css.html : traitement des images
341                $t = recuperer_fond("chm/css");
342                $t = preg_replace_callback("#url\('(.*)'\);#iU",'html_image',$t);
343                file_put_contents($sDirExport.'chm.css',$t);
344        }
345
346        //Traitement des pages HTML contenues dans liste.yaml
347        $id = $a['id'];
348        if($a['type']=='article')
349        {
350                // traiter article article#ID_ARTICLE.html
351                $code = recuperer_fond("chm/article_content", array('id_article' => $a['id'],'lang' => $langue,));
352                $n = 'article'.$id;
353        }
354        else
355        {
356                // traiter rubrique rubrique#ID_RUBRIQUE.html
357                $code = recuperer_fond("chm/index", array('id_rubrique' => $a['id'],'lang' => $langue,));
358                $n = 'rubrique'.$id;
359        }
360
361        //Traitement des images
362        $code = preg_replace_callback('#<img.*src="(.*)".*>#isU','html_image',$code);
363        $code = preg_replace_callback("#<img.*src='(.*)'.*>#isU",'html_image',$code);
364
365        //Traitement des liens
366        $code = preg_replace_callback("#href='(.*?)'#i",'html_lien',$code);
367        $code = preg_replace_callback('#href="(.*?)"#i','html_lien',$code);
368
369        // Suppression des liens de téléchargement du plugin Coloration Code
370        $code = preg_replace('#<p class=\'download code_download\'>.*</p>#iU','',$code);
371
372        // Enregistrement du fichier HTML
373        file_put_contents("$sDirExport$n.html",$code);
374}
375
376
377/**
378 * Export LaTeX
379 */
380function tex_export($a,$num,$secteur,$langue)
381{
382        $sDirExport = getDirExport();
383        if ($num == 0)
384        {
385                // Document maître
386                $code = recuperer_fond("tex/index", array('id_rubrique' => $secteur,'lang' => $langue,));
387                file_put_contents($sDirExport.'chmlatex_'.$langue.'.tex',$code);
388
389                // 1ère de couverture
390                $code = recuperer_fond("tex/premiere", array('id_rubrique' => $secteur,'lang' => $langue,));
391                $code = tex_post_traitement($code);
392                file_put_contents($sDirExport.'inclus/premiere.tex',$code);
393
394                // 4ème de couverture
395                $code = recuperer_fond("tex/derniere", array('id_rubrique' => $secteur,'lang' => $langue,));
396                $code = tex_post_traitement($code);
397                file_put_contents($sDirExport.'inclus/derniere.tex',$code);
398        }
399
400        // Traitement des articles et rubriques
401        $id = $a['id'];
402        if($a['type']=='article')
403        {
404                $n = 'article'.$id;
405                //traiter article article#ID_ARTICLE.html
406                $code = recuperer_fond("tex/article_content", array('id_article' => $a['id'],'lang' => $langue,));
407        }
408        else
409        {
410                $n = 'rubrique'.$id;
411                //traiter rubrique rubrique#ID_RUBRIQUE.html
412                $code = recuperer_fond("tex/rubrique_content", array('id_rubrique' => $a['id'],'lang' => $langue,));
413        }
414        $code = tex_post_traitement($code);
415        file_put_contents($sDirExport."inclus/$n.tex",$code);
416}
417
418
419/**
420 * Suppression d'un dossier et de son contenu
421 * @param $dir Dossier à supprimer
422 * @return retourne TRUE en cas de succès ou FALSE si une erreur survient
423 */
424function delTree($dir)
425{
426        $files = array_diff(scandir($dir), array('.','..'));
427        foreach ($files as $file)
428                {
429                  (is_dir("$dir/$file")) ? delTree("$dir/$file") : unlink("$dir/$file");
430                }
431        return rmdir($dir);
432}
433
434
435/**
436 * Ajout récursif d'un dossier dans un fichier ZIP
437 * @param $folder
438 * @param $zipFile
439 * @param $exclusiveLength
440 */
441function folderToZip($folder, &$zipFile, $exclusiveLength)
442{
443        $handle = opendir($folder);
444
445        while (false !== $f = readdir($handle)) {
446          if ($f != '.' && $f != '..') {
447                $filePath = "$folder/$f";
448                // Remove prefix from file path before add to zip.
449                $localPath = substr($filePath, $exclusiveLength);
450                if (is_file($filePath)) {
451                  $zipFile->addFile($filePath, $localPath);
452                } elseif (is_dir($filePath)) {
453                  // Add sub-directory.
454                  $zipFile->addEmptyDir($localPath);
455                  folderToZip($filePath, $zipFile, $exclusiveLength);
456                }
457          }
458        }
459        closedir($handle);
460}
461
462
463/**
464 * Création d'un fichier ZIP à partir d'un dossier
465 * @param $sourcePath Dossier à compresser
466 * @param $outZipPath Nom du fichier ZIP
467 */
468function zipDir($sourcePath, $outZipPath)
469{
470        $pathInfo = pathInfo($sourcePath);
471        $parentPath = $pathInfo['dirname'];
472        $dirName = $pathInfo['basename'];
473        $z = new ZipArchive();
474        $z->open($outZipPath, ZIPARCHIVE::CREATE);
475        $z->addEmptyDir($dirName);
476        folderToZip($sourcePath, $z, strlen("$parentPath/"));
477        $z->close();
478}
479
480?>
Note: See TracBrowser for help on using the repository browser.