5d99066149a5437d119b359210cb31cad1b9808d
[lhc/web/www.git] / www / plugins / rss_article_3_0 / genie / rssarticle_copie.php
1 <?php
2 /**
3 * Plugin RSS article pour Spip 3.0
4 * Licence GPL
5 *
6 *
7 */
8 if (!defined('_ECRIRE_INC_VERSION')) {
9 return;
10 }
11
12 // TODO
13 // - gerer les mots-clés hors enclosure ?
14 include_spip("inc/mail");
15 include_spip('inc/filtres');
16 include_spip('inc/distant');
17 include_spip('inc/chercher_logo');
18 include_spip('inc/rubriques');
19 include_spip('inc/config');
20
21 function genie_rssarticle_copie_dist($t){
22
23 // configuration (ou valeurs par defaut)
24 if (lire_config('rssarticle/import_statut')=="publie")
25 $import_statut="publie";
26 else
27 $import_statut="prop";
28 if (lire_config('rssarticle/mode')=="auto")
29 $mode_auto=true;
30 else
31 $mode_auto=false;
32 if (lire_config('rssarticle/email_alerte')=="on")
33 $email_alerte=true;
34 else
35 $email_alerte=false;
36 if (lire_config('rssarticle/copie_logo')=="on")
37 $copie_logo=true;
38 else
39 $copie_logo=false;
40 if (lire_config('rssarticle/html2spip')=="on")
41 $html2spip=true;
42 else
43 $html2spip=false;
44 $email_suivi = lire_config('rssarticle/email_suivi');
45
46 // autres valeurs
47 $accepter_forum = substr($GLOBALS['meta']['forums_publics'],0,3);
48
49 // principe de pile:
50 // on boucle sur les derniers articles syndiques pour les retirer ensuite
51 // bourrin voir les requetes avec jointure du Miroir ou du site Rezo
52 $log = "";
53 $log_c = 0;
54
55 // boucle sur les sites publies
56 if ($mode_auto)
57 $u = sql_select("id_syndic,id_rubrique,id_secteur","spip_syndic","statut='publie'"); // tous
58 else
59 $u = sql_select("id_syndic,id_rubrique,id_secteur","spip_syndic","statut='publie' AND rssarticle='oui'");
60
61 while ($b = sql_fetch($u)) {
62 $id_syndic = (int) $b['id_syndic'];
63 $id_rubrique = (int) $b['id_rubrique'];
64 $id_secteur = (int) $b['id_secteur'];
65
66 // sur chaque site copie les derniers syndication
67 $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
68 while ($a = sql_fetch($s)) {
69 $titre = $a['titre'];
70 $url = $a['url'];
71 $id_syndic_article = $a['id_syndic_article'];
72
73 // article avec mm titre existe ? (test doublons sur l'url plutot que sr le titre)
74 if (!$id_article = sql_getfetsel("id_article","spip_articles","url_site=".sql_quote($url))) {
75 $texte = $a['descriptif'];
76 //traitement pour syntaxe SPIP
77 if($html2spip)
78 $texte = html2spip($texte);
79 $lang = $a['lang'];
80 $url = $a['url'];
81 $tags = $a['tags'];
82 $lsdate = $a['date'];
83
84 if ($lang=="")
85 $lang = $GLOBALS['spip_lang'];
86
87 // cas particulier:
88 // site multilingue avec la configuration: 1 lang par rubrique
89 // on force l'article a avoir la langue de la rubrique ds lequel il est importee(pour omaidi)
90 if ($GLOBALS['meta']['multi_rubriques']=='oui') {
91 $s_lang = sql_select("lang", "spip_rubriques", "id_rubrique=$id_rubrique");
92 while ($a_lang = sql_fetch($s_lang))
93 $lang = $a_lang['lang'];
94 }
95
96 //$lsdate = date('Y-m-d H:i:s');
97 // creation de l'article
98 $id_article = sql_insertq( 'spip_articles', array(
99 'titre'=>$titre, 'id_rubrique'=>$id_rubrique,
100 'texte'=>$texte, 'statut'=>$import_statut, 'id_secteur'=>$id_secteur,
101 'date'=> $lsdate, 'accepter_forum'=>$accepter_forum, 'lang'=>$lang, 'url_site'=>$url));
102
103 // lier article et site
104 sql_insertq( 'spip_articles_syndic', array('id_article'=>$id_article, 'id_syndic'=>$id_syndic));
105
106 // gestion auteur
107 $auteurs= explode(", ",$a['lesauteurs']);
108 foreach ($auteurs as $k => $auteur) {
109 if ($current_id_auteur = rssarticle_get_id_auteur($auteur))
110 sql_insertq( 'spip_auteurs_liens', array('id_auteur'=>$current_id_auteur, 'id_objet'=>$id_article, 'objet'=>'article'));
111 }
112
113 // tags a convertir en documents distants
114 $doc_distants = extraire_enclosures($tags);
115 foreach ($doc_distants as $k=>$doc_distant) {
116 $infos = recuperer_infos_distantes($doc_distant);
117 if ($infos['extension']) {
118 $ext = $infos['extension'];
119 $taille = $infos['tailles'];
120 $inclus = sql_getfetsel("inclus", "spip_types_documents", "extension=" . sql_quote($ext) . " AND upload='oui'"); // extension autorisee ?
121 if ($inclus) {
122 $id_document = sql_insertq( 'spip_documents', array(
123 'extension'=>$ext,
124 'date'=> $lsdate,
125 'fichier'=> $doc_distant,
126 'taille'=> $taille,
127 'mode' => 'document',
128 'distant' => 'oui'));
129
130 sql_insertq( 'spip_documents_liens', array(
131 'id_document' =>$id_document,
132 'id_objet'=> $id_article,
133 'objet'=> 'article',
134 'vu'=> 'non'));
135 }
136 }
137 }
138
139 // logo
140 if ($copie_logo) {
141 if ($logo_site = inc_chercher_logo_dist($id_syndic,"id_syndic")) {
142 $logo_article = "arton$id_article.".$logo_site[3];
143 @copy($logo_site[0],_DIR_LOGOS."$logo_article");
144 }
145 }
146
147 $log_c++;
148 $log .= "\n - $titre";
149
150 // on "depublie" l'article syndique qui vient d'etre copie
151 sql_update("spip_syndic_articles", array('statut' => '"refuse"'), "id_syndic_article=".intval($id_syndic_article));
152
153 // Mise à jour des dates de rubriques après création d'un article dedans
154 if ($id_article) {
155 if (function_exists('calculer_rubriques'))
156 calculer_rubriques();
157 if (function_exists('calculer_langues_rubriques'))
158 calculer_langues_rubriques();
159 if (function_exists('propager_les_secteurs'))
160 propager_les_secteurs();
161 }
162 } // test doublons
163 }
164 } // FIN PILE
165
166 // log et alerte email
167 $log .= "\n\n---------\nPlugin Copie RSS en Articles: $log_c articles copies\n";
168 spip_log($log);
169 $log .= $GLOBALS['meta']['adresse_site']."/ecrire/?exec=accueil";
170
171 if ($email_alerte && $email_suivi !="" && $log_c > 0)
172 envoyer_mail($email_suivi,"Copie RSS en Articles", $log);
173 // maintenance generale
174 // mode auto: on efface les syndic_articles de plus de 2 mois pour soulager le systeme (cf genie/syndic)
175 // attention: on efface sur l'ensemble des sites syndiques ss tenir compte de l'option
176 if ($mode_auto) sql_delete('spip_syndic_articles', "maj < DATE_SUB(NOW(), INTERVAL 2 MONTH) AND date < DATE_SUB(NOW(), INTERVAL 2 MONTH)");
177
178 return 1;
179 }
180
181
182 //
183 // recupere id d'un auteur selon son nom sinon le creer
184 function rssarticle_get_id_auteur($nom) {
185 if (trim($nom)=="")
186 return false;
187
188 if ($id_auteur = sql_getfetsel("id_auteur","spip_auteurs","nom=".sql_quote($nom)))
189 return $id_auteur;
190
191 // auteur inconnu, on le cree ...
192 return sql_insertq('spip_auteurs',array('nom'=>$nom,'statut'=>'1comite'));
193 }
194
195 //
196 // extraire les documents taggues enclosure
197 // voir https://code.spip.net/@afficher_enclosures
198 function extraire_enclosures($tags) {
199 $s = array();
200 foreach (extraire_balises($tags, 'a') as $tag) {
201 if (extraire_attribut($tag, 'rel') == 'enclosure'
202 AND $t = extraire_attribut($tag, 'href')) {
203 $s[] = $t;
204 }
205 }
206 return $s;
207 }
208
209 /**
210 *
211 * Nettoyer l'utf-8 et ses accents
212 *
213 */
214 function clean_utf8($t) {
215 if (!preg_match('!\S!u', $t))
216 $t = preg_replace_callback(',&#x([0-9a-f]+);,i', 'utf8_do', utf8_encode(utf8_decode($t)));
217 return $t;
218 }
219
220
221 //passe le html en SPIP
222 //repris de memo.php, merci
223
224 function html2spip($lapage){
225 $lapage=clean_utf8($lapage);
226
227 // remettre les double quotes casé par texte_backend
228 $lapage = str_replace('&#034;','"',$lapage);
229
230 // PRETRAITEMENTS
231 $lapage = str_replace("\n\r", "\r", $lapage); // echapper au greedyness de preg_replace
232 $lapage = str_replace("\n", "\r", $lapage);
233
234 // itals
235 $lapage = preg_replace(",<(i|em)( [^>\r]*)?".">(.+)</\\1>,Uims", "{\\3}", $lapage);
236
237 // gras (pas de {{ pour eviter tout conflit avec {)
238 $lapage = preg_replace(",<(b|h[4-6])( [^>]*)?".">(.+)</\\1>,Uims", "@@b@@\\3@@/b@@", $lapage);
239 $lapage = preg_replace(",<strong( [^>]*)?".">(.+)</strong>,Uims", "@@b@@\\2@@/b@@", $lapage);
240
241 // entites
242 include_spip('inc/charsets');
243 $lapage = html2unicode($lapage, true); //secure?
244
245 // liens avec possibilités de non fermeture du tag
246 $lapage = preg_replace(",<a[ \t\n\r][^<>]*href=[^<>]*(http[^<>]*)[^<>]>(.*?)<,uims", "[\\2->\\1] <", $lapage);
247
248 // images (cf ressource)
249 $lapage = preg_replace(",<img[ \t\n\r][^<>]*src=[^<>]*(http[^<>'\"]*)[^<>]*>,uims","[img]\\1[//img]", $lapage);
250
251 // intertitres
252 $lapage = preg_replace(",<(h[1-3])( [^>]*)?".">(.+)</\\1>,Uims", "\r{{{ \\3 }}}\r", $lapage);
253 // tableaux
254 $lapage = preg_replace(",<tr( [^>]*)?".">,Uims", "<br />\r", $lapage);
255 $lapage = preg_replace(",<t[hd]( [^>]*)?".">,Uims", " | ", $lapage);
256
257 // POST TRAITEMENT
258 $lapage = str_replace("\r", "\n", $lapage);
259
260 // SUPPRIME LES TAGS
261 if (preg_match("/<title.*>(.*)<\/title>/i", $lapage, $regs)) {
262 $titre = textebrut($regs[1]);
263 }
264 $lapage = textebrut($lapage);
265
266 // Suite tableaux
267 $lapage = preg_replace(",\n[| ]+\n,", "", $lapage);
268 $lapage = preg_replace(",\n[|].+?[|].+?[|].+,", "\\0|\r", $lapage);
269
270 // retablir les gras
271 $lapage = preg_replace(",@@b@@(.*)@@/b@@,Uims","{{\\1}}",$lapage);
272
273 //retablir les images pour les lire avec le plugin ressource
274 $lapage = preg_replace('#\[img\](.*)\[\//img\]#Umis', "<$1>", $lapage);
275
276 //nettoyer les "] qui dépassent parfois
277 $lapage = preg_replace(",\"\],uims", "]", $lapage);
278
279 return $lapage;
280 }
281