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

Last change on this file was 109475, checked in by pierrekuhn82@…, 18 months ago

Version 0.5.3 : On revoit les notice en copiant le fichier du plugins sale, on réduit le nombre de spip_fetch mais il en reste. MOins d'espace en fin de ligne.

File size: 13.7 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"] = 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        // espaces utf-8 , inutile car on à l'option /u
51        //$u = str_replace("\xC2\xA0", " ", $u);
52
53        // sauf que dans un squelette spip qui passe par mes_fonctions et une boucle data on a bien /u qui matche le demi-cadrat \u2002 et l'espace fine \u2009
54        // mais pas en spip-cli qui fait un lire fichier...
55        // donc on les remplace là à défaut d'y comprendre quelque chose.
56        $u = str_replace(" ", " ", $u);
57        $u = str_replace(" ", " ", $u);
58
59        $auteur = extraire_attribut($metas, 'Autor');
60        $auteur = preg_replace('/^von\s*/Uims','',$auteur);
61        if(strlen($auteur) > 1)
62                $m['auteurs'] = $auteur ;
63
64        $m['titre'] = str_replace("\n", " ", extraire_attribut($metas, 'Titel'));
65
66        $u = extraire_balise($u,'red');
67        //$u = str_replace("\n",'',$u);
68        $ti = trim(textebrut(extraire_balise($u,'Titel'))) ;
69        if( ($ti != trim($m['titre'])))
70                $m['alertes'][] = "Embrouille sur le titre : >$ti< != > " . trim($m['titre']) . "<";
71
72        // attention il peut y avoir un encadré plus bas avec un second titre.
73        // donc on vire le premier titre mais pas les suivants.
74
75        preg_match_all("/<Titel>(.*)<\/Titel>/Uums", $u, $titres) ;
76
77        $titre = array_shift($titres[1]) ;
78
79        // on vire le premier titre
80        $u = str_replace('<Titel>' . $titre . '</Titel>', '', $u);
81
82        // on change en gras les suivants
83        foreach($titres[1] as $t)
84                $u = str_replace('<Titel>'. $t . '</Titel>', '{{{'.$t.'}}}',$u);
85
86        if($surtitre = trim(textebrut(extraire_balise($u,'Dach'))))
87                $m['surtitre'] = $surtitre ;
88        $u = preg_replace('/<Dach>.*<\/Dach>/Us','',$u);
89
90        // Nettoyage
91        $u = preg_replace('/<\/?kopf[^>]*>/','',$u);
92        $u = preg_replace('/<\/?red>/','',$u);
93        $u = preg_replace('/<\/?z?Initial>/','',$u);
94        $u = str_replace("<Kursiv/>", "", $u);
95        $u = str_replace("<Fett/>", "", $u);
96        $u = str_replace("<Hoch/>", "", $u);
97        $u = str_replace("<zAutor/>", "", $u);
98
99        if(preg_match(",^01,", $m['pages'])){
100                // tourne de une 2016/10art00817520.xml
101                $u = str_replace( "<Kasten>", "", $u);
102                $u = str_replace( "</Kasten>", "", $u);
103        }else{
104                // sous-papiers
105                $u = str_replace( "<Kasten>", "<quote>", $u);
106                $u = str_replace( "</Kasten>", "</quote>", $u);
107        }
108
109        // copyright
110        // $u = preg_replace('/(?:\(c\)|©)*\s*<Kursiv>Le\s*Monde\sdiplomatique,*\s*<\/Kursiv>,*\s*Berlin/ums','',$u);
111
112        //      <Fett>Fußnoten:</Fett><br/>
113        // <Fett>Fußnoten: <br/></Fett>
114        //      <Fett>Fußnoten:<br/></Fett>
115        $u = preg_replace('/<Fett>\s*Fu(ß|ss)note(n)*\s*:*\s*(<br\s*\/>)*\s*<\/Fett>(\s*<br\s*\/>)*/Us','',$u);
116        // liens
117        // <URL href="http://www.un.org/terrorism">www.un.org/terrorism</URL>
118
119        // Liens
120        $l = extraire_balises($u,"URL");
121        //var_dump($l);
122        foreach($l as $a){
123                $txt=textebrut($a);
124                $href=extraire_attribut($a, "href");
125                $u = str_replace($a,'[' . $txt .'->' . $href .']',$u);
126        }
127
128        // Nettoyer les auteurs qui peuvent être dans le sous-titre
129        // On les connait déjà et ils ont parfois des Von
130        // <zAutor>von Hubert Prolongeau</zAutor>
131        // <Unterzeile>Von <zAutor>SÉVERINE VATANT </zAutor> *</Unterzeile>
132        // <Unterzeile><Kursiv>Währungsunion: Die EU versagt, aber sie merkt es nicht </Kursiv><zAutor>von John Grahl</zAutor></Unterzeile>
133        // plusieurs auteurs possible : 1999_12_17/art231.xml
134
135        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
136                for($i=0 ; $i < sizeof($matches[0]) ; $i++){
137                        if(preg_match('/\*/',$matches[0][$i],$ast))
138                                $flag_signature = "Note d'auteur a check" ;
139                        $m['logs'][] = "Suppression de (auteur chapo) : " . entites_html($matches[0][$i]) ;
140                        $u = str_replace($matches[0][$i],'',$u);
141                        // on rechoppe l'auteur si on l'avait en fait pas : 2016_09_08/art00812340.xml
142                        if(!$m['auteurs'])
143                                $m['auteurs'] = textebrut($matches[0][$i]);
144                }
145        }
146
147        // nettoyage d'un <Unterzeile> vidé de son auteur
148        // <Unterzeile>  </Unterzeile>
149        $u = preg_replace("/<Unterzeile>\s*<\/Unterzeile>/Us","",$u);
150
151        // il y a aussi des auteurs dans le texte
152        //<Brot>Von</Brot>
153        //<Brot>LAKHDAR</Brot>
154        //<Brot>BENYOUNES</Brot>
155        // 1996_05_10/art299.xml, 1996_07_12/art260.xml
156        if(preg_match("%<Brot>Von\s*(unserem)*</Brot>\s*<Brot>[^<]*</Brot>\s*<Brot>[^<]*</Brot>%Uis",$u,$matches)){
157                $m['logs'][] = "Suppression (auteur) de : " . entites_html($matches[0]) ;
158                $u = str_replace($matches[0],'',$u);
159        }
160
161        //<Korrespondent>Von IGNACIO RAMONET</Korrespondent> 2003_01_17/art005.xml
162        $u = preg_replace('%<Korrespondent>[^<]*</Korrespondent>%Us','',$u);
163
164        // Traducteur // signature // crédit 1)
165
166        // <Kursiv>     dt. Bodo Schulze</Kursiv>
167        // <FettKursiv>Aus dem Englischen von Niels Kadritzke <br/></FettKursiv>
168        if(preg_match("%<Kursiv>(\s*dt\..*)</Kursiv>%Ums",$u,$matches)
169                OR preg_match("%<(?:(?:Fett)*Kursiv|Fussnote|Fett|Hinweis|SpitzQuelle)>(\s*Aus de.*)</*(?:(?:Fett)*Kursiv|Fussnote|Fett|Hinweis|SpitzQuelle)/*>%Uums",$u,$matches)
170                OR preg_match("%<Kursiv>(\s*deutsch von.*)</Kursiv>%Ums",$u,$matches)
171        ){
172                $m['traducteur'] = trim(textebrut($matches[1])) ;
173                $m['traducteur'] = preg_replace("/^\s*dt\.\s*|^\s*deutsch von\s*/Uims","",$matches[1]) ;
174                $m['logs'][] = "Suppression de (trad): " . entites_html($matches[0]) ;
175
176                //echo(htmlspecialchars($matches[0]));
177                //echo(htmlspecialchars($u));
178
179                // parenthese pour chercher une bio en fin de notes apres le traducteur
180                // voir aussi plus bas
181                if(preg_match("~" . preg_quote($matches[0]) . "(?!</Fussnote>)(.{2}.+)</Fussnote>~Uuims", $u , $b)){
182                        if($b[1]){
183                                //echo(htmlspecialchars($b[1]));
184                                // signature avec un crédit en prime ?
185                                if(preg_match("/©.*/", $b[1], $cre)){
186                                        //echo(htmlspecialchars($cre[0]));
187                                        $credit = $cre[0] ;
188                                        $b[1] = str_replace($credit, "", $b[1]);
189                                        $u = str_replace($credit,"",$u);
190                                }
191                                $m['signature'] .= $b[1] ;
192                                $u = str_replace($b[1],"",$u);
193                                $flag_signature = false ;
194                        }
195                }
196
197                // On vire le traducteur, et on remet le crédit le cas échéant pour la suite
198                if($credit)
199                        $repl = trim($credit) ;
200                else
201                        $repl = "";
202                $u = str_replace($matches[0],$repl,$u);
203                //echo(htmlspecialchars($u));
204        }
205
206                //echo(htmlspecialchars($u));
207
208
209
210        // pas de <br /> dans un <brot> 1996_05_10/art299.xml
211        if(preg_match_all("%<Brot>(.*)</Brot>%Us",$u,$matches)){
212                for($i=0 ; $i < sizeof($matches[1]) ; $i++){
213                        $no_br = preg_replace("%<br\s*/>%Us","",$matches[1][$i]) ;
214                        $u = str_replace($matches[1][$i],$no_br,$u);
215                }
216        }
217
218        // y'a t'il une bio dans les notes de bas de pages ?
219        // il peut y avoir plusieurs <Fussnote>
220        // <Fussnote>(.*)</Fussnote>
221        // <Fussnote>* Journalist, Jerusalem.</Fussnote>
222        // <Fussnote>© Le Monde diplomatique, Berlin</Fussnote>
223        //<Fussnote>
224//José López Mazz ist Professor für Anthropologie an der Universidad de la República, Montevideo.</Fussnote>
225
226        //var_dump($m['note_signature'],htmlspecialchars($u));
227
228        // recaler les note avec hinweis
229        // var_dump("<textarea>$u</textarea>");
230        $u = preg_replace(',<Hinweis>(<Hoch>.*)</Hinweis>,Uums',"<Fussnote>\\1</Fussnote>", $u);
231
232        // un petit credit en Hinweis ?
233        preg_match(",<Hinweis>(.*)</Hinweis>,Uums", $u, $hinweis);
234        if($hinweis[1]){
235                $m['credit'] = $hinweis[1] . "\n\n" ;
236                $u = str_replace($hinweis, "", $u);
237        }
238
239        if(preg_match_all("%<Fussnote>(.*)</Fussnote>%Us",$u,$matches)){
240
241                //var_dump("<textarea>", $u, "</textarea>", "<pre>", $matches, "</pre>");
242
243                for($i=0 ; $i < sizeof($matches[1]) ; $i++){
244                        // si pas de balise note et *
245                        if (!preg_match(',<hoch>,ims', $matches[1][$i])
246                                 //AND !preg_match("%^\d%Uims",$matches[1][$i]) // 2004_11_12/art052.xml
247                                 //AND preg_match("%^\s*\*%Uims",$matches[1][$i]) // 1995_09_15/art299.xml
248                                ){
249                                //var_dump(htmlspecialchars($u),$matches[1][$i]);
250
251                                // Crédit ou signature ?
252                                if(preg_match("/©.*/", $matches[1][$i])){
253                                        $credit = $matches[1][$i] ;
254                                        // On ne met pas le crédit en note non numérotée car ca pète la correction des notes ensuite.
255                                        $m['credit'] .= $credit ;
256                                        $u = str_replace($matches[0][$i],"",$u);
257                                }else{
258                                        $note_signature = trim(preg_replace('/^\s*\*\s*/','',$matches[1][$i])) ;
259                                        if($note_signature !== ""){
260                                                $m['signature'] .= $note_signature . "\n\n" ;
261                                                $u = str_replace($matches[0][$i],'',$u);
262                                                $flag_signature = false ;
263                                        }
264                                }
265                        }
266                }
267        }
268
269        //var_dump($m['signature']);
270
271        // une note signature dans un brot peut-être ? 1996_08_16/art256.xml
272        if($flag_signature
273                AND preg_match("%^<Brot>\*(.*)</Brot>%Uims",$u,$n)
274        ){
275                $m['signature'] = $n[1] ;
276                $u = str_replace($matches[0][$i],'',$u);
277                $flag_signature = false ;
278        }
279
280        if($flag_signature)
281                $m['alertes'][] = "Signature non trouvée" ;
282
283        // notes en début de ligne sans fussnote
284        $u = preg_replace(',^\s*<Hoch>\s*(\d+)\s*</Hoch>\s*,Uum',"\n\n(\\1) ", $u); // 2009_04_03/art00485576.xml
285
286        // notes avec espaces le cas échéant
287        $u = preg_replace(',\s*<Hoch>\s*(\d+)\s*</Hoch>\s*,Uum'," (\\1) ", $u); // galere sur la note 1 2015_07_09/art00746197.xml
288        // avec virgule ou :
289        $u = preg_replace('~<Hoch>\s*,*\s*(\d+)\s*,*\s*</Hoch>\s*~Uum'," (\\1), ",$u);
290        $u = preg_replace('~<Hoch>\s*:*\s*(\d+)\s*:*\s*</Hoch>\s*~Uum'," (\\1): ",$u);
291        $u = preg_replace('~<Hoch>\s*;*\s*(\d+)\s*;*\s*</Hoch>\s*~Uum'," (\\1); ",$u);
292        // avec .
293        $u = preg_replace('~<Hoch>\s*\.*\s*(\d+)\s*\.*\s*</Hoch>\s*~Uum'," (\\1). ",$u);
294        //      <Hoch>“6</Hoch>
295        $u = preg_replace('~<Hoch>\s*“*\s*(\d+)\s*“*\s*</Hoch>\s*~Uum',"“ (\\1) ",$u);
296        $u = preg_replace('~<Hoch>\s*\)*\s*(\d+)\s*\)*\s*</Hoch>\s*~Uum',") (\\1) ",$u);
297
298        $u = preg_replace(',^\s+\(,',"(",$u);
299        $u = str_replace(') .',").",$u);
300        $u = str_replace(') ,',"),",$u);
301        $u = preg_replace(',^ *(\(\d+\))\s+,ums',"\\1 ",$u); // 2009_04_03/art00485576.xml
302
303        // vides ou avec un . dedans
304        $u = preg_replace('~<Hoch>\s*</Hoch>~Uum',"",$u);
305        $u = preg_replace('~<Hoch>\s*\.\s*</Hoch>~Uum',". ",$u);
306        $u = preg_replace('~<Hoch>\s*,\s*</Hoch>~Uum',", ",$u);
307        $u = preg_replace('~<Hoch>\s*:\s*</Hoch>~Uum',": ",$u);
308        $u = preg_replace('~<Hoch>\s*:\s*</Hoch>~Uum',": ",$u);
309        //var_dump("<textarea>$u</textarea>");
310
311        // sous titre ou chapo
312        // <Unterzeile> court = sous titre
313        // <Unterzeile> long = chapo
314
315        if(preg_match_all("%<Unterzeile>(.*)</Unterzeile>%Us",$u,$matches)){
316                for($i=0 ; $i < sizeof($matches[0]) ; $i++){
317                        //$m['logs'][] = $matches[0][$i] ;
318                        if(strlen($matches[1][$i]) < 100){
319                                if($m['titre'] == "edito")
320                                        $m['titre'] = trim(textebrut($matches[1][$i])) ;
321                                else
322                                        $m['soustitre'] = trim(textebrut($matches[1][$i])) ;
323                        }
324                        if(strlen($matches[1][$i]) >= 100){
325                                if($m['chapo'])
326                                        $m['chapo'] .= "\n\n" ; // marche pas ? 1997_06_13/art262.xml
327                                $m['chapo'] .= trim(textebrut($matches[1][$i])) ;
328                        }
329                        $u = str_replace($matches[0][$i],'',$u);
330                        $m['logs'][] = "Suppression de (soustitre / chapo): " . entites_html($matches[0][$i]) ;
331                }
332        }
333
334        // Chapo <Vorspann>
335        if(preg_match("%<Vorspann>(.*)</Vorspann>%Us",$u,$matches)){
336                $m['chapo'] .= trim(textebrut($matches[1])) ;
337                $u = str_replace($matches[0],'',$u);
338                $m['logs'][] = "Suppression de (chapo): " . entites_html($matches[0]) ;
339
340        }
341
342        // Chapo <Initial>
343        if(preg_match("%<Initial>(.*)</Initial>%Us",$u,$matches)){
344                $m['chapo'] .= trim($matches[1]) ;
345                $u = str_replace($matches[0],'',$u);
346                $m['logs'][] = "Suppression de (chapo): " . entites_html($matches[0]) ;
347
348        }
349
350        // inters
351        $u = str_replace("<Zwischentitel>","\n\n{{{",$u);
352        $u = str_replace("</Zwischentitel>","}}}\n\n",$u);
353
354        // sauts de ligne
355        $u = preg_replace('/<br\s*\/?>/',"\n\n",$u);
356
357        //paragraphes
358        $u = preg_replace('/<\/?Brot>/',"\n\n",$u);
359        $u = str_replace("\n\n\n\n","\n\n",$u);
360
361        // notes encore
362        // . (4) => (4).
363        $u = preg_replace('~\. (\(\d+\))\s*~Um'," \\1. ",$u);
364
365        // Citations
366        // <Zitat>
367        // virer les exergue qui sont en fin de texte par erreur.
368        $u = preg_replace('~<Zitat>[^<]+</Zitat>$~Ums',"",$u);
369
370        // faire un quote avec les autres
371        $u = str_replace("<Zitat>","<quote>",$u);
372        $u = str_replace("</Zitat>","</quote>",$u);
373
374        // images des pages.
375        $images_balises = extraire_balises($u,"PdfFile");
376        foreach($images_balises as $imageb){
377                $m['images_pages'][] = preg_replace("/\.pdf$/",".jpg",textebrut($imageb));
378                $u = str_replace($imageb,"",$u);
379        }
380
381        $u = trim($u);
382        $m['texte'] = $u ;
383
384        foreach($champs  = array("texte", "chapo", "signature", "credit") as $t){
385                        // texte spip
386                        if($m[$t]){
387                                // itals
388                                $m[$t] = str_replace("<Kursiv>","{",$m[$t]);
389                                $m[$t] = str_replace("</Kursiv>","}",$m[$t]);
390
391                                // gras
392                                $m[$t] = str_replace("<Fett>","{{",$m[$t]);
393                                $m[$t] = str_replace("</Fett>","}}",$m[$t]);
394
395                                $m[$t] = str_replace("<FettKursiv>","{{ {",$m[$t]);
396                                $m[$t] = str_replace("</FettKursiv>","} }}",$m[$t]);
397
398                                //  Pas d'indice ou exposant
399                                $m[$t] = preg_replace(',</?Tief>,U',"",$m[$t]); // sinon on mettrait <sub> et <exp>
400
401                                // menage
402                                // notes de bas de page :
403                                $m[$t] = preg_replace(',</?Fussnote>,U',"\n\n",$m[$t]); //pb d'espace fine ? en fin de hoch 2002_07_12/art002.xml
404                        }
405        }
406        return $m ;
407}
408
Note: See TracBrowser for help on using the repository browser.