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

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