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

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

on peaufine

File size: 8.8 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) {
9        if (lire_fichier($fichier, $texte)) {           
10                return convertir_extraction_quark_xml($texte);
11        }
12}
13
14function convertir_extraction_quark_xml($c) {
15        $item = convertir_quark_xml($c);
16        $texte = extracteur_preparer_insertion($item);
17        return $texte ;
18}
19 
20function extracteur_preparer_insertion($item){
21       
22        $texte = "" ;
23       
24        if($item['surtitre'])
25                $texte .= "<ins class='surtitre'>" . trim($item['surtitre']) . "</ins>\n\n" ;
26
27        if($item['titre'])
28                $texte .= "<ins class='titre'>" . trim($item['titre']) . "</ins>\n\n" ;
29       
30        if($item['chapo'])
31                $texte .= "<ins class='chapo'>" . trim($item['chapo']) . "</ins>\n\n" ;
32
33        if($item['auteurs'])
34                $texte .= "\n\n@@AUTEUR\n\n" . trim($item['auteurs']) . "\n\n" ;
35
36        if($item['signature'])
37                $texte .= "\n\n@@SIGNATURE\n\n" . trim($item['signature']) . "\n\n" ;
38
39        $texte .=  "\n\n" . trim($item['texte']) . "\n" ;
40       
41        return $texte ;
42
43} 
44 
45 
46function convertir_quark_xml($c) {
47
48        // nettoyer le fichier
49        $u = remove_utf8_bom($c) ;
50       
51        // Pages
52        $b = extraire_balise($u, 'folio') ;
53        $item["pages"] = textebrut($b);
54       
55        $mise_en_page = extraire_balise($u, "RELATIONINFO");
56        $mise_en_page = extraire_attribut($mise_en_page, "parentAssetName");
57        $item["mise_en_page"] = $mise_en_page ;
58       
59        // type d'article
60        if(preg_match("/ENCADRÉ-Titre/i", $u)){
61                $item["type"] = "Encadré" ;
62        }elseif(preg_match("/LIVRES/i", $fichier)){
63                $item["type"] = "Note de lecture" ;
64        }
65
66        // type d'article
67        if(preg_match("/DOSSIER/i", $fichier)){
68                $item["dossier"] = str_replace(".qxp", "", $item["mise_en_page"]) ;
69        }
70
71        // L'article et son illustration sont dans des <spread>
72        $sequences = extraire_balises($u, "SPREAD") ;
73        foreach($sequences as $s){
74                // est-on dans une illustration ?
75                if(extraire_balise($s , 'PICTURE')){
76                        $image = extraire_balise($s, "CONTENT");
77                        //var_dump($image);
78                        $src = textebrut($image) ;
79                        $src = array_pop(explode(":", $src));
80
81                        $paragraphes = extraire_balises($s, "PARAGRAPH") ;
82               
83                        foreach($paragraphes as $p){
84                                                       
85                                $paragraphe = extraire_balise($p, "PARAGRAPH");
86                                $type = extraire_attribut($paragraphe, "PARASTYLE");
87                                $texte = textebrut($paragraphe);
88                                $item["styles"][$type] = 1 ;
89                               
90                                // Légende
91                                if(preg_match("/Légende-Photo/", $type)){
92                                        $legende = $texte ;
93                                        continue ;
94                                }
95
96                                // Crédit
97                                if(preg_match("/Crédit-photo/", $type)){
98                                        $credit = $texte ;
99                                        continue ;
100                                }
101                        }
102                       
103                        $item["images"][] = array('src' => $src, 'legende' => $legende, 'credits' => $credit) ;
104                                                       
105                        $item["texte"] .= "// IMAGE $src // \n <img src='$src' /> \n $legende\n $credit \n\n" ;
106
107
108                }else{
109                        // On est dans du texte
110                        // Parcourir les paragraphes en séparant les éléments trouvés selon leur feuille de style.
111                        // Titre // Auteurs // chapo // notes // signature // Paragraphes
112                                               
113                        $paragraphes = extraire_balises($s, "PARAGRAPH") ;
114                       
115                        foreach($paragraphes as $p){
116                               
117                                $paragraphe = extraire_balise($p, "PARAGRAPH");
118                                $type = extraire_attribut($paragraphe, "PARASTYLE");
119                               
120                                //var_dump("<pre>",htmlspecialchars($paragraphe));
121                               
122                                $texte = nettoyer_xml_quark($paragraphe);
123                               
124                                $item["styles"][$type] = 1 ;
125
126                                // inserer des traitements perso, dans mes_fonctions
127                                // NDL, coupures, etc avec styles hors spip de base.
128                                // if(function_exists(convertion_paragraphes_quark_xml_perso()))
129
130                                // Titre // auteur NDL
131                                if(preg_match("/NDL-Œuvre$/i", $type)){
132                                       
133                                        list($titre,$ndl_auteur) = explode(" — ", $texte);
134                                       
135                                        $item["titre"] .= $titre ;
136                                        $item["soustitre"] .= $ndl_auteur ;
137                                       
138                                        continue ;
139                                }
140
141                                // TIMES-Note auteur
142                                if(preg_match("/-Note auteur$/", $type)){
143                                        $texte = preg_replace("/^\s*\*\s*/","",$texte);
144                                        $item["signature"] .= $texte ;
145                                        continue ;
146                                }
147
148                                // Note biblio NDL
149                                if(preg_match("/NDL-Biblio$/i", $type)){
150                                        $item["texte"] .= "[<>" . $texte . "]\n\n" ;
151                                        continue ;
152                                }
153
154                                // Par notre envoyé spécial...
155                                if(preg_match("/^SIGNATURE-/", $type)){
156                                        $item["auteurs_tete"] .= trim($texte) ;
157                                        continue ;
158                                }
159
160                                // ne garder que ici que des titres, chapo, texte, etc, generique.
161
162                                // On cherche dans le nom des feuilles de style Quark des noms de champs spip
163
164                                // Surtitre
165                                if(preg_match("/surtitre/i", $type)){
166                                        if(sizeof($item["surtitre"]) > 0 and !preg_match("/^\s/", $texte) and !preg_match("/\s$/", $item["surtitre"]))
167                                                $texte = " " . $texte ;
168                                        $item["surtitre"] .= $texte ;
169                                        continue ;
170                                }
171               
172                                // Titre
173                                if(preg_match("/titre/i", $type)){
174                                        if(sizeof($item["titre"]) > 0 and !preg_match("/^\s/", $texte) and !preg_match("/\s$/", $item["titre"]))
175                                                $texte = " " . $texte ;
176                                        $item["titre"] .= $texte ;
177                                        continue ;
178                                }
179                               
180                                // Chapo
181                                if(preg_match("/chapo/i", $type)){
182                                        $item["chapo"] .= $texte ;
183                                        continue ;
184                                }
185               
186                                // Auteurs
187                                if(preg_match("/signature/i", $type)){
188                                        $item["auteurs"] .= $texte ;
189                                        continue ;
190                                }
191                                                               
192                                // Inters
193                                if(preg_match("/accroche/i", $type)){
194                                        $item["texte"] .= "\n\n" . '{{' . "$texte" . '}}' ."\n\n" ;
195                                        continue ;
196                                }
197                               
198                                // Notes de bas de page
199                                if(preg_match("/notes/i", $type)){
200                                        $item["notes"] .= $texte ."\n" ;
201                                        continue ;
202                                }
203                               
204                                $item["texte"] .= "$texte\n\n" ;
205                               
206                        }
207                       
208                        // Révisions post concatenation des paragrahes
209                        // Lettrine avec ital ex : //«~J{e ne suis pas
210                       
211                        $item["texte"] = preg_replace("/^([«\s~]*\w)\{/","{\\1", $item["texte"]);
212               
213                }
214        }
215       
216        // s'assurer qu'on a bien un auteur.
217        if(!$item["auteurs"]){
218                $auteurs = preg_replace("/^\s*(P|p)ar\s*/","", $item["auteurs_tete"]);
219                $auteurs = preg_replace("/(\s|\*|~)+$/","",$auteurs);
220                $item["auteurs"] = $auteurs ;
221        }
222       
223        // ajouter les notes
224       
225        if($item["notes"])
226                $item["texte"] = $item["texte"] . "[[<>\n" . $item["notes"] ."]]" . "\n" ;
227       
228        $item["auteurs"] = preg_replace("/\.\s*$/","",$item["auteurs"]);
229       
230        $item["textebrut"] = textebrut($u);
231               
232        $item["xml"] = htmlspecialchars($u) ;
233
234        //$item["xml"] = $u ;
235
236        return $item ;
237}
238
239
240
241// Fonctions spécialisées
242
243function remove_utf8_bom($text){
244    $bom = pack('H*','EFBBBF');
245    $text = preg_replace("/^$bom/", '', $text);
246    return $text;
247}
248
249
250//
251function nettoyer_xml_quark($xml){
252       
253        $texte = $xml ;
254       
255        $texte = preg_replace("/\R+/","",$xml);
256        $texte = preg_replace("/>\s+</","><",$texte);
257       
258        // espace insécable en balise vide.
259        $texte = preg_replace("/<RICHTEXT MERGE=\"false\" NONBREAKING=\"true\"\/?>(<\/RICHTEXT>)?/ims", "<RICHTEXT MERGE=\"false\" NONBREAKING=\"true\">~</RICHTEXT>", $texte);
260        $texte = preg_replace("/<RICHTEXT[^>]+><\/RICHTEXT>/ims", "<RICHTEXT> </RICHTEXT>", $texte);
261       
262        $ital = false ;
263       
264        foreach(extraire_balises($texte, "RICHTEXT") as $b){
265               
266                // itals sur plusieurs balises
267               
268                $prefixe_ital = "" ;
269                $ital_statut = extraire_attribut($b, "ITALIC");
270                if(!$ital AND $ital_statut == "true"){
271                        // début d'un ital
272                        $prefixe_ital = "{" ;
273                        $ital = true ;
274                }elseif($ital AND $ital_statut == "true"){
275                        // ital qui continue
276                        $prefixe_ital = "" ;
277                        $ital = true ;
278                }elseif($ital AND !$ital_statut){
279                        // fin d'ital
280                        $prefixe_ital = "}" ;
281                        $ital = false ;
282                }
283               
284                // gras
285                $gras_statut = extraire_attribut($b, "BOLD");
286                if($gras_statut == "true"){
287                        $gras_debut = "{{" ;
288                        $gras_fin = "}}" ;
289                }else{
290                        $gras_debut = "" ;
291                        $gras_fin = "" ;
292                }
293                       
294                $b = supprimer_tags($b);
295               
296                $texte_clean .= $prefixe_ital . $gras_debut . $b . $gras_fin  ; 
297                //var_dump("<pre>",htmlspecialchars($texte_clean));
298        }
299       
300        // fermer l'ital eventuellement resté ouvert
301        if($ital){
302                $s = "}" ;
303                //var_dump("lol",$b);
304        }       
305        else
306                $s = "";       
307       
308        $texte = $texte_clean.$s ;
309               
310        //$texte = supprimer_tags($texte);
311               
312        // entites inventées
313        // espaces fines ou insécables
314        $texte = str_replace("&amp;flexSpace;", "~", $texte);
315        $texte = str_replace("&amp;sixPerEmSpace;", "~", $texte);
316        $texte = str_replace("&amp;punctSpace;", "~", $texte);
317        $texte = str_replace("&amp;thinsp;", "~", $texte);
318        $texte = str_replace("&amp;nbsp;", "~", $texte);
319        $texte = str_replace("&nbsp;", "~", $texte);
320       
321        // cesures
322        $texte = str_replace("&amp;discHyphen;", "", $texte);
323        // autre
324        $texte = str_replace("&amp;ndash;", "—", $texte);
325        $texte = str_replace("&amp;softReturn;", " ", $texte);
326       
327
328        // espaces en gras.
329        $texte = str_replace(" }}","}} ",$texte);
330        $texte = str_replace("{{ "," {{",$texte);
331
332        // espaces en ital.
333        $texte = str_replace(" }","} ",$texte);
334        $texte = str_replace("{ "," {",$texte);
335
336       
337        /*      // espaces en italique ou en romain
338        $c = preg_replace(',[{] *~ *[}],', '~', $c);
339        $c = preg_replace(',[}] *~ *[{],', '~', $c);
340        $c = preg_replace(',[{] +[}],', ' ', $c);
341        $c = preg_replace(',[}] +[{],', ' ', $c);
342        $c = preg_replace(',([ ~])[}],', '}\1', $c);
343        $c = preg_replace(',[{]([ ~]),', '\1{', $c);
344        $c = preg_replace(',[ ~]?([{]»),', '{»', $c);
345        $c = preg_replace(',[{][}]|[}][{],', '', $c);
346*/     
347
348       
349        return $texte ;
350}
Note: See TracBrowser for help on using the repository browser.