source: spip-zone/_plugins_/importer_blog/action/importer_blog.php @ 47691

Last change on this file since 47691 was 47691, checked in by fil@…, 10 years ago

un plugin pour importer un dump blogspot dans un site SPIP 2.1 ou SPIP 3

File size: 7.6 KB
Line 
1<?php
2
3function action_importer_blog() {
4
5        header('Content-Type: text/html; charset=utf-8');
6        include_spip('inc/minipres');
7
8        if (!autoriser('webmestre')) {
9                echo minipres();
10                exit;
11        }
12
13        if ($_FILES
14        AND $f = array_pop($_FILES)
15        AND !$f['error']) {
16                $content = file_get_contents($f['tmp_name']);
17        }
18        else {
19                echo minipres('Erreur de fichier');
20                exit;
21
22        }
23
24        // Mode de stockage des liens mots<->articles
25        $trouver_table = charger_fonction('trouver_table', 'base');
26        define('_MODE_MOTS',  ($trouver_table('spip_mots_liens') ? 1 : 0));
27        define('_MODE_AUTEURS',  ($trouver_table('spip_auteurs_liens') ? 1 : 0));
28        define('_MODE_FORUM', _MODE_MOTS); // je suis flemmard, là...
29
30
31        echo install_debut_html('Import de '.$f['name']);
32
33        include_spip('iterateur/data');
34
35        $r = importer_blogspot($content);
36
37        if (!$r) 
38                echo "<h1>Import terminé avec succès</h1>";
39        else
40                echo "<h1>Erreur : $r</h1>\n";
41
42
43        echo install_fin_html();
44}
45
46
47function nettoyer_html($texte) {
48        /*
49        $texte = preg_replace(',<br ?/?><br ?/?>,i', "\n\n", $texte);
50        $texte = preg_replace(',<br ?/?>,i', "\n_ ", $texte);
51        $texte = preg_replace(',</div>,i', "\0\n\n", $texte);
52        */
53
54        return $texte;
55}
56
57
58function importer_post($a, $rub =1) {
59        $ref = "*".$a['id'];
60        $s = sql_query($q = "SELECT id_article FROM spip_articles WHERE nom_site=".sql_quote((string)$ref));
61        if ($t = sql_fetch($s))
62                $id = $t['id_article'];
63        else {
64                $id = sql_insertq('spip_articles', array(
65                        'nom_site' => $ref,
66                        'statut' => 'publie'
67                ));
68        }
69
70        if (!$id) {
71                echo "erreur sur $ref";
72                return;
73        }
74
75
76        $p = sql_updateq('spip_articles',
77                array(
78                        'titre' => $a['title'],
79                        'texte' => $a['content'],
80                        'date' => $a['date'],
81                        'id_rubrique' => $rub,
82                        'id_secteur' => $rub,
83                        'lang' => 'fr',
84                ),
85                'id_article='.$id
86        );
87
88if (_MODE_AUTEURS) { /* SPIP 3 */
89        sql_delete('spip_auteurs_liens', 'id_objet='.$id.' AND objet="article"');
90        if ($id_auteur = get_id_auteur($a['author'], $a['email'])) {
91                sql_insertq('spip_auteurs_liens', array('id_objet'=>$id, 'id_auteur' => $id_auteur, 'objet' => 'article'));
92        }
93} else { /* spip 2.1 */
94        sql_delete('spip_auteurs_articles', 'id_article='.$id);
95        if ($id_auteur = get_id_auteur($a['author'], $a['email'])) {
96                sql_insertq('spip_auteurs_articles', array('id_article'=>$id, 'id_auteur' => $id_auteur));
97        }
98}
99
100if (_MODE_MOTS) { /* SPIP 3 */
101        sql_delete('spip_mots_liens', 'id_objet='.$id.' AND objet="article"');
102        if (is_array($a['terms']))
103        foreach($a['terms'] as $term)
104        if ($id_mot = get_id_mot($term)) {
105                sql_insertq('spip_mots_liens', array('id_objet'=>$id, 'id_mot' => $id_mot, 'objet' => 'article'));
106        }
107} else { /* spip 2.1 */
108        sql_delete('spip_mots_articles', 'id_article='.$id);
109        if (is_array($a['terms']))
110        foreach($a['terms'] as $term)
111        if ($id_mot = get_id_mot($term)) {
112                sql_insertq('spip_mots_articles', array('id_article'=>$id, 'id_mot' => $id_mot));
113        }
114}
115
116        echo "<dd><a href='"._DIR_RESTREINT."?exec=articles&amp;id_article=$id'>article $id</a></dd>\n";
117
118#       var_dump($a, $p, $id, $id_auteur);
119#       exit;
120}
121
122
123function importer_comment($a) {
124        static $vu = array();
125
126        $ref_article = "*".$a['parent'];
127
128        $s = sql_query('SELECT id_article AS id FROM spip_articles WHERE nom_site='._q($ref_article));
129        if (!$t = sql_fetch($s)) {
130                echo "l'article $ref_article n'existe pas (encore?), on passe.\n";
131                return false;
132        }
133        $id_objet = $t['id'];
134
135        $ref = '*'.$a['id'];
136
137        $s = sql_query($q = "SELECT id_forum FROM spip_forum WHERE nom_site=".sql_quote((string)$ref));
138        if ($t = sql_fetch($s))
139                $id = $t['id_forum'];
140        else {
141                $id = sql_insertq('spip_forum', array(
142                        'nom_site' => $ref,
143                        'statut' => 'publie'
144                ));
145        }
146
147        if (!$id) {
148                echo "erreur sur $ref";
149                return;
150        }
151
152        $f = array(
153                        'titre' => '', ## $a['title'], sur blogspot le titre n'est que le debut du content
154                        'texte' => $a['content'],
155                        'date_heure' => $a['date'],
156                        'date_thread' => $a['date'],
157                        'auteur' => $a['author'],
158                        'email_auteur' => $a['email'],
159                );
160
161        if (_MODE_FORUM) {
162                $f['objet'] = 'article';
163                $f['id_objet'] = $id_objet;
164        } else {
165                $f['id_article'] = $id_objet;
166        }
167
168        $p = sql_updateq('spip_forum',
169                $f,
170                'id_forum='.$id
171        );
172
173        echo "<dd><a href='"._DIR_RESTREINT."?exec=articles&amp;id_article=$id_objet'>forum $id</a></dd>\n";
174
175
176}
177
178
179
180function get_id_auteur($name, $email='') {
181        static $mem = array();
182
183        if (!isset($mem[$name])) {
184                $s = sql_query("SELECT id_auteur FROM spip_auteurs WHERE nom="._q($name));
185                if ($t = sql_fetch($s))
186                        $id = $t['id_auteur'];
187                else
188                        $id = sql_insertq('spip_auteurs', array(
189                        'nom' => $name,
190                        'statut' => '1comite',
191                        'email' => $email
192                        ));
193
194                $mem[$name] = $id;
195        }
196
197        return $mem[$name];
198}
199
200function get_id_rubrique($name, $desc='') {
201        static $mem = array();
202
203        if (!isset($mem[$name])) {
204                $s = sql_query("SELECT id_rubrique FROM spip_rubriques WHERE titre="._q($name)." AND id_parent=0");
205                if ($t = sql_fetch($s))
206                        $id = $t['id_rubrique'];
207                else
208                        $id = sql_insertq('spip_rubriques', array(
209                        'titre' => $name,
210                        'texte' => $desc,
211                        'statut' => 'publie',
212                        'id_parent' => 0
213                        ));
214
215                $mem[$name] = $id;
216        }
217
218        return $mem[$name];
219}
220
221
222function get_id_mot($name) {
223        static $mem = array();
224
225        if (!isset($mem[$name])) {
226                $s = sql_query("SELECT id_mot FROM spip_mots WHERE titre="._q($name));
227                if ($t = sql_fetch($s))
228                        $id = $t['id_mot'];
229                else
230                        $id = sql_insertq('spip_mots', array(
231                        'titre' => $name,
232                        'id_groupe' => '1',
233                        'type' => 'tag',
234                        ));
235
236                $mem[$name] = $id;
237        }
238
239        return $mem[$name];
240}
241
242
243function importer_blogspot(&$content) {
244        $it = new SimpleXmlIterator(
245                str_replace('xmlns=', 'ns=',$content)
246        );
247
248        foreach ($it->xpath('entry') as $key => $val) {
249                $id = ((string)$val->id);
250
251
252#       echo htmlspecialchars($txt = (string) $val->content);
253#       echo "$key <pre>\n".htmlspecialchars(var_export(/*ObjectToArray*/($val),true))."</pre><hr />";
254#       if ($n++>100) exit;
255
256
257                if (preg_match(',\.post-(.*)$,', $id, $r)) {
258                        $ref = $r[1];
259
260                        $a = array('id' => $ref);
261
262                        echo "<dt>$ref</dt>\n";
263                        echo "<dd>".htmlspecialchars($tit = (string) $val->title)."</dd>";
264
265
266                        ## etablir le type (post / comment) de l'item
267                        $type =  $val->xpath('category[@scheme=\'http://schemas.google.com/g/2005#kind\']');
268                        $a['type'] = preg_replace(',^.*#,', '', (string) $type[0]->attributes()->term);
269
270
271                        ## etablir l'url
272                        if (
273                        $link =  $val->xpath('link[@rel=\'alternate\']')) {
274                                $a['link'] = preg_replace(',[?].*,', '', (string) $link[0]->attributes()->href);
275                                #var_export($link);
276                        }
277
278                        ## si c'est un commentaire, aller chercher l'article parent
279                        if ($a['type'] == 'comment') {
280                                $link =  $val->xpath('link[@rel=\'self\']');
281                                $link = $link[0]->attributes()->href;
282                                preg_match(',(\d+)/comments/,', $link, $r );
283                                $a['parent'] = $r[1];
284                        }
285
286
287                        $terms = array();
288                        foreach($val->xpath('category[@scheme="http://www.blogger.com/atom/ns#"]') as $t)
289                                $terms[] = (string)$t->attributes()->term;
290
291                        if ($terms) $a['terms'] = $terms;
292
293#                       var_dump($val->xpath('content')->attributes()->type);
294
295                        $a['title'] = nettoyer_html((string) $val->title);
296                        $a['content'] = nettoyer_html((string) $val->content);
297
298                        $a['date'] = date('Y-m-d H:i:s', strtotime((string) $val->published));
299                        $a['author'] = (string) $val->author->name;
300                        $a['email'] = (string) $val->author->email;
301                        if($a['email'] == 'noreply@blogger.com')
302                                $a['email'] = '';
303
304                        switch($a['type']) {
305                                case "post":
306                                        $rub = get_id_rubrique(
307                                                $settings['blog_name'], $settings['blog_description']);
308                                        importer_post($a, $rub);
309                                        break;
310                               
311                                case "comment":
312                                        importer_comment($a);
313                                        break;
314
315                                default:
316                                        echo "type inconnu: ".$type."\n";
317                                        break;
318                        }
319                }
320                else {
321                        echo "<s>$id</s> <br />\n";
322                        if (preg_match(',\.settings\.(\w+)$,', $id, $r)) {
323                                $settings[strtolower($r[1])] = (string) $val->content;
324                        }
325                }
326        }
327
328}
Note: See TracBrowser for help on using the repository browser.