source: spip-zone/_plugins_/convertisseur/trunk/spip-cli/convertisseurImporter.php @ 100562

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

menage

File size: 14.2 KB
Line 
1<?php
2
3/***
4
5Importer en masse des fichiers txt dans spip_articles.
6Les articles sont ajoutés avec leurs info sauf id_article dans des rubriques créées si besoin.
7Les documents <docxxx> sont gérés
8Les raccourcis de liens [xxx->12345] sont gérés
9
10*/
11
12
13use Symfony\Component\Console\Command\Command;
14use Symfony\Component\Console\Input\InputArgument;
15use Symfony\Component\Console\Input\InputInterface;
16use Symfony\Component\Console\Input\InputOption;
17use Symfony\Component\Console\Output\OutputInterface;
18use Symfony\Component\Console\Helper\ProgressBar;
19
20class fichiersImporter extends Command {
21        protected function configure() {
22                $this
23                        ->setName('convertisseur:importer')
24                        ->setDescription('Importer des fichiers SPIP txt dans la table spip_articles (ou autre).')
25                        ->setAliases(array(
26                                'import' // abbréviation commune pour "import"
27                        ))
28                        ->addOption(
29                                'source',
30                                's',
31                                InputOption::VALUE_OPTIONAL,
32                                'Répertoire source',
33                                'conversion_spip'
34                        )
35                        ->addOption(
36                                'dest',
37                                'd',
38                                InputOption::VALUE_OPTIONAL,
39                                'id_rubrique de la rubrique où importer les numéros et leurs articles',
40                                '0'
41                        )
42                        ->addOption(
43                                'racine_documents',
44                                'r',
45                                InputOption::VALUE_OPTIONAL,
46                                'path ajouté devant le `fichier` des documents joints importés',
47                                ''
48                        )
49                ;
50        }
51
52        protected function execute(InputInterface $input, OutputInterface $output) {
53                global $spip_racine;
54                global $spip_loaded;
55                global $spip_version_branche ;         
56       
57                include_spip("iterateur/data");
58               
59                $source = $input->getOption('source') ;
60                $id_parent = $input->getOption('dest') ;
61                $racine_documents = $input->getOption('racine_documents') ;     
62                               
63                // Répertoire source
64                if(!is_dir($source)){
65                        $output->writeln("<error>Préciser le répertoire avec les fichiers à importer. spip import -s repertoire </error>\n");
66                        exit ;
67                }       
68
69                if($id_parent == 0){
70                        $output->writeln("<error>Préciser dans quelle rubrique importer les articles. spip import -d `id_rubrique` </error>\n");
71                        exit ;
72                }       
73
74               
75                if ($spip_loaded) {
76                        chdir($spip_racine);
77
78                        if (!function_exists('passthru')){
79                                $output->writeln("<error>Votre installation de PHP doit pouvoir exécuter des commandes externes avec la fonction passthru().</error>");
80                        }
81                        // Si c'est bon on continue
82                        else{
83
84                                // Champs d'un article
85                                include_spip("base/abstract_sql");
86                                $show = sql_showtable("spip_articles");
87                                $champs = array_keys($show['field']);
88                               
89                                $show = sql_showtable("spip_documents");
90                                $champs_documents = array_keys($show['field']);
91                               
92                                // Ajout d'un champ la premiere fois pour stocker les éventuelles <ins> qui n'ont pas de champs (peut-être long).
93                                if(!in_array('metadonnees', $champs)){
94                                        $output->writeln("MAJ BDD : alter table spip_articles add metadonnees MEDIUMTEXT NOT NULL DEFAULT ''");
95                                        sql_query("alter table spip_articles add metadonnees MEDIUMTEXT NOT NULL DEFAULT ''");
96                                }
97                                // Ajout d'un champ la premiere fois pour stocker l'id_article original (pour ensuite remapper les liens [->123]).
98                                if(!in_array('id_source', $champs)){
99                                        $output->writeln("MAJ BDD : alter table spip_articles add id_source BIGINT(21) NOT NULL DEFAULT ''");
100                                        sql_query("alter table spip_articles add id_source BIGINT(21) NOT NULL DEFAULT ''");
101                                }
102                                // Ajout d'un champ la premiere fois pour stocker le nom du fichier source, pour reconnaitre un article déjà importé.
103                                if(!in_array('fichier_source', $champs)){
104                                        $output->writeln("MAJ BDD : alter table spip_articles add fichier_source MEDIUMTEXT NOT NULL DEFAULT ''");
105                                        sql_query("alter table spip_articles add fichier_source MEDIUMTEXT NOT NULL DEFAULT ''");
106                                }
107                                // on prend tous les fichiers txt dans la source, sauf si metadata.txt a la fin.
108                                $fichiers = preg_files($source . "/", "(?:(?<!\.metadata\.)txt$)", 100000);
109
110                                // start and displays the progress bar
111                                $progress = new ProgressBar($output, sizeof($fichiers));
112                                $progress->setBarWidth(100);
113                                $progress->setRedrawFrequency(1);
114                                $progress->setMessage(" Import de $source/*.txt en cours dans la rubrique $id_parent ... ", 'message'); /**/ 
115                                $progress->setMessage("", 'inforub');
116                                $progress->start();
117
118                                if(is_file("liens_a_corriger.txt"))
119                                        unlink("liens_a_corriger.txt");
120                                if(is_file("liens_non_corriges.txt"))
121                                        unlink("liens_non_corriges.txt");
122                                if(is_file("liens_corriges.txt"))
123                                        unlink("liens_corriges.txt");
124
125                                foreach($fichiers as $f){
126
127                                        $fichier =      basename($f) ;
128                                        preg_match("/^(\d{4})-\d{2}/", $fichier, $m);
129                                        $mois = $m[0];
130                                        $annee = $m[1] ;
131                                       
132                                        // chopper l'id_parent dans le fichier ?
133                                        include_spip("inc/flock");
134                                        lire_fichier($f, $texte);
135                                       
136                                        // menage
137                                        //@@COLLECTION:esRetour ligne automatique
138                                        //@@SOURCE:article914237.html
139                                       
140                                        $texte = preg_replace("/@@COLLECTION.*/", "", $texte);
141                                        $texte = preg_replace("/@@SOURCE.*/", "", $texte);
142                                       
143                                       
144                                        // Si des <ins> correspondent à des champs metadonnees connus, on les ajoute.
145                                        $champs_metadonnees = array("mots_cles", "auteurs", "hierarchie", "documents");
146                                        $hierarchie = "" ;
147                                        $auteurs = "" ;
148                                        $mots_cles = "" ;
149                                        $documents = "" ;
150
151                                        if (preg_match_all(",<ins[^>]+class='(.*?)'[^>]*?>(.*?)</ins>,ims", $texte, $z, PREG_SET_ORDER)){ 
152                                                foreach($z as $d){ 
153                                                        if(in_array($d[1], $champs_metadonnees)){ 
154                                                                // class="truc" => $truc
155                                                                $$d[1] = split("@@", $d[2]); 
156                                                                // virer du texte
157                                                                $texte = substr_replace($texte, '', strpos($texte, $d[0]), strlen($d[0])); 
158                                                        } 
159                                                } 
160                                        }
161                                       
162                                        if (preg_match(",<ins class='id_article'>(.*?)</ins>,ims", $texte, $z))
163                                                        $id_source = $z[1] ;
164                                       
165                                        // dans quelle rubrique importer ?
166                                        if($hierarchie){
167                                                $titre_parent = $hierarchie[0] ;
168                                                $titre_rubrique = $hierarchie[1] ;
169                                               
170                                                // hack perso diplo 2006/02 => 02 ou 2006-02 => 02
171                                                $titre_rubrique = preg_replace(",^(\d{4})(?:/|-)(\d{2})$,", "\\2", $titre_rubrique); 
172
173                                        }else{
174                                                $titre_parent = $annee ;
175                                                $titre_rubrique = "$annee-$mois" ;
176                                        }
177                                       
178                                        include_spip("inc/rubriques");
179                                        $id_rubrique = creer_rubrique_nommee("$titre_parent/$titre_rubrique", $id_parent);
180                                        $up = sql_updateq('spip_rubriques', array('statut' => 'publie'), "id_rubrique=$id_rubrique");
181                                       
182                                        if($up)
183                                                $progress->setMessage(" Rubrique $titre_parent/$titre_rubrique => $id_rubrique ", 'inforub');
184                                       
185                                        $progress->setMessage("", 'docs');
186                                        $progress->setMessage("", 'mot');
187                                        $progress->setMessage("", 'auteur');
188                                       
189                                        // inserer l'article
190                                        include_spip("inc/convertisseur");
191
192                                        // auteur par défaut (admin)
193                                        $id_admin = sql_getfetsel("id_auteur", "spip_auteurs", "id_auteur=1");
194                                        $id_admin = ($id_admin)? $id_admin : 12166 ;
195
196                                        $GLOBALS['auteur_session']['id_auteur'] = $id_admin ;
197                       
198                                        if($id_article = inserer_conversion($texte, $id_rubrique, $f)){
199                                                // Créer l'auteur ?
200                                                if($auteurs){
201
202                                                        foreach($auteurs as $auteur){
203                                                               
204                                                                list($nom_auteur,$bio_auteur) = explode("::", $auteur);
205                                                                // On essaie de trouver un nom*prénom dans les auteurs
206                                                                $a_nom = explode(" ", $nom_auteur);
207                                                                $prenom_nom = array_pop($a_nom) . "*" . join(" ", $a_nom);
208                                                               
209                                                                // echo "\n$prenom_nom\n" ;
210                                                               
211                                                                if($id_auteur = sql_getfetsel("id_auteur", "spip_auteurs", "nom=" . sql_quote($prenom_nom))){
212                                                                       
213                                                                }else   
214                                                                        $id_auteur = sql_getfetsel("id_auteur", "spip_auteurs", "nom=" . sql_quote($nom_auteur));
215                                                               
216                                                                if(!$id_auteur){
217                                                                        $id_auteur = sql_insertq("spip_auteurs", array(
218                                                                                "nom" => $nom_auteur,
219                                                                                "statut" => "1comite",
220                                                                                "bio" => $bio_auteur
221                                                                ));
222                                                               
223                                                                $auteur_m = substr("Création de l'auteur " . $auteur, 0, 100) ;
224                                                                $progress->setMessage($auteur_m, 'auteur');
225                                                                }
226                                                       
227                                                                if($spip_version_branche > "3"){
228                                                                        if(!sql_getfetsel("id_auteur", "spip_auteurs_liens", "id_auteur=$id_auteur and id_objet=$id_article and objet='article'"))
229                                                                                sql_insertq("spip_auteurs_liens", array(
230                                                                                "id_auteur" => $id_auteur,
231                                                                                "id_objet" => $id_article,
232                                                                                "objet" => "article"
233                                                                        ));
234                                                        }else // spip 2
235                                                                        if(!sql_getfetsel("id_auteur", "spip_auteurs_articles", "id_auteur=$id_auteur and id_article=$id_article"))
236                                                                                sql_insertq("spip_auteurs_articles", array(
237                                                                                "id_auteur" => $id_auteur,
238                                                                                "id_article" => $id_article
239                                                                        ));
240                                                               
241                                                        }
242                                                }
243                               
244                                                // Créer des mots clés ?
245                                                if($mots_cles){
246                                                        foreach($mots_cles as $mot){
247                                                                // groupe mot-clé
248                                                                list($type_mot,$titre_mot) = explode("::", $mot);
249                                                                $type_mot = ($type_mot)? $type_mot : "Mots importés" ;
250
251                                                                $id_groupe_mot = sql_getfetsel("id_groupe", "spip_groupes_mots", "titre=" . sql_quote($type_mot));
252                                                                if(!$id_groupe_mot)
253                                                                        $id_groupe_mot = sql_insertq("spip_groupes_mots", array("titre" => $type_mot));                                                         
254
255                                                                $id_mot = sql_getfetsel("id_mot", "spip_mots", "titre=" . sql_quote($titre_mot));
256                                                                if(!$id_mot AND $titre_mot !=""){
257                                                                        $id_mot = sql_insertq("spip_mots", array(
258                                                                        "titre" => $titre_mot,
259                                                                        "type" => $type_mot,
260                                                                        "id_groupe" => $id_groupe_mot
261                                                                ));
262                                                                $mot_m = substr("Création du mot " . $titre_mot . " (" . $type_mot .")", 0, 100) ;
263                                                                        $progress->setMessage($mot_m, 'mot');
264                                                                }
265
266                                                                if($spip_version_branche > "3"){
267                                                                        if(!sql_getfetsel("id_mot", "spip_mots_liens", "id_mot=$id_mot and id_objet=$id_article and objet='article'"))
268                                                                                sql_insertq("spip_mots_liens", array(
269                                                                                "id_mot" => $id_mot,
270                                                                                "id_objet" => $id_article,
271                                                                                "objet" => "article"
272                                                                        ));
273                                                                }else // spip 2
274                                                                        if(!sql_getfetsel("id_mot", "spip_mots_articles", "id_mot=$id_mot and id_article=$id_article"))
275                                                                                sql_insertq("spip_mots_articles", array(
276                                                                                "id_mot" => $id_mot,
277                                                                                "id_article" => $id_article
278                                                                        ));
279                                                        }
280                                                }
281
282                                                // Créer des documents ?
283                                                if($documents){
284                                                        foreach($documents as $doc){
285                                                                $d = json_decode($doc, true);
286                                                                $id_doc = $d['id_document'] ;
287                                                                unset($d['id_document']);
288                                                                if(strlen($racine_documents) > 0 AND !preg_match(",/$,",$racine_documents))
289                                                                        $racine_documents = $racine_documents . "/" ;
290                                                                $d['fichier'] = $racine_documents . $d['fichier'] ;
291                                                               
292                                                                // champs ok dans les documents ?
293                                                                foreach($d as $k => $v)
294                                                                        if(in_array($k, $champs_documents))
295                                                                                $document_a_inserer[$k] = $v ;
296                                                               
297                                                                // insertion du doc
298                                                                $id_document = sql_getfetsel("id_document", "spip_documents", "fichier=" . sql_quote($d['fichier']));
299                                                                if(!$id_document){                                                                     
300                                                                        $id_document = sql_insertq("spip_documents", $document_a_inserer);
301                                                                        $progress->setMessage("Création du document " . $d['titre'] . " (" . $d['fichier'] .")", 'docs');
302                                                                }
303                                                               
304                                                                if($id_document AND !sql_getfetsel("id_document", "spip_documents_liens", "id_document=$id_document and id_objet=$id_article and objet='article'"))
305                                                                        sql_insertq("spip_documents_liens", array(
306                                                                                "id_document" => $id_document,
307                                                                                "id_objet" => $id_article,
308                                                                                "objet" => "article"
309                                                        ));
310                                                       
311                                                        // modifier le texte qui appelle peut etre un <doc123>
312                                                        if($id_document){
313                                                                // ressortir le texte propre...
314                                                                $texte = sql_getfetsel("texte", "spip_articles", "id_article=$id_article");
315                                                                $texte = preg_replace("/(<(doc|img|emb))". $id_doc . "/i", "\${1}" . $id_document, $texte);
316                                                                        sql_update("spip_articles", array("texte" => sql_quote($texte)), "id_article=$id_article");
317                                                        }
318                                                        }
319                                                }
320                                               
321                                                // recaler des liens [->123456] ?
322                                                include_spip("inc/lien");
323                                                if(preg_match(_RACCOURCI_LIEN, $texte))
324                                                        passthru("echo '$id_article     $id_source' >> liens_a_corriger.txt");
325
326                                                // Si tout s'est bien passé, on avance la barre
327                                                $progress->setMessage($f, 'filename');
328                                                $progress->setFormat("<fg=white;bg=blue>%message%</>\n" . "<fg=white;bg=red>%inforub% %auteur% %mot%</>\n" . '%current%/%max% [%bar%] %percent:3s%% %elapsed:6s%/%estimated:-6s% %memory:6s%' . "\n  %filename%\n%docs%\n\n");
329                                                $progress->advance();
330                                                                                       
331                                        }else{
332                                                $output->writeln("<error>échec de l'import de $f</error>");
333                                                exit ;
334                                        }
335                                }       
336
337                                // ensure that the progress bar is at 100%
338                                $progress->finish();
339                               
340                                // remapper les liens [->12345]
341                                lire_fichier("liens_a_corriger.txt", $articles);
342                                $corrections_liens = inc_file_to_array_dist($articles);
343                                foreach($corrections_liens as $k => $v){
344                                        if($v){
345                                                list($id_article, $id_source) = explode("\t", $v);
346                                                $texte = sql_getfetsel("texte", "spip_articles", "id_article=$id_article") ;
347                                                // recaler des liens [->123456] ?
348                                                include_spip("inc/lien");
349                                                if(preg_match_all(_RACCOURCI_LIEN, $texte, $liens, PREG_SET_ORDER)){
350                                                        foreach($liens as $l){
351                                                                if(preg_match("/^[0-9]+$/", $l[4])){   
352                                                                        // trouver l'article dont l'id_source est $l[4] dans le secteur
353                                                                        if($id_dest = sql_getfetsel("id_article", "spip_articles", "id_source=" . trim($l[4]) . " and id_secteur=$id_parent")){
354                                                                                $lien_actuel = $l[0] ;
355                                                                                $lien_corrige = str_replace($l[4], $id_dest, $l[0]) ;
356                                                                               
357                                                                                $lien = escapeshellarg("$id_article : $lien_actuel => $lien_corrige");
358                                                                                passthru("echo $lien >> liens_corriges.txt");
359                                                                                // maj le texte
360                                                                                $texte_corrige = str_replace($lien_actuel, $lien_corrige, $texte);
361                                                                                sql_update("spip_articles", array("texte" => sql_quote($texte_corrige)), "id_article=$id_article");
362                                                                                // attention s'il y a plusieurs liens
363                                                                                $texte = $texte_corrige ;
364                                                                        }else{
365                                                                                $commande = escapeshellarg("Dans $id_article (source $id_source)" . $l[0] . " : lien vers " . $l[4] . " non trouvé") ;
366                                                                                passthru("echo $commande >> liens_non_corriges.txt");
367                                                                        }       
368                                                                       
369                                                                }
370                                                        }
371                                                }
372                                        }
373                                }
374                               
375                                $output->writeln("");
376                                if(is_file("liens_a_corriger.txt"))
377                                        unlink("liens_a_corriger.txt");
378                        }
379                }
380                else{
381                        $output->writeln('<error>Vous n’êtes pas dans une installation de SPIP. Impossible de convertir le texte.</error>');
382                }
383        }
384}
Note: See TracBrowser for help on using the repository browser.