source: spip-zone/_plugins_/spip2spip/trunk/inc/spip2spip.php @ 119848

Last change on this file since 119848 was 119848, checked in by real3t@…, 2 years ago

[SPIP2SPIP] Suite de r105928 : compatibilité PHP7 pour l'importation des mots clefs des articles et des événements

File size: 45.5 KB
Line 
1<?php
2/**
3 * Plugin Spip2spip
4 *
5 * Licence GNU/GPL
6 */
7
8if (!defined('_ECRIRE_INC_VERSION')) {
9        return;
10}
11
12/**
13 * Effectue la syndication d'un flux backend-spip pour un site donnee et importe les données
14 *
15 * @param int $id_site identifiant du sitex du document
16 * @param string $mode *   null : la valeur configuree par defaut ou pour le provider est utilisee
17 *   'cron' : mode silencieux et spip_log
18 *   'html' : mode bavard
19 * @return array  tableau des articles importés
20 */
21function spip2spip_syndiquer($id_site, $mode = 'cron') {
22    include_spip("inc/distant");
23    include_spip("inc/syndic");
24    include_spip("inc/getdocument");
25    include_spip("inc/ajouter_documents");
26    include_spip("inc/config");
27    include_spip('inc/rubriques');
28
29    $log_html = "";
30    $log_email = "";
31
32    //-------------------------------
33    // Recupere la config
34    //-------------------------------
35    // groupe mot cle "licence" installe ? (contrib: https://contrib.spip.net/Filtre-Licence )
36    if (spip2spip_get_id_groupemot("licence")) {
37        $isLicenceInstalled = true;
38    } else {
39        $isLicenceInstalled = false;
40    }
41
42    // Lire config
43    $import_statut = lire_config('spip2spip/import_statut', 'identique');
44    $import_date_article = (lire_config('spip2spip/import_date_article', '') == 'oui') ? true : false;
45    $citer_source = lire_config('spip2spip/citer_source') ? true : false;
46    $creer_thematique_article  = (lire_config('spip2spip/creer_thematique_article', '') == 'oui') ? true : false;
47    $email_alerte = lire_config('spip2spip/email_alerte') ? true : false;
48    $email_suivi = lire_config('spip2spip/email_suivi', $GLOBALS['meta']['adresse_suivi']);
49    $import_mot_article = lire_config('spip2spip/import_mot_article') ? true : false;
50    $import_mot_evt = lire_config('spip2spip/import_mot_evnt') ? true : false;
51    $import_mot_groupe_creer = lire_config('spip2spip/import_mot_groupe_creer') ? true : false;
52    $id_import_mot_groupe = lire_config('spip2spip/import_mot_groupe_creer', -1);
53        if (!defined('_SPIP2SPIP_RECUPERER_CONTENU')) {
54                define('_SPIP2SPIP_RECUPERER_CONTENU', true);
55        }
56        if (!defined('_SPIP2SPIP_RECUPERER_DOC')) {
57                define('_SPIP2SPIP_RECUPERER_DOC', true);
58        }
59
60    //-------------------------------
61    // selection du site
62    //-------------------------------
63    if ($row_site = sql_fetsel("*", "spip_spip2spips", "id_spip2spip=" . intval($id_site))) {
64        $id_site = $row_site["id_spip2spip"];
65        $site_titre = $row_site["site_titre"];
66        $url_syndic = $row_site["site_rss"];
67        $date_syndic = $row_site["maj"];
68
69        spip_log("syndication: " . $url_syndic, "spiptospip");
70
71        sql_update("spip_spip2spips", array('maj' => 'NOW()'), "id_spip2spip=$id_site");
72
73        // Aller chercher les donnees du flux RSS et les analyser
74        $rss = recuperer_page($url_syndic, true);
75        if (!$rss) {
76            $log_html.= "<div class='bloc_error'>" . _T('spip2spip:avis_echec_syndication') . "</div>";
77        } else {
78            $articles = analyser_backend_spip2spip($rss);
79
80            //----*************
81            // Des articles dispo pour ce site ?
82            if (is_array($articles)) {
83
84                // on ouvre le ul avant l'énumération du ou des article(s)
85                $log_html.= "<ul class='liste-items'>\n";
86                foreach ($articles as $article) {
87                    $log_html.= "<li class='item'>";
88                     // On ouvre les festivités
89
90                    if (isset($article['link'])) {
91                        $documents_current_article = array();
92                        $version_flux = $article['version_flux'];
93
94                        $current_titre = $article['titre'];
95                        $current_link = $article['link'];
96
97                        // Est que l'article n'a pas été déjà importé ?
98                        $nb_reponses = sql_countsel("spip_articles", "s2s_url=" . sql_quote($current_link));
99                        if ($nb_reponses > 0) {
100
101                            // article deja connu et present ds la base
102                            $article_importe = sql_fetsel('id_article,titre', 'spip_articles', 's2s_url=' . sql_quote($current_link));
103                            $log_html.= "<span class='bloc_info'>" . _T('spip2spip:imported_already') . "</span><a href='$current_link' rel='external' class='h3'>$current_titre</a><br/>\n" . "<strong>" . _T('spip2spip:label_thematique') . ':</strong> ' . $article['keyword'] . "<br/>\n" . "<a href=" . generer_url_ecrire('article', 'id_article=' . $article_importe['id_article']) . ">" . _T('spip2spip:imported_view') . "</a>\n";
104                            spip_log("deja importe: " . $current_link, "spiptospip");
105
106                        } else {
107
108                            // nouvel article à importer
109                            $log_html.= "<span class='bloc_success'>" . _T('spip2spip:imported_new') . "</span>\n" . "<a href='$current_link' rel='external' class='h3'>$current_titre</a>\n";
110
111                            // on cherche la rubrique destination
112                            $target = spip2spip_get_id_rubrique($article['keyword']);
113                            if (!$target) {
114
115                                // Aucune rubrique associée au thème.
116                                if ($creer_thematique_article) {
117                                    $id_thematique = spip2spip_set_thematique($article['keyword']);
118                                    $thematique_complement = " (<a href=" . generer_url_ecrire('mot', 'id_mot=' . $id_thematique) . ">" . _T('spip2spip:voir_thematique') . "</a>)";
119                                } else {
120                                    $thematique_complement = '';
121                                }
122
123                                $log_html.= "<div class='bloc_notice'>" . _T('spip2spip:no_target') . " <strong>" . $article['keyword'] . "</strong>" . $thematique_complement . "</div>\n";
124                            } else {
125
126                                // On a une rubrique cible
127                                // On importe les données
128
129                                // -----------------------------------
130                                // etape 1 -  traitement des documents
131                                // -----------------------------------
132                                if (_SPIP2SPIP_RECUPERER_DOC) {
133                                                                        $_documents = $article['documents'];
134                                                                }
135                                $documents_current_article = array();
136                                if ($_documents != "") {
137                                    $_documents = preg_replace_callback('!s:(\d+):"(.*?)";!', 
138                                                                        function ($matches) {
139                                                                                return strtolower("'s:'.strlen($matches[1]).':\".$matches[1].\";'");
140                                                                                }
141                                                                                ,
142                                                                                $_documents);
143                                    $_documents = unserialize($_documents);
144                                    foreach ($_documents as $_document) {
145                                        $id_distant = $_document['id'];
146                                        $source = $_document['url'];
147                                        $titre = stripslashes($_document['titre']);
148                                        $desc = stripslashes($_document['desc']);
149                                        $credits = stripslashes($_document['credits']);
150
151                                        // inspire de @ajouter_un_document() - inc/ajout_documents.php
152                                        if ($a = recuperer_infos_distantes($source)) {
153                                                                                        if (is_array($a)) {
154
155                                                                                                $type_image = $a['type_image'];
156
157                                                                                                unset($a['type_image']);
158                                                                                                unset($a['body']);
159                                                                                                unset($a['mode']);
160
161                                                                                                $a['date'] = 'NOW()';
162                                                                                                $a['distant'] = 'oui';
163
164                                                                                                $a['mode'] = 'document';
165                                                                                                $a['fichier'] = set_spip_doc($source);
166
167                                                                                                unset($a['mime_type']);
168
169                                                                                                $a['titre'] = $titre;
170                                                                                                 // infos spip2spip, recupere via le flux
171                                                                                                $a['descriptif'] = $desc;
172                                                                                                $a['credits'] = $credits;
173
174                                                                                                $documents_current_article[$id_distant] = sql_insertq("spip_documents", $a);
175                                                                                        }
176                                                                                }
177                                    }
178                                }
179                                 // Fin de l'étape 1 de traitement des documents
180
181                                // -----------------------------------
182                                // etape 2 -  traitement de l'article
183                                // -----------------------------------
184                                $_titre = $article['titre'];
185                                                                $_s2s_url_site_distant = $article['s2s_url_site_distant'];
186                                                                $_s2s_id_article_distant = $article['s2s_id_article_distant'];
187                                                                if (_SPIP2SPIP_RECUPERER_CONTENU) {
188                                                                        $_surtitre = $article['surtitre'];
189                                                                        $_soustitre = $article['soustitre'];
190                                                                        $_descriptif = spip2spip_convert_extra($article['descriptif'], $documents_current_article, $version_flux);
191                                                                        $_chapo = spip2spip_convert_extra($article['chapo'], $documents_current_article, $version_flux);
192                                                                        $_texte = spip2spip_convert_extra($article['texte'], $documents_current_article, $version_flux);
193                                                                        $_ps = spip2spip_convert_extra($article['ps'], $documents_current_article, $version_flux);
194                                                                } else {
195                                                                        $_surtitre = '';
196                                                                        $_soustitre = '';
197                                                                        $_descriptif = '';
198                                                                        $_chapo = '';
199                                                                        $_texte = '';
200                                                                        $_ps = '';                                                                     
201                                                                }
202
203                                // ----------
204                                //date de la syndication ou date de l'article ?
205                                if ($import_date_article == true) {
206                                    $_date = $article['date'];
207                                     // Date de l'article
208                                } else {
209                                    $_date = date('Y-m-d H:i:s', time());
210                                     //Date de syndication
211                                }
212                                $_date_redac = $article['date_redac'];
213                                $_date_modif = $article['date_modif'];
214                                $_nom_site = $article['nom_site'];
215                                $_url_site = $article['url_site'];
216                                $_virtuel = $article['virtuel'];
217                                $_lang = $article['lang'];
218                                $_logo = $article['logo'];
219                                $_logosurvol = $article['logosurvol'];
220                                $_id_rubrique = $target;
221                                $_id_secteur = spip2spip_get_id_secteur($target);
222                                $_statut = ($import_statut == 'identique') ? $article['statut'] : $import_statut;
223                                $_id_auteur = $article['auteur'];
224                                $_link = $article['link'];
225                                $_trad = $article['trad'];
226                                $_licence = $article['licence'];
227
228                                // ----------
229                                // on cite la source originale ds le champs ps et la licence
230                                if ($citer_source) {
231                                    $_ps.= _T('spip2spip:origin_url') . " [->" . $_link . "]";
232                                }
233
234                                // ----------
235                                // licence ?
236                                if ($_licence != "" && !isLicenceInstalled) {
237                                    $_ps.= _T('spip2spip:article_license') . " " . $_licence;
238                                }
239
240                                // ----------
241                                // ....dans la table articles
242                                // ----------
243                                $id_nouvel_article = sql_insertq("spip_articles", array(
244                                    'lang' => $_lang,
245                                    'surtitre' => $_surtitre,
246                                    'titre' => $_titre,
247                                    'soustitre' => $_soustitre,
248                                    'id_rubrique' => $_id_rubrique,
249                                    'id_secteur' => $_id_secteur,
250                                    'descriptif' => $_descriptif,
251                                    'chapo' => $_chapo,
252                                    'virtuel' => $_virtuel,
253                                    'texte' => $_texte,
254                                    'ps' => $_ps,
255                                    'statut' => $_statut,
256                                    'nom_site' => $_nom_site,
257                                    'url_site' => $_url_site,
258                                    'accepter_forum' => 'non',
259                                    'date' => $_date,
260                                    'date_redac' => $_date_redac,
261                                    'date_modif' => $_date_modif,
262                                    's2s_url' => $_link,
263                                    's2s_url_trad' => $_trad,
264                                                                        's2s_url_site_distant' => $_s2s_url_site_distant,
265                                                                        's2s_id_article_distant' => $_s2s_id_article_distant,
266                                ));
267                                $log_html.= "<br/>\n" . "<strong>" . _T('spip2spip:label_thematique') . ':</strong> ' . $article['keyword'] . "<br/>\n<a href='" . generer_url_ecrire('article', "id_article=$id_nouvel_article") . "'>" . _T('spip2spip:imported_view') . "</a>\n";
268
269                                $log_email.= $article['titre'] . "\n" . _T('spip2spip:imported_view') . ": " . generer_url_ecrire('article', "id_article=$id_nouvel_article", true, false) . "\n\n";
270
271                                // Au besoin, changer le statut de rubrique concernee
272                                if ($_statut == "publie")
273                                   calculer_rubriques_if($_id_rubrique, array('statut' => $_statut));
274
275
276
277                                // ----------
278                                // gestion lien traduction
279                                // ----------
280                                if ($_trad) {
281                                    if ($_trad == $_link) {
282
283                                        // il s'agit de l'article origine de traduc
284                                        sql_updateq('spip_articles', array("id_trad" => $id_nouvel_article), "id_article=$id_nouvel_article");
285                                         // maj article orig trad
286                                        sql_updateq('spip_articles', array("id_trad" => $id_nouvel_article), "s2s_url_trad=" . sql_quote($_link));
287                                         // maj article trad (si deja importe ds une session precedente)
288
289                                    } else {
290
291                                        // il s'agit d'un article traduit,
292                                        // on cherche si on a l'article origine de trad en local
293                                        if ($row = sql_fetsel("id_article", "spip_articles", "s2s_url=" . sql_quote($_trad))) {
294                                            $id_article_trad = (int)$row['id_article'];
295                                            sql_updateq('spip_articles', array("id_trad" => $id_article_trad), "id_article=$id_nouvel_article");
296                                             // maj article trad
297                                            sql_updateq('spip_articles', array("id_trad" => $id_article_trad), "id_article=$id_article_trad");
298                                             // maj article orig trad (si deja importe ds une session precedente)
299
300                                        }
301                                    }
302                                }
303
304                                // ----------
305                                // ... dans la table auteurs
306                                // ----------
307                                if ($_id_auteur) {
308
309                                    if ($version_flux <= "1.8") {
310                                            $auteurs = explode(", ", $_id_auteur);
311                                    }  else {
312                                            $auteurs = unserialize($_id_auteur);
313                                    }
314
315                                    foreach ($auteurs as $auteur) {
316                                        $id_auteur = spip2spip_get_id_auteur($auteur);
317                                        if ($id_auteur) {
318                                            @sql_insertq("spip_auteurs_liens", array('id_auteur' => $id_auteur, 'objet' => 'article', 'vu' => 'non', 'id_objet' => $id_nouvel_article));
319                                        }
320                                    }
321                                }
322
323                                // ----------
324                                // ... dans la table spip_documents_liens
325                                // ----------
326                                foreach ($documents_current_article as $document_current_article) {
327                                    @sql_insertq('spip_documents_liens', array('id_document' => $document_current_article, 'id_objet' => $id_nouvel_article, 'objet' => 'article'));
328                                }
329
330                                // ----------
331                                // ... si logo, tente de l'importer
332                                // ----------
333                                if ($_logo) {
334                                    $logo_local = _DIR_RACINE . copie_locale($_logo);
335                                    if ($logo_local) {
336                                        $logo_local_dest = _DIR_IMG . "arton$id_nouvel_article." . substr($logo_local, -3);
337                                        @rename($logo_local, $logo_local_dest);
338                                    }
339                                }
340
341                                // ----------
342                                // ... si logo de survol, tente de l'importer
343                                // ----------
344                                if ($_logosurvol) {
345                                    $logosurvol_local = _DIR_RACINE . copie_locale($_logosurvol);
346                                    if ($logosurvol_local) {
347                                        $logosurvol_local_dest = _DIR_IMG . "artoff$id_nouvel_article." . substr($logosurvol_local, -3);
348                                        @rename($logosurvol_local, $logosurvol_local_dest);
349                                    }
350                                }
351
352                                // -----------------------------------
353                                // etape 3 - traitement des mots de l'article
354                                // -----------------------------------
355                                $_mots = $article['mots'];
356                                if ($_mots != "" && $import_mot_article) {
357                                    $_mots = unserialize($_mots);
358                                    foreach ($_mots as $_mot) {
359                                        $groupe = stripslashes($_mot['groupe']);
360                                        $titre = stripslashes($_mot['titre']);
361                                        spip2spip_insert_mode_article($id_nouvel_article, $titre, $groupe, $import_mot_groupe_creer, $id_import_mot_groupe, "article");
362                                    }
363                                }
364
365                                // -----------------------------------
366                                // etape 4 - traitement des evenements
367                                // -----------------------------------
368                                $_evenements = $article['evenements'];
369                                if ($_evenements != "") {
370                                                                        $_evenements = preg_replace_callback('!s:(\d+):"(.*?)";!', 
371                                                                        function ($matches) {
372                                                                                return strtolower("'s:'.strlen($matches[1]).':\".$matches[1].\";'");
373                                                                                }
374                                                                                ,
375                                                                                $_evenements);
376                                    $_evenements = unserialize(base64_decode($_evenements));
377                                    foreach ($_evenements as $_evenement) {
378                                        $datedeb = $_evenement['datedeb'];
379                                        $datefin = $_evenement['datefin'];
380                                        $lieu = stripslashes($_evenement['lieu']);
381                                        $adresse = spip2spip_convert_extra(stripslashes($_evenement['adresse']), $documents_current_article, $version_flux);
382                                        $horaire = $_evenement['horaire'];
383                                        $titre = stripslashes($_evenement['titre']);
384                                        $statut = ($import_statut == "identique") ? $_evt_statut : $import_statut;
385                                        $desc = spip2spip_convert_extra(stripslashes($_evenement['desc']), $documents_current_article, $version_flux);
386                                        $motevts = $_evenement['motevts'];
387
388                                        $id_nouvel_evt = sql_insertq('spip_evenements', array(
389                                            'id_article' => $id_nouvel_article,
390                                            'date_debut' => $datedeb,
391                                            'date_fin' => $datefin,
392                                            'titre' => $titre,
393                                            'descriptif' => $desc,
394                                            'lieu' => $lieu,
395                                            'adresse' => $adresse,
396                                            'horaire' => $horaire,
397                                            'statut' => $statut,
398                                        ));
399                                        $log_html.= "<div class='event_ok'>" . _T('spip2spip:event_ok') . " : $datedeb  $lieu</div>";
400
401                                        // mot cle ?
402                                        if ($motevts != "" && $import_mot_evt) {
403                                            foreach ($motevts as $motevt) {
404                                                $groupe = stripslashes($motevt['groupe']);
405                                                $titre = stripslashes($motevt['titre']);
406                                                spip2spip_insert_mode_article($id_nouvel_evt, $titre, $groupe, $import_mot_groupe_creer, $id_import_mot_groupe, "evenement");
407                                            }
408                                        }
409
410                                        // #mot cle
411
412                                    }
413                                }
414                                 // Fin etape 4
415
416                                // ----------
417                                // .... dans le groupe mot "licence" ?
418                                // ----------
419                                if ($_licence != "" && isLicenceInstalled) {
420                                    $id_mot = spip2spip_get_id_mot($_licence);
421                                    if ($id_mot) {
422                                        @sql_insertq('spip_mots_articles', array('id_mot' => $id_mot, 'id_article' => $id_nouvel_article));
423                                    }
424                                }
425                            }
426                             // Fin du traitement de l'article vers sa rubrique cible.
427                            $log_html.= "</li>\n";
428                             // on n'oublie pas de fermer l'item de la liste
429
430                        }
431                         // On a traité l'article à importer.
432
433
434                    } else {
435
436                        // pas de link dans l'article du flux.
437
438                    }
439                }
440                 // Fin du traitement de chaque article.
441                // On ferme la liste.
442                $log_html.= "</ul>\n";
443            } else {
444
445                // On n'a pas d'article dans le flux.
446                $log_html.= "<div class='bloc_notice'>" . _T('spip2spip:aucun_article') . "</div>";
447            }
448        }
449         // fin du traitement du flux rss (else)
450
451
452    }
453     // #selection du site
454
455    // alerte email ?
456    if ($email_alerte && $log_email != "") {
457        $envoyer_mail = charger_fonction('envoyer_mail', 'inc');
458        $envoyer_mail($email_suivi, _T('spip2spip:titre_mail'), $log_email);
459    }
460
461    if ($mode == 'html') {
462        return $log_html;
463    }
464    return false;
465}
466
467// -----------------------
468// Fonctions Parsing
469// -----------------------
470
471//
472// verifie s'il s'agit du bon format de backend
473// a terme peut etre utile pour recuperer le numero de version
474function is_spip2spip_backend($str) {
475
476    // Chercher un numero de version
477    if (preg_match('/(spip2spip)[[:space:]](([^>]*[[:space:]])*)version[[:space:]]*=[[:space:]]*[\'"]([-_a-zA-Z0-9\.]+)[\'"]/', $str, $regs)) return true;
478    return false;
479}
480
481//
482// parse le backend xml spip2spip
483// basée sur la fonction originale: ecrire/inc/syndic.php -> analyser_backend()
484function analyser_backend_spip2spip($rss) {
485    include_spip("inc_texte.php"); // pour couper()
486    include_spip("inc_filtres.php"); // pour filtrer_entites()
487
488    $xml_tags = array('surtitre', 'titre', 'soustitre', 'descriptif', 'chapo', 'texte', 'ps', 'auteur', 'auteurs', 'link', 's2s_url_site_distant', 's2s_id_article_distant', 'trad', 'date', 'date_redac', 'date_modif', 'statut', 'nom_site', 'url_site', 'virtuel', 'evenements', 'lang', 'logo', 'logosurvol', 'keyword', 'mots', 'licence', 'documents');
489
490    $syndic_regexp = array(
491        'item' => ',<item[>[:space:]],i',
492        'itemfin' => '</item>',
493        'surtitre' => ',<surtitre[^>]*>(.*?)</surtitre[^>]*>,ims',
494        'statut' => ',<statut[^>]*>(.*?)</statut[^>]*>,ims',
495        'titre' => ',<titre[^>]*>(.*?)</titre[^>]*>,ims',
496        'soustitre' => ',<soustitre[^>]*>(.*?)</soustitre[^>]*>,ims',
497        'descriptif' => ',<descriptif[^>]*>(.*?)</descriptif[^>]*>,ims',
498        'chapo' => ',<chapo[^>]*>(.*?)</chapo[^>]*>,ims',
499        'texte' => ',<texte[^>]*>(.*?)</texte[^>]*>,ims',
500        'ps' => ',<ps[^>]*>(.*?)</ps[^>]*>,ims',
501        'auteur' => ',<auteur[^>]*>(.*?)</auteur[^>]*>,ims',        // spip2spip v1.8
502        'auteurs' => ',<auteurs[^>]*>(.*?)</auteurs[^>]*>,ims',     // spip2spip v1.9
503        'link' => ',<link[^>]*>(.*?)</link[^>]*>,ims',
504                's2s_url_site_distant' => ',<s2s_url_site_distant[^>]*>(.*?)</s2s_url_site_distant[^>]*>,ims',
505                's2s_id_article_distant' => ',<s2s_id_article_distant[^>]*>(.*?)</s2s_id_article_distant[^>]*>,ims',
506        'trad' => ',<trad[^>]*>(.*?)</trad[^>]*>,ims',
507        'date' => ',<date[^>]*>(.*?)</date[^>]*>,ims',
508        'date_redac' => ',<date_redac[^>]*>(.*?)</date_redac[^>]*>,ims',
509        'date_modif' => ',<date_modif[^>]*>(.*?)</date_modif[^>]*>,ims',
510        'virtuel' => ',<virtuel[^>]*>(.*?)</virtuel[^>]*>,ims',
511        'nom_site' => ',<nom_site[^>]*>(.*?)</nom_site[^>]*>,ims',
512        'url_site' => ',<url_site[^>]*>(.*?)</url_site[^>]*>,ims',
513        'evenements' => ',<evenements[^>]*>(.*?)</evenements[^>]*>,ims',
514        'lang' => ',<lang[^>]*>(.*?)</lang[^>]*>,ims',
515        'logo' => ',<logo[^>]*>(.*?)</logo[^>]*>,ims',
516        'logosurvol' => ',<logosurvol[^>]*>(.*?)</logosurvol[^>]*>,ims',
517        'keyword' => ',<keyword[^>]*>(.*?)</keyword[^>]*>,ims',
518        'mots' => ',<mots[^>]*>(.*?)</mots[^>]*>,ims',
519        'licence' => ',<licence[^>]*>(.*?)</licence[^>]*>,ims',
520        'documents' => ',<documents[^>]*>(.*?)</documents[^>]*>,ims',
521    );
522
523    // documents
524    $xml_doc_tags = array('id', 'url', 'titre', 'desc', 'credits');
525    $document_regexp = array(
526        'document' => ',<document[>[:space:]],i',
527        'documentfin' => '</document>',
528        'id' => ',<id[^>]*>(.*?)</id[^>]*>,ims',
529        'url' => ',<url[^>]*>(.*?)</url[^>]*>,ims',
530        'titre' => ',<titre[^>]*>(.*?)</titre[^>]*>,ims',
531        'desc' => ',<desc[^>]*>(.*?)</desc[^>]*>,ims',
532        'credits' => ',<credits[^>]*>(.*?)</credits[^>]*>,ims',
533    );
534
535    // mots
536    $xml_mot_tags = array('groupe', 'titre');
537    $mot_regexp = array(
538        'mot' => ',<mot[>[:space:]],i',
539        'motfin' => '</mot>',
540        'groupe' => ',<groupe[^>]*>(.*?)</groupe[^>]*>,ims',
541        'titre' => ',<titre[^>]*>(.*?)</titre[^>]*>,ims',
542    );
543
544    // auteurs
545    $xml_auteur_tags = array('auteur_item');
546    $auteur_regexp = array(
547        'auteur' => ',<auteur[>[:space:]],i',
548        'auteurfin' => '</auteur>',
549        'auteur_item' => ',<auteur[^>]*>(.*?)</auteur[^>]*>,ims',
550    );
551
552    // evenements
553    $xml_event_tags = array('datedeb', 'datefin', 'titre', 'statut', 'desc', 'lieu', 'adresse', 'horaire', 'motevts');
554
555    // on ne gere pas pour l'instant idevent/idsource qui permet de conserver la liaison des repetitions
556
557    $evenement_regexp = array(
558        'evenement' => ',<evenement[>[:space:]],i',
559        'evenementfin' => '</evenement>',
560        'datedeb' => ',<datedeb[^>]*>(.*?)</datedeb[^>]*>,ims',
561        'datefin' => ',<datefin[^>]*>(.*?)</datefin[^>]*>,ims',
562        'titre' => ',<titre[^>]*>(.*?)</titre[^>]*>,ims',
563        'statut' => ',<statut[^>]*>(.*?)</statut[^>]*>,ims',
564        'desc' => ',<desc[^>]*>(.*?)</desc[^>]*>,ims',
565        'lieu' => ',<lieu[^>]*>(.*?)</lieu[^>]*>,ims',
566        'adresse' => ',<adresse[^>]*>(.*?)</adresse[^>]*>,ims',
567        'horaire' => ',<horaire[^>]*>(.*?)</horaire[^>]*>,ims',
568        'motevts' => ',<motevts[^>]*>(.*?)</motevts[^>]*>,ims',
569    );
570
571    $xml_motevt_tags = array('groupe', 'titre');
572    $motevt_regexp = array(
573        'motevt' => ',<motevt[>[:space:]],i',
574        'motevtfin' => '</motevt>',
575        'groupe' => ',<groupe[^>]*>(.*?)</groupe[^>]*>,ims',
576        'titre' => ',<titre[^>]*>(.*?)</titre[^>]*>,ims',
577    );
578
579    // fichier backend correct ?
580    if (!is_spip2spip_backend($rss)) return _T('spip2spip:avis_echec_syndication_01');
581
582    // Echapper les CDATA
583    $echappe_cdata = array();
584    if (preg_match_all(',<!\[CDATA\[(.*)]]>,Uims', $rss, $regs, PREG_SET_ORDER)) {
585        foreach ($regs as $n => $reg) {
586            $echappe_cdata[$n] = $reg[1];
587            $rss = str_replace($reg[0], "@@@SPIP_CDATA$n@@@", $rss);
588        }
589    }
590
591    // supprimer les commentaires
592    $rss = preg_replace(',<!--\s+.*\s-->,Ums', '', $rss);
593
594    // multi (pas echappe)
595    $rss = str_replace("&lt;multi&gt;", "@@@MULTI@@@", $rss);
596    $rss = str_replace("&lt;/multi&gt;", "@@@MULTJ@@@", $rss);
597
598    // lien interne  <- (pas echappe)
599    $rss = str_replace("&lt;-", "@@@LIEN_INV@@@", $rss);
600
601    // version du flux
602    $version_flux = 0;
603    if (preg_match_all(',<spip2spip version="(.*?)">,Uims', $rss, $r, PREG_SET_ORDER)) foreach ($r as $regs) {
604        $version_flux = (float)$regs[1];
605    }
606    spip_log("version flux: $version_flux", "spiptospip");
607
608    // differences des traitements selon les versions du flux
609    if ($version_flux <= "1.8") {
610            $key = array_search('auteurs', $xml_tags);
611            unset($xml_tags[$key]);
612    } else {
613            $key = array_search('auteur', $xml_tags);
614            unset($xml_tags[$key]);
615    }
616
617    // analyse de chaque item
618    $items = array();
619    if (preg_match_all($syndic_regexp['item'], $rss, $r, PREG_SET_ORDER)) foreach ($r as $regs) {
620        $debut_item = strpos($rss, $regs[0]);
621        $fin_item = strpos($rss, $syndic_regexp['itemfin']) + strlen($syndic_regexp['itemfin']);
622        $items[] = substr($rss, $debut_item, $fin_item - $debut_item);
623        $debut_texte = substr($rss, "0", $debut_item);
624        $fin_texte = substr($rss, $fin_item, strlen($rss));
625        $rss = $debut_texte . $fin_texte;
626    }
627
628    // Analyser chaque <item>...</item> du backend et le transformer en tableau
629    if (!count($items)) return _T('spip2spip:avis_echec_syndication_01');
630
631    foreach ($items as $item) {
632
633        $data = array();
634
635        // Date
636        /* Pas trop compris cette partie, mais cela gènait l'import de la date de l'article (si cette methode est choisie). Je commente donc et présuppose que la date du RSS est bonne.
637        $la_date = "";
638        if (preg_match(",<date>([^<]*)</date>,Uims",$item,$match))      $la_date = $match[1];
639        if ($la_date)       $la_date = my_strtotime($la_date);
640        if ($la_date < time() - 365 * 24 * 3600 OR $la_date > time() + 48 * 3600)       $la_date = time();
641        $data['date'] = $la_date;
642        */
643
644        // version du flux
645        $data['version_flux'] = $version_flux;
646
647        // Recuperer les autres tags du xml
648        foreach ($xml_tags as $xml_tag) {
649            if (preg_match($syndic_regexp[$xml_tag], $item, $match))
650                    $data[$xml_tag] = $match[1];
651                else
652                    $data[$xml_tag] = "";
653        }
654
655        // On parse le noeud documents
656        if ($data['documents'] != "") {
657            $documents = array();
658            if (preg_match_all($document_regexp['document'], $data['documents'], $r2, PREG_SET_ORDER)) foreach ($r2 as $regs) {
659                $debut_item = strpos($data['documents'], $regs[0]);
660                $fin_item = strpos($data['documents'], $document_regexp['documentfin']) + strlen($document_regexp['documentfin']);
661                $documents[] = substr($data['documents'], $debut_item, $fin_item - $debut_item);
662                $debut_texte = substr($data['documents'], "0", $debut_item);
663                $fin_texte = substr($data['documents'], $fin_item, strlen($data['documents']));
664                $data['documents'] = $debut_texte . $fin_texte;
665            }
666
667            $portfolio = array();
668            if (count($documents)) {
669                foreach ($documents as $document) {
670                    $data_node = array();
671                    foreach ($xml_doc_tags as $xml_doc_tag) {
672                        if (preg_match($document_regexp[$xml_doc_tag], $document, $match)) $data_node[$xml_doc_tag] = $match[1];
673                        else $data_node[$xml_doc_tag] = "";
674                    }
675                    $portfolio[] = $data_node;
676                }
677                $data['documents'] = serialize($portfolio);
678            }
679        } // noeud documents
680
681        // On parse le noeud evenement
682        if ($data['evenements'] != "") {
683            $evenements = array();
684            if (preg_match_all($evenement_regexp['evenement'], $data['evenements'], $r3, PREG_SET_ORDER)) foreach ($r3 as $regs) {
685                $debut_item = strpos($data['evenements'], $regs[0]);
686                $fin_item = strpos($data['evenements'], $evenement_regexp['evenementfin']) + strlen($evenement_regexp['evenementfin']);
687                $evenements[] = substr($data['evenements'], $debut_item, $fin_item - $debut_item);
688                $debut_texte = substr($data['evenements'], "0", $debut_item);
689                $fin_texte = substr($data['evenements'], $fin_item, strlen($data['evenements']));
690                $data['evenements'] = $debut_texte . $fin_texte;
691            }
692
693            $agenda = array();
694            if (count($evenements)) {
695                foreach ($evenements as $evenement) {
696
697                    $data_node = array();
698                    foreach ($xml_event_tags as $xml_event_tag) {
699                        if (preg_match($evenement_regexp[$xml_event_tag], $evenement, $match)) $data_node[$xml_event_tag] = $match[1];
700                        else $data_node[$xml_event_tag] = "";
701                    }
702
703                    // bug lieu et desc  (suite au p)
704                    $data_node['lieu'] = strip_tags(html_entity_decode($data_node['lieu']));
705                    $data_node['desc'] = strip_tags(html_entity_decode($data_node['desc']));
706
707                    // On parse le noeud motevt (mot evenement) ?
708                    if ($data_node['motevts'] != "") {
709                        $motevts = array();
710                        if (preg_match_all($motevt_regexp['motevt'], $data_node['motevts'], $r2, PREG_SET_ORDER)) foreach ($r2 as $regs) {
711                            $debut_item = strpos($data_node['motevts'], $regs[0]);
712                            $fin_item = strpos($data_node['motevts'], $motevt_regexp['motevtfin']) + strlen($motevt_regexp['motevtfin']);
713                            $motevts[] = substr($data_node['motevts'], $debut_item, $fin_item - $debut_item);
714                            $debut_texte = substr($data_node['motevts'], "0", $debut_item);
715                            $fin_texte = substr($data_node['motevts'], $fin_item, strlen($data_node['motevts']));
716                            $data_node['motevts'] = $debut_texte . $fin_texte;
717                        }
718
719                        $motcleevt = array();
720                        if (count($motevts)) {
721                            foreach ($motevts as $motevt) {
722                                $data_node_evt = array();
723                                foreach ($xml_motevt_tags as $xml_motevt_tag) {
724                                    if (preg_match($motevt_regexp[$xml_motevt_tag], $motevt, $match)) $data_node_evt[$xml_motevt_tag] = $match[1];
725                                    else $data_node_evt[$xml_motevt_tag] = "";
726                                }
727                                $motcleevt[] = $data_node_evt;
728                            }
729                            $data_node['motevts'] = $motcleevt;
730                        }
731                    }
732
733                    // #noeud motevt
734
735                    $agenda[] = $data_node;
736                }
737
738                $data['evenements'] = base64_encode(serialize($agenda));
739                 // astuce php.net
740
741            }
742        } //noeud evenements
743
744        // On parse le noeud mots
745        if ($data['mots'] != "") {
746            $mots = array();
747            if (preg_match_all($mot_regexp['mot'], $data['mots'], $r2, PREG_SET_ORDER)) foreach ($r2 as $regs) {
748                $debut_item = strpos($data['mots'], $regs[0]);
749                $fin_item = strpos($data['mots'], $mot_regexp['motfin']) + strlen($mot_regexp['motfin']);
750                $mots[] = substr($data['mots'], $debut_item, $fin_item - $debut_item);
751                $debut_texte = substr($data['mots'], "0", $debut_item);
752                $fin_texte = substr($data['mots'], $fin_item, strlen($data['mots']));
753                $data['mots'] = $debut_texte . $fin_texte;
754            }
755
756            $motcle = array();
757            if (count($mots)) {
758                foreach ($mots as $mot) {
759                    $data_node = array();
760                    foreach ($xml_mot_tags as $xml_mot_tag) {
761                        if (preg_match($mot_regexp[$xml_mot_tag], $mot, $match)) $data_node[$xml_mot_tag] = $match[1];
762                        else $data_node[$xml_mot_tag] = "";
763                    }
764                    $motcle[] = $data_node;
765                }
766                $data['mots'] = serialize($motcle);
767            }
768        } // noeud mots
769
770        // On parse le noeud auteurs
771        if ($data['auteurs'] != "") {
772            $auteurs = array();
773            if (preg_match_all($auteur_regexp['auteur'], $data['auteurs'], $r2, PREG_SET_ORDER)) foreach ($r2 as $regs) {
774                $debut_item = strpos($data['auteurs'], $regs[0]);
775                $fin_item = strpos($data['auteurs'], $auteur_regexp['auteurfin']) + strlen($auteur_regexp['auteurfin']);
776                $auteurs[] = substr($data['auteurs'], $debut_item, $fin_item - $debut_item);
777                $debut_texte = substr($data['auteurs'], "0", $debut_item);
778                $fin_texte = substr($data['auteurs'], $fin_item, strlen($data['auteurs']));
779                $data['auteurs'] = $debut_texte . $fin_texte;
780            }
781
782            $auteurs_articles = array();
783            if (count($auteurs)) {
784                foreach ($auteurs as $auteur) {
785                    $data_node = array();
786                    foreach ($xml_auteur_tags as $xml_auteur_tag) {
787                        if (preg_match($auteur_regexp[$xml_auteur_tag], $auteur, $match)) $data_node[$xml_auteur_tag] = $match[1];
788                        else $data_node[$xml_auteur_tag] = "";
789                    }
790                    $auteurs_articles[] = $data_node;
791                }
792
793                $auteurs = array();
794                // on transforme en tableau simple
795                foreach($auteurs_articles as $auteurs_article)
796                        $auteurs[] = $auteurs_article['auteur_item'];
797
798                $data['auteur'] = serialize($auteurs);
799            }
800
801        }  // noeud auteurs
802
803        // Nettoyer les donnees et remettre les CDATA et multi en place
804        foreach ($data as $var => $val) {
805            $data[$var] = filtrer_entites($data[$var]);
806            foreach ($echappe_cdata as $n => $e) $data[$var] = str_replace("@@@SPIP_CDATA$n@@@", $e, $data[$var]);
807            if (!defined("_SPIP2SPIP_IMPORT_HTML")) $data[$var] = trim(textebrut($data[$var]));
808             // protection import HTML
809            $data[$var] = str_replace("@@@MULTI@@@", "<multi>", $data[$var]);
810            $data[$var] = str_replace("@@@MULTJ@@@", "</multi>", $data[$var]);
811            $data[$var] = str_replace("@@@LIEN_INV@@@", "<-", $data[$var]);
812        }
813
814        $articles[] = $data;
815    }
816
817    return $articles;
818}
819
820// -----------------------
821// Fonctions SQL
822// -----------------------
823
824//
825// recuperer id_rubrique (normalement uniquement) lié à un mot
826function spip2spip_get_id_rubrique($mot) {
827    $id_group_spip2spip = spip2spip_get_id_groupemot("- spip2spip -");
828    $result = sql_select("id_mot", "spip_mots", array("titre = " . sql_quote($mot), "id_groupe = '$id_group_spip2spip'"));
829    while ($row = sql_fetch($result)) {
830        $id_mot = (int)$row['id_mot'];
831        if ($row2 = sql_fetsel("id_objet", "spip_mots_liens", "objet='rubrique' AND id_mot='$id_mot'")) return $row2['id_objet'];
832    }
833    return false;
834}
835
836//
837// recupère id d'un groupe de mots-clés
838function spip2spip_get_id_groupemot($titre) {
839    if ($row = sql_fetsel("id_groupe", "spip_groupes_mots", "titre=" . sql_quote($titre))) return $row['id_groupe'];
840    return false;
841}
842
843//
844// recupère id d'un mot
845function spip2spip_get_id_mot($titre) {
846    if ($row = sql_fetsel("id_mot", "spip_mots", "titre=" . sql_quote($titre))) return $row['id_mot'];
847    return false;
848}
849
850//
851// recupère id du secteur
852function spip2spip_get_id_secteur($id_rubrique) {
853    if ($row = sql_fetsel("id_secteur", "spip_rubriques", "id_rubrique=$id_rubrique")) return $row['id_secteur'];
854    return 0;
855}
856
857//
858// recupere id d'un auteur selon son nom sinon le creer
859function spip2spip_get_id_auteur($name) {
860    if (trim($name) == "") return false;
861    if ($row = sql_fetsel("id_auteur", "spip_auteurs", "nom=" . sql_quote($name))) return $row['id_auteur'];
862
863    // auteur inconnu, on le cree ...
864    return sql_insertq('spip_auteurs', array('nom' => $name, 'statut' => '1comite'));
865}
866
867//
868// insert un mot-cle a un objet (article / evenement)
869function spip2spip_insert_mode_article($id_objet, $mot_titre, $groupe_titre, $mode_creer_groupe, $id_groupe = - 1, $objet_lie = "article") {
870
871    if ($mode_creer_groupe) {
872
873        // groupe existe ?
874        if ($row = sql_fetsel("id_groupe", "spip_groupes_mots", "titre=" . sql_quote($groupe_titre))) {
875            $id_groupe = $row['id_groupe'];
876        } else {
877            $id_groupe = sql_insertq('spip_groupes_mots', array('titre' => $groupe_titre, 'tables_liees' => $objet_lie . "s", 'minirezo' => 'oui', 'comite' => 'oui', 'forum' => 'non'));
878        }
879    }
880
881    if ($id_groupe > 0) {
882
883        // mot existe ?
884        if ($row = sql_fetsel("id_mot", "spip_mots", "titre=" . sql_quote($mot_titre) . " AND id_groupe=" . intval($id_groupe))) {
885            $id_mot = $row['id_mot'];
886        } else {
887            if ($row = sql_fetsel("titre", "spip_groupes_mots", "id_groupe=" . intval($id_groupe))) $type = $row['titre'];
888            $id_mot = sql_insertq('spip_mots', array('titre' => $mot_titre, 'id_groupe' => intval($id_groupe), 'type' => $type));
889        }
890
891        sql_insertq("spip_mots_liens", array('id_mot' => intval($id_mot), 'id_objet' => intval($id_objet), 'objet' => $objet_lie));
892    } else {
893        spip_log("pas de groupe-clé import specifie", "spiptospip");
894    }
895}
896
897// insérer nouvelle thématique du flux
898function spip2spip_set_thematique($titre) {
899    $id_group_spip2spip = spip2spip_get_id_groupemot("- spip2spip -");
900    $mot = sql_fetsel('id_mot', 'spip_mots', 'id_groupe=' . intval($id_group_spip2spip) . " AND titre=" . sql_quote($titre));
901    if (!$mot) {
902        $thematique_cree = sql_insertq('spip_mots', array('titre' => $titre, 'id_groupe' => $id_group_spip2spip));
903        return $thematique_cree;
904    } else {
905        return $mot['id_mot'];
906    }
907}
908
909// -----------------------
910// Fonctions de formatage
911// -----------------------
912
913//
914// restaure le formatage des extra
915function spip2spip_convert_extra($texte, $documents, $version_flux = 1.6) {
916    $texte = spip2spip_convert_ln($texte, $version_flux);
917    $texte = spip2spip_convert_img($texte, $documents);
918    return $texte;
919}
920
921//
922// restaure le formatage des img et doc avec le tableau fourni
923function spip2spip_convert_img($texte, $documents) {
924    $texte_avt_regex = $texte;
925    krsort($documents);
926    foreach ($documents as $k => $val) {
927        $texte = preg_replace("/__IMG$k(.*?)__/i", "<img$val$1>", $texte);
928
929        // si le doc est employe en tant image, changer son mode pour qu'il sorte du portfolio (mode=document) et passe en image (mode=image)
930        if ($texte_avt_regex != $texte) spip2spip_update_mode_document($val, 'image');
931
932        // autre mise a jour non image
933        $texte = preg_replace("/__DOC$k(.*?)__/i", "<doc$val$1>", $texte);
934
935        $texte_avt_regex = $texte;
936    }
937
938    //$texte = preg_replace("/__(IMG|DOC)(.*?)__/i", "",$texte); // nettoyage des codes qui resteraient eventuellement
939    $texte = preg_replace("/__(.*?)__/i", "", $texte);
940     // expression plus large (pour prevoir la compatabilite future si ajout d'autres extras)
941    return $texte;
942}
943
944//
945// restaure le formatage des ln
946function spip2spip_convert_ln($texte, $version_flux = 1.6) {
947    if ($version_flux < 1.7) {
948        $texte = str_replace("__LN__", "\n\n", $texte);
949    } else {
950        $texte = str_replace("__LN__", "\n", $texte);
951    }
952    return $texte;
953}
954
955//
956// change le mode (vignette/document/) du document
957function spip2spip_update_mode_document($id_document, $mode = "vignette") {
958    sql_updateq('spip_documents', array("mode" => $mode), "id_document=$id_document");
959}
Note: See TracBrowser for help on using the repository browser.