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

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

Compatibilité PHP7

File size: 45.6 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 = preg_replace('!s:(\d+):"(.*?)";!e', "'s:'.strlen('$2').':\"$2\";'", $_mots);
358                                    $_mots = unserialize($_mots);
359                                    foreach ($_mots as $_mot) {
360                                        $groupe = stripslashes($_mot['groupe']);
361                                        $titre = stripslashes($_mot['titre']);
362                                        spip2spip_insert_mode_article($id_nouvel_article, $titre, $groupe, $import_mot_groupe_creer, $id_import_mot_groupe, "article");
363                                    }
364                                }
365
366                                // -----------------------------------
367                                // etape 4 - traitement des evenements
368                                // -----------------------------------
369                                $_evenements = $article['evenements'];
370                                if ($_evenements != "") {
371                                    $_evenements = preg_replace('!s:(\d+):"(.*?)";!e', "'s:'.strlen('$2').':\"$2\";'", $_evenements);
372                                    $_evenements = unserialize(base64_decode($_evenements));
373                                    foreach ($_evenements as $_evenement) {
374                                        $datedeb = $_evenement['datedeb'];
375                                        $datefin = $_evenement['datefin'];
376                                        $lieu = stripslashes($_evenement['lieu']);
377                                        $adresse = spip2spip_convert_extra(stripslashes($_evenement['adresse']), $documents_current_article, $version_flux);
378                                        $horaire = $_evenement['horaire'];
379                                        $titre = stripslashes($_evenement['titre']);
380                                        $statut = ($import_statut == "identique") ? $_evt_statut : $import_statut;
381                                        $desc = spip2spip_convert_extra(stripslashes($_evenement['desc']), $documents_current_article, $version_flux);
382                                        $motevts = $_evenement['motevts'];
383
384                                        $id_nouvel_evt = sql_insertq('spip_evenements', array(
385                                            'id_article' => $id_nouvel_article,
386                                            'date_debut' => $datedeb,
387                                            'date_fin' => $datefin,
388                                            'titre' => $titre,
389                                            'descriptif' => $desc,
390                                            'lieu' => $lieu,
391                                            'adresse' => $adresse,
392                                            'horaire' => $horaire,
393                                            'statut' => $statut,
394                                        ));
395                                        $log_html.= "<div class='event_ok'>" . _T('spip2spip:event_ok') . " : $datedeb  $lieu</div>";
396
397                                        // mot cle ?
398                                        if ($motevts != "" && $import_mot_evt) {
399                                            foreach ($motevts as $motevt) {
400                                                $groupe = stripslashes($motevt['groupe']);
401                                                $titre = stripslashes($motevt['titre']);
402                                                spip2spip_insert_mode_article($id_nouvel_evt, $titre, $groupe, $import_mot_groupe_creer, $id_import_mot_groupe, "evenement");
403                                            }
404                                        }
405
406                                        // #mot cle
407
408                                    }
409                                }
410                                 // Fin etape 4
411
412                                // ----------
413                                // .... dans le groupe mot "licence" ?
414                                // ----------
415                                if ($_licence != "" && isLicenceInstalled) {
416                                    $id_mot = spip2spip_get_id_mot($_licence);
417                                    if ($id_mot) {
418                                        @sql_insertq('spip_mots_articles', array('id_mot' => $id_mot, 'id_article' => $id_nouvel_article));
419                                    }
420                                }
421                            }
422                             // Fin du traitement de l'article vers sa rubrique cible.
423                            $log_html.= "</li>\n";
424                             // on n'oublie pas de fermer l'item de la liste
425
426                        }
427                         // On a traité l'article à importer.
428
429
430                    } else {
431
432                        // pas de link dans l'article du flux.
433
434                    }
435                }
436                 // Fin du traitement de chaque article.
437                // On ferme la liste.
438                $log_html.= "</ul>\n";
439            } else {
440
441                // On n'a pas d'article dans le flux.
442                $log_html.= "<div class='bloc_notice'>" . _T('spip2spip:aucun_article') . "</div>";
443            }
444        }
445         // fin du traitement du flux rss (else)
446
447
448    }
449     // #selection du site
450
451    // alerte email ?
452    if ($email_alerte && $log_email != "") {
453        $envoyer_mail = charger_fonction('envoyer_mail', 'inc');
454        $envoyer_mail($email_suivi, _T('spip2spip:titre_mail'), $log_email);
455    }
456
457    if ($mode == 'html') {
458        return $log_html;
459    }
460    return false;
461}
462
463// -----------------------
464// Fonctions Parsing
465// -----------------------
466
467//
468// verifie s'il s'agit du bon format de backend
469// a terme peut etre utile pour recuperer le numero de version
470function is_spip2spip_backend($str) {
471
472    // Chercher un numero de version
473    if (preg_match('/(spip2spip)[[:space:]](([^>]*[[:space:]])*)version[[:space:]]*=[[:space:]]*[\'"]([-_a-zA-Z0-9\.]+)[\'"]/', $str, $regs)) return true;
474    return false;
475}
476
477//
478// parse le backend xml spip2spip
479// basée sur la fonction originale: ecrire/inc/syndic.php -> analyser_backend()
480function analyser_backend_spip2spip($rss) {
481    include_spip("inc_texte.php"); // pour couper()
482    include_spip("inc_filtres.php"); // pour filtrer_entites()
483
484    $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');
485
486    $syndic_regexp = array(
487        'item' => ',<item[>[:space:]],i',
488        'itemfin' => '</item>',
489        'surtitre' => ',<surtitre[^>]*>(.*?)</surtitre[^>]*>,ims',
490        'statut' => ',<statut[^>]*>(.*?)</statut[^>]*>,ims',
491        'titre' => ',<titre[^>]*>(.*?)</titre[^>]*>,ims',
492        'soustitre' => ',<soustitre[^>]*>(.*?)</soustitre[^>]*>,ims',
493        'descriptif' => ',<descriptif[^>]*>(.*?)</descriptif[^>]*>,ims',
494        'chapo' => ',<chapo[^>]*>(.*?)</chapo[^>]*>,ims',
495        'texte' => ',<texte[^>]*>(.*?)</texte[^>]*>,ims',
496        'ps' => ',<ps[^>]*>(.*?)</ps[^>]*>,ims',
497        'auteur' => ',<auteur[^>]*>(.*?)</auteur[^>]*>,ims',        // spip2spip v1.8
498        'auteurs' => ',<auteurs[^>]*>(.*?)</auteurs[^>]*>,ims',     // spip2spip v1.9
499        'link' => ',<link[^>]*>(.*?)</link[^>]*>,ims',
500                's2s_url_site_distant' => ',<s2s_url_site_distant[^>]*>(.*?)</s2s_url_site_distant[^>]*>,ims',
501                's2s_id_article_distant' => ',<s2s_id_article_distant[^>]*>(.*?)</s2s_id_article_distant[^>]*>,ims',
502        'trad' => ',<trad[^>]*>(.*?)</trad[^>]*>,ims',
503        'date' => ',<date[^>]*>(.*?)</date[^>]*>,ims',
504        'date_redac' => ',<date_redac[^>]*>(.*?)</date_redac[^>]*>,ims',
505        'date_modif' => ',<date_modif[^>]*>(.*?)</date_modif[^>]*>,ims',
506        'virtuel' => ',<virtuel[^>]*>(.*?)</virtuel[^>]*>,ims',
507        'nom_site' => ',<nom_site[^>]*>(.*?)</nom_site[^>]*>,ims',
508        'url_site' => ',<url_site[^>]*>(.*?)</url_site[^>]*>,ims',
509        'evenements' => ',<evenements[^>]*>(.*?)</evenements[^>]*>,ims',
510        'lang' => ',<lang[^>]*>(.*?)</lang[^>]*>,ims',
511        'logo' => ',<logo[^>]*>(.*?)</logo[^>]*>,ims',
512        'logosurvol' => ',<logosurvol[^>]*>(.*?)</logosurvol[^>]*>,ims',
513        'keyword' => ',<keyword[^>]*>(.*?)</keyword[^>]*>,ims',
514        'mots' => ',<mots[^>]*>(.*?)</mots[^>]*>,ims',
515        'licence' => ',<licence[^>]*>(.*?)</licence[^>]*>,ims',
516        'documents' => ',<documents[^>]*>(.*?)</documents[^>]*>,ims',
517    );
518
519    // documents
520    $xml_doc_tags = array('id', 'url', 'titre', 'desc', 'credits');
521    $document_regexp = array(
522        'document' => ',<document[>[:space:]],i',
523        'documentfin' => '</document>',
524        'id' => ',<id[^>]*>(.*?)</id[^>]*>,ims',
525        'url' => ',<url[^>]*>(.*?)</url[^>]*>,ims',
526        'titre' => ',<titre[^>]*>(.*?)</titre[^>]*>,ims',
527        'desc' => ',<desc[^>]*>(.*?)</desc[^>]*>,ims',
528        'credits' => ',<credits[^>]*>(.*?)</credits[^>]*>,ims',
529    );
530
531    // mots
532    $xml_mot_tags = array('groupe', 'titre');
533    $mot_regexp = array(
534        'mot' => ',<mot[>[:space:]],i',
535        'motfin' => '</mot>',
536        'groupe' => ',<groupe[^>]*>(.*?)</groupe[^>]*>,ims',
537        'titre' => ',<titre[^>]*>(.*?)</titre[^>]*>,ims',
538    );
539
540    // auteurs
541    $xml_auteur_tags = array('auteur_item');
542    $auteur_regexp = array(
543        'auteur' => ',<auteur[>[:space:]],i',
544        'auteurfin' => '</auteur>',
545        'auteur_item' => ',<auteur[^>]*>(.*?)</auteur[^>]*>,ims',
546    );
547
548    // evenements
549    $xml_event_tags = array('datedeb', 'datefin', 'titre', 'statut', 'desc', 'lieu', 'adresse', 'horaire', 'motevts');
550
551    // on ne gere pas pour l'instant idevent/idsource qui permet de conserver la liaison des repetitions
552
553    $evenement_regexp = array(
554        'evenement' => ',<evenement[>[:space:]],i',
555        'evenementfin' => '</evenement>',
556        'datedeb' => ',<datedeb[^>]*>(.*?)</datedeb[^>]*>,ims',
557        'datefin' => ',<datefin[^>]*>(.*?)</datefin[^>]*>,ims',
558        'titre' => ',<titre[^>]*>(.*?)</titre[^>]*>,ims',
559        'statut' => ',<statut[^>]*>(.*?)</statut[^>]*>,ims',
560        'desc' => ',<desc[^>]*>(.*?)</desc[^>]*>,ims',
561        'lieu' => ',<lieu[^>]*>(.*?)</lieu[^>]*>,ims',
562        'adresse' => ',<adresse[^>]*>(.*?)</adresse[^>]*>,ims',
563        'horaire' => ',<horaire[^>]*>(.*?)</horaire[^>]*>,ims',
564        'motevts' => ',<motevts[^>]*>(.*?)</motevts[^>]*>,ims',
565    );
566
567    $xml_motevt_tags = array('groupe', 'titre');
568    $motevt_regexp = array(
569        'motevt' => ',<motevt[>[:space:]],i',
570        'motevtfin' => '</motevt>',
571        'groupe' => ',<groupe[^>]*>(.*?)</groupe[^>]*>,ims',
572        'titre' => ',<titre[^>]*>(.*?)</titre[^>]*>,ims',
573    );
574
575    // fichier backend correct ?
576    if (!is_spip2spip_backend($rss)) return _T('spip2spip:avis_echec_syndication_01');
577
578    // Echapper les CDATA
579    $echappe_cdata = array();
580    if (preg_match_all(',<!\[CDATA\[(.*)]]>,Uims', $rss, $regs, PREG_SET_ORDER)) {
581        foreach ($regs as $n => $reg) {
582            $echappe_cdata[$n] = $reg[1];
583            $rss = str_replace($reg[0], "@@@SPIP_CDATA$n@@@", $rss);
584        }
585    }
586
587    // supprimer les commentaires
588    $rss = preg_replace(',<!--\s+.*\s-->,Ums', '', $rss);
589
590    // multi (pas echappe)
591    $rss = str_replace("&lt;multi&gt;", "@@@MULTI@@@", $rss);
592    $rss = str_replace("&lt;/multi&gt;", "@@@MULTJ@@@", $rss);
593
594    // lien interne  <- (pas echappe)
595    $rss = str_replace("&lt;-", "@@@LIEN_INV@@@", $rss);
596
597    // version du flux
598    $version_flux = 0;
599    if (preg_match_all(',<spip2spip version="(.*?)">,Uims', $rss, $r, PREG_SET_ORDER)) foreach ($r as $regs) {
600        $version_flux = (float)$regs[1];
601    }
602    spip_log("version flux: $version_flux", "spiptospip");
603
604    // differences des traitements selon les versions du flux
605    if ($version_flux <= "1.8") {
606            $key = array_search('auteurs', $xml_tags);
607            unset($xml_tags[$key]);
608    } else {
609            $key = array_search('auteur', $xml_tags);
610            unset($xml_tags[$key]);
611    }
612
613    // analyse de chaque item
614    $items = array();
615    if (preg_match_all($syndic_regexp['item'], $rss, $r, PREG_SET_ORDER)) foreach ($r as $regs) {
616        $debut_item = strpos($rss, $regs[0]);
617        $fin_item = strpos($rss, $syndic_regexp['itemfin']) + strlen($syndic_regexp['itemfin']);
618        $items[] = substr($rss, $debut_item, $fin_item - $debut_item);
619        $debut_texte = substr($rss, "0", $debut_item);
620        $fin_texte = substr($rss, $fin_item, strlen($rss));
621        $rss = $debut_texte . $fin_texte;
622    }
623
624    // Analyser chaque <item>...</item> du backend et le transformer en tableau
625    if (!count($items)) return _T('spip2spip:avis_echec_syndication_01');
626
627    foreach ($items as $item) {
628
629        $data = array();
630
631        // Date
632        /* 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.
633        $la_date = "";
634        if (preg_match(",<date>([^<]*)</date>,Uims",$item,$match))      $la_date = $match[1];
635        if ($la_date)       $la_date = my_strtotime($la_date);
636        if ($la_date < time() - 365 * 24 * 3600 OR $la_date > time() + 48 * 3600)       $la_date = time();
637        $data['date'] = $la_date;
638        */
639
640        // version du flux
641        $data['version_flux'] = $version_flux;
642
643        // Recuperer les autres tags du xml
644        foreach ($xml_tags as $xml_tag) {
645            if (preg_match($syndic_regexp[$xml_tag], $item, $match))
646                    $data[$xml_tag] = $match[1];
647                else
648                    $data[$xml_tag] = "";
649        }
650
651        // On parse le noeud documents
652        if ($data['documents'] != "") {
653            $documents = array();
654            if (preg_match_all($document_regexp['document'], $data['documents'], $r2, PREG_SET_ORDER)) foreach ($r2 as $regs) {
655                $debut_item = strpos($data['documents'], $regs[0]);
656                $fin_item = strpos($data['documents'], $document_regexp['documentfin']) + strlen($document_regexp['documentfin']);
657                $documents[] = substr($data['documents'], $debut_item, $fin_item - $debut_item);
658                $debut_texte = substr($data['documents'], "0", $debut_item);
659                $fin_texte = substr($data['documents'], $fin_item, strlen($data['documents']));
660                $data['documents'] = $debut_texte . $fin_texte;
661            }
662
663            $portfolio = array();
664            if (count($documents)) {
665                foreach ($documents as $document) {
666                    $data_node = array();
667                    foreach ($xml_doc_tags as $xml_doc_tag) {
668                        if (preg_match($document_regexp[$xml_doc_tag], $document, $match)) $data_node[$xml_doc_tag] = $match[1];
669                        else $data_node[$xml_doc_tag] = "";
670                    }
671                    $portfolio[] = $data_node;
672                }
673                $data['documents'] = serialize($portfolio);
674            }
675        } // noeud documents
676
677        // On parse le noeud evenement
678        if ($data['evenements'] != "") {
679            $evenements = array();
680            if (preg_match_all($evenement_regexp['evenement'], $data['evenements'], $r3, PREG_SET_ORDER)) foreach ($r3 as $regs) {
681                $debut_item = strpos($data['evenements'], $regs[0]);
682                $fin_item = strpos($data['evenements'], $evenement_regexp['evenementfin']) + strlen($evenement_regexp['evenementfin']);
683                $evenements[] = substr($data['evenements'], $debut_item, $fin_item - $debut_item);
684                $debut_texte = substr($data['evenements'], "0", $debut_item);
685                $fin_texte = substr($data['evenements'], $fin_item, strlen($data['evenements']));
686                $data['evenements'] = $debut_texte . $fin_texte;
687            }
688
689            $agenda = array();
690            if (count($evenements)) {
691                foreach ($evenements as $evenement) {
692
693                    $data_node = array();
694                    foreach ($xml_event_tags as $xml_event_tag) {
695                        if (preg_match($evenement_regexp[$xml_event_tag], $evenement, $match)) $data_node[$xml_event_tag] = $match[1];
696                        else $data_node[$xml_event_tag] = "";
697                    }
698
699                    // bug lieu et desc  (suite au p)
700                    $data_node['lieu'] = strip_tags(html_entity_decode($data_node['lieu']));
701                    $data_node['desc'] = strip_tags(html_entity_decode($data_node['desc']));
702
703                    // On parse le noeud motevt (mot evenement) ?
704                    if ($data_node['motevts'] != "") {
705                        $motevts = array();
706                        if (preg_match_all($motevt_regexp['motevt'], $data_node['motevts'], $r2, PREG_SET_ORDER)) foreach ($r2 as $regs) {
707                            $debut_item = strpos($data_node['motevts'], $regs[0]);
708                            $fin_item = strpos($data_node['motevts'], $motevt_regexp['motevtfin']) + strlen($motevt_regexp['motevtfin']);
709                            $motevts[] = substr($data_node['motevts'], $debut_item, $fin_item - $debut_item);
710                            $debut_texte = substr($data_node['motevts'], "0", $debut_item);
711                            $fin_texte = substr($data_node['motevts'], $fin_item, strlen($data_node['motevts']));
712                            $data_node['motevts'] = $debut_texte . $fin_texte;
713                        }
714
715                        $motcleevt = array();
716                        if (count($motevts)) {
717                            foreach ($motevts as $motevt) {
718                                $data_node_evt = array();
719                                foreach ($xml_motevt_tags as $xml_motevt_tag) {
720                                    if (preg_match($motevt_regexp[$xml_motevt_tag], $motevt, $match)) $data_node_evt[$xml_motevt_tag] = $match[1];
721                                    else $data_node_evt[$xml_motevt_tag] = "";
722                                }
723                                $motcleevt[] = $data_node_evt;
724                            }
725                            $data_node['motevts'] = $motcleevt;
726                        }
727                    }
728
729                    // #noeud motevt
730
731                    $agenda[] = $data_node;
732                }
733
734                $data['evenements'] = base64_encode(serialize($agenda));
735                 // astuce php.net
736
737            }
738        } //noeud evenements
739
740        // On parse le noeud mots
741        if ($data['mots'] != "") {
742            $mots = array();
743            if (preg_match_all($mot_regexp['mot'], $data['mots'], $r2, PREG_SET_ORDER)) foreach ($r2 as $regs) {
744                $debut_item = strpos($data['mots'], $regs[0]);
745                $fin_item = strpos($data['mots'], $mot_regexp['motfin']) + strlen($mot_regexp['motfin']);
746                $mots[] = substr($data['mots'], $debut_item, $fin_item - $debut_item);
747                $debut_texte = substr($data['mots'], "0", $debut_item);
748                $fin_texte = substr($data['mots'], $fin_item, strlen($data['mots']));
749                $data['mots'] = $debut_texte . $fin_texte;
750            }
751
752            $motcle = array();
753            if (count($mots)) {
754                foreach ($mots as $mot) {
755                    $data_node = array();
756                    foreach ($xml_mot_tags as $xml_mot_tag) {
757                        if (preg_match($mot_regexp[$xml_mot_tag], $mot, $match)) $data_node[$xml_mot_tag] = $match[1];
758                        else $data_node[$xml_mot_tag] = "";
759                    }
760                    $motcle[] = $data_node;
761                }
762                $data['mots'] = serialize($motcle);
763            }
764        } // noeud mots
765
766        // On parse le noeud auteurs
767        if ($data['auteurs'] != "") {
768            $auteurs = array();
769            if (preg_match_all($auteur_regexp['auteur'], $data['auteurs'], $r2, PREG_SET_ORDER)) foreach ($r2 as $regs) {
770                $debut_item = strpos($data['auteurs'], $regs[0]);
771                $fin_item = strpos($data['auteurs'], $auteur_regexp['auteurfin']) + strlen($auteur_regexp['auteurfin']);
772                $auteurs[] = substr($data['auteurs'], $debut_item, $fin_item - $debut_item);
773                $debut_texte = substr($data['auteurs'], "0", $debut_item);
774                $fin_texte = substr($data['auteurs'], $fin_item, strlen($data['auteurs']));
775                $data['auteurs'] = $debut_texte . $fin_texte;
776            }
777
778            $auteurs_articles = array();
779            if (count($auteurs)) {
780                foreach ($auteurs as $auteur) {
781                    $data_node = array();
782                    foreach ($xml_auteur_tags as $xml_auteur_tag) {
783                        if (preg_match($auteur_regexp[$xml_auteur_tag], $auteur, $match)) $data_node[$xml_auteur_tag] = $match[1];
784                        else $data_node[$xml_auteur_tag] = "";
785                    }
786                    $auteurs_articles[] = $data_node;
787                }
788
789                $auteurs = array();
790                // on transforme en tableau simple
791                foreach($auteurs_articles as $auteurs_article)
792                        $auteurs[] = $auteurs_article['auteur_item'];
793
794                $data['auteur'] = serialize($auteurs);
795            }
796
797        }  // noeud auteurs
798
799        // Nettoyer les donnees et remettre les CDATA et multi en place
800        foreach ($data as $var => $val) {
801            $data[$var] = filtrer_entites($data[$var]);
802            foreach ($echappe_cdata as $n => $e) $data[$var] = str_replace("@@@SPIP_CDATA$n@@@", $e, $data[$var]);
803            if (!defined("_SPIP2SPIP_IMPORT_HTML")) $data[$var] = trim(textebrut($data[$var]));
804             // protection import HTML
805            $data[$var] = str_replace("@@@MULTI@@@", "<multi>", $data[$var]);
806            $data[$var] = str_replace("@@@MULTJ@@@", "</multi>", $data[$var]);
807            $data[$var] = str_replace("@@@LIEN_INV@@@", "<-", $data[$var]);
808        }
809
810        $articles[] = $data;
811    }
812
813    return $articles;
814}
815
816// -----------------------
817// Fonctions SQL
818// -----------------------
819
820//
821// recuperer id_rubrique (normalement uniquement) lié à un mot
822function spip2spip_get_id_rubrique($mot) {
823    $id_group_spip2spip = spip2spip_get_id_groupemot("- spip2spip -");
824    $result = sql_select("id_mot", "spip_mots", array("titre = " . sql_quote($mot), "id_groupe = '$id_group_spip2spip'"));
825    while ($row = sql_fetch($result)) {
826        $id_mot = (int)$row['id_mot'];
827        if ($row2 = sql_fetsel("id_objet", "spip_mots_liens", "objet='rubrique' AND id_mot='$id_mot'")) return $row2['id_objet'];
828    }
829    return false;
830}
831
832//
833// recupère id d'un groupe de mots-clés
834function spip2spip_get_id_groupemot($titre) {
835    if ($row = sql_fetsel("id_groupe", "spip_groupes_mots", "titre=" . sql_quote($titre))) return $row['id_groupe'];
836    return false;
837}
838
839//
840// recupère id d'un mot
841function spip2spip_get_id_mot($titre) {
842    if ($row = sql_fetsel("id_mot", "spip_mots", "titre=" . sql_quote($titre))) return $row['id_mot'];
843    return false;
844}
845
846//
847// recupère id du secteur
848function spip2spip_get_id_secteur($id_rubrique) {
849    if ($row = sql_fetsel("id_secteur", "spip_rubriques", "id_rubrique=$id_rubrique")) return $row['id_secteur'];
850    return 0;
851}
852
853//
854// recupere id d'un auteur selon son nom sinon le creer
855function spip2spip_get_id_auteur($name) {
856    if (trim($name) == "") return false;
857    if ($row = sql_fetsel("id_auteur", "spip_auteurs", "nom=" . sql_quote($name))) return $row['id_auteur'];
858
859    // auteur inconnu, on le cree ...
860    return sql_insertq('spip_auteurs', array('nom' => $name, 'statut' => '1comite'));
861}
862
863//
864// insert un mot-cle a un objet (article / evenement)
865function spip2spip_insert_mode_article($id_objet, $mot_titre, $groupe_titre, $mode_creer_groupe, $id_groupe = - 1, $objet_lie = "article") {
866
867    if ($mode_creer_groupe) {
868
869        // groupe existe ?
870        if ($row = sql_fetsel("id_groupe", "spip_groupes_mots", "titre=" . sql_quote($groupe_titre))) {
871            $id_groupe = $row['id_groupe'];
872        } else {
873            $id_groupe = sql_insertq('spip_groupes_mots', array('titre' => $groupe_titre, 'tables_liees' => $objet_lie . "s", 'minirezo' => 'oui', 'comite' => 'oui', 'forum' => 'non'));
874        }
875    }
876
877    if ($id_groupe > 0) {
878
879        // mot existe ?
880        if ($row = sql_fetsel("id_mot", "spip_mots", "titre=" . sql_quote($mot_titre) . " AND id_groupe=" . intval($id_groupe))) {
881            $id_mot = $row['id_mot'];
882        } else {
883            if ($row = sql_fetsel("titre", "spip_groupes_mots", "id_groupe=" . intval($id_groupe))) $type = $row['titre'];
884            $id_mot = sql_insertq('spip_mots', array('titre' => $mot_titre, 'id_groupe' => intval($id_groupe), 'type' => $type));
885        }
886
887        sql_insertq("spip_mots_liens", array('id_mot' => intval($id_mot), 'id_objet' => intval($id_objet), 'objet' => $objet_lie));
888    } else {
889        spip_log("pas de groupe-clé import specifie", "spiptospip");
890    }
891}
892
893// insérer nouvelle thématique du flux
894function spip2spip_set_thematique($titre) {
895    $id_group_spip2spip = spip2spip_get_id_groupemot("- spip2spip -");
896    $mot = sql_fetsel('id_mot', 'spip_mots', 'id_groupe=' . intval($id_group_spip2spip) . " AND titre=" . sql_quote($titre));
897    if (!$mot) {
898        $thematique_cree = sql_insertq('spip_mots', array('titre' => $titre, 'id_groupe' => $id_group_spip2spip));
899        return $thematique_cree;
900    } else {
901        return $mot['id_mot'];
902    }
903}
904
905// -----------------------
906// Fonctions de formatage
907// -----------------------
908
909//
910// restaure le formatage des extra
911function spip2spip_convert_extra($texte, $documents, $version_flux = 1.6) {
912    $texte = spip2spip_convert_ln($texte, $version_flux);
913    $texte = spip2spip_convert_img($texte, $documents);
914    return $texte;
915}
916
917//
918// restaure le formatage des img et doc avec le tableau fourni
919function spip2spip_convert_img($texte, $documents) {
920    $texte_avt_regex = $texte;
921    krsort($documents);
922    foreach ($documents as $k => $val) {
923        $texte = preg_replace("/__IMG$k(.*?)__/i", "<img$val$1>", $texte);
924
925        // 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)
926        if ($texte_avt_regex != $texte) spip2spip_update_mode_document($val, 'image');
927
928        // autre mise a jour non image
929        $texte = preg_replace("/__DOC$k(.*?)__/i", "<doc$val$1>", $texte);
930
931        $texte_avt_regex = $texte;
932    }
933
934    //$texte = preg_replace("/__(IMG|DOC)(.*?)__/i", "",$texte); // nettoyage des codes qui resteraient eventuellement
935    $texte = preg_replace("/__(.*?)__/i", "", $texte);
936     // expression plus large (pour prevoir la compatabilite future si ajout d'autres extras)
937    return $texte;
938}
939
940//
941// restaure le formatage des ln
942function spip2spip_convert_ln($texte, $version_flux = 1.6) {
943    if ($version_flux < 1.7) {
944        $texte = str_replace("__LN__", "\n\n", $texte);
945    } else {
946        $texte = str_replace("__LN__", "\n", $texte);
947    }
948    return $texte;
949}
950
951//
952// change le mode (vignette/document/) du document
953function spip2spip_update_mode_document($id_document, $mode = "vignette") {
954    sql_updateq('spip_documents', array("mode" => $mode), "id_document=$id_document");
955}
Note: See TracBrowser for help on using the repository browser.