[PLUGINS] +set de base
[lhc/web/www.git] / www / plugins / odt2spip_30 / inc / odt2spip_generer_sortie.php
1 <?php
2 /**
3 * Créer un article à partir d'un fichier au format odt
4 *
5 * @author cy_altern
6 * @license GNU/LGPL
7 *
8 * @package plugins
9 * @subpackage odt2spip
10 * @category import
11 *
12 *
13 */
14
15 if (!defined("_ECRIRE_INC_VERSION")) return;
16
17 /**
18 * Création de l'Array contenant les paramètres du futur article
19 *
20 * Le fichier content.xml a été extrait de l'archive .odt, et placé dans le dossier
21 * temporaire propre à l'utilisateur courant. Un premier traitement est effectué
22 * par cette fonction pour qu'il soit finalement transformé en texte utilisant les
23 * balises SPIP. On tient compte de la présence des plugins enluminure_typo et
24 * intertitre_enrichis. Les images sont extraites du document .odt et sont prêtes
25 * à être insérées dans le futur article SPIP.
26 *
27 * @param int $id_auteur Utilisateur courant
28 * @param string $rep_dezip Répertoire où est dezippé le fichier odt
29 * @return Array
30 */
31 function inc_odt2spip_generer_sortie($id_auteur, $rep_dezip){
32 // variables en dur pour xml en entree et xslt utilisee
33 // $xml_entre = $rep_dezip . 'content.xml'; // chemin du fichier xml a lire
34 $xml_entre = _DIR_TMP . 'odt2spip/' . $id_auteur . '/content.xml'; // chemin du fichier xml a lire
35 $xslt_texte = _DIR_PLUGIN_ODT2SPIP . 'inc/odt2spip.xsl'; // chemin de la xslt a utiliser pour le texte
36
37 // determiner si le plugin enluminure_typo ou intertitres_enrichis est present & actif
38 include_spip('inc/plugin');
39 $Tplugins = liste_plugin_actifs();
40 $intertitres_riches = ((array_key_exists('TYPOENLUMINEE', $Tplugins) OR array_key_exists('INTERTITRESTDM', $Tplugins)) ? 'oui' : 'non');
41
42 // si il n'existe pas de titre:h dans le doc, on parametre ici la longueur max du paragraphe utilise pour remplacer
43 $nb_caracteres_titre = 50;
44
45 // faut il mettre les images en mode document?
46 $type = (_request('mode_image') AND _request('mode_image') == 'document') ? 'document' : 'image';
47 $ModeImages = ($type == 'document' ? 'doc' : 'img');
48
49 // récupérer la langue de publication + verifier la valeur envoyée
50 $Tlangues = explode(',', $GLOBALS['meta']['langues_proposees']);
51 $LanguePublication = (in_array(_request('lang_publi'), $Tlangues) ? _request('lang_publi') : $GLOBALS['meta']['langue_site']);
52
53 // date pour les champs date et date_modif
54 $date_jour = date("Y-m-d H:i:s");
55
56 // appliquer la transformation XSLT sur le fichier content.xml
57 // on est php5: utiliser les fonctions de la classe XSLTProcessor
58 // verifier que l'extension xslt est active
59 if (!class_exists('XSLTProcessor')) {
60 die(_T('odtspip:err_extension_xslt'));
61 }
62 $proc = new XSLTProcessor();
63
64 // passage des parametres a la xslt
65 $proc->setParameter(null, 'IntertitresRiches', $intertitres_riches);
66
67 $xml = new DOMDocument();
68 $xml->load($xml_entre);
69 $xsl = new DOMDocument();
70 $xsl->load($xslt_texte);
71 $proc->importStylesheet($xsl); // attachement des regles xsl
72
73 // lancer le parseur
74 if (!$xml_sortie = $proc->transformToXml($xml)) {
75 die(_T('odtspip:err_transformation_xslt'));
76 }
77
78 // construire l'array des parametres de l'article
79 preg_match('/<titre>(.*?)<\/titre>/',$xml_sortie, $t);
80 $Tarticle['titre'] = $t[1];
81 preg_match('/<texte>(.*?)<\/texte>/s',$xml_sortie, $a);
82 $Tarticle['texte'] = $a[1];
83 $Tarticle['date_redac'] = '0000-00-00 00:00:00';
84 $Tarticle['date'] = $Tarticle['date_modif'] = $date_jour;
85 $Tarticle['lang'] = $LanguePublication;
86 $Tarticle['statut'] = 'prop';
87 $Tarticle['accepter_forum'] = 'non';
88
89 // traitements complementaires du texte de l'article
90 // remplacer les &gt; et &lt;
91 $a_remplacer = array('&#60;', '&#62;', '&lt;', '&gt;', '"');
92 $remplace = array('<', '>', '<', '>', "'");
93
94 // si plugin TYPOENLUMINE est en version 3 (ou plus) utiliser la syntaxe {{{**titre 2}}} a la place de {2{titre 2}2}
95 // (cf http://www.spip-contrib.net/odt2spip-creation-d-articles-a-partir-de-fichiers#forum435614)
96 if (array_key_exists('TYPOENLUMINEE', $Tplugins) AND intval(substr($Tplugins['TYPOENLUMINEE']['version'], 0, 1)) >= 3) {
97 array_push($a_remplacer, '{2{', '}2}', '{3{', '}3}', '{4{', '}4}', '{5{', '}5}');
98 array_push($remplace, '{{{**', '}}}', '{{{***', '}}}', '{{{****', '}}}', '{{{*****', '}}}');
99 }
100
101 $Tarticle['texte'] = str_replace($a_remplacer, $remplace, $Tarticle['texte']);
102
103 // gerer la conversion des <math>Object X</math> => on delegue a /inc/odt2spip_traiter_mathml.php
104 if (preg_match_all('/<math>(.*?)<\/math>/', $Tarticle['texte'], $match, PREG_PATTERN_ORDER) > 0) {
105 include_spip('inc/odt2spip_traiter_mathml');
106 foreach ($match[1] as $balise) {
107 $fic_content = $rep_dezip . $balise . '/content.xml';
108 // si le fichier /Object X/content.xml ne contient pas du mathML, virer la balise <math>
109 if (substr_count(file_get_contents($fic_content), '<!DOCTYPE math:math') < 1) {
110 $Tarticle['texte'] = str_replace('<math>' . $balise . '</math>', '', $Tarticle['texte']);
111 continue;
112 }
113 // sinon faire la transfo xsl du contenu du fichier pour obtenir le LateX qu'on place dans la balise
114 $Tarticle['texte'] = str_replace($balise, odt2spip_traiter_mathml($fic_content), $Tarticle['texte']);
115 }
116 }
117
118 // virer les sauts de ligne multiples
119 $Tarticle['texte'] = preg_replace('/([\r\n]{2})[ \r\n]*/m', "$1", $Tarticle['texte']);
120
121 // si malgré toutes les magouille xslt la balise <titre> est vide, mettre le nom du fichier odt
122 if ($Tarticle['titre'] == '')
123 $Tarticle['titre'] = str_replace(array('_','-','.odt'), array(' ',' ',''), $fichier_zip);
124
125 // traiter les images: dans tous les cas il faut les integrer dans la table documents
126 $rep_pictures = $rep_dezip . "Pictures/";
127
128 // parametres de conversion de taille des images : cm -> px (en 96 dpi puisque c'est ce que semble utiliser Writer)
129 $conversion_image = 96 / 2.54;
130
131 preg_match_all('/<img([;a-zA-Z0-9\.]*)/', $Tarticle['texte'], $match, PREG_PATTERN_ORDER);
132 if (@count($match) > 0) {
133 if (!isset($odt2spip_retailler_img)) {
134 $odt2spip_retailler_img = charger_fonction('odt2spip_retailler_img', 'inc');
135 }
136 if (!isset($ajouter_documents)) {
137 $ajouter_documents = charger_fonction('ajouter_documents', 'action');
138 }
139 $Timages = array();
140 foreach($match[1] as $ch) {
141 $Tdims = explode(';;;', $ch);
142 $img = $Tdims[0];
143 // si l'extension du fichier image n'est pas jpg/gif/png virer la balise
144 if (!in_array(strtolower(substr($img, -3)), array('jpg','gif','png')))
145 $Tarticle['texte'] = str_replace($ch, '', $Tarticle['texte']);
146 elseif (file_exists($rep_pictures . $img)) {
147 // retailler l'image en fct des parametres ;;;largeur;;;hauteur;;;
148 $largeur = round($Tdims[1] * $conversion_image);
149 $hauteur = round($Tdims[2] * $conversion_image);
150 $odt2spip_retailler_img($rep_pictures . $img, $largeur, $hauteur);
151 if ($id_document = $ajouter_documents('new',
152 array(array('tmp_name' => $rep_pictures . $img, 'name' => $img, 'titrer' => 0, 'distant' => 0, 'type' => $type)),
153 '', 0, $type)
154 AND $id_img = intval($id_document[0])
155 AND $id_img == $id_document[0]) {
156 $Timages[] = $id_img;
157
158 // remplacer les noms de fichier par leur id_document dans les <imgLeNomDuFichier.jpg> du texte
159 $Tarticle['texte'] = str_replace($ch, $id_img, $Tarticle['texte']);
160 }
161 }
162 }
163
164 // si les images doivent êtres intégrées en mode document, remplacer la balise <imgXY> par <docXY>
165 if ($type == 'document')
166 preg_replace('/<img/', '<doc', $Tarticle['texte']);
167
168 // intégrer l'array des images dans les parametres de l'article
169 // ce qui permettra de faire la liaison lorsqu'on aura l'id_article
170 $Tarticle['Timages'] = $Timages;
171 }
172
173 // encodage des caracteres pour gerer aussi les SPIP 3 en ISO-8859-1
174 // cf http://contrib.spip.net/odt2spip-creation-d-articles-a-partir-de-fichiers#forum466929
175 if ($GLOBALS['meta']['charset'] != 'utf-8'){
176 include_spip('inc/charsets');
177 $Tarticle['texte'] = importer_charset($Tarticle['texte'], 'utf-8');
178 $Tarticle['titre'] = importer_charset($Tarticle['titre'], 'utf-8');
179 }
180
181 return $Tarticle;
182 }
183
184 ?>