diff --git a/ecrire/exec/import_all.php b/ecrire/exec/import_all.php index 5ecbd823336a7bff391658cc9cb3fcfe48dce1f5..9fbae317cf140d108f4a49f42f962c74fcd7578a 100644 --- a/ecrire/exec/import_all.php +++ b/ecrire/exec/import_all.php @@ -118,12 +118,13 @@ function exec_import_all_dist() if ($my_date) { + global $trans; if ($request['insertion'] == 'passe2') { include_spip('inc/import_insere'); $trans = translate_init($request); } else $trans = array(); - $res = import_tables($request, $dir, $trans); + $res = import_tables($request, $dir); } echo $res, "</body></html>\n"; diff --git a/ecrire/inc/import.php b/ecrire/inc/import.php index 458336029a1a71a488a2666dee87d00fcc387e63..57e8f0b98e6db2d728b285d066a52a7edcbfb3c3 100644 --- a/ecrire/inc/import.php +++ b/ecrire/inc/import.php @@ -153,9 +153,8 @@ function detruit_restaurateur() } // http://doc.spip.org/@import_tables -function import_tables($request, $dir, $trans=array()) { +function import_tables($request, $dir) { global $import_ok, $abs_pos, $affiche_progression_pourcent; - static $time_javascript; $my_pos = (!isset($GLOBALS['meta']["status_restauration"])) ? 0 : $GLOBALS['meta']["status_restauration"]; @@ -216,7 +215,7 @@ function import_tables($request, $dir, $trans=array()) { flush(); $oldtable =''; - while ($table = $fimport($file, $request, $gz, $trans)) { + while ($table = $fimport($file, $request, $gz)) { // Pas d'ecriture SQL car sinon le temps double. // Il faut juste faire attention a bien lire_metas() // au debut de la restauration @@ -224,11 +223,10 @@ function import_tables($request, $dir, $trans=array()) { if ($oldtable != $table) { spip_log("Restauration de $table"); affiche_progression_javascript($abs_pos,$size,$table); - - $time_javascript = time(); $oldtable = $table; } } + if (!$import_ok) $res = _T('avis_archive_invalide'); else { diff --git a/ecrire/inc/import_0_0.php b/ecrire/inc/import_0_0.php index 77b75b7493d70266d0f04c54804253933de3bb59..e6ced6b6cd3940688ab906ca6c164fca5dd952b9 100644 --- a/ecrire/inc/import_0_0.php +++ b/ecrire/inc/import_0_0.php @@ -15,7 +15,7 @@ if (!defined("_ECRIRE_INC_VERSION")) return; // pour le support des vieux dump // pff ou vous l'avez trouve ce dump ? // http://doc.spip.org/@inc_import_0_0_dist -function inc_import_0_0_dist($f, $request, $gz=false, $t='') { +function inc_import_0_0_dist($f, $request, $gz=false) { global $import_ok; // detruire les tables a restaurer diff --git a/ecrire/inc/import_1_2.php b/ecrire/inc/import_1_2.php index 3fe20e206df877bf7e2e508fab8a9cf021f444ee..d6b516e46bafb31dab343a54e5fc13c14e6ac94b 100644 --- a/ecrire/inc/import_1_2.php +++ b/ecrire/inc/import_1_2.php @@ -38,7 +38,7 @@ function description_table($nom){ // pour le support des vieux dump // http://doc.spip.org/@inc_import_1_2_dist -function inc_import_1_2_dist($f, $request, $gz=false, $t='') { +function inc_import_1_2_dist($f, $request, $gz=false) { global $import_ok; static $field_desc = array (); diff --git a/ecrire/inc/import_1_3.php b/ecrire/inc/import_1_3.php index 76a26af7ef8fda7df635e756af7315c12a842ab1..5aa3f07304cc4aab55a15a246374bf5ca1eba9b6 100644 --- a/ecrire/inc/import_1_3.php +++ b/ecrire/inc/import_1_3.php @@ -37,8 +37,8 @@ function description_table($nom){ } // http://doc.spip.org/@inc_import_1_3_dist -function inc_import_1_3_dist($lecteur, $request, $gz=false, $trans=array()) { - global $import_ok, $abs_pos, $tables_trans; +function inc_import_1_3_dist($lecteur, $request, $gz=false) { + global $import_ok, $abs_pos, $tables_trans, $trans; static $tables = ''; static $phpmyadmin, $fin; static $field_desc = array (); @@ -102,13 +102,13 @@ function inc_import_1_3_dist($lecteur, $request, $gz=false, $trans=array()) { '/' . $table); if ($values === false) return ($import_ok = false); - if ($values) $boucle($values, $new, $desc, $request, $trans); + if ($values) $boucle($values, $new, $desc, $request); return $import_ok = $new; } // http://doc.spip.org/@import_replace -function import_replace($values, $table, $desc, $request, $trans) { +function import_replace($values, $table, $desc, $request) { if (!spip_query("REPLACE $table (" . join(',',array_keys($values)) . ') VALUES (' .join(',',array_map('_q', $values)) . ')')) { $GLOBALS['erreur_restauration'] = spip_sql_error(); } diff --git a/ecrire/inc/import_insere.php b/ecrire/inc/import_insere.php index d0d9e04a55cab54dbcf5ebe064581447be8c7a03..496644056d8b476778498320fdba02168a94cd83 100644 --- a/ecrire/inc/import_insere.php +++ b/ecrire/inc/import_insere.php @@ -55,12 +55,14 @@ function insere_1_init($request) { return insere_2_init($request); } +// construire le tableau PHP de la table spip_translate +// (mis en table pour pouvoir reprendre apres interruption) + // http://doc.spip.org/@translate_init function translate_init($request) { - /* - construire le tableau PHP de la table spip_translate - (mis en table pour pouvoir reprendre apres interruption) - */ + + include_spip('inc/texte.php'); // pour les Regexp des raccourcis + $q = spip_query("SELECT * FROM spip_translate"); $trans = array(); while ($r = spip_fetch_array($q)) { @@ -71,13 +73,14 @@ function translate_init($request) { // http://doc.spip.org/@import_insere -function import_insere($values, $table, $desc, $request, $trans) { +function import_insere($values, $table, $desc, $request) { + $type_id = $desc['key']["PRIMARY KEY"]; // reserver une place dans les tables principales si nouveau $ajout = 0; if ((!function_exists($f = 'import_identifie_' . $type_id)) - OR (!$n = $f($values, $table, $desc, $request, $trans))) { + OR (!$n = $f($values, $table, $desc, $request))) { $n = spip_abstract_insert($table, '', '()'); if (!$n) { $GLOBALS['erreur_restauration'] = spip_sql_error(); @@ -107,25 +110,19 @@ function import_insere($values, $table, $desc, $request, $trans) { // si une autre occurrence est rencontree a la reprise. Pas dramatique. // http://doc.spip.org/@import_translate -function import_translate($values, $table, $desc, $request, &$trans) { +function import_translate($values, $table, $desc, $request) { + global $trans; $vals = ''; foreach ($values as $k => $v) { if ($k=='id_parent' OR $k=='id_secteur') $k = 'id_rubrique'; - if (isset($trans[$k]) AND isset($trans[$k][$v])) { - list($g, $titre, $ajout) = $trans[$k][$v]; - if ($g < 0) { - $f = 'import_identifie_parent_' . $k; - $g = $f($g, $titre, $trans, $v); - if ($g > 0) - // memoriser qu'on insere - $trans[$k][$v][2]=1; - else $g = (0-$g); -# spip_log("MAJ $k $v = $g"); - $trans[$k][$v][0] = $g; + $v = importe_translate_maj($k, $v); + + if (preg_match_all(_RACCOURCI_LIEN, $v, $m, PREG_SET_ORDER)) { + foreach ($m as $regs) { + $v = importe_raccourci($regs, $k, $v); } - $v = $g; } $vals .= "," . _q($v); @@ -134,14 +131,47 @@ function import_translate($values, $table, $desc, $request, &$trans) { $p = $desc['key']["PRIMARY KEY"]; $v = $values[$p]; if (!isset($trans[$p]) OR !isset($trans[$p][$v]) OR $trans[$p][$v][2]) - spip_query("REPLACE $table (" . join(',',array_keys($values)) . ') VALUES (' .substr($vals,1) . ')'); -# else spip_log("evite $p $v $table"); + spip_query($q = "REPLACE $table (" . join(',',array_keys($values)) . ') VALUES (' .substr($vals,1) . ')'); } +function importe_translate_maj($k, $v) +{ + global $trans; + if (!(isset($trans[$k]) AND isset($trans[$k][$v]))) return $v; + + list($g, $titre, $ajout) = $trans[$k][$v]; + if ($g < 0) { + $f = 'import_identifie_parent_' . $k; + $g = $f($g, $titre, $v); + if ($g > 0) + // memoriser qu'on insere + $trans[$k][$v][2]=1; + else $g = (0-$g); + $trans[$k][$v][0] = $g; + } + return $g; +} + +function importe_raccourci($regs, $k, $v) +{ + $lien = vider_url($regs[3]); # supprimer 'http://' ou 'mailto:' + + if (!$match = typer_raccourci($lien)) return $v; + + list($f,$objet,$id,$params,$ancre) = $match; + + $k = 'id_' . $f; + $g = importe_translate_maj($k, $id); + + if ($g == $id) return $v; + + $rac = '[' . $regs[1] . '->' . $reg[2] . $objet . $g . $params . $ancre .']'; + return str_replace($regs[0], $rac, $v); +} // deux groupes de mots ne peuvent avoir le meme titre ==> identification // http://doc.spip.org/@import_identifie_id_groupe -function import_identifie_id_groupe($values, $table, $desc, $request, $trans) { +function import_identifie_id_groupe($values, $table, $desc, $request) { $r = spip_fetch_array(spip_query($q = "SELECT id_groupe, titre FROM spip_groupes_mots WHERE titre=" . _q($values['titre'])), SPIP_NUM); return $r; } @@ -149,14 +179,15 @@ function import_identifie_id_groupe($values, $table, $desc, $request, $trans) { // pour un mot le titre est insuffisant, il faut aussi l'identite du groupe. // Memoriser ces 2 infos et le signaler a import_translate grace a 1 negatif // http://doc.spip.org/@import_identifie_id_mot -function import_identifie_id_mot($values, $table, $desc, $request, $trans) { +function import_identifie_id_mot($values, $table, $desc, $request) { return array((0 - $values['id_groupe']), $values['titre']); } // mot de meme titre et de meme groupe ==> identification // http://doc.spip.org/@import_identifie_parent_id_mot -function import_identifie_parent_id_mot($id_groupe, $titre, $trans, $v) +function import_identifie_parent_id_mot($id_groupe, $titre, $v) { + global $trans; $titre = _q($titre); $id_groupe = 0-$id_groupe; if (isset($trans['id_groupe']) @@ -173,49 +204,51 @@ function import_identifie_parent_id_mot($id_groupe, $titre, $trans, $v) // pour une rubrique le titre est insuffisant, il faut l'identite du parent // Memoriser ces 2 infos et le signaler a import_translate grace a 1 negatif -function import_identifie_id_rubrique($values, $table, $desc, $request, $trans) { +function import_identifie_id_rubrique($values, $table, $desc, $request) { return array((0 - $values['id_parent']), $values['titre']); } // renumerotation en cascade. // rubrique de meme titre et de meme parent ==> identification -function import_identifie_parent_id_rubrique($id_parent, $titre, &$trans, $v) +function import_identifie_parent_id_rubrique($id_parent, $titre, $v) { -# spip_log("import_identifie_parent_id_rubrique($id_parent, $titre, $v "); + global $trans; if (isset($trans['id_rubrique'])) { if ($id_parent < 0) { $id_parent = (0 - $id_parent); - $pitre = $trans['id_rubrique'][$id_parent][1]; $gparent = $trans['id_rubrique'][$id_parent][0]; - $n = import_identifie_parent_id_rubrique($gparent, $pitre, $trans, $id_parent); -# spip_log("MAJ_rub $id_parent = $n"); - $trans['id_rubrique'][$id_parent][0] = $n>0 ? $n: (0-$n); - if ($n > 0) { - $trans['id_rubrique'][$id_parent][2]=1; // nouvelle rub. - return import_alloue_id_rubrique($n, $titre, $trans, $v); - } + // parent deja renumerote depuis le debut la passe 2 + if ($gparent > 0) + $id_parent = $gparent; else { - $id_parent = (0 - $n); + // premiere occurrence du parent + $pitre = $trans['id_rubrique'][$id_parent][1]; + $n = import_identifie_parent_id_rubrique($gparent, $pitre, $id_parent); + $trans['id_rubrique'][$id_parent][0] = ($n>0) ? $n: (0-$n); + // parent tout neuf, + // pas la peine de chercher un titre homonyme + if ($n > 0) { + $trans['id_rubrique'][$id_parent][2]=1; // nouvelle rub. + return import_alloue_id_rubrique($n, $titre, $v); + } else $id_parent = (0 - $n); } } $r = spip_fetch_array(spip_query("SELECT id_rubrique FROM spip_rubriques WHERE titre=" . _q($titre) . " AND id_parent=" . intval($id_parent))); if ($r) { -# spip_log("identification $titre $v de nouveau part $id_parent a " . (0 - $r['id_rubrique'])); return (0 - $r['id_rubrique']); } - return import_alloue_id_rubrique($id_parent, $titre, $trans, $v); + return import_alloue_id_rubrique($id_parent, $titre, $v); } } // reserver la place en mettant titre et parent tout de suite // pour que le SELECT ci-dessus fonctionne a la prochaine occurrence -function import_alloue_id_rubrique($id_parent, $titre, &$trans, $v) { +function import_alloue_id_rubrique($id_parent, $titre, $v) { $titre = _q($titre); $r = spip_abstract_insert('spip_rubriques', '(titre, id_parent)', "($titre,$id_parent)"); spip_query("REPLACE spip_translate (id_old, id_new, titre, type, ajout) VALUES ($v,$r,$titre,'id_rubrique',1)"); -# spip_log("allocation rub $titre $r pour $v nouveau parent $id_parent"); return $r; } diff --git a/ecrire/inc/texte.php b/ecrire/inc/texte.php index c900867b6eaeff8a16021c3e65d716d95e462266..2e98a9b00008eaf5394142b0ae8fc4a607f8e5ac 100644 --- a/ecrire/inc/texte.php +++ b/ecrire/inc/texte.php @@ -636,6 +636,30 @@ function extraire_lien ($regs) { } // traitement des raccourcis issus de [TITRE->RACCOURCInnn] et connexes + +define('_RACCOURCI_URL', ',^(\S*?)\s*(\d+)(\?.*?)?(#[^\s]*)?$,S'); + +function typer_raccourci ($lien) { + + if (!preg_match(_RACCOURCI_URL, trim($lien), $match)) return false; + + $f = $match[1]; + + // valeur par defaut et alias historiques + if (!$f) $f = 'article'; + else if ($f == 'art') $f = 'article'; + else if ($f == 'br') $f = 'breve'; + else if ($f == 'rub') $f = 'rubrique'; + else if ($f == 'aut') $f = 'auteur'; + else if ($f == 'doc' OR $f == 'im' OR $f == 'img' OR $f == 'image' OR $f == 'emb') + $f = 'document'; + else if (preg_match(',^br..?ve$,S', $f)) $f = 'breve'; # accents :( + $match[0] = $f; + return $match; +} + +// Cherche un lien du type [->raccourci 123] +// associe a une fonction generer_url_raccourci() // // Valeur retournee selon le parametre $pour: // 'tout' : <a href="L">T</a> @@ -646,23 +670,8 @@ function extraire_lien ($regs) { function calculer_url ($lien, $texte='', $pour='url') { $lien = vider_url($lien); # supprimer 'http://' ou 'mailto:' - // Cherche un lien du type [->raccourci 123] - // associe a une fonction generer_url_raccourci() - if (preg_match(',^(\S*?)\s*(\d+)(\?.*?)?(#[^\s]*)?$,S', trim($lien), $match)) { - list(,$objet,$id,$params,$ancre) = $match; - - // valeur par defaut - if (!$f = $objet) $f = 'article'; - - // aliases (historique) - if ($f == 'art') $f = 'article'; - else if ($f == 'br') $f = 'breve'; - else if ($f == 'rub') $f = 'rubrique'; - else if ($f == 'aut') $f = 'auteur'; - else if ($f == 'doc' OR $f == 'im' OR $f == 'img' OR $f == 'image' OR $f == 'emb') - $f = 'document'; - else if (preg_match(',^br..?ve$,S', $f)) $f = 'breve'; # accents :( - + if ($match = typer_raccourci ($lien)) { + list($f,$objet,$id,$params,$ancre) = $match; // chercher la fonction nommee generer_url_$raccourci // ou calculer_url_raccourci si on n'a besoin que du lien $f=(($pour == 'url') ? 'generer' : 'calculer') . '_url_' . $f; @@ -1188,6 +1197,8 @@ function traiter_raccourci_lien($regs) { . "</a>"); } +// Regexp des raccouris, aussi utilisee pour la fusion de sauvegarde Spip +define('_RACCOURCI_LIEN', ",\[([^][]*)->(>?)([^]]*)\],msS"); // Nettoie un texte, traite les raccourcis spip, la typo, etc. // http://doc.spip.org/@traiter_raccourcis @@ -1352,9 +1363,9 @@ function traiter_raccourcis($letexte) { // Note : complique car c'est ici qu'on applique typo(), // et en plus on veut pouvoir les passer en pipeline // - $regexp = ",\[([^][]*)->(>?)([^]]*)\],msS"; + $inserts = array(); - if (preg_match_all($regexp, $letexte, $matches, PREG_SET_ORDER)) { + if (preg_match_all(_RACCOURCI_LIEN, $letexte, $matches, PREG_SET_ORDER)) { $i = 0; foreach ($matches as $regs) { $inserts[++$i] = traiter_raccourci_lien($regs);