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

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

pipeline traitement perso pour un paragraphe converti depuis quark xml

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