source: spip-zone/_plugins_/convertisseur/trunk/extract/xml_de.php @ 100366

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

les iterateurs des extracteurs renvoient les champs de données converties (titre, chapo, texte, auteurs etc) et un champ insertion qui montre les données qui vont etre insérées dans le spip + éventuellement des champs techniques pour le debug (xml, logs, alertes), on peut donc les utiliser soit pour afficher directement une convertion, soit pour générer des fichiers à inserer dans spip

File size: 10.3 KB
Line 
1<?php
2
3// Sait-on extraire ce format ?
4$GLOBALS['extracteur']['xml_de'] = 'extracteur_xml_de';
5
6function extracteur_xml_de($fichier, &$charset) {
7        $charset = 'utf-8';
8        if (lire_fichier($fichier, $texte)) {           
9                return convertir_extraction_xml_de($texte);
10        }
11}
12
13function convertir_extraction_xml_de($c) {
14        $item = convertir_xml_de($c);
15        $texte = extracteur_preparer_insertion($item);
16               
17        return $texte ;
18}
19
20function convertir_xml_de($u) {
21
22        include_spip('inc/charsets');
23        include_spip('inc/filtres');
24
25        // debug xml
26        // pas de saut de lignes
27        $m['xml'] = entites_html(preg_replace("/>\s*</Us",">\n\n\n\n<",$u));
28        $m['xml'] = preg_replace("/^\n$/Ums",'',$m['xml']);
29
30        // chopper les metas données
31        $metas = extraire_balise($u,'kopf');
32        $m['pages'] = str_replace(","," ", extraire_attribut($metas, 'Seite'));
33       
34        $p = explode(" ",$m['pages']) ;
35        if($p[0] < 10 and !preg_match("/^0/", $m['pages']))
36                $m['pages'] = "0" . $m['pages'] ;
37       
38               
39        $m['date'] = extraire_attribut($metas, 'Edat');
40        $m["url"] = "http://monde-diplomatique.de/artikel/!".  extraire_attribut($metas, 'DatNr') ;
41
42        // pas de puces
43        $u = preg_replace(',&kenkel;\s*,','',$u);
44        // espaces non prise par preg
45        $u = preg_replace(',&thinsp;,',' ',$u); 
46
47        // passer en utf-8 en nettoyant les entites
48        $u = unicode2charset(html2unicode($u)) ;
49
50        $auteur = extraire_attribut($metas, 'Autor');
51        $auteur = preg_replace('/^von\s*/Uims','',$auteur);
52        if(strlen($auteur) > 1) 
53                $m['auteurs'] = $auteur ;
54
55        $m['titre'] = extraire_attribut($metas, 'Titel');
56
57        $u = extraire_balise($u,'red');
58        //$u = str_replace("\n",'',$u);
59
60        if( ($ti = trim(textebrut(extraire_balise($u,'Titel')))) != $m['titre'])
61                $m['alertes'][] = "Embrouille sur le titre : $ti >> " . $m['titre'] ;
62 
63        // attention il peut y avoir un encadré plus bas avec un second titre.
64        // donc on vire le premier titre mais pas les suivants.
65       
66        preg_match_all("/<Titel>(.*)<\/Titel>/Uums", $u, $titres) ;
67       
68        $titre = array_shift($titres[1]) ;
69               
70        // on vire le premier titre
71        $u = str_replace('<Titel>' . $titre . '</Titel>', '', $u);
72                       
73        // on change en gras les suivants
74        foreach($titres[1] as $t)
75                $u = str_replace('<Titel>'. $t . '</Titel>', '{{{'.$t.'}}}',$u);
76       
77        // on on remplace les kast par des quote
78        $u = str_replace( "<Kasten>", "<quote>", $u);
79        $u = str_replace( "</Kasten>", "</quote>", $u);
80       
81       
82        if($surtitre = trim(textebrut(extraire_balise($u,'Dach'))))
83                $m['surtitre'] = $surtitre ;
84        $u = preg_replace('/<Dach>.*<\/Dach>/Us','',$u);
85
86        // Nettoyage
87        $u = preg_replace('/<\/?kopf[^>]*>/','',$u);
88        $u = preg_replace('/<\/?red>/','',$u);
89        $u = preg_replace('/<\/?zInitial>/','',$u);
90       
91        // copyright
92        // $u = preg_replace('/(?:\(c\)|©)*\s*<Kursiv>Le\s*Monde\sdiplomatique,*\s*<\/Kursiv>,*\s*Berlin/ums','',$u);
93               
94        //      <Fett>Fußnoten:</Fett><br/>
95        // <Fett>Fußnoten: <br/></Fett>
96        //      <Fett>Fußnoten:<br/></Fett>
97        $u = preg_replace('/<Fett>\s*Fu(ß|ss)note(n)*\s*:*\s*(<br\s*\/>)*\s*<\/Fett>(\s*<br\s*\/>)*/Us','',$u);
98
99        // menage
100        $u = preg_replace('~<Fussnote>\s+</Fussnote>~Uums','',$u);
101
102
103        // liens
104        // <URL href="http://www.un.org/terrorism">www.un.org/terrorism</URL>
105       
106        // Liens
107        $l = extraire_balises($u,"URL");
108        //var_dump($l);
109        foreach($l as $a){
110                $txt=textebrut($a);
111                $href=extraire_attribut($a, "href");
112                $u = str_replace($a,'[' . $txt .'->' . $href .']',$u);
113        }
114
115        // Nettoyer les auteurs qui peuvent être dans le sous-titre
116        // On les connait déjà et ils ont parfois des Von
117        // <zAutor>von Hubert Prolongeau</zAutor>       
118        // <Unterzeile>Von <zAutor>SÉVERINE VATANT </zAutor> *</Unterzeile>
119        // <Unterzeile><Kursiv>Währungsunion: Die EU versagt, aber sie merkt es nicht </Kursiv><zAutor>von John Grahl</zAutor></Unterzeile>
120        // plusieurs auteurs possible : 1999_12_17/art231.xml
121       
122        if(preg_match_all("%\s*(Von)?( unserem Korrespondenten)?\s*<zAutor>[^<]+</zAutor>\s*(\*)?(und)?%is",$u,$matches)){ // pas de U a cause 2002_02_15/art067.xml
123                for($i=0 ; $i < sizeof($matches[0]) ; $i++){
124                        if(preg_match('/\*/',$matches[0][$i],$ast))
125                                $flag_signature = "Note d'auteur a check" ;
126                        $m['logs'][] = "Suppression de (auteur chapo) : " . entites_html($matches[0][$i]) ;
127                        $u = str_replace($matches[0][$i],'',$u);
128                }
129        }
130       
131        // nettoyage d'un <Unterzeile> vidé de son auteur       
132        // <Unterzeile>  </Unterzeile>
133        $u = preg_replace("/<Unterzeile>\s*<\/Unterzeile>/Us","",$u);
134       
135        // il y a aussi des auteurs dans le texte
136        //<Brot>Von</Brot>
137        //<Brot>LAKHDAR</Brot>
138        //<Brot>BENYOUNES</Brot>
139        // 1996_05_10/art299.xml, 1996_07_12/art260.xml
140        if(preg_match("%<Brot>Von\s*(unserem)*</Brot>\s*<Brot>[^<]*</Brot>\s*<Brot>[^<]*</Brot>%Uis",$u,$matches)){
141                $m['logs'][] = "Suppression (auteur) de : " . entites_html($matches[0]) ;
142                $u = str_replace($matches[0],'',$u);
143        }
144
145        //<Korrespondent>Von IGNACIO RAMONET</Korrespondent> 2003_01_17/art005.xml
146        $u = preg_replace('%<Korrespondent>[^<]*</Korrespondent>%Us','',$u);
147
148        // <Kursiv>     dt. Bodo Schulze</Kursiv>
149        // <FettKursiv>Aus dem Englischen von Niels Kadritzke <br/></FettKursiv>
150        if(preg_match("%<Kursiv>(\s*dt\..*)</Kursiv>%Ums",$u,$matches)
151                OR preg_match("%<(?:(?:Fett)*Kursiv|Fussnote)>(\s*Aus de.*)</*(?:(?:Fett)*Kursiv|Fussnote)/*>%Uums",$u,$matches)
152                OR preg_match("%<Kursiv>(\s*deutsch von.*)</Kursiv>%Ums",$u,$matches)           
153        ){
154                $m['traducteur'] = trim(textebrut($matches[1])) ;
155                $m['traducteur'] = preg_replace("/^\s*dt\.\s*|^\s*deutsch von\s*/Uims","",$matches[1]) ;
156                $m['logs'][] = "Suppression de (trad): " . entites_html($matches[0]) ;
157               
158                //echo(htmlspecialchars($matches[0]));
159               
160                // parenthese pour chercher une bio en fin de notes apres le traducteur
161                // voir aussi plus bas
162                if(preg_match("~" . preg_quote($matches[0]) . "(.{2}.+)</Fussnote>~Uuims", $u , $b)){
163                        if($b[1]){
164                                $m['signature'] .= $b[1] ;
165                                $u = str_replace($b[1],'',$u);
166                                $flag_signature = false ;                               
167                        }
168                }               
169                $u = str_replace($matches[0],'',$u);
170        }
171       
172        // pas de <br /> dans un <brot> 1996_05_10/art299.xml
173        if(preg_match_all("%<Brot>(.*)</Brot>%Us",$u,$matches)){
174                for($i=0 ; $i < sizeof($matches[1]) ; $i++){
175                        $no_br = preg_replace("%<br\s*/>%Us","",$matches[1][$i]) ;
176                        $u = str_replace($matches[1][$i],$no_br,$u);
177                }       
178        }
179
180        // y'a t'il une bio dans les notes de bas de pages ?
181        // il peut y avoir plusieurs <Fussnote>
182        // <Fussnote>(.*)</Fussnote>
183        // <Fussnote>* Journalist, Jerusalem.</Fussnote>
184       
185        //<Fussnote>
186//José López Mazz ist Professor für Anthropologie an der Universidad de la República, Montevideo.</Fussnote>
187
188        //var_dump($m['note_signature'],htmlspecialchars($u));
189
190
191        if(preg_match_all("%<Fussnote>(.*)</Fussnote>%Us",$u,$matches)){
192               
193                //var_dump($matches[1]);
194               
195                for($i=0 ; $i < sizeof($matches[1]) ; $i++){
196                        // si pas de balise note et *
197                        if (!preg_match(',<hoch>,ims', $matches[1][$i])
198                                 //AND !preg_match("%^\d%Uims",$matches[1][$i]) // 2004_11_12/art052.xml
199                                 //AND preg_match("%^\s*\*%Uims",$matches[1][$i]) // 1995_09_15/art299.xml
200                                ){
201                                //var_dump(htmlspecialchars($u),$matches[1][$i]);
202                                $note_signature = trim(preg_replace('/^\s*\*\s*/','',$matches[1][$i])) ;
203                                if($note_signature !== ""){
204                                        $m['signature'] .= $note_signature . "\n\n" ;
205                                        $u = str_replace($matches[0][$i],'',$u);
206                                        $flag_signature = false ;       
207                                }       
208                        }                       
209                }       
210        }
211
212        //var_dump($m['signature']);
213       
214        // une note signature dans un brot peut-être ? 1996_08_16/art256.xml
215        if($flag_signature
216                AND preg_match("%^<Brot>\*(.*)</Brot>%Uims",$u,$n)
217        ){
218                $m['signature'] = $n[1] ;
219                $u = str_replace($matches[0][$i],'',$u);
220                $flag_signature = false ;
221        }
222       
223        if($flag_signature)
224                $m['alertes'][] = "Signature non trouvée" ;
225
226        // notes avec des espaces dedans...
227        // <Hoch>3 </Hoch>
228       
229        $u = preg_replace(',^<Hoch>\s*(\d+)\s*</Hoch>\s*,Um',"<br />(\\1) ",$u); //pb d'espace fine ? en fin de hoch 2002_07_12/art002.xml
230
231       
232        // notes dans le texte
233        $u = preg_replace(',(?:\s)*<Hoch>\s*(\d+)\s*</Hoch>\s*,U'," (\\1) ",$u); // galere sur la note 1 2015_07_09/art00746197.xml
234        $u = preg_replace(',^\s+\(,',"(",$u);
235        $u = str_replace(') .',").",$u);
236
237
238//      $u = preg_replace('/<Fussnote>/Us',"\n",$u);
239//      $u = preg_replace('/<\/Fussnote>/Us',"\n",$u);
240
241        // sous titre ou chapo
242        // <Unterzeile> court = sous titre
243        // <Unterzeile> long = chapo
244       
245        if(preg_match_all("%<Unterzeile>(.*)</Unterzeile>%Us",$u,$matches)){
246                for($i=0 ; $i < sizeof($matches[0]) ; $i++){
247                        //$m['logs'][] = $matches[0][$i] ;             
248                        if(strlen($matches[1][$i]) < 100){
249                                if($m['titre'] == "edito")
250                                        $m['titre'] = trim(textebrut($matches[1][$i])) ;
251                                else
252                                        $m['soustitre'] = trim(textebrut($matches[1][$i])) ;
253                        }
254                        if(strlen($matches[1][$i]) >= 100){
255                                if($m['chapo'])
256                                        $m['chapo'] .= "\n\n" ; // marche pas ? 1997_06_13/art262.xml
257                                $m['chapo'] .= trim(textebrut($matches[1][$i])) ;
258                        }       
259                        $u = str_replace($matches[0][$i],'',$u);
260                        $m['logs'][] = "Suppression de (soustitre / chapo): " . entites_html($matches[0][$i]) ;         
261                }
262        }
263       
264        // Chapo <Vorspann>
265        if(preg_match("%<Vorspann>(.*)</Vorspann>%Us",$u,$matches)){
266                $m['chapo'] .= trim(textebrut($matches[1])) ;
267                $u = str_replace($matches[0],'',$u);
268                $m['logs'][] = "Suppression de (chapo): " . entites_html($matches[0]) ;         
269                       
270        }       
271
272        // Chapo <Initial>
273        if(preg_match("%<Initial>(.*)</Initial>%Us",$u,$matches)){
274                $m['chapo'] .= trim(textebrut($matches[1])) ;
275                $u = str_replace($matches[0],'',$u);
276                $m['logs'][] = "Suppression de (chapo): " . entites_html($matches[0]) ;         
277                       
278        }       
279
280        // inters
281        $u = str_replace("<Zwischentitel>","\n\n{{{",$u);
282        $u = str_replace("</Zwischentitel>","}}}\n\n",$u);     
283
284        // sauts de ligne
285        $u = preg_replace('/<br\s*\/?>/',"\n\n",$u);
286               
287        //paragraphes
288        $u = preg_replace('/<\/?Brot>/',"\n\n",$u);
289        $u = str_replace("\n\n\n\n","\n\n",$u);
290
291        // Citations
292        // <Zitat>
293        $u = str_replace("<Zitat>","<quote>",$u);
294        $u = str_replace("</Zitat>","</quote>",$u);
295               
296        // images des pages.
297        $images_balises = extraire_balises($u,"PdfFile");
298        foreach($images_balises as $imageb){
299                $m['images_pages'][] = preg_replace("/\.pdf$/",".jpg",textebrut($imageb));
300                $u = str_replace($imageb,"",$u);       
301        }
302
303        $u = trim($u);
304        $m['texte'] = $u ;
305
306        foreach($champs  = array("texte", "chapo", "signature") as $t){
307                        // texte spip
308       
309                        // itals
310                        $m[$t] = str_replace("<Kursiv>","{",$m[$t]);
311                        $m[$t] = str_replace("</Kursiv>","}",$m[$t]);   
312               
313                        // gras
314                        $m[$t] = str_replace("<Fett>","{{",$m[$t]);
315                        $m[$t] = str_replace("</Fett>","}}",$m[$t]);
316                       
317                        // menage
318                        // notes de bas de page :
319                        $m[$t] = preg_replace(',</?Fussnote>,U',"\n\n",$m[$t]); //pb d'espace fine ? en fin de hoch 2002_07_12/art002.xml
320                       
321
322        }
323       
324
325        return $m ;
326}
327
Note: See TracBrowser for help on using the repository browser.