--- /dev/null
+<?php\r
+/**\r
+ * Plugin RSS article pour Spip 3.0\r
+ * Licence GPL\r
+ * \r
+ *\r
+ */\r
+\r
+// TODO\r
+// - gerer les mots-clés hors enclosure ?\r
+include_spip("inc/mail");\r
+include_spip('inc/filtres'); \r
+include_spip('inc/distant');\r
+include_spip('inc/chercher_logo');\r
+include_spip('inc/rubriques');\r
+include_spip('inc/config');\r
+\r
+function genie_rssarticle_copie_dist($t){ \r
+\r
+ // configuration (ou valeurs par defaut) \r
+ if (lire_config('rssarticle/import_statut')=="publie") $import_statut="publie"; else $import_statut="prop"; \r
+ if (lire_config('rssarticle/mode')=="auto") $mode_auto=true; else $mode_auto=false; \r
+ if (lire_config('rssarticle/email_alerte')=="on") $email_alerte=true; else $email_alerte=false;\r
+ if (lire_config('rssarticle/copie_logo')=="on") $copie_logo=true; else $copie_logo=false; \r
+ if (lire_config('rssarticle/html2spip')=="on") $html2spip=true; else $html2spip=false; \r
+ $email_suivi = lire_config('rssarticle/email_suivi'); \r
+ \r
+ // autres valeurs\r
+ $accepter_forum = substr($GLOBALS['meta']['forums_publics'],0,3);\r
+ \r
+ // principe de pile:\r
+ // on boucle sur les derniers articles syndiques pour les retirer ensuite\r
+ // bourrin voir les requetes avec jointure du Miroir ou du site Rezo \r
+ $log = "";\r
+ $log_c = 0;\r
+ \r
+ // boucle sur les sites publies \r
+ if ($mode_auto) $u = sql_select("id_syndic,id_rubrique,id_secteur","spip_syndic","statut='publie'"); // tous \r
+ else $u = sql_select("id_syndic,id_rubrique,id_secteur","spip_syndic","statut='publie' AND rssarticle='oui'");\r
+ \r
+ while ($b = sql_fetch($u)) {\r
+ $id_syndic = (int) $b['id_syndic'];\r
+ $id_rubrique = (int) $b['id_rubrique'];\r
+ $id_secteur = (int) $b['id_secteur'];\r
+ \r
+ // sur chaque site copie les derniers syndication\r
+ $s = sql_select("*", "spip_syndic_articles", "statut='publie' AND id_syndic='$id_syndic'","","maj DESC","10"); // par flot de 10 articles / site pour limiter la charge\r
+ while ($a = sql_fetch($s)) {\r
+ $titre = $a['titre'];\r
+ $url = $a['url'];\r
+ $id_syndic_article = $a['id_syndic_article']; \r
+ \r
+ // article avec mm titre existe ? (test doublons sur l'url plutot que sr le titre)\r
+ if (!$row = sql_fetsel("id_article","spip_articles","url_site=".sql_quote($url))) { \r
+ \r
+ $texte = $a['descriptif'];\r
+ //traitement pour syntaxe SPIP\r
+ if($html2spip)\r
+ $texte = html2spip($texte);\r
+ $lang = $a['lang'];\r
+ $url = $a['url'];\r
+ $tags = $a['tags'];\r
+ $lsDate = $a['date'];\r
+ \r
+ \r
+ if ($lang=="") \r
+ $lang = $GLOBALS['spip_lang']; \r
+ \r
+ // cas particulier: \r
+ // site multilingue avec la configuration: 1 lang par rubrique \r
+ // on force l'article a avoir la langue de la rubrique ds lequel il est importee(pour omaidi) \r
+ if ($GLOBALS['meta']['multi_rubriques']=='oui') {\r
+ $s_lang = sql_select("lang", "spip_rubriques", "id_rubrique=$id_rubrique");\r
+ while ($a_lang = sql_fetch($s_lang)) \r
+ $lang = $a_lang['lang']; \r
+ }\r
+ \r
+ //$lsDate = date('Y-m-d H:i:s'); \r
+ // creation de l'article\r
+ $id_article = sql_insertq( 'spip_articles', array(\r
+ 'titre'=>$titre, 'id_rubrique'=>$id_rubrique,\r
+ 'texte'=>$texte, 'statut'=>$import_statut, 'id_secteur'=>$id_secteur,\r
+ 'date'=> $lsDate, 'accepter_forum'=>$accepter_forum, 'lang'=>$lang, 'url_site'=>$url));\r
+ \r
+ // lier article et site\r
+ sql_insertq( 'spip_articles_syndic', array('id_article'=>$id_article, 'id_syndic'=>$id_syndic));\r
+ \r
+ // gestion auteur \r
+ $auteurs= explode(", ",$a['lesauteurs']); \r
+ foreach ($auteurs as $k => $auteur) { \r
+ if ($current_id_auteur = rssarticle_get_id_auteur($auteur))\r
+ sql_insertq( 'spip_auteurs_liens', array('id_auteur'=>$current_id_auteur, 'id_objet'=>$id_article, 'objet'=>'article')); \r
+ }\r
+ \r
+ // tags a convertir en documents distants \r
+ $doc_distants = extraire_enclosures($tags);\r
+ foreach ($doc_distants as $k=>$doc_distant) {\r
+ $infos = recuperer_infos_distantes($doc_distant);\r
+ if ($infos['extension']) {\r
+ $ext = $infos['extension'];\r
+ $taille = $infos['tailles']; \r
+ $row = sql_fetsel("inclus", "spip_types_documents", "extension=" . sql_quote($ext) . " AND upload='oui'"); // extension autorisee ?\r
+ if ($row) {\r
+ $id_document = sql_insertq( 'spip_documents', array(\r
+ 'extension'=>$ext, \r
+ 'date'=> $lsDate,\r
+ 'fichier'=> $doc_distant,\r
+ 'taille'=> $taille,\r
+ 'mode' => 'document',\r
+ 'distant' => 'oui'));\r
+ \r
+ sql_insertq( 'spip_documents_liens', array(\r
+ 'id_document' =>$id_document, \r
+ 'id_objet'=> $id_article,\r
+ 'objet'=> 'article',\r
+ 'vu'=> 'non')); \r
+ }\r
+ }\r
+ \r
+ }\r
+ \r
+ // logo\r
+ if ($copie_logo) { \r
+ if ($logo_site = inc_chercher_logo_dist($id_syndic,"id_syndic")) {\r
+ $logo_article = "arton$id_article.".$logo_site[3];\r
+ @copy($logo_site[0],_DIR_LOGOS."$logo_article");\r
+ } \r
+ }\r
+ \r
+ $log_c++;\r
+ $log .= "\n - $titre"; \r
+ \r
+ // on "depublie" l'article syndique qui vient d'etre copie\r
+ sql_update("spip_syndic_articles", array('statut' => '"refuse"'), "id_syndic_article=$id_syndic_article");\r
+\r
+ // Mise à jour des dates de rubriques après création d'un article dedans\r
+ if ($id_article) {\r
+ if (function_exists('calculer_rubriques'))\r
+ calculer_rubriques();\r
+ if (function_exists('calculer_langues_rubriques'))\r
+ calculer_langues_rubriques();\r
+ if (function_exists('propager_les_secteurs'))\r
+ propager_les_secteurs();\r
+ }\r
+ \r
+ } // test doublons\r
+ } \r
+ } // FIN PILE\r
+ \r
+ \r
+ // log et alerte email\r
+ $log .= "\n\n---------\nPlugin Copie RSS en Articles: $log_c articles copies\n";\r
+ spip_log($log);\r
+ $log .= $GLOBALS['meta']['adresse_site']."/ecrire/?exec=accueil";\r
+ \r
+ if ($email_alerte && $email_suivi !="" && $log_c > 0) \r
+ envoyer_mail($email_suivi,"Copie RSS en Articles", $log);\r
+ \r
+ // maintenance generale\r
+ // mode auto: on efface les syndic_articles de plus de 2 mois pour soulager le systeme (cf genie/syndic) \r
+ // attention: on efface sur l'ensemble des sites syndiques ss tenir compte de l'option \r
+ if ($mode_auto) sql_delete('spip_syndic_articles', "maj < DATE_SUB(NOW(), INTERVAL 2 MONTH) AND date < DATE_SUB(NOW(), INTERVAL 2 MONTH)");\r
+ \r
+ return 1;\r
+}\r
+\r
+\r
+//\r
+// recupere id d'un auteur selon son nom sinon le creer\r
+function rssarticle_get_id_auteur($nom) { \r
+ if (trim($nom)=="") \r
+ return false;\r
+ \r
+ if ($row = sql_fetsel(array("id_auteur"),"spip_auteurs","nom=".sql_quote($nom))) \r
+ return $row['id_auteur']; \r
+\r
+ // auteur inconnu, on le cree ... \r
+ return sql_insertq('spip_auteurs',array('nom'=>$nom,'statut'=>'1comite'));\r
+}\r
+\r
+//\r
+// extraire les documents taggues enclosure \r
+// voir http://doc.spip.org/@afficher_enclosures\r
+function extraire_enclosures($tags) {\r
+ $s = array();\r
+ foreach (extraire_balises($tags, 'a') as $tag) {\r
+ if (extraire_attribut($tag, 'rel') == 'enclosure'\r
+ AND $t = extraire_attribut($tag, 'href')) {\r
+ $s[] = $t;\r
+ }\r
+ }\r
+ return $s;\r
+}\r
+\r
+/**\r
+ * \r
+ * Nettoyer l'utf-8 et ses accents \r
+ *\r
+**/\r
+function clean_utf8($t) {\r
+ if (!preg_match('!\S!u', $t))\r
+ $t = preg_replace_callback(',&#x([0-9a-f]+);,i', 'utf8_do', utf8_encode(utf8_decode($t)));\r
+ return $t;\r
+}\r
+\r
+\r
+//passe le html en SPIP\r
+//repris de memo.php, merci\r
+\r
+function html2spip($lapage){\r
+ $lapage=clean_utf8($lapage);\r
+ \r
+ // remettre les double quotes casé par texte_backend\r
+ $lapage = str_replace('"','"',$lapage);\r
+ \r
+ // PRETRAITEMENTS\r
+ $lapage = str_replace("\n\r", "\r", $lapage); // echapper au greedyness de preg_replace\r
+ $lapage = str_replace("\n", "\r", $lapage);\r
+\r
+ // itals\r
+ $lapage = preg_replace(",<(i|em)( [^>\r]*)?".">(.+)</\\1>,Uims", "{\\3}", $lapage);\r
+ \r
+ // gras (pas de {{ pour eviter tout conflit avec {)\r
+ $lapage = preg_replace(",<(b|h[4-6])( [^>]*)?".">(.+)</\\1>,Uims", "@@b@@\\3@@/b@@", $lapage);\r
+ $lapage = preg_replace(",<strong( [^>]*)?".">(.+)</strong>,Uims", "@@b@@\\2@@/b@@", $lapage);\r
+ \r
+ // entites\r
+ include_spip('inc/charsets');\r
+ $lapage = html2unicode($lapage, true); //secure?\r
+ \r
+ // liens avec possibilités de non fermeture du tag\r
+ $lapage = preg_replace(",<a[ \t\n\r][^<>]*href=[^<>]*(http[^<>]*)[^<>]>(.*?)<,uims", "[\\2->\\1] <", $lapage);\r
+\r
+ // images (cf ressource)\r
+ $lapage = preg_replace(",<img[ \t\n\r][^<>]*src=[^<>]*(http[^<>'\"]*)[^<>]*>,uims","[img]\\1[//img]", $lapage);\r
+\r
+ \r
+ // intertitres\r
+ $lapage = preg_replace(",<(h[1-3])( [^>]*)?".">(.+)</\\1>,Uims", "\r{{{ \\3 }}}\r", $lapage);\r
+ // tableaux\r
+ $lapage = preg_replace(",<tr( [^>]*)?".">,Uims", "<br />\r", $lapage);\r
+ $lapage = preg_replace(",<t[hd]( [^>]*)?".">,Uims", " | ", $lapage);\r
+\r
+ // POST TRAITEMENT\r
+ $lapage = str_replace("\r", "\n", $lapage);\r
+\r
+ // SUPPRIME LES TAGS\r
+ if (eregi("<title.*>(.*)</title>", $lapage, $regs))\r
+ $titre = textebrut($regs[1]);\r
+ $lapage = textebrut($lapage);\r
+ \r
+ // Suite tableaux\r
+ $lapage = preg_replace(",\n[| ]+\n,", "", $lapage);\r
+ $lapage = preg_replace(",\n[|].+?[|].+?[|].+,", "\\0|\r", $lapage);\r
+ \r
+ // retablir les gras\r
+ $lapage = preg_replace(",@@b@@(.*)@@/b@@,Uims","{{\\1}}",$lapage);\r
+ \r
+ //retablir les images pour les lire avec le plugin ressource\r
+ $lapage = preg_replace('#\[img\](.*)\[\//img\]#Umis', "<$1>", $lapage);\r
+ \r
+ //nettoyer les "] qui dépassent parfois\r
+ $lapage = preg_replace(",\"\],uims", "]", $lapage);\r
+ \r
+ return $lapage;\r
+}\r
+\r
+?>
\ No newline at end of file