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

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

Correction d'un bug introduit dans la r91747 : le fichier yaml récapitulant les rubriques et articles à exporter n'était plus produit !!!
Correction du non traitement des balises img s'étalant sur plusieurs lignes
Correction des liens vers les articles n'ayant aucune traduction et n'existant pas dans la langue demandée (id_trad=0)

File size: 15.8 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.