source: spip-zone/_plugins_/convertisseur/trunk/extract/quark_xml.php

Last change on this file was 119894, checked in by fil@…, 2 days ago

on a parfois /MASTERSPREAD et du texte qui accompagne des PICTURE

File size: 8.9 KB
Line 
1<?php
2
3include_spip("inc/filtres");
4
5// Sait-on extraire ce format ?
6$GLOBALS['extracteur']['quark_xml'] = 'extracteur_quark_xml';
7
8function extracteur_quark_xml($fichier, &$charset) {
9        $charset = 'utf-8';
10        if (lire_fichier($fichier, $texte)) {
11                return convertir_extraction_quark_xml($texte);
12        }
13}
14
15function convertir_extraction_quark_xml($c) {
16        $item = convertir_quark_xml($c);
17        $texte = extracteur_preparer_insertion($item);
18        return $texte ;
19}
20
21function convertir_quark_xml($c) {
22
23        // surcharge nettoyage perso ?
24        if(find_in_path('convertisseur_perso.php'))
25                include_spip("convertisseur_perso");
26
27        // nettoyer le fichier
28        $u = remove_utf8_bom($c) ;
29
30        // Pages
31        $b = extraire_balise($u, 'folio') ;
32        $pages = textebrut($b);
33
34        $p = explode("-", $pages) ;
35
36        foreach($p as &$v)
37                if(intval($v) < 10)
38                        $v = "0" . $v ;
39
40        $item["pages"] = join(" ", $p) ;
41
42        $mise_en_page = extraire_balise($u, "RELATIONINFO");
43        $mise_en_page = extraire_attribut($mise_en_page, "parentAssetName");
44        $item["mise_en_page"] = $mise_en_page ;
45
46
47        // L'article et son illustration sont dans des <spread>
48        // Il peut y avoir plusieurs illustrations dans un même spread
49        $u = preg_replace("/MASTERSPREAD>/", "SPREAD>", $u);
50        $sequences = extraire_balises($u, "SPREAD") ;
51        foreach($sequences as $s){
52                // est-on dans une illustration ?
53                if(extraire_balise($s , 'PICTURE')){
54                        $images = array();
55                        // on cherche dans plusieurs box des images des legendes et des crédits de meme nom
56                        // <ID NAME="USA_Img_2" UID="2817"/>
57                        foreach(extraire_balises($s, "BOX") as $box_content){
58                                $id = $src = $txt = "" ;
59                                $id = extraire_attribut(extraire_balise($box_content, "ID"),"NAME");
60
61                                $details = explode("_", $id);
62
63                                $id_article = $details[0];
64                                $type_balise = $details[1];
65                                $numero_balise = $details[2];
66
67                                $image = extraire_balise($box_content, "CONTENT");
68                                //var_dump($image);
69                                $src = textebrut($image) ;
70                                $src = array_pop(explode("/", $src));
71
72                                $paragraphes = extraire_balises($box_content, "PARAGRAPH") ;
73
74                                foreach($paragraphes as $p){
75
76                                        $paragraphe = extraire_balise($p, "PARAGRAPH");
77                                        $type = extraire_attribut($paragraphe, "PARASTYLE");
78
79                                        // nettoyer un peu
80                                        $texte = textebrut(nettoyer_xml_quark($paragraphe));
81
82                                        $tech["styles"][$type] = 1 ;
83
84                                        // Légende
85                                        if(preg_match("/Légende|crédit/ui", $type)){
86                                                $txt .= $texte ;
87                                                continue ;
88                                        }
89                                }
90
91                                if($src)
92                                        $images[$id_article][$numero_balise]["source"] = $src ;
93                                if($type_balise == "Legende")
94                                        $images[$id_article][$numero_balise]["legende"] = $txt ;
95                                if($type_balise == "Credit")
96                                        $images[$id_article][$numero_balise]["credit"] = $txt ;
97                        }
98
99                        //var_dump($item["images"]);
100
101                        foreach($images as $art)
102                                foreach($art as $image)
103                                        $item["images"] .= "\nSource : " . $image['source'] . " \n Légende : " . $image['legende'] . "\n Crédit : " . $image['credit'] . "\n\n" ;
104
105                        //$item["texte"] .= "//// IMAGE $src // \n <img src='$src' /> \n $legende\n $credit \n\n" ;
106
107
108                }
109               
110                {
111                        // On est dans du texte
112                        // Parcourir les paragraphes en séparant les éléments trouvés selon leur feuille de style.
113                        // Titre // Auteurs // chapo // notes // signature // Paragraphes
114
115                        $paragraphes = extraire_balises($s, "PARAGRAPH") ;
116
117                        foreach($paragraphes as $p){
118
119                                $paragraphe = extraire_balise($p, "PARAGRAPH");
120                                $type = extraire_attribut($paragraphe, "PARASTYLE");
121
122                                //var_dump("<pre>",htmlspecialchars($paragraphe));
123
124                                // nettoyer un peu
125                                $texte = nettoyer_xml_quark($paragraphe);
126
127                                if($texte == "")
128                                        continue ;
129
130                                // init des styles
131                                $tech["styles"][$type] = 1 ;
132
133                                // On cherche dans le nom des feuilles de style Quark des noms de champs spip
134
135                                // Surtitre
136                                if(preg_match("/surtitre/i", $type)){
137                                        if(sizeof($item["surtitre"]) > 0 and !preg_match("/^\s/", $texte) and !preg_match("/\s$/", $item["surtitre"]))
138                                                $texte = " " . $texte ;
139                                        $item["surtitre"] .= $texte ;
140                                        continue ;
141                                }
142
143                                // Titre (mais pas surtitre)
144                                if(preg_match("/(?:(?<!sur)titre)/i", $type)){
145                                        # plusieurs titres ?? On envoie dans le texte les suivants
146                                        if(sizeof($item["titre"]) > 0 and !preg_match("/^\s/", $texte) and !preg_match("/\s$/", $item["titre"])){
147                                                $item["texte"] .= "@TITRE\n$texte\n\n" ;
148                                                $texte = " // " . $texte ;
149                                        }
150
151                                        $item["titre"] .= $texte ;
152                                        continue ;
153                                }
154
155                                // Eventuels traitements perso
156                                if (function_exists('nettoyer_paragraphe')){
157                                        $res = nettoyer_paragraphe($type, $texte, $item);
158                                        if($res){
159                                                $item = $res ;
160                                                continue ;
161                                        }
162                                }
163
164                                // Chapo
165                                if(preg_match("/chapo/i", $type)){
166                                        $item["chapo"] .= $texte ;
167                                        continue ;
168                                }
169
170                                // Inters
171                                if(preg_match("/(accroche|-inter|-exergue|Article_Inter)/i", $type)){
172                                        $item["texte"] .= "\n\n" . '{{{' . "$texte" . '}}}' ."\n\n" ;
173                                        continue ;
174                                }
175
176                                // Notes de bas de page
177                                if(preg_match("/notes/i", $type)){
178                                        $item["notes"] .= $texte ."\n\n" ;
179                                        continue ;
180                                }
181
182                                // Auteurs
183                                if(preg_match("/auteur/i", $type)){
184                                        $item["auteurs"] .= $texte ;
185                                        continue ;
186                                }
187
188                                // Cas général
189                                $item["texte"] .= "$texte\n\n" ;
190
191                        }
192
193                }
194        }
195
196        // ajouter les notes
197
198        if($item["notes"]){
199                $item["texte"] = $item["texte"] . "[[<>\n" . trim($item["notes"]) ."\n]]" . "\n" ;
200                unset($item["notes"]) ;
201        }
202
203        $item["auteurs"] = preg_replace("/\.\s*$/","",$item["auteurs"]);
204        $item["auteurs"] = preg_replace("/^Par\s/i","",$item["auteurs"]);
205
206        // passer la main pour une surcharge éventuelle
207        $c = $item ;
208
209        if (function_exists('nettoyer_conversion')){
210                $item = nettoyer_conversion($item);
211        }
212
213        // var_dump($item["auteurs_tete"],"<hr>");
214        // var_dump($item["auteurs"]);
215
216        //$item["textebrut"] = textebrut($u);
217        //$item["xml"] = htmlspecialchars($u) ;
218
219        //$item["xml"] = $u ;
220
221        return $item ;
222}
223
224
225
226// Fonctions spécialisées
227
228function remove_utf8_bom($text){
229    $bom = pack('H*','EFBBBF');
230    $text = preg_replace("/^$bom/", '', $text);
231    return $text;
232}
233
234
235//
236function nettoyer_xml_quark($xml){
237
238        $texte = $xml ;
239
240        $texte = preg_replace("/\R+/","",$xml);
241        $texte = preg_replace("/>\s+</","><",$texte);
242
243        // espace insécable en balise vide.
244        $texte = preg_replace("/<RICHTEXT MERGE=\"false\" NONBREAKING=\"true\"\/?>(<\/RICHTEXT>)?/ims", "<RICHTEXT MERGE=\"false\" NONBREAKING=\"true\">~</RICHTEXT>", $texte);
245        $texte = preg_replace("/<RICHTEXT[^>]+><\/RICHTEXT>/ims", "<RICHTEXT> </RICHTEXT>", $texte);
246
247        $ital = false ;
248
249        foreach(extraire_balises($texte, "RICHTEXT") as $b){
250
251                // itals sur plusieurs balises
252
253                $prefixe_ital = "" ;
254                $ital_statut = extraire_attribut($b, "ITALIC");
255                // essayer aussi de choper un italique non conventionnel dans la police
256                if(!$ital_statut){
257                        $font = extraire_attribut($b, "FONT");
258                        if(preg_match("/.*Italic.*/i",$font)){
259                                $ital_statut = "true" ;
260                                //var_dump($b);
261                        }
262                }
263               
264                if(!$ital AND $ital_statut == "true"){
265                        // début d'un ital
266                        $prefixe_ital = "{" ;
267                        $ital = true ;
268                }elseif($ital AND $ital_statut == "true"){
269                        // ital qui continue
270                        $prefixe_ital = "" ;
271                        $ital = true ;
272                }elseif($ital AND !$ital_statut){
273                        // fin d'ital
274                        $prefixe_ital = "}" ;
275                        $ital = false ;
276                }
277
278                // gras
279                $gras_statut = extraire_attribut($b, "BOLD");
280                if($gras_statut == "true"){
281                        $gras_debut = "{{" ;
282                        $gras_fin = "}}" ;
283                }else{
284                        $gras_debut = "" ;
285                        $gras_fin = "" ;
286                }
287
288                $b = supprimer_tags($b);
289
290                $texte_clean .= $prefixe_ital . $gras_debut . $b . $gras_fin  ;
291                //var_dump("<pre>",htmlspecialchars($texte_clean));
292        }
293
294        // fermer l'ital eventuellement resté ouvert
295        if($ital){
296                $s = "}" ;
297                //var_dump("lol",$b);
298        }
299        else
300                $s = "";
301
302        $texte = $texte_clean.$s ;
303
304        //$texte = supprimer_tags($texte);
305
306        // entites inventées
307        // espaces fines ou insécables
308        $texte = preg_replace(",&(amp;)?flexSpace;,", "~", $texte);
309        $texte = preg_replace(",&(amp;)?sixPerEmSpace;,", "~", $texte);
310        $texte = preg_replace(",&(amp;)?punctSpace;,", "~", $texte);
311        $texte = preg_replace(",&(amp;)?thinsp;,", "~", $texte);
312        $texte = preg_replace(",&(amp;)?nbsp;,", "~", $texte);
313        $texte = str_replace("&nbsp;", "~", $texte);
314
315        // cesures
316        $texte = preg_replace(",&(amp;)?discHyphen;,", "", $texte);
317        // autre
318        $texte = preg_replace(",&(amp;)?ndash;,", "—", $texte);
319        $texte = preg_replace(",&(amp;)?softReturn;,", " ", $texte); // ou bien par "" ? commence-&softReturn;t-on
320
321        $texte = str_replace(" &amp; ", " & ", $texte);
322
323        // espaces en gras.
324        $texte = str_replace(" }}","}} ",$texte);
325        $texte = str_replace("{{ "," {{",$texte);
326
327        // espaces en ital.
328        $texte = str_replace(" }","} ",$texte);
329        $texte = str_replace("{ "," {",$texte);
330
331
332        /*      // espaces en italique ou en romain
333        $c = preg_replace(',[{] *~ *[}],', '~', $c);
334        $c = preg_replace(',[}] *~ *[{],', '~', $c);
335        $c = preg_replace(',[{] +[}],', ' ', $c);
336        $c = preg_replace(',[}] +[{],', ' ', $c);
337        $c = preg_replace(',([ ~])[}],', '}\1', $c);
338        $c = preg_replace(',[{]([ ~]),', '\1{', $c);
339        $c = preg_replace(',[ ~]?([{]»),', '{»', $c);
340        $c = preg_replace(',[{][}]|[}][{],', '', $c);
341        */
342
343        //var_dump("<pre>",$texte,"</pre>");
344
345        return trim($texte) ;
346}
Note: See TracBrowser for help on using the repository browser.