source: spip-zone/_plugins_/convertisseur/trunk/spip-cli/convertisseurConvertir.php @ 100519

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

debug

File size: 6.2 KB
Line 
1<?php
2
3/***
4
5Convertir des fichiers par lots.
6
7Mettre les fichiers dans le repertoire /conversion_source/%COLLECTION%/%NUMERO%/[fichiers] du SPIP par défaut, ou dans un autre répertoire.
8
9Lancer la commande spip-cli : spip conversion
10
11Les fichiers convertis sont placés dans le repertoire /conversion_spip/%COLLECTION%/%NUMERO% du SPIP
12
13Si un repertoire git est trouvé dans /dest alors on prend le repertoire */ // /*.git/*/collections comme répertoire dest (ce qui permet de faire un suivi de révision du contenu).
14
15
16use Symfony\Component\Console\Command\Command;
17use Symfony\Component\Console\Input\InputArgument;
18use Symfony\Component\Console\Input\InputInterface;
19use Symfony\Component\Console\Input\InputOption;
20use Symfony\Component\Console\Output\OutputInterface;
21
22class Convert extends Command {
23        protected function configure() {
24                $this
25                        ->setName('convertisseur:convertir')
26                        ->setDescription('Conversion de fichiers divers au format SPIP txt. `spip conversion -e %extracteur% -s %source% -d %dest%`.')
27                        ->setAliases(array(
28                                'conversion' // abbréviation commune pour "conversion"
29                        ))
30                        ->addOption(
31                                'extracteur',
32                                'e',
33                                InputOption::VALUE_OPTIONAL,
34                                'Type d\'extracteur pour la conversion',
35                                ''
36                        )
37                        ->addOption(
38                                'source',
39                                's',
40                                InputOption::VALUE_OPTIONAL,
41                                'Répertoire source de la collection à convertir, structuré en collection/numero/[fichiers]',
42                                'conversion_source'
43                        )
44                        ->addOption(
45                                'dest',
46                                'd',
47                                InputOption::VALUE_OPTIONAL,
48                                'Répertoire de destination',
49                                'conversion_spip'
50                        )
51                ;
52        }
53
54        protected function execute(InputInterface $input, OutputInterface $output) {
55                global $spip_racine;
56                global $spip_loaded;
57               
58                $source = $input->getOption('source') ;
59                $dest = $input->getOption('dest') ;
60                $extracteur = $input->getOption('extracteur') ;
61               
62                include_spip("iterateur/data");
63                include_spip("inc/utils");
64                include_spip(_DIR_PLUGIN_CONVERTISSEUR . "convertisseur_fonctions");
65
66                $extracteurs_dispos = join(", ",$GLOBALS['extracteurs_disponibles']);
67
68                if($extracteur == "" || !in_array($extracteur, $GLOBALS['extracteurs_disponibles'])){
69                        $output->writeln("<error>Définir un extracteur `spip conversion -e %extracteur%`. Extracteurs disponibles : $extracteurs_dispos</error>");
70                        exit ;
71                }
72               
73                if ($spip_loaded) {
74                        chdir($spip_racine);
75
76                        if (!function_exists('passthru')){
77                                $output->writeln("<error>Votre installation de PHP doit pouvoir exécuter des commandes externes avec la fonction passthru().</error>");
78                        }
79                       
80                        // Répertoire de destination ou l'on enregistre les fichiers spip (/convertion_spip par défaut).
81                        if(!is_dir($source)){
82                                $output->writeln("<error>Préciser où sont les fichiers à convertir `spip conversion -s %repertoire%` ou créer un repertoire conversion_source/</error>");
83                                exit ;
84                        }
85       
86                        // Repertoire source
87                        if($dest != "" AND !is_dir($dest))
88                                mkdir($dest);
89                       
90                        if(!is_dir($dest)){
91                                $output->writeln("<error>Préciser où placer les fichiers convertis `spip conversion -d %repertoire%` ou créer un répertoire conversion_spip/</error>");
92                                exit ;
93                        }
94                       
95                        // Si c'est bon on continue
96                        else{
97                                $output->writeln("<info>C'est parti pour la conversion `$extracteur` des fichiers de $source/ dans $dest/ !</info>");
98
99                                // trouve t'on un repertoire trunk/collections dans $dest ?
100                                if($ls_depot = inc_ls_to_array_dist($dest ."/trunk/collections")){
101                                        $dest = $ls_depot[0]['dirname'] . "/" .  $ls_depot[0]['basename'] ;
102                                        $output->writeln("<info>GIT : dest = $dest</info>");
103                                }
104                                                               
105                                // plugin convertisseur
106                                include_spip("extract/$extracteur");                           
107                                $fonction_extraction = $GLOBALS['extracteur'][$extracteur] ;
108                               
109                                // chopper des fichiers xml mais pas xxx_metatada.xml
110                                $fichiers = preg_files($source ."/", "(?:(?<!_metadata\.)xml$)");
111                                                                       
112                                // ou a défaut n'importe quel fichier trouvé
113                                if(sizeof($fichiers) == 0)
114                                        $fichiers = preg_files($source, ".*");
115                               
116                                foreach($fichiers as $f){
117                                       
118                                        //var_dump($f);
119                                       
120                                        $fn = str_replace("$source/","", $f);
121                               
122                                        // Déterminer l'organisation des fichiers
123                                        $classement = explode("/", $fn);
124                                        // Répertoires publication et numero ?
125                                        if(sizeof($classement) >= 3){
126                                                $collection = $classement[0] . "/";
127                                                $numero = $classement[1] . "/";
128                                        }// Répertoires de numeros ?
129                                        elseif(sizeof($classement) == 2){
130                                                $collection = "";
131                                                $numero=$classement[0] . "/" ;
132                                        }else{
133                                                # on recopie l'arbo de la source
134                                                preg_match(",.*/([^/]+)/([^/]+)/[^/]+$,", $f, $m);
135                                                $collection = $m[1] ."/ ";
136                                                $numero = $m[2] . "/" ;
137                                                // var_dump($m, $collection, $numero);
138                                        }
139                                       
140                                        $article = basename($f);
141
142                                        // pour le chemin des documents.
143                                        set_request('fichier', $collection . $numero . "fichier.xml");
144                                       
145                                        $contenu = $fonction_extraction($f,$charset);
146                                       
147                                        include_spip("inc/convertisseur");
148                                        $contenu = nettoyer_format($contenu);
149
150                                        // Générer des noms de fichiers valides
151                                        include_spip("inc/charsets");
152                                        $article = translitteration($article);                                 
153                                        $article = preg_replace(',[^\w-]+,', '_', $article);
154                                        $article = preg_replace(',_xml$,', '.txt', $article);
155                                       
156                                        $c = array(
157                                                "fichier_source" => $f,
158                                                "dest" => $dest,
159                                                "collection" => $collection,
160                                                "numero" => $numero,
161                                                "contenu" => $contenu,
162                                                "basename" => $article ,
163                                                "fichier_dest" => $dest . "/" . $collection . $numero . $article
164                                        );
165                                       
166                                        // traitements persos sur $c avant d'écrire le fichier converti ?
167                                        if(find_in_path('convertisseur_perso.php'))
168                                                include_spip("convertisseur_perso");
169                                        if (function_exists('nettoyer_conversion_cli')){
170                                                $c = nettoyer_conversion_cli($c);
171                                        }
172                                       
173                                        if(!is_dir($c["dest"] . "/" .  $c["collection"])){
174                                                mkdir($c["dest"]  . "/" . $c["collection"]) ;
175                                        }
176                                        if(!is_dir($c["dest"]  . "/" . $c["collection"] . $c["numero"])){
177                                                mkdir($c["dest"]  . "/" . $c["collection"] . $c["numero"]) ;
178                                        }
179                                       
180                                        include_spip("inc/flock");
181                                        ecrire_fichier($c["fichier_dest"], $c["contenu"]);
182                                       
183                                        $output->writeln("Nouvelle conversion : " . $c["fichier_dest"]);
184
185                                }
186                               
187                        }
188
189                }
190                else{
191                        $output->writeln('<error>Vous n’êtes pas dans une installation de SPIP. Impossible de convertir le texte.</error>');
192                }
193        }
194}
195
Note: See TracBrowser for help on using the repository browser.