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

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

pipeline traitement perso pour un paragraphe converti depuis quark xml

File size: 8.1 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                                // Titre
138                                if(preg_match("/titre/i", $type)){
139                                        if(sizeof($item["titre"]) > 0 and !preg_match("/^\s/", $texte) and !preg_match("/\s$/", $item["titre"]))
140                                                $texte = " " . $texte ;
141                                                $item["titre"] .= $texte ;
142                                        continue ;
143                                }
144
145                                // Eventuels traitements perso
146                                if (function_exists('nettoyer_paragraphe')){
147                                        $res = nettoyer_paragraphe($type, $texte, $item);                       
148                                        if($res){
149                                                $item = $res ;
150                                                continue ;     
151                                        }
152                                }
153
154                                // Surtitre
155                                if(preg_match("/surtitre/i", $type)){
156                                        if(sizeof($item["surtitre"]) > 0 and !preg_match("/^\s/", $texte) and !preg_match("/\s$/", $item["surtitre"]))
157                                                $texte = " " . $texte ;
158                                        $item["surtitre"] .= $texte ;
159                                        continue ;
160                                }
161                               
162                                // Chapo
163                                if(preg_match("/chapo/i", $type)){
164                                        $item["chapo"] .= $texte ;
165                                        continue ;
166                                }
167                               
168                                // Inters
169                                if(preg_match("/accroche/i", $type)){
170                                        $item["texte"] .= "\n\n" . '{{{' . "$texte" . '}}}' ."\n\n" ;
171                                        continue ;
172                                }
173                               
174                                // Notes de bas de page
175                                if(preg_match("/notes/i", $type)){
176                                        $item["notes"] .= $texte ."\n" ;
177                                        continue ;
178                                }
179                               
180                                // Auteurs
181                                if(preg_match("/signature/i", $type)){
182                                        $item["auteurs"] .= $texte ;                   
183                                        continue ;
184                                }
185                                                               
186                                // Cas général
187                                $item["texte"] .= "$texte\n\n" ;
188                               
189                        }
190               
191                }
192        }
193       
194        // ajouter les notes
195       
196        if($item["notes"]){
197                $item["texte"] = $item["texte"] . "[[<>\n" . $item["notes"] ."]]" . "\n" ;
198                unset($item["notes"]) ;
199        }
200       
201        $item["auteurs"] = preg_replace("/\.\s*$/","",$item["auteurs"]);
202               
203        // passer la main pour une surcharge éventuelle
204        $c = $item ;
205       
206        if (function_exists('nettoyer_conversion')){
207                $item = nettoyer_conversion($item);                     
208        }
209       
210        // var_dump($item["auteurs_tete"],"<hr>");
211        // var_dump($item["auteurs"]);
212       
213        //$item["textebrut"] = textebrut($u);   
214        //$item["xml"] = htmlspecialchars($u) ;
215
216        //$item["xml"] = $u ;
217
218        return $item ;
219}
220
221
222
223// Fonctions spécialisées
224
225function remove_utf8_bom($text){
226    $bom = pack('H*','EFBBBF');
227    $text = preg_replace("/^$bom/", '', $text);
228    return $text;
229}
230
231
232//
233function nettoyer_xml_quark($xml){
234       
235        $texte = $xml ;
236       
237        $texte = preg_replace("/\R+/","",$xml);
238        $texte = preg_replace("/>\s+</","><",$texte);
239       
240        // espace insécable en balise vide.
241        $texte = preg_replace("/<RICHTEXT MERGE=\"false\" NONBREAKING=\"true\"\/?>(<\/RICHTEXT>)?/ims", "<RICHTEXT MERGE=\"false\" NONBREAKING=\"true\">~</RICHTEXT>", $texte);
242        $texte = preg_replace("/<RICHTEXT[^>]+><\/RICHTEXT>/ims", "<RICHTEXT> </RICHTEXT>", $texte);
243       
244        $ital = false ;
245       
246        foreach(extraire_balises($texte, "RICHTEXT") as $b){
247               
248                // itals sur plusieurs balises
249               
250                $prefixe_ital = "" ;
251                $ital_statut = extraire_attribut($b, "ITALIC");
252                if(!$ital AND $ital_statut == "true"){
253                        // début d'un ital
254                        $prefixe_ital = "{" ;
255                        $ital = true ;
256                }elseif($ital AND $ital_statut == "true"){
257                        // ital qui continue
258                        $prefixe_ital = "" ;
259                        $ital = true ;
260                }elseif($ital AND !$ital_statut){
261                        // fin d'ital
262                        $prefixe_ital = "}" ;
263                        $ital = false ;
264                }
265               
266                // gras
267                $gras_statut = extraire_attribut($b, "BOLD");
268                if($gras_statut == "true"){
269                        $gras_debut = "{{" ;
270                        $gras_fin = "}}" ;
271                }else{
272                        $gras_debut = "" ;
273                        $gras_fin = "" ;
274                }
275                       
276                $b = supprimer_tags($b);
277               
278                $texte_clean .= $prefixe_ital . $gras_debut . $b . $gras_fin  ; 
279                //var_dump("<pre>",htmlspecialchars($texte_clean));
280        }
281       
282        // fermer l'ital eventuellement resté ouvert
283        if($ital){
284                $s = "}" ;
285                //var_dump("lol",$b);
286        }       
287        else
288                $s = "";       
289       
290        $texte = $texte_clean.$s ;
291               
292        //$texte = supprimer_tags($texte);
293               
294        // entites inventées
295        // espaces fines ou insécables
296        $texte = str_replace("&amp;flexSpace;", "~", $texte);
297        $texte = str_replace("&amp;sixPerEmSpace;", "~", $texte);
298        $texte = str_replace("&amp;punctSpace;", "~", $texte);
299        $texte = str_replace("&amp;thinsp;", "~", $texte);
300        $texte = str_replace("&amp;nbsp;", "~", $texte);
301        $texte = str_replace("&nbsp;", "~", $texte);
302       
303        // cesures
304        $texte = str_replace("&amp;discHyphen;", "", $texte);
305        // autre
306        $texte = str_replace("&amp;ndash;", "—", $texte);
307        $texte = str_replace("&amp;softReturn;", " ", $texte); // ou bien par "" ? commence-&softReturn;t-on
308       
309
310        // espaces en gras.
311        $texte = str_replace(" }}","}} ",$texte);
312        $texte = str_replace("{{ "," {{",$texte);
313
314        // espaces en ital.
315        $texte = str_replace(" }","} ",$texte);
316        $texte = str_replace("{ "," {",$texte);
317
318       
319        /*      // espaces en italique ou en romain
320        $c = preg_replace(',[{] *~ *[}],', '~', $c);
321        $c = preg_replace(',[}] *~ *[{],', '~', $c);
322        $c = preg_replace(',[{] +[}],', ' ', $c);
323        $c = preg_replace(',[}] +[{],', ' ', $c);
324        $c = preg_replace(',([ ~])[}],', '}\1', $c);
325        $c = preg_replace(',[{]([ ~]),', '\1{', $c);
326        $c = preg_replace(',[ ~]?([{]»),', '{»', $c);
327        $c = preg_replace(',[{][}]|[}][{],', '', $c);
328        */     
329
330        //var_dump("<pre>",$texte,"</pre>");   
331       
332        return trim($texte) ;
333}
Note: See TracBrowser for help on using the repository browser.