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

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

Correction de bugs :

Ajout de la compilation en CHM et Latex sur le serveur (non pleinement testé)
Traduction en anglais

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