Changeset 93622 in spip-zone
- Timestamp:
- Dec 13, 2015, 11:52:51 AM (5 years ago)
- Location:
- _core_/plugins/revisions
- Files:
-
- 18 edited
Legend:
- Unmodified
- Added
- Removed
-
_core_/plugins/revisions/afficher_diff/champ.php
r93092 r93622 11 11 \***************************************************************************/ 12 12 13 if (!defined("_ECRIRE_INC_VERSION")) return; 13 if (!defined("_ECRIRE_INC_VERSION")) { 14 return; 15 } 14 16 15 17 include_spip('inc/diff'); … … 17 19 /** 18 20 * Afficher le diff d'un champ texte generique 21 * 19 22 * @param string $champ 20 23 * @param string $old … … 24 27 * @return string 25 28 */ 26 function afficher_diff_champ_dist($champ, $old, $new, $format = 'diff') {29 function afficher_diff_champ_dist($champ, $old, $new, $format = 'diff') { 27 30 // ne pas se compliquer la vie ! 28 if ($old ==$new)29 $out = ($format !='complet'?'':$new);30 else {31 if ($f = charger_fonction($champ,'afficher_diff', true)){31 if ($old == $new) { 32 $out = ($format != 'complet' ? '' : $new); 33 } else { 34 if ($f = charger_fonction($champ, 'afficher_diff', true)) { 32 35 return $f($champ, $old, $new, $format); 33 36 } 34 37 35 38 $diff = new Diff(new DiffTexte); 36 39 $n = preparer_diff($new); 37 40 $o = preparer_diff($old); 38 41 39 $out = afficher_diff($diff->comparer($n, $o));40 if ($format == 'diff' OR $format == 'apercu') 42 $out = afficher_diff($diff->comparer($n, $o)); 43 if ($format == 'diff' OR $format == 'apercu') { 41 44 $out = afficher_para_modifies($out, ($format == 'apercu')); 45 } 42 46 } 47 43 48 return $out; 44 49 } … … 52 57 * @return string 53 58 */ 54 function afficher_para_modifies 59 function afficher_para_modifies($texte, $court = false) { 55 60 // Limiter la taille de l'affichage 56 if ($court) $max = 200; 57 else $max = 2000; 61 if ($court) { 62 $max = 200; 63 } else { 64 $max = 2000; 65 } 58 66 59 67 $texte_ret = ""; 60 $paras = explode ("\n",$texte);68 $paras = explode("\n", $texte); 61 69 for ($i = 0; $i < count($paras) AND strlen($texte_ret) < $max; $i++) { 62 if (strpos($paras[$i], '"diff-')) $texte_ret .= $paras[$i]."\n\n"; 70 if (strpos($paras[$i], '"diff-')) { 71 $texte_ret .= $paras[$i] . "\n\n"; 72 } 63 73 # if (strlen($texte_ret) > $max) $texte_ret .= '(...)'; 64 74 } 65 75 $texte = $texte_ret; 76 66 77 return $texte; 67 78 } -
_core_/plugins/revisions/afficher_diff/id_rubrique.php
r93092 r93622 11 11 \***************************************************************************/ 12 12 13 if (!defined("_ECRIRE_INC_VERSION")) return; 13 if (!defined("_ECRIRE_INC_VERSION")) { 14 return; 15 } 14 16 15 17 include_spip('inc/diff'); … … 26 28 * @return string 27 29 */ 28 function afficher_diff_id_rubrique_dist($champ, $old, $new, $format = 'diff') {30 function afficher_diff_id_rubrique_dist($champ, $old, $new, $format = 'diff') { 29 31 // ne pas se compliquer la vie ! 30 if ($old ==$new)32 if ($old == $new) { 31 33 $out = _T('info_dans_rubrique') 32 . " <b>« ".generer_info_entite($new,'rubrique','titre')." »</b>";33 else34 . " <b>« " . generer_info_entite($new, 'rubrique', 'titre') . " »</b>"; 35 } else { 34 36 $out = _T('revisions:version_deplace_rubrique', 35 array('from'=> generer_info_entite($old,'rubrique','titre') 36 ,'to'=>generer_info_entite($new,'rubrique','titre') 37 ) 38 ); 37 array( 38 'from' => generer_info_entite($old, 'rubrique', 'titre') 39 , 40 'to' => generer_info_entite($new, 'rubrique', 'titre') 41 ) 42 ); 43 } 44 39 45 return $out; 40 46 } -
_core_/plugins/revisions/afficher_diff/jointure.php
r93092 r93622 11 11 \***************************************************************************/ 12 12 13 if (!defined("_ECRIRE_INC_VERSION")) return; 13 if (!defined("_ECRIRE_INC_VERSION")) { 14 return; 15 } 14 16 15 17 include_spip('inc/diff'); … … 17 19 /** 18 20 * Afficher le diff d'un champ texte generique 21 * 19 22 * @param string $champ 20 23 * @param string $old … … 24 27 * @return string 25 28 */ 26 function afficher_diff_jointure_dist($champ, $old, $new, $format = 'diff') {27 $join = substr($champ, 9);29 function afficher_diff_jointure_dist($champ, $old, $new, $format = 'diff') { 30 $join = substr($champ, 9); 28 31 $objet = objet_type($join); 29 32 30 $old = explode(',', $old);31 $new = explode(',', $new);33 $old = explode(',', $old); 34 $new = explode(',', $new); 32 35 33 36 $liste = array(); 34 37 35 38 // les communs 36 $intersection = array_intersect($new,$old); 37 foreach($intersection as $id) 38 if ($id=intval(trim($id))) 39 $liste[$id] = "<a href='".generer_url_entite($id,$objet)."' title='"._T(objet_info($objet,'texte_objet'))." $id'>".generer_info_entite($id,$objet,'titre')."</a>"; 39 $intersection = array_intersect($new, $old); 40 foreach ($intersection as $id) { 41 if ($id = intval(trim($id))) { 42 $liste[$id] = "<a href='" . generer_url_entite($id, $objet) . "' title='" . _T(objet_info($objet, 43 'texte_objet')) . " $id'>" . generer_info_entite($id, $objet, 'titre') . "</a>"; 44 } 45 } 40 46 41 47 // les supprimes 42 $old = array_diff($old, $intersection);43 foreach ($old as $id)44 if ($id =intval(trim($id)))48 $old = array_diff($old, $intersection); 49 foreach ($old as $id) { 50 if ($id = intval(trim($id))) { 45 51 $liste[$id] = "<span class='diff-supprime'>" 46 . "<a href='".generer_url_entite($id,$objet)."' title='"._T(objet_info($objet,'texte_objet'))." $id'>".generer_info_entite($id,$objet,'titre')."</a>" 47 . "</span>"; 52 . "<a href='" . generer_url_entite($id, $objet) . "' title='" . _T(objet_info($objet, 53 'texte_objet')) . " $id'>" . generer_info_entite($id, $objet, 'titre') . "</a>" 54 . "</span>"; 55 } 56 } 48 57 49 58 // les ajoutes 50 $new = array_diff($new, $intersection);51 foreach ($new as $id)52 if ($id =intval(trim($id)))59 $new = array_diff($new, $intersection); 60 foreach ($new as $id) { 61 if ($id = intval(trim($id))) { 53 62 $liste[$id] = "<span class='diff-ajoute'>" 54 . "<a href='".generer_url_entite($id,$objet)."' title='"._T(objet_info($objet,'texte_objet'))." $id'>".generer_info_entite($id,$objet,'titre')."</a>" 55 . "</span>"; 63 . "<a href='" . generer_url_entite($id, $objet) . "' title='" . _T(objet_info($objet, 64 'texte_objet')) . " $id'>" . generer_info_entite($id, $objet, 'titre') . "</a>" 65 . "</span>"; 66 } 67 } 56 68 57 69 ksort($liste); 58 $liste = implode(', ',$liste); 70 $liste = implode(', ', $liste); 71 59 72 return $liste; 60 73 } -
_core_/plugins/revisions/base/revisions.php
r89285 r93622 13 13 /** 14 14 * Déclarations relatives à la base de données 15 * 15 * 16 16 * @package SPIP\Revisions\Pipelines 17 **/17 **/ 18 18 19 if (!defined('_ECRIRE_INC_VERSION')) return; 19 if (!defined('_ECRIRE_INC_VERSION')) { 20 return; 21 } 20 22 21 23 /** … … 28 30 * Déclarations d'interface pour le compilateur 29 31 */ 30 function revisions_declarer_tables_interfaces($interface) {32 function revisions_declarer_tables_interfaces($interface) { 31 33 32 $interface['table_des_tables']['versions'] ='versions';34 $interface['table_des_tables']['versions'] = 'versions'; 33 35 34 36 return $interface; … … 37 39 /** 38 40 * Déclaration des jointures génériques 39 * 41 * 40 42 * @pipeline declarer_tables_objets_sql 41 43 * @param array $tables … … 44 46 * Description complétée des tables 45 47 */ 46 function revisions_declarer_tables_objets_sql($tables) {48 function revisions_declarer_tables_objets_sql($tables) { 47 49 48 50 // jointures sur les mots pour tous les objets 49 $tables[]['tables_jointures'][] = 'versions';51 $tables[]['tables_jointures'][] = 'versions'; 50 52 51 53 return $tables; … … 62 64 * Description complétée des tables 63 65 */ 64 function revisions_declarer_tables_auxiliaires($tables_auxiliaires) {66 function revisions_declarer_tables_auxiliaires($tables_auxiliaires) { 65 67 66 $spip_versions = array 67 "id_version" 68 "id_objet" 69 "objet" 70 "date" 71 "id_auteur" 72 "titre_version" 73 "permanent" 74 "champs" 68 $spip_versions = array( 69 "id_version" => "bigint(21) DEFAULT 0 NOT NULL", 70 "id_objet" => "bigint(21) DEFAULT 0 NOT NULL", 71 "objet" => "VARCHAR (25) DEFAULT '' NOT NULL", 72 "date" => "datetime DEFAULT '0000-00-00 00:00:00' NOT NULL", 73 "id_auteur" => "VARCHAR(23) DEFAULT '' NOT NULL", # stocke aussi IP(v6) 74 "titre_version" => "text DEFAULT '' NOT NULL", 75 "permanent" => "char(3) DEFAULT '' NOT NULL", 76 "champs" => "text DEFAULT '' NOT NULL" 75 77 ); 76 78 77 $spip_versions_key = array 78 "PRIMARY KEY" 79 $spip_versions_key = array( 80 "PRIMARY KEY" => "id_version, id_objet, objet", 79 81 "KEY id_version" => "id_version", 80 82 "KEY id_objet" => "id_objet", 81 "KEY objet" => "objet"); 83 "KEY objet" => "objet" 84 ); 82 85 83 86 $spip_versions_fragments = array( 84 "id_fragment" 85 "version_min" 86 "version_max" 87 "id_objet" 88 "objet" 89 "compress" 90 "fragment" 87 "id_fragment" => "int unsigned DEFAULT '0' NOT NULL", 88 "version_min" => "int unsigned DEFAULT '0' NOT NULL", 89 "version_max" => "int unsigned DEFAULT '0' NOT NULL", 90 "id_objet" => "bigint(21) NOT NULL", 91 "objet" => "VARCHAR (25) DEFAULT '' NOT NULL", 92 "compress" => "tinyint NOT NULL", 93 "fragment" => "longblob" # ici c'est VRAIMENT un blob (on y stocke du gzip) 91 94 ); 92 95 93 96 $spip_versions_fragments_key = array( 94 "PRIMARY KEY" 97 "PRIMARY KEY" => "id_objet, objet, id_fragment, version_min" 95 98 ); 96 99 … … 98 101 $tables_auxiliaires['spip_versions'] = array( 99 102 'field' => &$spip_versions, 100 'key' => &$spip_versions_key); 103 'key' => &$spip_versions_key 104 ); 101 105 102 106 $tables_auxiliaires['spip_versions_fragments'] = array( 103 107 'field' => &$spip_versions_fragments, 104 'key' => &$spip_versions_fragments_key); 108 'key' => &$spip_versions_fragments_key 109 ); 105 110 106 111 return $tables_auxiliaires; -
_core_/plugins/revisions/formulaires/configurer_revisions_objets.php
r89285 r93622 11 11 \***************************************************************************/ 12 12 13 if (!defined("_ECRIRE_INC_VERSION")) return; 13 if (!defined("_ECRIRE_INC_VERSION")) { 14 return; 15 } 14 16 15 function formulaires_configurer_revisions_objets_charger_dist() {16 if (!$objets = unserialize($GLOBALS['meta']['objets_versions'])) 17 function formulaires_configurer_revisions_objets_charger_dist() { 18 if (!$objets = unserialize($GLOBALS['meta']['objets_versions'])) { 17 19 $objets = array(); 20 } 18 21 $valeurs = array( 19 'objets_versions' =>$objets,22 'objets_versions' => $objets, 20 23 ); 21 24 … … 23 26 } 24 27 25 function formulaires_configurer_revisions_objets_traiter_dist() {28 function formulaires_configurer_revisions_objets_traiter_dist() { 26 29 27 30 include_spip('inc/meta'); 28 31 $tables = serialize(_request('objets_versions')); 29 ecrire_meta('objets_versions', $tables);32 ecrire_meta('objets_versions', $tables); 30 33 31 return array('message_ok' =>_T('config_info_enregistree'));34 return array('message_ok' => _T('config_info_enregistree')); 32 35 } 33 36 34 function test_objet_versionable($desc) {37 function test_objet_versionable($desc) { 35 38 if (!$desc['editable'] 36 39 OR !isset($desc['champs_versionnes']) 37 40 OR !count($desc['champs_versionnes']) 38 ) 41 ) { 39 42 return ''; 43 } 40 44 41 45 // regarder si il y a un vrai champ versionne, pas seulement une jointure 42 foreach ($desc['champs_versionnes'] as $c) {43 if (strncmp($c, 'jointure_',9)!=0)46 foreach ($desc['champs_versionnes'] as $c) { 47 if (strncmp($c, 'jointure_', 9) != 0) { 44 48 return ' '; 49 } 45 50 } 46 51 … … 48 53 return ''; 49 54 } 55 50 56 ?> -
_core_/plugins/revisions/formulaires/reviser.php
r93092 r93622 11 11 \***************************************************************************/ 12 12 13 if (!defined("_ECRIRE_INC_VERSION")) return; 13 if (!defined("_ECRIRE_INC_VERSION")) { 14 return; 15 } 14 16 15 17 include_spip('base/abstract_sql'); 16 18 17 function trouver_version_inf($objet, $id_objet, $cond = "") {19 function trouver_version_inf($objet, $id_objet, $cond = "") { 18 20 return sql_getfetsel( 19 20 21 ($cond?"$cond AND ":"")."objet=".sql_quote($objet)." AND id_objet=".intval($id_objet),22 23 24 25 21 'id_version', 22 'spip_versions', 23 ($cond ? "$cond AND " : "") . "objet=" . sql_quote($objet) . " AND id_objet=" . intval($id_objet), 24 '', 25 'id_version DESC', 26 '0,1' 27 ); 26 28 } 27 function check_version_diff($objet, $id_objet, $id_version, $id_diff, $last_version = 0){ 28 if (!$last_version) 29 $last_version = trouver_version_inf($objet,$id_objet); 29 30 function check_version_diff($objet, $id_objet, $id_version, $id_diff, $last_version = 0) { 31 if (!$last_version) { 32 $last_version = trouver_version_inf($objet, $id_objet); 33 } 30 34 31 35 // si pas de diff possible, on renvoi 0,0 32 if (!$last_version) 33 return array(0,0); 36 if (!$last_version) { 37 return array(0, 0); 38 } 34 39 35 if ($last_version==1) 36 return array(1,0); 40 if ($last_version == 1) { 41 return array(1, 0); 42 } 37 43 38 $id_version = max($id_version, 2);39 $id_version = min($id_version, $last_version);44 $id_version = max($id_version, 2); 45 $id_version = min($id_version, $last_version); 40 46 41 47 // verifier id_version 42 $id_version = trouver_version_inf($objet, $id_objet,"id_version<=".intval($id_version));48 $id_version = trouver_version_inf($objet, $id_objet, "id_version<=" . intval($id_version)); 43 49 44 50 // si rien trouve on prend la derniere 45 if (!$id_version) 51 if (!$id_version) { 46 52 $id_version = $last_version; 53 } 47 54 48 55 // minorer id_diff en fonction de id_version 49 $id_diff = min($id_diff, $id_version-1);56 $id_diff = min($id_diff, $id_version-1); 50 57 // verifier id_diff 51 $id_diff = trouver_version_inf($objet, $id_objet,"id_version<=".intval($id_diff));58 $id_diff = trouver_version_inf($objet, $id_objet, "id_version<=" . intval($id_diff)); 52 59 53 if (!$id_diff) 54 $id_diff = trouver_version_inf($objet,$id_objet,"id_version<".intval($id_version)); 60 if (!$id_diff) { 61 $id_diff = trouver_version_inf($objet, $id_objet, "id_version<" . intval($id_version)); 62 } 55 63 56 64 // echec, on renvoi ce qu'on peut 57 if (!$id_diff) 65 if (!$id_diff) { 58 66 $id_diff = $id_version-1; 67 } 59 68 60 69 return array($id_version, $id_diff); 61 70 } 62 71 63 function formulaires_reviser_charger_dist($objet, $id_objet, $id_version, $id_diff) {64 if (!$objets = unserialize($GLOBALS['meta']['objets_versions'])) 72 function formulaires_reviser_charger_dist($objet, $id_objet, $id_version, $id_diff) { 73 if (!$objets = unserialize($GLOBALS['meta']['objets_versions'])) { 65 74 $objets = array(); 75 } 66 76 67 if (!in_array(table_objet_sql($objet), $objets))77 if (!in_array(table_objet_sql($objet), $objets)) { 68 78 return false; 79 } 69 80 70 $last_version = trouver_version_inf($objet, $id_objet);71 list($id_version, $id_diff) = check_version_diff($objet,$id_objet,$id_version,$id_diff,$last_version);72 if (!$id_version) 81 $last_version = trouver_version_inf($objet, $id_objet); 82 list($id_version, $id_diff) = check_version_diff($objet, $id_objet, $id_version, $id_diff, $last_version); 83 if (!$id_version) { 73 84 return false; 74 85 } 86 75 87 $valeurs = array( 76 '_last_version' =>$last_version,77 '_objet' =>$objet,78 '_id_objet' =>$id_objet,79 'id_version' =>$id_version,80 'id_diff' =>$id_diff,88 '_last_version' => $last_version, 89 '_objet' => $objet, 90 '_id_objet' => $id_objet, 91 'id_version' => $id_version, 92 'id_diff' => $id_diff, 81 93 ); 82 94 … … 84 96 } 85 97 86 function formulaires_reviser_verifier_dist($objet, $id_objet, $id_version, $id_diff) {98 function formulaires_reviser_verifier_dist($objet, $id_objet, $id_version, $id_diff) { 87 99 $erreurs = array(); 88 list($id_version,$id_diff) = check_version_diff($objet,$id_objet,_request('id_version'),_request('id_diff')); 89 set_request('id_version',$id_version); 90 set_request('id_diff',$id_diff); 100 list($id_version, $id_diff) = check_version_diff($objet, $id_objet, _request('id_version'), _request('id_diff')); 101 set_request('id_version', $id_version); 102 set_request('id_diff', $id_diff); 103 91 104 return $erreurs; 92 105 } 93 106 94 function formulaires_reviser_traiter_dist($objet, $id_objet, $id_version, $id_diff) {95 $res = array('message_ok' =>'','editable'=>true);107 function formulaires_reviser_traiter_dist($objet, $id_objet, $id_version, $id_diff) { 108 $res = array('message_ok' => '', 'editable' => true); 96 109 97 110 $id_version = _request('id_version'); 98 111 $id_diff = _request('id_diff'); 99 112 100 if (_AJAX) 101 $res['message_ok'].="<script type='text/javascript'>if (window.jQuery) jQuery('#wysiwyg.revision').ajaxReload({args:{id_version:$id_version,id_diff:$id_diff},history:true});</script>"; 102 else 103 $res['redirect'] = parametre_url(parametre_url(self(),'id_version',$id_version),'id_diff',$id_diff,'&'); 113 if (_AJAX) { 114 $res['message_ok'] .= "<script type='text/javascript'>if (window.jQuery) jQuery('#wysiwyg.revision').ajaxReload({args:{id_version:$id_version,id_diff:$id_diff},history:true});</script>"; 115 } else { 116 $res['redirect'] = parametre_url(parametre_url(self(), 'id_version', $id_version), 'id_diff', $id_diff, '&'); 117 } 118 104 119 return $res; 105 120 } -
_core_/plugins/revisions/genie/optimiser_revisions.php
r92827 r93622 16 16 */ 17 17 18 if (!defined('_ECRIRE_INC_VERSION')) return; 18 if (!defined('_ECRIRE_INC_VERSION')) { 19 return; 20 } 19 21 20 22 include_spip('base/abstract_sql'); … … 22 24 /** 23 25 * Tâche Cron d'optimisation des révisions 24 * 26 * 25 27 * @param int $last 26 28 * Timestamp de la dernière exécution de cette tâche … … 32 34 optimiser_base_revisions(); 33 35 optimiser_tables_revision(); 34 36 35 37 return 1; 36 38 } 37 39 38 40 /** 39 * Supprimer les révisions des objets disparus 41 * Supprimer les révisions des objets disparus 40 42 */ 41 function optimiser_base_revisions() {43 function optimiser_base_revisions() { 42 44 /** 43 45 * On commence par récupérer la liste des types d'objet ayant au moins une révision 44 */ 45 $objets_revises = sql_select('objet', 'spip_versions','id_version=1','objet');46 46 */ 47 $objets_revises = sql_select('objet', 'spip_versions', 'id_version=1', 'objet'); 48 47 49 /** 48 50 * Pour chaque objet, on va contruire un tableau des identifiants disparus 49 51 * On supprimera ensuite les occurences dans spip_versions et spip_versions_fragments 50 52 */ 51 while ($objet = sql_fetch($objets_revises)) {53 while ($objet = sql_fetch($objets_revises)) { 52 54 $in = array(); 53 55 $table = table_objet_sql($objet['objet']); 54 56 $id_table_objet = id_table_objet($objet['objet']); 55 57 $res = sql_select("A.id_objet AS id_objet, A.objet AS objet", 56 57 ON R.$id_table_objet=A.id_objet AND A.objet=" .sql_quote($objet['objet']),58 "R.$id_table_objet IS NULL AND A.objet=".sql_quote($objet['objet'])." AND A.id_objet > 0",59 60 58 "spip_versions AS A LEFT JOIN $table AS R 59 ON R.$id_table_objet=A.id_objet AND A.objet=" . sql_quote($objet['objet']), 60 "R.$id_table_objet IS NULL AND A.objet=" . sql_quote($objet['objet']) . " AND A.id_objet > 0", 61 "A.id_objet", 62 "A.id_objet"); 61 63 62 64 while ($row = sql_fetch($res)) { … … 67 69 /** 68 70 * Si on a un array 69 * On supprime toute occurence des objets disparus dans : 71 * On supprime toute occurence des objets disparus dans : 70 72 * -* spip_versions 71 73 * -* spip_versions_fragments 72 74 */ 73 75 if ($in) { 74 foreach (array('spip_versions','spip_versions_fragments') as $table){75 sql_delete($table, sql_in('id_objet',array_keys($in)) . " AND objet=".sql_quote($objet['objet']));76 foreach (array('spip_versions', 'spip_versions_fragments') as $table) { 77 sql_delete($table, sql_in('id_objet', array_keys($in)) . " AND objet=" . sql_quote($objet['objet'])); 76 78 } 77 79 } … … 82 84 * Optimisation des tables spip_versions et spip_versions_fragments 83 85 */ 84 function optimiser_tables_revision() {85 foreach (array('spip_versions','spip_versions_fragments') as $table){86 function optimiser_tables_revision() { 87 foreach (array('spip_versions', 'spip_versions_fragments') as $table) { 86 88 spip_log("debut d'optimisation de la table $table"); 87 if (sql_optimize($table)) 89 if (sql_optimize($table)) { 88 90 spip_log("fin d'optimisation de la table $table"); 89 else91 } else { 90 92 spip_log("Pas d'optimiseur necessaire pour $table"); 93 } 91 94 } 92 95 } 96 93 97 ?> -
_core_/plugins/revisions/inc/diff.php
r93105 r93622 15 15 * 16 16 * @package SPIP\Revisions\Diff 17 **/ 18 19 if (!defined("_ECRIRE_INC_VERSION")) return; 17 **/ 18 19 if (!defined("_ECRIRE_INC_VERSION")) { 20 return; 21 } 20 22 21 23 … … 24 26 25 27 /** 26 * Calcule un LCS (Longest Common Subsequence) simplifié 28 * Calcule un LCS (Longest Common Subsequence) simplifié 27 29 * 28 30 * Chaque chaîne est une permutation de l'autre et on passe en paramètre … … 32 34 * @param array $s 33 35 * @return array 34 **/36 **/ 35 37 function lcs_opt($s) { 36 38 $n = count($s); 37 if (!$n) return array(); 39 if (!$n) { 40 return array(); 41 } 38 42 $paths = array(); 39 43 $paths_ymin = array(); … … 44 48 $max = 400; 45 49 foreach ($s as $y => $c) { 46 if ($max-- < 0) break; # eviter l'explosion memoire des tres gros diff 50 if ($max-- < 0) { 51 break; 52 } # eviter l'explosion memoire des tres gros diff 47 53 for ($len = $max_len; $len > 0; $len--) { 48 54 if ($paths_ymin[$len] < $y) { 49 $paths_ymin[$len +1] = $y;50 $paths[$len +1] = $paths[$len];51 $paths[$len +1][$y] = $c;55 $paths_ymin[$len+1] = $y; 56 $paths[$len+1] = $paths[$len]; 57 $paths[$len+1][$y] = $c; 52 58 break; 53 59 } … … 57 63 $paths[1] = array($y => $c); 58 64 } 59 if ($len + 1 > $max_len) $max_len = $len + 1; 60 } 65 if ($len+1 > $max_len) { 66 $max_len = $len+1; 67 } 68 } 69 61 70 return $paths[$max_len]; 62 71 } … … 71 80 * @param array $t 72 81 * @return array 73 **/82 **/ 74 83 function lcs($s, $t) { 75 84 $n = count($s); 76 85 $p = count($t); 77 if (!$n || !$p) return array(0 => array(), 1 => array()); 86 if (!$n || !$p) { 87 return array(0 => array(), 1 => array()); 88 } 78 89 $paths = array(); 79 90 $paths_ymin = array(); … … 82 93 83 94 // Insertion des points 84 foreach ($t as $y => $c) $t_pos[trim($c)][] = $y; 95 foreach ($t as $y => $c) { 96 $t_pos[trim($c)][] = $y; 97 } 85 98 86 99 foreach ($s as $x => $c) { 87 100 $c = trim($c); 88 if (!isset($t_pos[$c])) continue; 101 if (!isset($t_pos[$c])) { 102 continue; 103 } 89 104 krsort($t_pos[$c]); 90 105 foreach ($t_pos[$c] as $y) { 91 106 for ($len = $max_len; $len > 0; $len--) { 92 107 if ($paths_ymin[$len] < $y) { 93 $paths_ymin[$len +1] = $y;108 $paths_ymin[$len+1] = $y; 94 109 // On construit le resultat sous forme de chaine d'abord, 95 110 // car les tableaux de PHP sont dispendieux en taille memoire 96 $paths[$len + 1] = $paths[$len]." $x,$y";111 $paths[$len+1] = $paths[$len] . " $x,$y"; 97 112 break; 98 113 } 99 114 } 100 if ($len + 1 > $max_len) $max_len = $len + 1; 115 if ($len+1 > $max_len) { 116 $max_len = $len+1; 117 } 101 118 if ($len == 0) { 102 119 $paths_ymin[1] = $y; … … 113 130 $v[$y] = $x; 114 131 } 132 115 133 return array($u, $v); 116 134 } 135 117 136 return array(0 => array(), 1 => array()); 118 137 } … … 122 141 * 123 142 * @package SPIP\Revisions\Diff 124 **/143 **/ 125 144 class Diff { 126 145 /** 127 146 * Objet DiffX d'un texte ou partie de texte 128 * 129 * @var Object Objet Diff* (DiffTexte, DiffPara, DiffPhrase) */ 147 * 148 * @var Object Objet Diff* (DiffTexte, DiffPara, DiffPhrase) 149 */ 130 150 var $diff; 131 151 var $fuzzy; 132 152 133 153 /** 134 * Constructeur 154 * Constructeur 135 155 * 136 * @param Object $diff 137 **/156 * @param Object $diff Objet Diff* d'un texte ou morceau de texte 157 **/ 138 158 function __construct($diff) { 139 159 $this->diff = $diff; … … 149 169 $lcs = lcs_opt($trans); 150 170 $lcs_rev = array_flip($lcs); 151 } 152 else { 171 } else { 153 172 list($trans_rev, $trans) = lcs($paras_old, $paras); 154 173 $lcs = $trans; 155 174 $lcs_rev = $trans_rev; 156 175 } 157 176 158 177 reset($paras_old); 159 178 reset($paras); … … 177 196 if (!isset($i_old)) { 178 197 list($i_old, $p_old) = each($paras_old); 179 if (!$p_old) $fin_old = true; 198 if (!$p_old) { 199 $fin_old = true; 200 } 180 201 } 181 202 while (!$fin_old && $i_old < $j) { … … 185 206 unset($i_old); 186 207 list($i_old, $p_old) = each($paras_old); 187 if (!$p_old) $fin_old = true; 208 if (!$p_old) { 209 $fin_old = true; 210 } 188 211 } 189 212 } … … 195 218 if (!isset($i_old)) { 196 219 list($i_old, $p_old) = each($paras_old); 197 if (!strlen($p_old)) $fin_old = true; 220 if (!strlen($p_old)) { 221 $fin_old = true; 222 } 198 223 } 199 224 while (!$fin_old) { … … 202 227 } 203 228 list($i_old, $p_old) = each($paras_old); 204 if (!$p_old) $fin_old = true; 229 if (!$p_old) { 230 $fin_old = true; 231 } 205 232 } 206 233 } … … 210 237 } 211 238 } 239 212 240 return $this->diff->resultat(); 213 241 } … … 218 246 * 219 247 * @package SPIP\Revisions\Diff 220 **/248 **/ 221 249 class DiffTexte { 222 250 var $r; 223 251 224 252 /** 225 * Constructeur 226 **/253 * Constructeur 254 **/ 227 255 function __construct() { 228 256 $this->r = ""; … … 232 260 function _diff($p, $p_old) { 233 261 $diff = new Diff(new DiffPara); 262 234 263 return $diff->comparer($p, $p_old); 235 264 } … … 241 270 242 271 /** 243 * Découper les paragraphes d'un texte en fragments 272 * Découper les paragraphes d'un texte en fragments 244 273 * 245 * @param string $texte 274 * @param string $texte Texte à fragmenter 246 275 * @return string[] Tableau de fragments (paragraphes) 247 **/276 **/ 248 277 function segmenter($texte) { 249 278 return separer_paras($texte); … … 254 283 function ajouter($p) { 255 284 $p = trim($p); 256 $this->r .= "\n\n\n<span class=\"diff-para-ajoute\" title=\""._T('revisions:diff_para_ajoute')."\">".$p."</span rem=\"diff-\">"; 257 } 285 $this->r .= "\n\n\n<span class=\"diff-para-ajoute\" title=\"" . _T('revisions:diff_para_ajoute') . "\">" . $p . "</span rem=\"diff-\">"; 286 } 287 258 288 // http://code.spip.net/@supprimer 259 289 function supprimer($p_old) { 260 290 $p_old = trim($p_old); 261 $this->r .= "\n\n\n<span class=\"diff-para-supprime\" title=\""._T('revisions:diff_para_supprime')."\">".$p_old."</span rem=\"diff-\">"; 262 } 291 $this->r .= "\n\n\n<span class=\"diff-para-supprime\" title=\"" . _T('revisions:diff_para_supprime') . "\">" . $p_old . "</span rem=\"diff-\">"; 292 } 293 263 294 // http://code.spip.net/@deplacer 264 295 function deplacer($p, $p_old) { 265 $this->r .= "\n\n\n<span class=\"diff-para-deplace\" title=\"" ._T('revisions:diff_para_deplace')."\">";296 $this->r .= "\n\n\n<span class=\"diff-para-deplace\" title=\"" . _T('revisions:diff_para_deplace') . "\">"; 266 297 $this->r .= trim($this->_diff($p, $p_old)); 267 298 $this->r .= "</span rem=\"diff-\">"; 268 299 } 300 269 301 // http://code.spip.net/@comparer 270 302 function comparer($p, $p_old) { 271 $this->r .= "\n\n\n" .$this->_diff($p, $p_old);272 } 273 303 $this->r .= "\n\n\n" . $this->_diff($p, $p_old); 304 } 305 274 306 // http://code.spip.net/@resultat 275 307 function resultat() { … … 282 314 * 283 315 * @package SPIP\Revisions\Diff 284 **/316 **/ 285 317 class DiffPara { 286 318 var $r; … … 294 326 function _diff($p, $p_old) { 295 327 $diff = new Diff(new DiffPhrase); 328 296 329 return $diff->comparer($p, $p_old); 297 330 } … … 301 334 return true; 302 335 } 336 303 337 // http://code.spip.net/@segmenter 304 338 function segmenter($texte) { … … 306 340 $texte = trim($texte); 307 341 while (preg_match('/[\.!\?\]]+\s*/u', $texte, $regs)) { 308 $p = strpos($texte, $regs[0]) +strlen($regs[0]);342 $p = strpos($texte, $regs[0])+strlen($regs[0]); 309 343 $paras[] = substr($texte, 0, $p); 310 344 $texte = substr($texte, $p); 311 345 } 312 if ($texte) $paras[] = $texte; 346 if ($texte) { 347 $paras[] = $texte; 348 } 349 313 350 return $paras; 314 351 } … … 316 353 // http://code.spip.net/@ajouter 317 354 function ajouter($p) { 318 $this->r .= "<span class=\"diff-ajoute\" title=\""._T('revisions:diff_texte_ajoute')."\">".$p."</span rem=\"diff-\">"; 319 } 355 $this->r .= "<span class=\"diff-ajoute\" title=\"" . _T('revisions:diff_texte_ajoute') . "\">" . $p . "</span rem=\"diff-\">"; 356 } 357 320 358 // http://code.spip.net/@supprimer 321 359 function supprimer($p_old) { 322 $this->r .= "<span class=\"diff-supprime\" title=\""._T('revisions:diff_texte_supprime')."\">".$p_old."</span rem=\"diff-\">"; 323 } 360 $this->r .= "<span class=\"diff-supprime\" title=\"" . _T('revisions:diff_texte_supprime') . "\">" . $p_old . "</span rem=\"diff-\">"; 361 } 362 324 363 // http://code.spip.net/@deplacer 325 364 function deplacer($p, $p_old) { 326 $this->r .= "<span class=\"diff-deplace\" title=\""._T('revisions:diff_texte_deplace')."\">".$this->_diff($p, $p_old)."</span rem=\"diff-\">"; 327 } 365 $this->r .= "<span class=\"diff-deplace\" title=\"" . _T('revisions:diff_texte_deplace') . "\">" . $this->_diff($p, 366 $p_old) . "</span rem=\"diff-\">"; 367 } 368 328 369 // http://code.spip.net/@comparer 329 370 function comparer($p, $p_old) { 330 371 $this->r .= $this->_diff($p, $p_old); 331 372 } 332 373 333 374 // http://code.spip.net/@resultat 334 375 function resultat() { … … 341 382 * 342 383 * @package SPIP\Revisions\Diff 343 **/384 **/ 344 385 class DiffPhrase { 345 386 var $r; … … 354 395 return false; 355 396 } 397 356 398 // http://code.spip.net/@segmenter 357 399 function segmenter($texte) { 358 400 $paras = array(); 359 401 if (test_pcre_unicode()) { 360 $punct = '([[:punct:]]|' .plage_punct_unicode().')';402 $punct = '([[:punct:]]|' . plage_punct_unicode() . ')'; 361 403 $mode = 'u'; 362 } 363 else { 404 } else { 364 405 // Plages de poncutation pour preg_match bugge (ha ha) 365 $punct = '([^\w\s\x80-\xFF]|' .plage_punct_unicode().')';406 $punct = '([^\w\s\x80-\xFF]|' . plage_punct_unicode() . ')'; 366 407 $mode = ''; 367 408 } 368 $preg = '/(' .$punct.'+)(\s+|$)|(\s+)('.$punct.'*)/'.$mode;409 $preg = '/(' . $punct . '+)(\s+|$)|(\s+)(' . $punct . '*)/' . $mode; 369 410 while (preg_match($preg, $texte, $regs)) { 370 411 $p = strpos($texte, $regs[0]); … … 376 417 if ($punct == '[[') { 377 418 $avant = substr($texte, 0, $p) . $regs[5] . $punct; 378 $texte = $regs[4] . substr($texte, $p + $l); 379 } 380 else 381 if ($punct == ']]') { 382 $avant = substr($texte, 0, $p) . $regs[5] . $punct; 383 $texte = substr($texte, $p + $l); 384 } 385 // Attacher les raccourcis fermants au mot precedent 386 else 387 if (preg_match(',^[\]}]+$,', $punct)) { 388 $avant = substr($texte, 0, $p) . (isset($regs[5])?$regs[5]:'') . $punct; 389 $texte = $regs[4] . substr($texte, $p + $l); 390 } 391 // Attacher les raccourcis ouvrants au mot suivant 392 else if (isset($regs[5]) && $regs[5] && preg_match(',^[\[{]+$,', $punct)) { 393 $avant = substr($texte, 0, $p) . $regs[5]; 394 $texte = $punct . substr($texte, $p + $l); 395 } 396 // Les autres signes de ponctuation sont des mots a part entiere 397 else { 398 $avant = substr($texte, 0, $p); 399 $milieu = $regs[0]; 400 $texte = substr($texte, $p + $l); 401 } 402 } 403 else { 404 $avant = substr($texte, 0, $p + $l); 405 $texte = substr($texte, $p + $l); 406 } 407 if ($avant) $paras[] = $avant; 408 if ($milieu) $paras[] = $milieu; 409 } 410 if ($texte) $paras[] = $texte; 419 $texte = $regs[4] . substr($texte, $p+$l); 420 } else { 421 if ($punct == ']]') { 422 $avant = substr($texte, 0, $p) . $regs[5] . $punct; 423 $texte = substr($texte, $p+$l); 424 } // Attacher les raccourcis fermants au mot precedent 425 else { 426 if (preg_match(',^[\]}]+$,', $punct)) { 427 $avant = substr($texte, 0, $p) . (isset($regs[5]) ? $regs[5] : '') . $punct; 428 $texte = $regs[4] . substr($texte, $p+$l); 429 } // Attacher les raccourcis ouvrants au mot suivant 430 else { 431 if (isset($regs[5]) && $regs[5] && preg_match(',^[\[{]+$,', $punct)) { 432 $avant = substr($texte, 0, $p) . $regs[5]; 433 $texte = $punct . substr($texte, $p+$l); 434 } // Les autres signes de ponctuation sont des mots a part entiere 435 else { 436 $avant = substr($texte, 0, $p); 437 $milieu = $regs[0]; 438 $texte = substr($texte, $p+$l); 439 } 440 } 441 } 442 } 443 } else { 444 $avant = substr($texte, 0, $p+$l); 445 $texte = substr($texte, $p+$l); 446 } 447 if ($avant) { 448 $paras[] = $avant; 449 } 450 if ($milieu) { 451 $paras[] = $milieu; 452 } 453 } 454 if ($texte) { 455 $paras[] = $texte; 456 } 457 411 458 return $paras; 412 459 } … … 414 461 // http://code.spip.net/@ajouter 415 462 function ajouter($p) { 416 $this->r .= "<span class=\"diff-ajoute\" title=\""._T('revisions:diff_texte_ajoute')."\">".$p."</span rem=\"diff-\"> "; 417 } 463 $this->r .= "<span class=\"diff-ajoute\" title=\"" . _T('revisions:diff_texte_ajoute') . "\">" . $p . "</span rem=\"diff-\"> "; 464 } 465 418 466 // http://code.spip.net/@supprimer 419 467 function supprimer($p_old) { 420 $this->r .= "<span class=\"diff-supprime\" title=\""._T('revisions:diff_texte_supprime')."\">".$p_old."</span rem=\"diff-\"> "; 421 } 468 $this->r .= "<span class=\"diff-supprime\" title=\"" . _T('revisions:diff_texte_supprime') . "\">" . $p_old . "</span rem=\"diff-\"> "; 469 } 470 422 471 // http://code.spip.net/@comparer 423 472 function comparer($p, $p_old) { … … 437 486 438 487 $charset = $GLOBALS['meta']['charset']; 439 if ($charset == 'utf-8') 488 if ($charset == 'utf-8') { 440 489 return unicode_to_utf_8(html2unicode($texte)); 490 } 491 441 492 return unicode_to_utf_8(html2unicode(charset2unicode($texte, $charset, true))); 442 493 } … … 445 496 function afficher_diff($texte) { 446 497 $charset = $GLOBALS['meta']['charset']; 447 if ($charset == 'utf-8') return $texte; 498 if ($charset == 'utf-8') { 499 return $texte; 500 } 501 448 502 return charset2unicode($texte, 'utf-8'); 449 503 } -
_core_/plugins/revisions/inc/revisions.php
r93092 r93622 15 15 * 16 16 * @package SPIP\Revisions\Fonctions 17 **/ 18 if (!defined("_ECRIRE_INC_VERSION")) return; 17 **/ 18 if (!defined("_ECRIRE_INC_VERSION")) { 19 return; 20 } 19 21 20 22 $GLOBALS['agregation_versions'] = 10; 21 23 22 24 /** Intervalle de temps (en seconde) separant deux révisions par un même auteur */ 23 define('_INTERVALLE_REVISIONS', 600); 25 define('_INTERVALLE_REVISIONS', 600); 24 26 25 27 /** 26 * Découper les paragraphes d'un texte en fragments 27 * 28 * @param string $texte 29 * @param array $paras 28 * Découper les paragraphes d'un texte en fragments 29 * 30 * @param string $texte Texte à fragmenter 31 * @param array $paras Tableau de fragments déjà là 30 32 * @return string[] Tableau de fragments (paragraphes) 31 **/33 **/ 32 34 function separer_paras($texte, $paras = array()) { 33 if (!$paras) $paras = array(); 35 if (!$paras) { 36 $paras = array(); 37 } 34 38 while (preg_match("/(\r\n?){2,}|\n{2,}/", $texte, $regs)) { 35 $p = strpos($texte, $regs[0]) +strlen($regs[0]);39 $p = strpos($texte, $regs[0])+strlen($regs[0]); 36 40 $paras[] = substr($texte, 0, $p); 37 41 $texte = substr($texte, $p); 38 42 } 39 if ($texte) $paras[] = $texte; 43 if ($texte) { 44 $paras[] = $texte; 45 } 46 40 47 return $paras; 41 48 } … … 64 71 // Attention a echapper $fragment, binaire potentiellement gz 65 72 return array( 66 'id_objet' => intval($id_objet), 67 'objet' => $objet, 68 'id_fragment' => intval($id_fragment), 69 'version_min' => intval($version_min), 70 'version_max' => intval($version_max), 71 'compress' => $compress, 72 'fragment' => $fragment); 73 'id_objet' => intval($id_objet), 74 'objet' => $objet, 75 'id_fragment' => intval($id_fragment), 76 'version_min' => intval($version_min), 77 'version_max' => intval($version_max), 78 'compress' => $compress, 79 'fragment' => $fragment 80 ); 73 81 } 74 82 … … 76 84 function envoi_replace_fragments($replaces) { 77 85 $desc = $GLOBALS['tables_auxiliaires']['spip_versions_fragments']; 78 foreach ($replaces as $r)86 foreach ($replaces as $r) { 79 87 sql_replace('spip_versions_fragments', $r, $desc); 88 } 80 89 } 81 90 … … 84 93 function envoi_delete_fragments($id_objet, $objet, $deletes) { 85 94 if (count($deletes)) { 86 sql_delete("spip_versions_fragments", "id_objet=".intval($id_objet)." AND objet=".sql_quote($objet)." AND ((". join(") OR (", $deletes)."))"); 95 sql_delete("spip_versions_fragments", 96 "id_objet=" . intval($id_objet) . " AND objet=" . sql_quote($objet) . " AND ((" . join(") OR (", 97 $deletes) . "))"); 87 98 } 88 99 } … … 100 111 $nouveau = true; 101 112 // Recuperer la version la plus recente 102 $row = sql_fetsel("compress, fragment, version_min, version_max", "spip_versions_fragments", "id_objet=".intval($id_objet)." AND objet=".sql_quote($objet)." AND id_fragment=$id_fragment AND version_min<=$id_version", "", "version_min DESC", "1"); 113 $row = sql_fetsel("compress, fragment, version_min, version_max", "spip_versions_fragments", 114 "id_objet=" . intval($id_objet) . " AND objet=" . sql_quote($objet) . " AND id_fragment=$id_fragment AND version_min<=$id_version", 115 "", "version_min DESC", "1"); 103 116 104 117 if ($row) { 105 118 $fragment = $row['fragment']; 106 119 $version_min = $row['version_min']; 107 if ($row['compress'] > 0) $fragment = @gzuncompress($fragment); 120 if ($row['compress'] > 0) { 121 $fragment = @gzuncompress($fragment); 122 } 108 123 $fragment = unserialize($fragment); 109 124 if (is_array($fragment)) { … … 117 132 $fragment = array($id_version => $texte); 118 133 $version_min = $id_version; 119 } 120 else { 134 } else { 121 135 // Ne pas dupliquer les fragments non modifies 122 136 $modif = true; 123 for ($i = $id_version -1; $i >= $version_min; $i--) {137 for ($i = $id_version-1; $i >= $version_min; $i--) { 124 138 if (isset($fragment[$i])) { 125 139 $modif = ($fragment[$i] != $texte); … … 127 141 } 128 142 } 129 if ($modif) $fragment[$id_version] = $texte; 143 if ($modif) { 144 $fragment[$id_version] = $texte; 145 } 130 146 } 131 147 132 148 // Preparer l'enregistrement du fragment 133 $replaces[] = replace_fragment($id_objet, $objet, $version_min, $id_version, $id_fragment, $fragment);149 $replaces[] = replace_fragment($id_objet, $objet, $version_min, $id_version, $id_fragment, $fragment); 134 150 } 135 151 … … 149 165 150 166 // D'abord, vider les fragments inutiles 151 sql_delete("spip_versions_fragments", "id_objet=".intval($id_objet)." AND objet=".sql_quote($objet)." AND version_min>=$version_debut AND version_max<=$version_fin"); 167 sql_delete("spip_versions_fragments", 168 "id_objet=" . intval($id_objet) . " AND objet=" . sql_quote($objet) . " AND version_min>=$version_debut AND version_max<=$version_fin"); 152 169 153 170 // Fragments chevauchant l'ensemble de l'intervalle, s'ils existent 154 $result = sql_select("id_fragment, compress, fragment, version_min, version_max", "spip_versions_fragments", "id_objet=".intval($id_objet)." AND objet=".sql_quote($objet)." AND version_min<$version_debut AND version_max>$version_fin"); 171 $result = sql_select("id_fragment, compress, fragment, version_min, version_max", "spip_versions_fragments", 172 "id_objet=" . intval($id_objet) . " AND objet=" . sql_quote($objet) . " AND version_min<$version_debut AND version_max>$version_fin"); 155 173 156 174 while ($row = sql_fetch($result)) { 157 175 $id_fragment = $row['id_fragment']; 158 176 $fragment = $row['fragment']; 159 if ($row['compress'] > 0) $fragment = gzuncompress($fragment); 177 if ($row['compress'] > 0) { 178 $fragment = gzuncompress($fragment); 179 } 160 180 $fragment = unserialize($fragment); 161 181 for ($i = $version_fin; $i >= $version_debut; $i--) { 162 182 if (isset($fragment[$i])) { 163 183 // Recopier le dernier fragment si implicite 164 if (!isset($fragment[$version_fin + 1])) 165 $fragment[$version_fin + 1] = $fragment[$i]; 184 if (!isset($fragment[$version_fin+1])) { 185 $fragment[$version_fin+1] = $fragment[$i]; 186 } 166 187 unset($fragment[$i]); 167 188 } 168 189 } 169 190 170 $replaces[] = replace_fragment($id_objet, $objet,191 $replaces[] = replace_fragment($id_objet, $objet, 171 192 $row['version_min'], $row['version_max'], $id_fragment, $fragment); 172 193 } 173 194 174 195 // Fragments chevauchant le debut de l'intervalle, s'ils existent 175 $result = sql_select("id_fragment, compress, fragment, version_min, version_max", "spip_versions_fragments", "id_objet=".intval($id_objet)." AND objet=".sql_quote($objet)." AND version_min<$version_debut AND version_max>=$version_debut AND version_max<=$version_fin"); 196 $result = sql_select("id_fragment, compress, fragment, version_min, version_max", "spip_versions_fragments", 197 "id_objet=" . intval($id_objet) . " AND objet=" . sql_quote($objet) . " AND version_min<$version_debut AND version_max>=$version_debut AND version_max<=$version_fin"); 176 198 177 199 $deb_fragment = array(); … … 181 203 $version_min = $row['version_min']; 182 204 $version_max = $row['version_max']; 183 if ($row['compress'] > 0) $fragment = gzuncompress($fragment); 205 if ($row['compress'] > 0) { 206 $fragment = gzuncompress($fragment); 207 } 184 208 $fragment = unserialize($fragment); 185 209 for ($i = $version_debut; $i <= $version_max; $i++) { 186 if (isset($fragment[$i])) unset($fragment[$i]); 210 if (isset($fragment[$i])) { 211 unset($fragment[$i]); 212 } 187 213 } 188 214 … … 191 217 // Ajuster l'intervalle des versions 192 218 $deb_version_min[$id_fragment] = $version_min; 193 $deb_version_max[$id_fragment] = $version_debut -1;219 $deb_version_max[$id_fragment] = $version_debut-1; 194 220 } 195 221 196 222 // Fragments chevauchant la fin de l'intervalle, s'ils existent 197 $result = sql_select("id_fragment, compress, fragment, version_min, version_max", "spip_versions_fragments", "id_objet=".intval($id_objet)." AND objet=".sql_quote($objet)." AND version_max>$version_fin AND version_min>=$version_debut AND version_min<=$version_fin"); 223 $result = sql_select("id_fragment, compress, fragment, version_min, version_max", "spip_versions_fragments", 224 "id_objet=" . intval($id_objet) . " AND objet=" . sql_quote($objet) . " AND version_max>$version_fin AND version_min>=$version_debut AND version_min<=$version_fin"); 198 225 199 226 while ($row = sql_fetch($result)) { … … 202 229 $version_min = $row['version_min']; 203 230 $version_max = $row['version_max']; 204 if ($row['compress'] > 0) $fragment = gzuncompress($fragment); 231 if ($row['compress'] > 0) { 232 $fragment = gzuncompress($fragment); 233 } 205 234 $fragment = unserialize($fragment); 206 235 for ($i = $version_fin; $i >= $version_min; $i--) { 207 236 if (isset($fragment[$i])) { 208 237 // Recopier le dernier fragment si implicite 209 if (!isset($fragment[$version_fin + 1])) 210 $fragment[$version_fin + 1] = $fragment[$i]; 238 if (!isset($fragment[$version_fin+1])) { 239 $fragment[$version_fin+1] = $fragment[$i]; 240 } 211 241 unset($fragment[$i]); 212 242 } … … 218 248 $agreger = false; 219 249 if (isset($deb_fragment[$id_fragment])) { 220 $agreger = (count($deb_fragment[$id_fragment]) +count($fragment) <= $agregation_versions);250 $agreger = (count($deb_fragment[$id_fragment])+count($fragment) <= $agregation_versions); 221 251 if ($agreger) { 222 $fragment = $deb_fragment[$id_fragment] +$fragment;252 $fragment = $deb_fragment[$id_fragment]+$fragment; 223 253 $version_min = $deb_version_min[$id_fragment]; 224 } 225 else { 226 $replaces[] = replace_fragment($id_objet,$objet, 254 } else { 255 $replaces[] = replace_fragment($id_objet, $objet, 227 256 $deb_version_min[$id_fragment], $deb_version_max[$id_fragment], 228 257 $id_fragment, $deb_fragment[$id_fragment]); … … 232 261 if (!$agreger) { 233 262 // Ajuster l'intervalle des versions 234 $version_min = $version_fin +1;263 $version_min = $version_fin+1; 235 264 } 236 265 $replaces[] = replace_fragment($id_objet, $objet, $version_min, $version_max, $id_fragment, $fragment); … … 240 269 if (is_array($deb_fragment) && count($deb_fragment) > 0) { 241 270 foreach ($deb_fragment as $id_fragment => $fragment) { 242 $replaces[] = replace_fragment($id_objet, $objet,271 $replaces[] = replace_fragment($id_objet, $objet, 243 272 $deb_version_min[$id_fragment], $deb_version_max[$id_fragment], 244 273 $id_fragment, $deb_fragment[$id_fragment]); … … 247 276 248 277 envoi_replace_fragments($replaces); 249 envoi_delete_fragments($id_objet, $objet, $deletes);278 envoi_delete_fragments($id_objet, $objet, $deletes); 250 279 } 251 280 … … 254 283 * Récupérer les fragments d'un objet pour une version demandée 255 284 * 256 * @param int $id_objet 257 * @param string $objet 258 * @param int $id_version 285 * @param int $id_objet Identifiant de l'objet 286 * @param string $objet Objet 287 * @param int $id_version Identifiant de la version 259 288 * @return array Couples id_fragment => texte 260 289 */ … … 262 291 $fragments = array(); 263 292 264 if ($id_version == 0) return array(); 293 if ($id_version == 0) { 294 return array(); 295 } 265 296 266 297 $result = sql_select( 267 298 "id_fragment, version_min, version_max, compress, fragment", 268 299 "spip_versions_fragments", 269 "id_objet=" . intval($id_objet) . " AND objet=".sql_quote($objet)270 ." AND version_min<=$id_version AND version_max>=$id_version");300 "id_objet=" . intval($id_objet) . " AND objet=" . sql_quote($objet) 301 . " AND version_min<=$id_version AND version_max>=$id_version"); 271 302 272 303 while ($row = sql_fetch($result)) { … … 275 306 $fragment = $row['fragment']; 276 307 // si le fragment est compressé, tenter de le décompresser, sinon écrire une erreur 277 if ($row['compress'] > 0) {308 if ($row['compress'] > 0) { 278 309 $fragment_ = @gzuncompress($fragment); 279 if (strlen($fragment) && $fragment_ ===false){310 if (strlen($fragment) && $fragment_ === false) { 280 311 $fragment = serialize(array($row['version_max'] => "[" . _T('forum_titre_erreur') . $id_fragment . "]")); 281 } 282 else283 $fragment = $fragment_;312 } else { 313 $fragment = $fragment_; 314 } 284 315 } 285 316 // tenter dedésérialiser le fragment, sinon écrire une erreur 286 317 $fragment_ = unserialize($fragment); 287 if (strlen($fragment) && $fragment_ ===false){288 $fragment =array($row['version_max']=>"["._T('forum_titre_erreur').$id_fragment."]");289 } 290 else291 $fragment = $fragment_;318 if (strlen($fragment) && $fragment_ === false) { 319 $fragment = array($row['version_max'] => "[" . _T('forum_titre_erreur') . $id_fragment . "]"); 320 } else { 321 $fragment = $fragment_; 322 } 292 323 // on retrouve le fragment le plus près de notre version 293 324 for ($i = $id_version; $i >= $version_min; $i--) { … … 299 330 ## la situation n'est pas meilleure ni pire qu'avant) 300 331 if ($GLOBALS['meta']['charset'] == 'utf-8' 301 AND include_spip('inc/charsets') 302 AND !is_utf8($fragment[$i])) { 332 AND include_spip('inc/charsets') 333 AND !is_utf8($fragment[$i]) 334 ) { 303 335 $fragment[$i] = importer_charset($fragment[$i], 'iso-8859-1'); 304 336 } … … 310 342 } 311 343 } 344 312 345 return $fragments; 313 346 } … … 331 364 332 365 // Nettoyage de la ponctuation pour faciliter l'appariement 333 foreach ($src as $key => $val) {366 foreach ($src as $key => $val) { 334 367 $t1[$key] = strval(preg_replace("/[[:punct:][:space:]]+/", " ", $val)); 335 368 } 336 foreach ($dest as $key => $val) {369 foreach ($dest as $key => $val) { 337 370 $t2[$key] = strval(preg_replace("/[[:punct:][:space:]]+/", " ", $val)); 338 371 } 339 372 340 373 // Premiere passe : chercher les correspondance exactes 341 foreach($t1 as $key => $val) $md1[$key] = md5($val); 342 foreach($t2 as $key => $val) $md2[md5($val)][$key] = $key; 343 foreach($md1 as $key1 => $h) { 374 foreach ($t1 as $key => $val) { 375 $md1[$key] = md5($val); 376 } 377 foreach ($t2 as $key => $val) { 378 $md2[md5($val)][$key] = $key; 379 } 380 foreach ($md1 as $key1 => $h) { 344 381 if (isset($md2[$h])) { 345 382 $key2 = reset($md2[$h]); … … 356 393 if ($flou) { 357 394 // Deuxieme passe : recherche de correlation par test de compressibilite 358 foreach ($t1 as $key => $val) {395 foreach ($t1 as $key => $val) { 359 396 $l1[$key] = strlen(gzcompress($val)); 360 397 } 361 foreach ($t2 as $key => $val) {398 foreach ($t2 as $key => $val) { 362 399 $l2[$key] = strlen(gzcompress($val)); 363 400 } 364 foreach ($t1 as $key1 => $s1) {365 foreach ($t2 as $key2 => $s2) {366 $r = strlen(gzcompress($s1 .$s2));367 $taux = 1.0 * $r / ($l1[$key1] +$l2[$key2]);401 foreach ($t1 as $key1 => $s1) { 402 foreach ($t2 as $key2 => $s2) { 403 $r = strlen(gzcompress($s1 . $s2)); 404 $taux = 1.0*$r/($l1[$key1]+$l2[$key2]); 368 405 if (!isset($gz_min1[$key1]) || !$gz_min1[$key1] || $gz_min1[$key1] > $taux) { 369 406 $gz_min1[$key1] = $taux; 370 407 $gz_trans1[$key1] = $key2; 371 408 } 372 if (!isset($gz_min2[$key2]) || !$gz_min2[$key2] || $gz_min2[$key2] > $taux) {409 if (!isset($gz_min2[$key2]) || !$gz_min2[$key2] || $gz_min2[$key2] > $taux) { 373 410 $gz_min2[$key2] = $taux; 374 411 $gz_trans2[$key2] = $key1; … … 379 416 // Depouiller les resultats de la deuxieme passe : 380 417 // ne retenir que les correlations reciproques 381 foreach ($gz_trans1 as $key1 => $key2) {418 foreach ($gz_trans1 as $key1 => $key2) { 382 419 if ($gz_trans2[$key2] == $key1 && $gz_min1[$key1] < 0.9) { 383 420 $src_dest[$key1] = $key2; … … 395 432 * Récupérer les champs d'un objet, pour une version demandée 396 433 * 397 * @param int $id_objet 398 * @param string $objet 399 * @param int $id_version 434 * @param int $id_objet Identifiant de l'objet 435 * @param string $objet Objet 436 * @param int $id_version Identifiant de la version 400 437 * @return array Couples champs => textes 401 438 */ 402 439 function recuperer_version($id_objet, $objet, $id_version) { 403 440 404 $champs = sql_getfetsel("champs", "spip_versions", "id_objet=" . intval($id_objet) . " AND objet=".sql_quote($objet)." AND id_version=" . intval($id_version)); 405 if (!$champs OR !is_array($champs = unserialize($champs))) 441 $champs = sql_getfetsel("champs", "spip_versions", 442 "id_objet=" . intval($id_objet) . " AND objet=" . sql_quote($objet) . " AND id_version=" . intval($id_version)); 443 if (!$champs OR !is_array($champs = unserialize($champs))) { 406 444 return array(); 407 else return reconstuire_version($champs, 408 recuperer_fragments($id_objet,$objet, $id_version)); 445 } else { 446 return reconstuire_version($champs, 447 recuperer_fragments($id_objet, $objet, $id_version)); 448 } 409 449 } 410 450 … … 415 455 * retourne le texte de chaque champ. 416 456 * 417 * @param array $champs 457 * @param array $champs Couples (champ => liste d'id_fragment). 418 458 * La liste est de la forme "5 32 7 16 8 2" 419 * @param array $fragments 420 * @param array $res 459 * @param array $fragments Couples (id_fragment => texte) 460 * @param array $res Couples (champ => texte) déjà connus 421 461 * @return array Couples (champ => texte) 422 462 */ … … 424 464 425 465 static $msg; 426 if (!$msg) $msg = _T('forum_titre_erreur'); 466 if (!$msg) { 467 $msg = _T('forum_titre_erreur'); 468 } 427 469 428 470 foreach ($champs as $nom => $code) { … … 437 479 } 438 480 } 481 439 482 return $res; 440 483 } … … 442 485 // http://code.spip.net/@supprimer_versions 443 486 function supprimer_versions($id_objet, $objet, $version_min, $version_max) { 444 sql_delete("spip_versions", "id_objet=".intval($id_objet)." AND objet=".sql_quote($objet)." AND id_version>=$version_min AND id_version<=$version_max"); 445 446 supprimer_fragments($id_objet,$objet, $version_min, $version_max); 487 sql_delete("spip_versions", 488 "id_objet=" . intval($id_objet) . " AND objet=" . sql_quote($objet) . " AND id_version>=$version_min AND id_version<=$version_max"); 489 490 supprimer_fragments($id_objet, $objet, $version_min, $version_max); 447 491 } 448 492 … … 459 503 * Auteur apportant les modifications. En absence (session anonyme), utilisera l'IP pour garder une trace. 460 504 * @return int 461 * id_version : identifiant de la version 462 **/505 * id_version : identifiant de la version 506 **/ 463 507 function ajouter_version($id_objet, $objet, $champs, $titre_version = "", $id_auteur = null) { 464 508 $paras = $paras_old = $paras_champ = $fragments = array(); … … 475 519 // Detruire les tentatives d'archivages non abouties en 1 heure 476 520 sql_delete('spip_versions', array( 477 "id_objet=" . intval($id_objet), 478 "objet=" . sql_quote($objet), 479 "id_version <= 0", 480 "date < DATE_SUB(" . sql_quote(date('Y-m-d H:i:s')) . ", INTERVAL " . _INTERVALLE_REVISIONS . " SECOND)") 521 "id_objet=" . intval($id_objet), 522 "objet=" . sql_quote($objet), 523 "id_version <= 0", 524 "date < DATE_SUB(" . sql_quote(date('Y-m-d H:i:s')) . ", INTERVAL " . _INTERVALLE_REVISIONS . " SECOND)" 525 ) 481 526 ); 482 527 … … 485 530 // et un titre contenant en fait le moment de l'insertion 486 531 list($ms, $sec) = explode(' ', microtime()); 487 $date = $sec . substr($ms,1,4)-20; // SQL ne ramene que 4 chiffres significatifs apres la virgule pour 0.0+titre_version 488 $datediff = ($sec - mktime(0,0,0,9,1,2007)) * 1000000 + substr($ms,2, strlen($ms)-4); 489 490 $valeurs = array('id_objet' => $id_objet, 491 'objet' => $objet, 492 'id_version' => (0 - $datediff), 493 'date' => date('Y-m-d H:i:s'), 494 'id_auteur' => $str_auteur, // varchar ici! 495 'titre_version' => $date); 496 sql_insertq('spip_versions', $valeurs); 532 $date = $sec . substr($ms, 1, 533 4)-20; // SQL ne ramene que 4 chiffres significatifs apres la virgule pour 0.0+titre_version 534 $datediff = ($sec-mktime(0, 0, 0, 9, 1, 2007))*1000000+substr($ms, 2, strlen($ms)-4); 535 536 $valeurs = array( 537 'id_objet' => $id_objet, 538 'objet' => $objet, 539 'id_version' => (0-$datediff), 540 'date' => date('Y-m-d H:i:s'), 541 'id_auteur' => $str_auteur, // varchar ici! 542 'titre_version' => $date 543 ); 544 sql_insertq('spip_versions', $valeurs); 497 545 498 546 // Eviter les validations entremelees en s'endormant s'il existe … … 508 556 # sleep(15); 509 557 $delai = $sec-10; 510 while (sql_countsel('spip_versions', "id_objet=".intval($id_objet)." AND objet=".sql_quote($objet)." AND id_version < 0 AND 0.0+titre_version < $date AND titre_version<>".sql_quote($date,'','text')." AND 0.0+titre_version > $delai")) { 511 spip_log("version $objet $id_objet :insertion en cours avant $date ($delai)",'revisions'); 558 while (sql_countsel('spip_versions', 559 "id_objet=" . intval($id_objet) . " AND objet=" . sql_quote($objet) . " AND id_version < 0 AND 0.0+titre_version < $date AND titre_version<>" . sql_quote($date, 560 '', 'text') . " AND 0.0+titre_version > $delai")) { 561 spip_log("version $objet $id_objet :insertion en cours avant $date ($delai)", 'revisions'); 512 562 sleep(1); 513 563 $delai++; … … 515 565 # sleep(15); spip_log("sortie $sec $delai"); 516 566 // Determiner le numero du prochain fragment 517 $next = sql_fetsel("id_fragment", "spip_versions_fragments", "id_objet=".intval($id_objet)." AND objet=".sql_quote($objet), "", "id_fragment DESC", "1"); 567 $next = sql_fetsel("id_fragment", "spip_versions_fragments", 568 "id_objet=" . intval($id_objet) . " AND objet=" . sql_quote($objet), "", "id_fragment DESC", "1"); 518 569 519 570 $onlylock = ''; 520 571 521 572 // Examiner la derniere version 522 $row = sql_fetsel("id_version, champs, id_auteur, date, permanent", "spip_versions", "id_objet=".intval($id_objet)." AND objet=".sql_quote($objet)." AND id_version > 0", '', "id_version DESC", "1"); // le champ id_auteur est un varchar dans cette table 573 $row = sql_fetsel("id_version, champs, id_auteur, date, permanent", "spip_versions", 574 "id_objet=" . intval($id_objet) . " AND objet=" . sql_quote($objet) . " AND id_version > 0", '', "id_version DESC", 575 "1"); // le champ id_auteur est un varchar dans cette table 523 576 524 577 if ($row) { 525 578 $id_version = $row['id_version']; 526 $paras_old = recuperer_fragments($id_objet, $objet, $id_version);579 $paras_old = recuperer_fragments($id_objet, $objet, $id_version); 527 580 $champs_old = $row['champs']; 528 if ($row['id_auteur']!= $str_auteur 529 OR $row['permanent']!='non' 530 OR strtotime($row['date']) < (time()-_INTERVALLE_REVISIONS)) { 581 if ($row['id_auteur'] != $str_auteur 582 OR $row['permanent'] != 'non' 583 OR strtotime($row['date']) < (time()-_INTERVALLE_REVISIONS) 584 ) { 531 585 spip_log(strtotime($row['date']), 'revisions'); 532 586 spip_log(time(), 'revisions'); … … 540 594 $onlylock = 're'; 541 595 } 542 } else 596 } else { 543 597 $id_version = 1; 544 545 $next = !$next ? 1 : ($next['id_fragment'] + 1); 598 } 599 600 $next = !$next ? 1 : ($next['id_fragment']+1); 546 601 547 602 // Generer les nouveaux fragments … … 557 612 if ($n) { 558 613 // Tables d'appariement dans les deux sens 559 list(, $trans) = apparier_paras($paras_old, $paras);614 list(, $trans) = apparier_paras($paras_old, $paras); 560 615 reset($champs); 561 616 $nom = ''; … … 563 618 // eviter une notice PHP au tout debut de la boucle 564 619 // on ajoute ''=>0 en debut de tableau. 565 $paras_champ = array($nom =>0) +$paras_champ;620 $paras_champ = array($nom => 0)+$paras_champ; 566 621 567 622 for ($i = 0; $i < $n; $i++) { 568 while ($i >= $paras_champ[$nom]) list($nom, ) = each($champs); 623 while ($i >= $paras_champ[$nom]) { 624 list($nom,) = each($champs); 625 } 569 626 // Lier au fragment existant si possible, sinon creer un nouveau fragment 570 627 $id_fragment = isset($trans[$i]) ? $trans[$i] : $next++; … … 580 637 581 638 // Enregistrer les modifications 582 ajouter_fragments($id_objet, $objet, $id_version, $fragments);639 ajouter_fragments($id_objet, $objet, $id_version, $fragments); 583 640 584 641 // Si l'insertion ne servait que de verrou, … … 587 644 588 645 if (!$onlylock) { 589 sql_updateq('spip_versions', array('id_version'=>$id_version, 'date'=>date('Y-m-d H:i:s'), 'champs'=> serialize($codes), 'permanent'=>$permanent, 'titre_version'=> $titre_version), "id_objet=".intval($id_objet)." AND objet=".sql_quote($objet)." AND id_version < 0 AND titre_version='$date'"); 646 sql_updateq('spip_versions', array( 647 'id_version' => $id_version, 648 'date' => date('Y-m-d H:i:s'), 649 'champs' => serialize($codes), 650 'permanent' => $permanent, 651 'titre_version' => $titre_version 652 ), 653 "id_objet=" . intval($id_objet) . " AND objet=" . sql_quote($objet) . " AND id_version < 0 AND titre_version='$date'"); 590 654 } else { 591 sql_updateq('spip_versions', array('date'=>date('Y-m-d H:i:s'), 'champs'=>serialize($codes), 'permanent'=>$permanent, 'titre_version'=> $titre_version), "id_objet=".intval($id_objet)." AND objet=".sql_quote($objet)." AND id_version=$id_version"); 592 sql_delete("spip_versions", "id_objet=".intval($id_objet)." AND objet=".sql_quote($objet)." AND id_version < 0 AND titre_version ='$date'"); 593 } 594 spip_log($onlylock . "memorise la version $id_version de l'objet $objet $id_objet $titre_version",'revisions'); 655 sql_updateq('spip_versions', array( 656 'date' => date('Y-m-d H:i:s'), 657 'champs' => serialize($codes), 658 'permanent' => $permanent, 659 'titre_version' => $titre_version 660 ), "id_objet=" . intval($id_objet) . " AND objet=" . sql_quote($objet) . " AND id_version=$id_version"); 661 sql_delete("spip_versions", 662 "id_objet=" . intval($id_objet) . " AND objet=" . sql_quote($objet) . " AND id_version < 0 AND titre_version ='$date'"); 663 } 664 spip_log($onlylock . "memorise la version $id_version de l'objet $objet $id_objet $titre_version", 'revisions'); 595 665 596 666 return $id_version; … … 604 674 $span_diff = array(); 605 675 if (preg_match_all(',<(/)?(span|div) (class|rem)="diff-[^>]*>,', $texte, $regs, PREG_SET_ORDER)) { 606 $regs = array_slice($regs, 0,500); #limiter la casse s'il y en a trop676 $regs = array_slice($regs, 0, 500); #limiter la casse s'il y en a trop 607 677 foreach ($regs as $c => $reg) { 608 $texte = str_replace($reg[0], '@@@SPIP_DIFF' .$c.'@@@', $texte);678 $texte = str_replace($reg[0], '@@@SPIP_DIFF' . $c . '@@@', $texte); 609 679 } 610 680 } … … 639 709 foreach ($area as $reg) { 640 710 $remplace = preg_replace(',@@@SPIP_DIFF[0-9]+@@@,', '**', $reg[0]); 641 if ($remplace <> $reg[0]) 711 if ($remplace <> $reg[0]) { 642 712 $texte = str_replace($reg[0], $remplace, $texte); 713 } 643 714 } 644 715 } 645 716 646 717 // replacer les valeurs des <span> et <div> diff- 647 if (is_array($regs)) 648 foreach ($regs as $c => $reg) { 649 $bal = (!$reg[1]) ? $reg[0] : "</$reg[2]>"; 650 $texte = str_replace('@@@SPIP_DIFF'.$c.'@@@', $bal, $texte); 651 $GLOBALS['les_notes'] = str_replace('@@@SPIP_DIFF'.$c.'@@@', $bal, $GLOBALS['les_notes']); 718 if (is_array($regs)) { 719 foreach ($regs as $c => $reg) { 720 $bal = (!$reg[1]) ? $reg[0] : "</$reg[2]>"; 721 $texte = str_replace('@@@SPIP_DIFF' . $c . '@@@', $bal, $texte); 722 $GLOBALS['les_notes'] = str_replace('@@@SPIP_DIFF' . $c . '@@@', $bal, $GLOBALS['les_notes']); 723 } 652 724 } 653 725 … … 655 727 // quand le dernier tag est ouvrant le refermer ... 656 728 $reg = end($regs); 657 if (!$reg[1] AND $reg[2]) $texte.="</$reg[2]>"; 729 if (!$reg[1] AND $reg[2]) { 730 $texte .= "</$reg[2]>"; 731 } 658 732 659 733 // et interdire_scripts ! … … 666 740 /** 667 741 * Liste les champs versionnés d'une table objet. 668 * 742 * 669 743 * @param string $table 670 744 * Nom complet de sa table sql. Exemple 'spip_articles' … … 675 749 $liste_objets_versionnees = is_array(unserialize($GLOBALS['meta']['objets_versions'])) ? unserialize($GLOBALS['meta']['objets_versions']) : array(); 676 750 677 if (!in_array($table, $liste_objets_versionnees))751 if (!in_array($table, $liste_objets_versionnees)) { 678 752 return array(); 753 } 679 754 680 755 include_spip('base/objets'); 681 if ($infos=lister_tables_objets_sql($table) 682 AND isset($infos['champs_versionnes'])) 756 if ($infos = lister_tables_objets_sql($table) 757 AND isset($infos['champs_versionnes']) 758 ) { 683 759 return $infos['champs_versionnes']; 760 } 684 761 685 762 return array(); … … 689 766 * Lorsqu'un champ versionée est une jointure, récuperer tous les liens 690 767 * et les mettre sous forme de liste énumérée 691 * 768 * 692 769 * @param string $objet 693 770 * @param string $id_objet … … 695 772 * @return string 696 773 */ 697 function recuperer_valeur_champ_jointure($objet, $id_objet, $jointure) {774 function recuperer_valeur_champ_jointure($objet, $id_objet, $jointure) { 698 775 $objet_joint = objet_type($jointure); 699 776 include_spip('action/editer_liens'); 700 777 $v = array(); 701 778 if (objet_associable($objet_joint)) { 702 $liens = objet_trouver_liens(array($objet_joint =>'*'),array($objet=>$id_objet));703 foreach ($liens as $l)779 $liens = objet_trouver_liens(array($objet_joint => '*'), array($objet => $id_objet)); 780 foreach ($liens as $l) { 704 781 $v[] = $l[$objet_joint]; 705 }706 elseif(objet_associable($objet)) {707 $liens = objet_trouver_liens(array($objet =>$id_objet),array($objet_joint=>'*'));708 foreach ($liens as $l)782 } 783 } elseif (objet_associable($objet)) { 784 $liens = objet_trouver_liens(array($objet => $id_objet), array($objet_joint => '*')); 785 foreach ($liens as $l) { 709 786 $v[] = $l[$objet]; 787 } 710 788 } 711 789 sort($v); 712 return implode(",",$v); 790 791 return implode(",", $v); 713 792 } 714 793 715 794 /** 716 795 * Créer la première révision d'un objet si nécessaire 717 * 796 * 718 797 * À faire notamment si on vient d'activer l'extension et qu'on fait une modif 719 798 * sur un objet qui était déjà en base, mais non versionné … … 721 800 * La fonction renvoie le numéro de la dernière version de l'objet, 722 801 * et 0 si pas de version pour cet objet 723 * 802 * 724 803 * @param string $table 725 804 * @param string $objet … … 729 808 * @return int 730 809 */ 731 function verifier_premiere_revision($table, $objet, $id_objet, $champs = null, $id_auteur = 0) {810 function verifier_premiere_revision($table, $objet, $id_objet, $champs = null, $id_auteur = 0) { 732 811 733 812 $id_table_objet = id_table_objet($objet); 734 if (!$champs) 813 if (!$champs) { 735 814 $champs = liste_champs_versionnes($table); 736 if (!$champs) 815 } 816 if (!$champs) { 737 817 return false; 738 739 if (!$id_version = sql_getfetsel('id_version','spip_versions',"id_objet=".intval($id_objet)." AND objet=".sql_quote($objet),'','id_version DESC','0,1')) { 818 } 819 820 if (!$id_version = sql_getfetsel('id_version', 'spip_versions', 821 "id_objet=" . intval($id_objet) . " AND objet=" . sql_quote($objet), '', 'id_version DESC', '0,1') 822 ) { 740 823 // recuperer toutes les valeurs actuelles des champs 741 824 // pour l'objet 742 $originaux = sql_fetsel("*", $table, "$id_table_objet=" .intval($id_objet));825 $originaux = sql_fetsel("*", $table, "$id_table_objet=" . intval($id_objet)); 743 826 $premiere = false; 744 827 $champs_originaux = array(); 745 828 746 foreach ($champs as $v){747 if (isset($originaux[$v])) {829 foreach ($champs as $v) { 830 if (isset($originaux[$v])) { 748 831 $champs_originaux[$v] = $originaux[$v]; 749 } 750 elseif (strncmp($v, 'jointure_', 9) == 0) { 751 $champs_originaux[$v] = recuperer_valeur_champ_jointure($objet,$id_objet,substr($v,9)); 832 } elseif (strncmp($v, 'jointure_', 9) == 0) { 833 $champs_originaux[$v] = recuperer_valeur_champ_jointure($objet, $id_objet, substr($v, 9)); 752 834 } 753 835 if (isset($champs_originaux[$v]) AND isset($originaux[$v]) AND strlen($originaux[$v])) { … … 759 841 // il faut creer une premiere revision 760 842 if ($premiere) { 761 $trouver_table = charger_fonction('trouver_table', 'base');843 $trouver_table = charger_fonction('trouver_table', 'base'); 762 844 $desc = $trouver_table($table); 763 845 … … 765 847 766 848 $date_modif = ""; 767 foreach (array('date_modif','maj') as $d){768 if (!$date_modif AND isset($originaux[$d]) AND $t =strtotime($d))849 foreach (array('date_modif', 'maj') as $d) { 850 if (!$date_modif AND isset($originaux[$d]) AND $t = strtotime($d)) { 769 851 $date_modif = date("Y-m-d H:i:s", $t-20); 852 } 770 853 } 771 854 if (!$date_modif 772 AND isset($desc['date']) 773 AND isset($originaux[$desc['date']])) { 855 AND isset($desc['date']) 856 AND isset($originaux[$desc['date']]) 857 ) { 774 858 $date_modif = $originaux[$desc['date']]; 775 } 776 elseif (!$date_modif) 859 } elseif (!$date_modif) { 777 860 $date_modif = date("Y-m-d H:i:s", time()-20); 778 779 if ($id_version = ajouter_version($id_objet, $objet, $champs_originaux, _T('revisions:version_initiale'), $id_auteur)) 780 sql_updateq('spip_versions', array('date' => $date_modif), "id_objet=".intval($id_objet)." AND objet=".sql_quote($objet)." AND id_version=$id_version"); 781 } 782 } 861 } 862 863 if ($id_version = ajouter_version($id_objet, $objet, $champs_originaux, _T('revisions:version_initiale'), 864 $id_auteur) 865 ) { 866 sql_updateq('spip_versions', array('date' => $date_modif), 867 "id_objet=" . intval($id_objet) . " AND objet=" . sql_quote($objet) . " AND id_version=$id_version"); 868 } 869 } 870 } 871 783 872 return $id_version; 784 873 } 874 785 875 ?> -
_core_/plugins/revisions/inc/revisions_autoriser.php
r93092 r93622 16 16 * 17 17 * @package SPIP\Revisions\Autorisations 18 **/18 **/ 19 19 20 if (!defined('_ECRIRE_INC_VERSION')) return; 20 if (!defined('_ECRIRE_INC_VERSION')) { 21 return; 22 } 21 23 22 24 /** 23 25 * Fonction du pipeline autoriser. N'a rien à faire. 26 * 24 27 * @pipeline autoriser 25 28 */ 26 function revisions_autoriser() {}29 function revisions_autoriser() { } 27 30 28 31 /** 29 32 * Autorisation de voir les revisions ? 30 * 33 * 31 34 * Il faut : 32 35 * - des revisions définies pour cet objet … … 35 38 * 36 39 * @param string $faire Action demandée 37 * @param string $type 38 * @param int $idIdentifiant de l'objet39 * @param array $quiDescription de l'auteur demandant l'autorisation40 * @param array $optOptions de cette autorisation40 * @param string $type Type d'objet sur lequel appliquer l'action 41 * @param int $id Identifiant de l'objet 42 * @param array $qui Description de l'auteur demandant l'autorisation 43 * @param array $opt Options de cette autorisation 41 44 * @return bool true s'il a le droit, false sinon 42 45 */ … … 46 49 47 50 include_spip('inc/revisions'); 48 if (!liste_champs_versionnes($table)) 51 if (!liste_champs_versionnes($table)) { 49 52 return false; 53 } 50 54 51 if (!$row = sql_fetsel("*", $table, "$id_table_objet=" .intval($id)))55 if (!$row = sql_fetsel("*", $table, "$id_table_objet=" . intval($id))) { 52 56 return false; 57 } 53 58 54 59 return … … 59 64 /** 60 65 * Autorisation de voir le menu révisions 61 * 66 * 62 67 * Il faut des révisions activées et présentes. 63 68 * 64 69 * @param string $faire Action demandée 65 * @param string $type 66 * @param int $idIdentifiant de l'objet67 * @param array $quiDescription de l'auteur demandant l'autorisation68 * @param array $optOptions de cette autorisation70 * @param string $type Type d'objet sur lequel appliquer l'action 71 * @param int $id Identifiant de l'objet 72 * @param array $qui Description de l'auteur demandant l'autorisation 73 * @param array $opt Options de cette autorisation 69 74 * @return bool true s'il a le droit, false sinon 70 75 */ 71 function autoriser_revisions_menu_dist($faire, $type = '', $id = 0, $qui = NULL, $opt = NULL){76 function autoriser_revisions_menu_dist($faire, $type = '', $id = 0, $qui = null, $opt = null) { 72 77 // SI pas de revisions sur un objet quelconque. 73 78 // ET pas de version... pas de bouton, c'est inutile... … … 76 81 return false; 77 82 } 83 78 84 return true; 79 85 } -
_core_/plugins/revisions/inc/revisions_pipeline.php
r92678 r93622 15 15 * 16 16 * @package SPIP\Revisions\Pipelines 17 **/ 18 if (!defined('_ECRIRE_INC_VERSION')) return; 17 **/ 18 if (!defined('_ECRIRE_INC_VERSION')) { 19 return; 20 } 19 21 20 22 … … 22 24 * Ajoute dans le bloc d'info d'un objet un bouton permettant d'aller voir 23 25 * l'historique de ses révisions 24 * 25 * @param array $flux 26 * 27 * @param array $flux Données du pipeline 26 28 * @return array $flux Données du pipeline 27 29 */ 28 function revisions_boite_infos($flux) {30 function revisions_boite_infos($flux) { 29 31 $type = $flux['args']['type']; 30 32 if ($id = intval($flux['args']['id']) 31 32 AND in_array(table_objet_sql($type), $tables)33 AND autoriser('voirrevisions',$type,$id)34 35 36 AND sql_countsel('spip_versions', 'id_objet='.intval($id).' AND objet = '.sql_quote($type)) > 133 AND $tables = unserialize($GLOBALS['meta']['objets_versions']) 34 AND in_array(table_objet_sql($type), $tables) 35 AND autoriser('voirrevisions', $type, $id) 36 // regarder le numero de revision le plus eleve, et afficher le bouton 37 // si c'est interessant (id_version>1) 38 AND sql_countsel('spip_versions', 'id_objet=' . intval($id) . ' AND objet = ' . sql_quote($type)) > 1 37 39 ) { 38 40 include_spip('inc/presentation'); 39 $flux['data'] .= icone_horizontale(_T('revisions:info_historique_lien'), generer_url_ecrire('revision',"id_objet=$id&objet=$type"), "revision-24.png"); 41 $flux['data'] .= icone_horizontale(_T('revisions:info_historique_lien'), 42 generer_url_ecrire('revision', "id_objet=$id&objet=$type"), "revision-24.png"); 40 43 } 41 44 … … 49 52 * et sur la page de suivi de l'activité du site 50 53 * 51 * @param array $flux 54 * @param array $flux Données du pipeline 52 55 * @return array $flux Données du pipeline 53 56 */ … … 55 58 // la bonne page et des objets révisables cochées ! 56 59 if (in_array($flux['args']['exec'], array('accueil', 'suivi_edito')) 57 and unserialize($GLOBALS['meta']['objets_versions'])) { 60 and unserialize($GLOBALS['meta']['objets_versions']) 61 ) { 58 62 $contexte = array(); 59 if ($GLOBALS['visiteur_session']['statut'] !=='0minirezo') {63 if ($GLOBALS['visiteur_session']['statut'] !== '0minirezo') { 60 64 $contexte['id_auteur'] = $GLOBALS['visiteur_session']['id_auteur']; 61 65 } 62 $flux['data'] .= recuperer_fond('prive/objets/liste/versions',$contexte,array('ajax'=>true)); 63 } 66 $flux['data'] .= recuperer_fond('prive/objets/liste/versions', $contexte, array('ajax' => true)); 67 } 68 64 69 return $flux; 65 70 } … … 67 72 /** 68 73 * Définir les metas de configuration liées aux révisions 69 * 74 * 70 75 * Utilisé par inc/config 71 76 * 72 * @param array $metas 77 * @param array $metas Liste des métas et leurs valeurs par défaut 73 78 * @return array Liste des métas et leurs valeurs par défaut 74 79 */ 75 function revisions_configurer_liste_metas($metas) {80 function revisions_configurer_liste_metas($metas) { 76 81 // Dorénavant dans les metas on utilisera un array serialisé de types d'objets 77 82 // qui correspondront aux objets versionnés 78 $metas['objets_versions'] = 83 $metas['objets_versions'] = ''; 79 84 80 85 return $metas; … … 84 89 /** 85 90 * Charge les données d'une révision donnée dans le formulaire d'édition d'un objet 86 * 87 * @param array $flux 91 * 92 * @param array $flux Données du pipeline 88 93 * @return array $flux Données du pipeline 89 94 */ 90 function revisions_formulaire_charger($flux) {91 if (strncmp($flux['args']['form'], 'editer_',7)==092 93 AND $objet = substr($flux['args']['form'],7)94 95 95 function revisions_formulaire_charger($flux) { 96 if (strncmp($flux['args']['form'], 'editer_', 7) == 0 97 AND $id_version = _request('id_version') 98 AND $objet = substr($flux['args']['form'], 7) 99 AND $id_table_objet = id_table_objet($objet) 100 AND isset($flux['data'][$id_table_objet]) 96 101 AND $id = intval($flux['data'][$id_table_objet]) 97 AND !$flux['args']['je_suis_poste']){ 102 AND !$flux['args']['je_suis_poste'] 103 ) { 98 104 // ajouter un message convival pour indiquer qu'on a restaure la version 99 $flux['data']['message_ok'] = _T('revisions:icone_restaurer_version', array('version'=>$id_version));100 $flux['data']['message_ok'] .= "<br />" ._T('revisions:message_valider_recuperer_version');105 $flux['data']['message_ok'] = _T('revisions:icone_restaurer_version', array('version' => $id_version)); 106 $flux['data']['message_ok'] .= "<br />" . _T('revisions:message_valider_recuperer_version'); 101 107 // recuperer la version 102 108 include_spip('inc/revisions'); 103 $champs = recuperer_version($id, $objet, $id_version);104 foreach ($champs as $champ=>$valeur){105 if (!strncmp($champ, 'jointure_',9)==0){106 if ($champ =='id_rubrique'){109 $champs = recuperer_version($id, $objet, $id_version); 110 foreach ($champs as $champ => $valeur) { 111 if (!strncmp($champ, 'jointure_', 9) == 0) { 112 if ($champ == 'id_rubrique') { 107 113 $flux['data']['id_parent'] = $valeur; 114 } else { 115 $flux['data'][$champ] = $valeur; 108 116 } 109 else110 $flux['data'][$champ] = $valeur;111 117 } 112 118 } 113 119 } 120 114 121 return $flux; 115 122 } 116 117 123 118 124 … … 120 126 * Sur une insertion en base, lever un flag pour ne pas creer une premiere révision vide 121 127 * dans pre_edition mais attendre la post_edition pour cela 122 * 123 * @param array $x 124 * @return array $x Données du pipeline 125 */ 126 function revisions_post_insertion($x) {128 * 129 * @param array $x Données du pipeline 130 * @return array $x Données du pipeline 131 */ 132 function revisions_post_insertion($x) { 127 133 $table = $x['args']['table']; 128 134 include_spip('inc/revisions'); 129 if ($champs = liste_champs_versionnes($table)) { 130 $GLOBALS['premiere_revision']["$table:".$x['args']['id_objet']] = true; 131 } 135 if ($champs = liste_champs_versionnes($table)) { 136 $GLOBALS['premiere_revision']["$table:" . $x['args']['id_objet']] = true; 137 } 138 132 139 return $x; 133 140 } … … 138 145 * et la creer sinon avec l'etat actuel de l'objet 139 146 * 140 * @param array $x 147 * @param array $x Données du pipeline 141 148 * @return array $x Données du pipeline 142 149 */ … … 144 151 // ne rien faire quand on passe ici en controle md5 145 152 if (!isset($x['args']['action']) 146 OR $x['args']['action']!=='controler'){ 153 OR $x['args']['action'] !== 'controler' 154 ) { 147 155 $table = $x['args']['table']; 148 156 include_spip('inc/revisions'); 149 157 // si flag leve passer son chemin, post_edition le fera (mais baisser le flag en le gardant en memoire tout de meme) 150 if (isset($GLOBALS['premiere_revision']["$table:".$x['args']['id_objet']])){ 151 $GLOBALS['premiere_revision']["$table:".$x['args']['id_objet']] = 0; 152 } 153 // sinon creer une premiere revision qui date et dont on ne connait pas l'auteur 154 elseif ($versionnes = liste_champs_versionnes($table)) { 158 if (isset($GLOBALS['premiere_revision']["$table:" . $x['args']['id_objet']])) { 159 $GLOBALS['premiere_revision']["$table:" . $x['args']['id_objet']] = 0; 160 } // sinon creer une premiere revision qui date et dont on ne connait pas l'auteur 161 elseif ($versionnes = liste_champs_versionnes($table)) { 155 162 $objet = isset($x['args']['type']) ? $x['args']['type'] : objet_type($table); 156 163 verifier_premiere_revision($table, $objet, $x['args']['id_objet'], $versionnes, -1); 157 164 } 158 165 } 166 159 167 return $x; 160 168 } … … 164 172 * enregistrer une première révision de l'objet si nécessaire 165 173 * 166 * @param array $x 174 * @param array $x Données du pipeline 167 175 * @return array $x Données du pipeline 168 176 */ 169 177 function revisions_pre_edition_lien($x) { 170 if (intval($x['args']['id_objet_source'])>0 171 AND intval($x['args']['id_objet'])>0) { 178 if (intval($x['args']['id_objet_source']) > 0 179 AND intval($x['args']['id_objet']) > 0 180 ) { 172 181 $table = table_objet_sql($x['args']['objet']); 173 182 $id_objet = intval($x['args']['id_objet']); 174 183 include_spip('inc/revisions'); 175 if (isset($GLOBALS['premiere_revision']["$table:".$id_objet])){ 176 $GLOBALS['premiere_revision']["$table:".$id_objet] = 0; 177 } 178 // ex : si le champ jointure_mots est versionnable sur les articles 184 if (isset($GLOBALS['premiere_revision']["$table:" . $id_objet])) { 185 $GLOBALS['premiere_revision']["$table:" . $id_objet] = 0; 186 } // ex : si le champ jointure_mots est versionnable sur les articles 179 187 elseif ($versionnes = liste_champs_versionnes($table) 180 AND in_array($j='jointure_'.table_objet($x['args']['objet_source']),$versionnes)){ 181 verifier_premiere_revision($table,$x['args']['objet'],$id_objet,$versionnes,-1); 188 AND in_array($j = 'jointure_' . table_objet($x['args']['objet_source']), $versionnes) 189 ) { 190 verifier_premiere_revision($table, $x['args']['objet'], $id_objet, $versionnes, -1); 182 191 } 183 192 184 193 $table = table_objet_sql($x['args']['objet_source']); 185 194 $id_objet = $x['args']['id_objet_source']; 186 if (isset($GLOBALS['premiere_revision']["$table:".$id_objet])){ 187 $GLOBALS['premiere_revision']["$table:".$id_objet] = 0; 188 } 189 // ex : si le champ jointure_articles est versionnable sur les mots 195 if (isset($GLOBALS['premiere_revision']["$table:" . $id_objet])) { 196 $GLOBALS['premiere_revision']["$table:" . $id_objet] = 0; 197 } // ex : si le champ jointure_articles est versionnable sur les mots 190 198 elseif ($versionnes = liste_champs_versionnes($table) 191 AND in_array($j='jointure_'.table_objet($x['args']['objet']),$versionnes)){ 192 verifier_premiere_revision($table,$x['args']['objet_source'],$id_objet,$versionnes,-1); 199 AND in_array($j = 'jointure_' . table_objet($x['args']['objet']), $versionnes) 200 ) { 201 verifier_premiere_revision($table, $x['args']['objet_source'], $id_objet, $versionnes, -1); 193 202 } 194 203 } … … 200 209 * Après modification en base, versionner l'objet 201 210 * 202 * @param array $x 211 * @param array $x Données du pipeline 203 212 * @return array $x Données du pipeline 204 213 */ 205 214 function revisions_post_edition($x) { 206 215 include_spip('inc/revisions'); 207 if (isset($x['args']['table']) and $versionnes = liste_champs_versionnes($x['args']['table'])) {216 if (isset($x['args']['table']) and $versionnes = liste_champs_versionnes($x['args']['table'])) { 208 217 // Regarder si au moins une des modifs est versionnable 209 218 $champs = array(); … … 212 221 include_spip('inc/session'); 213 222 214 if (isset($GLOBALS['premiere_revision']["$table:" .$x['args']['id_objet']])){215 unset($GLOBALS['premiere_revision']["$table:" .$x['args']['id_objet']]);223 if (isset($GLOBALS['premiere_revision']["$table:" . $x['args']['id_objet']])) { 224 unset($GLOBALS['premiere_revision']["$table:" . $x['args']['id_objet']]); 216 225 // verifier la premiere version : sur une version initiale on attend ici pour la creer 217 226 // plutot que de creer une version vide+un diff 218 227 verifier_premiere_revision($table, $objet, $x['args']['id_objet'], $versionnes, session_get('id_auteur')); 219 } 220 else { 228 } else { 221 229 // on versionne les differences 222 230 foreach ($versionnes as $key) { … … 227 235 228 236 if (count($champs)) { 229 ajouter_version($x['args']['id_objet'], $objet, $champs, '', session_get('id_auteur'));237 ajouter_version($x['args']['id_objet'], $objet, $champs, '', session_get('id_auteur')); 230 238 } 231 239 } … … 239 247 * Après modification en base d'un lien, versionner l'objet si nécessaire 240 248 * 241 * @param array $x 249 * @param array $x Données du pipeline 242 250 * @return array $x Données du pipeline 243 251 */ … … 256 264 ) 257 265 */ 258 if (intval($x['args']['id_objet_source'])>0 259 AND intval($x['args']['id_objet'])>0) { 266 if (intval($x['args']['id_objet_source']) > 0 267 AND intval($x['args']['id_objet']) > 0 268 ) { 260 269 261 270 $table = table_objet_sql($x['args']['objet']); 262 271 $id_objet = $x['args']['id_objet']; 263 272 include_spip('inc/revisions'); 264 if (isset($GLOBALS['premiere_revision']["$table:".$id_objet])){ 265 $GLOBALS['premiere_revision']["$table:".$id_objet] = 0; 266 } 267 // ex : si le champ jointure_mots est versionnable sur les articles 273 if (isset($GLOBALS['premiere_revision']["$table:" . $id_objet])) { 274 $GLOBALS['premiere_revision']["$table:" . $id_objet] = 0; 275 } // ex : si le champ jointure_mots est versionnable sur les articles 268 276 elseif ($versionnes = liste_champs_versionnes($table) 269 AND in_array($j='jointure_'.table_objet($x['args']['objet_source']),$versionnes)){ 270 $champs = array($j=>recuperer_valeur_champ_jointure($x['args']['objet'],$id_objet,$x['args']['objet_source'])); 271 ajouter_version($id_objet,$x['args']['objet'], $champs, '', $GLOBALS['visiteur_session']['id_auteur']); 277 AND in_array($j = 'jointure_' . table_objet($x['args']['objet_source']), $versionnes) 278 ) { 279 $champs = array( 280 $j => recuperer_valeur_champ_jointure($x['args']['objet'], $id_objet, $x['args']['objet_source']) 281 ); 282 ajouter_version($id_objet, $x['args']['objet'], $champs, '', $GLOBALS['visiteur_session']['id_auteur']); 272 283 } 273 284 274 285 $table = table_objet_sql($x['args']['objet_source']); 275 286 $id_objet = $x['args']['id_objet_source']; 276 if (isset($GLOBALS['premiere_revision']["$table:".$id_objet])){ 277 $GLOBALS['premiere_revision']["$table:".$id_objet] = 0; 278 } 279 // ex : si le champ jointure_articles est versionnable sur les mots 287 if (isset($GLOBALS['premiere_revision']["$table:" . $id_objet])) { 288 $GLOBALS['premiere_revision']["$table:" . $id_objet] = 0; 289 } // ex : si le champ jointure_articles est versionnable sur les mots 280 290 elseif ($versionnes = liste_champs_versionnes($table) 281 AND in_array($j='jointure_'.table_objet($x['args']['objet']),$versionnes)){ 282 $champs = array($j=>recuperer_valeur_champ_jointure($x['args']['objet_source'],$id_objet,$x['args']['objet'])); 283 ajouter_version($id_objet,$x['args']['objet_source'], $champs, '', $GLOBALS['visiteur_session']['id_auteur']); 291 AND in_array($j = 'jointure_' . table_objet($x['args']['objet']), $versionnes) 292 ) { 293 $champs = array( 294 $j => recuperer_valeur_champ_jointure($x['args']['objet_source'], $id_objet, $x['args']['objet']) 295 ); 296 ajouter_version($id_objet, $x['args']['objet_source'], $champs, '', $GLOBALS['visiteur_session']['id_auteur']); 284 297 } 285 298 } … … 298 311 * Tableau des tâches et leur périodicité en seconde 299 312 */ 300 function revisions_taches_generales_cron($taches_generales) {313 function revisions_taches_generales_cron($taches_generales) { 301 314 $taches_generales['optimiser_revisions'] = 86400; 315 302 316 return $taches_generales; 303 317 } 318 304 319 ?> -
_core_/plugins/revisions/inc/suivi_versions.php
r93092 r93622 15 15 * 16 16 * @package SPIP\Revisions\Versions 17 **/ 18 if (!defined("_ECRIRE_INC_VERSION")) return; 17 **/ 18 if (!defined("_ECRIRE_INC_VERSION")) { 19 return; 20 } 19 21 20 22 include_spip('inc/revisions'); … … 23 25 /** 24 26 * Afficher un diff correspondant à une révision d'un objet 25 * 26 * @param int $id_objet 27 * @param string $objet 28 * @param int $id_version 27 * 28 * @param int $id_objet Identifiant de l'objet 29 * @param string $objet Objet 30 * @param int $id_version Identifiant de la version 29 31 * @param bool $court 30 32 * - false : affiche le diff complet … … 33 35 * Texte HTML du diff. 34 36 */ 35 function revisions_diff ($id_objet, $objet, $id_version, $court = false){ 36 $textes = revision_comparee($id_objet,$objet, $id_version, 'diff'); 37 if (!is_array($textes)) return $textes; 37 function revisions_diff($id_objet, $objet, $id_version, $court = false) { 38 $textes = revision_comparee($id_objet, $objet, $id_version, 'diff'); 39 if (!is_array($textes)) { 40 return $textes; 41 } 38 42 $rev = ''; 39 43 $nb = 0; 40 44 foreach ($textes as $var => $t) { 41 if ($n =strlen($t)) {42 if ($court) 45 if ($n = strlen($t)) { 46 if ($court) { 43 47 $nb += $n; 44 else {48 } else { 45 49 $aff = propre_diff($t); 46 50 if ($GLOBALS['les_notes']) { 47 $aff .= '<p>' .$GLOBALS['les_notes'].'</p>';51 $aff .= '<p>' . $GLOBALS['les_notes'] . '</p>'; 48 52 $GLOBALS['les_notes'] = ''; 49 53 } … … 52 56 } 53 57 } 58 54 59 return $court ? _T('taille_octets', array('taille' => $nb)) : $rev; 55 60 } … … 62 67 * récupérer une version qui contient ce champ. On complète alors la liste 63 68 * des champs avec la version du champ trouvée. 64 * 65 * @param string $objet 66 * @param int $id_objet 67 * @param int $id_version 68 * @param string $champ 69 * @param array $champs 69 * 70 * @param string $objet Objet 71 * @param int $id_objet Identifiant de l'objet 72 * @param int $id_version Identifiant de la version 73 * @param string $champ Le nom du champ à retrouver 74 * @param array $champs Liste des champs déjà connus 70 75 * @return void 71 76 */ 72 function retrouver_champ_version_objet($objet, $id_objet, $id_version, $champ, &$champs) {73 if (isset($champs[$champ])) 77 function retrouver_champ_version_objet($objet, $id_objet, $id_version, $champ, &$champs) { 78 if (isset($champs[$champ])) { 74 79 return; 80 } 75 81 76 82 // Remonter dans le temps pour trouver le champ en question … … 78 84 $id_ref = $id_version-1; 79 85 $prev = array(); 80 while (!isset($prev[$champ]) AND $id_ref >0) {81 $prev = recuperer_version($id_objet, $objet, $id_ref--);86 while (!isset($prev[$champ]) AND $id_ref > 0) { 87 $prev = recuperer_version($id_objet, $objet, $id_ref--); 82 88 } 83 89 if (isset($prev[$champ])) { … … 96 102 * qui ont été modifiés depuis une version précédente et la version 97 103 * d'id_version, et les retourne. 98 * 104 * 99 105 * La version précédente est par défaut la version juste 100 106 * avant id_version, mais peut être définie via le paramètre id_diff. … … 102 108 * Le retour est plus ou moins locace en fonction du paramètre format. 103 109 * 104 * @param int $id_objet 105 * @param string $objet 106 * @param int $id_version 110 * @param int $id_objet Identifiant de l'objet 111 * @param string $objet Objet 112 * @param int $id_version Identifiant de la version 107 113 * @param string $format 108 114 * Type de retour … … 116 122 * Couples (champ => texte) 117 123 */ 118 function revision_comparee($id_objet, $objet, $id_version, $format = 'diff', $id_diff = NULL) {124 function revision_comparee($id_objet, $objet, $id_version, $format = 'diff', $id_diff = null) { 119 125 include_spip('inc/diff'); 120 126 121 127 // chercher le numero de la version precedente 122 128 if (!$id_diff) { 123 $id_diff = sql_getfetsel("id_version", "spip_versions", "id_objet=" . intval($id_objet) . " AND id_version < " . intval($id_version)." AND objet=".sql_quote($objet), "", "id_version DESC", "1"); 129 $id_diff = sql_getfetsel("id_version", "spip_versions", 130 "id_objet=" . intval($id_objet) . " AND id_version < " . intval($id_version) . " AND objet=" . sql_quote($objet), 131 "", "id_version DESC", "1"); 124 132 } 125 133 … … 133 141 } 134 142 135 $old = recuperer_version($id_objet, $objet, $id_diff);136 $new = recuperer_version($id_objet, $objet, $id_version);143 $old = recuperer_version($id_objet, $objet, $id_diff); 144 $new = recuperer_version($id_objet, $objet, $id_version); 137 145 138 146 $textes = array(); … … 152 160 153 161 // memoriser les cas les plus courant 154 $afficher_diff_champ = charger_fonction('champ','afficher_diff');155 $afficher_diff_jointure = charger_fonction('jointure', 'afficher_diff');162 $afficher_diff_champ = charger_fonction('champ', 'afficher_diff'); 163 $afficher_diff_jointure = charger_fonction('jointure', 'afficher_diff'); 156 164 foreach ($champs as $champ) { 157 165 // Remonter dans le temps pour trouver le champ en question 158 166 // pour chaque version 159 retrouver_champ_version_objet($objet,$id_objet,$id_version,$champ,$new); 160 retrouver_champ_version_objet($objet,$id_objet,$id_diff,$champ,$old); 161 162 if (!strlen($new[$champ]) && !strlen($old[$champ])) continue; 167 retrouver_champ_version_objet($objet, $id_objet, $id_version, $champ, $new); 168 retrouver_champ_version_objet($objet, $id_objet, $id_diff, $champ, $old); 169 170 if (!strlen($new[$champ]) && !strlen($old[$champ])) { 171 continue; 172 } 163 173 164 174 // si on n'a que le vieux, ou que le nouveau, on ne 165 175 // l'affiche qu'en mode "complet" 166 if ($format == 'complet') 176 if ($format == 'complet') { 167 177 $textes[$champ] = strlen($new[$champ]) 168 178 ? $new[$champ] : $old[$champ]; 179 } 169 180 170 181 // si on a les deux, le diff nous interesse, plus ou moins court 171 182 if (isset($new[$champ]) AND isset($old[$champ])) { 172 if (!$afficher_diff = charger_fonction($objet."_".$champ,'afficher_diff',true) 173 AND !$afficher_diff = charger_fonction($champ,'afficher_diff',true)) 174 $afficher_diff = (strncmp($champ,'jointure_',9)==0?$afficher_diff_jointure:$afficher_diff_champ); 175 176 $textes[$champ] = $afficher_diff($champ,$old[$champ],$new[$champ],$format); 183 if (!$afficher_diff = charger_fonction($objet . "_" . $champ, 'afficher_diff', true) 184 AND !$afficher_diff = charger_fonction($champ, 'afficher_diff', true) 185 ) { 186 $afficher_diff = (strncmp($champ, 'jointure_', 9) == 0 ? $afficher_diff_jointure : $afficher_diff_champ); 187 } 188 189 $textes[$champ] = $afficher_diff($champ, $old[$champ], $new[$champ], $format); 177 190 } 178 191 } … … 181 194 // que donner par defaut ? (par exemple si id_version=1) 182 195 if (!$textes) { 183 $textes = recuperer_version($id_objet, $objet, $id_version);196 $textes = recuperer_version($id_objet, $objet, $id_version); 184 197 } 185 198 -
_core_/plugins/revisions/prive/objets/contenu/revision_fonctions.php
r93092 r93622 1 1 <?php 2 2 3 if (!defined('_ECRIRE_INC_VERSION')) return; 3 if (!defined('_ECRIRE_INC_VERSION')) { 4 return; 5 } 4 6 5 7 /** 6 8 * Trouver le label d'un champ de révision 7 * 9 * 8 10 * Quelques champs ont un label dans dans les chaînes de langue de SPIP 9 11 * Pour un champ particulier d'un objet particulier, le pipeline revisions_chercher_label 10 12 * peut être utilisé 11 * 13 * 12 14 * @param string $champ 13 * 15 * Le nom du champ révisionné 14 16 * @param string $objet 15 * 17 * Le type d'objet révisionné 16 18 * @return string $label 17 * 19 * Le label du champ 18 20 */ 19 function label_champ($champ, $objet = false) {21 function label_champ($champ, $objet = false) { 20 22 $label = ""; 21 23 // si jointure: renvoyer le nom des objets joints 22 if (strncmp($champ,'jointure_',9)==0) 23 return _T(objet_info(objet_type(substr($champ,9)),'texte_objets')); 24 25 switch ($champ){ 24 if (strncmp($champ, 'jointure_', 9) == 0) { 25 return _T(objet_info(objet_type(substr($champ, 9)), 'texte_objets')); 26 } 27 28 switch ($champ) { 26 29 case 'surtitre': 27 30 $label = "texte_sur_titre"; … … 39 42 $champ = "chapeau"; 40 43 default: 41 $label = pipeline('revisions_chercher_label',array('args'=>array('champ'=>$champ,'objet'=>$objet),'data' => 'info_'.$champ)); 44 $label = pipeline('revisions_chercher_label', 45 array('args' => array('champ' => $champ, 'objet' => $objet), 'data' => 'info_' . $champ)); 42 46 break; 43 47 } 44 return $label?_T($label):""; 48 49 return $label ? _T($label) : ""; 45 50 } 46 51 -
_core_/plugins/revisions/prive/objets/liste/versions_fonctions.php
r53214 r93622 1 1 <?php 2 2 3 if (!defined('_ECRIRE_INC_VERSION')) return; 3 if (!defined('_ECRIRE_INC_VERSION')) { 4 return; 5 } 4 6 5 7 include_spip('inc/puce_statut'); -
_core_/plugins/revisions/prive/rss/revisions_fonctions.php
r89285 r93622 11 11 \***************************************************************************/ 12 12 13 if (!defined("_ECRIRE_INC_VERSION")) return; 13 if (!defined("_ECRIRE_INC_VERSION")) { 14 return; 15 } 14 16 15 17 include_spip('inc/suivi_versions'); -
_core_/plugins/revisions/prive/squelettes/contenu/revision_fonctions.php
r53214 r93622 1 1 <?php 2 2 3 if (!defined('_ECRIRE_INC_VERSION')) return; 3 if (!defined('_ECRIRE_INC_VERSION')) { 4 return; 5 } 4 6 5 7 include_spip('inc/revisions'); -
_core_/plugins/revisions/revisions_administrations.php
r93092 r93622 15 15 * 16 16 * @package SPIP\Revisions\Installation 17 **/ 18 19 if (!defined('_ECRIRE_INC_VERSION')) return; 17 **/ 18 19 if (!defined('_ECRIRE_INC_VERSION')) { 20 return; 21 } 20 22 21 23 /** … … 25 27 * @param string $version_cible 26 28 */ 27 function revisions_upgrade($nom_meta_base_version, $version_cible) {29 function revisions_upgrade($nom_meta_base_version, $version_cible) { 28 30 // cas particulier : 29 31 // si plugin pas installe mais que la table existe 30 32 // considerer que c'est un upgrade depuis v 1.0.0 31 33 // pour gerer l'historique des installations SPIP <=2.1 32 if (!isset($GLOBALS['meta'][$nom_meta_base_version])) {33 $trouver_table = charger_fonction('trouver_table', 'base');34 if (!isset($GLOBALS['meta'][$nom_meta_base_version])) { 35 $trouver_table = charger_fonction('trouver_table', 'base'); 34 36 if ($desc = $trouver_table('spip_versions') 35 AND isset($desc['exist']) AND $desc['exist'] 36 AND isset($desc['field']['id_article'])){ 37 ecrire_meta($nom_meta_base_version,'1.0.0'); 37 AND isset($desc['exist']) AND $desc['exist'] 38 AND isset($desc['field']['id_article']) 39 ) { 40 ecrire_meta($nom_meta_base_version, '1.0.0'); 38 41 } 39 42 // si pas de table en base, on fera une simple creation de base … … 42 45 $maj = array(); 43 46 $maj['create'] = array( 44 array('maj_tables', array('spip_versions','spip_versions_fragments')),47 array('maj_tables', array('spip_versions', 'spip_versions_fragments')), 45 48 array('revisions_upate_meta'), 46 49 ); … … 49 52 // Ajout du champs objet et modification du champs id_article en id_objet 50 53 // sur les 2 tables spip_versions et spip_versions_fragments 51 array('sql_alter', "TABLE spip_versions CHANGE id_article id_objet bigint(21) DEFAULT 0 NOT NULL"),52 array('sql_alter', "TABLE spip_versions ADD objet VARCHAR (25) DEFAULT '' NOT NULL AFTER id_objet"),54 array('sql_alter', "TABLE spip_versions CHANGE id_article id_objet bigint(21) DEFAULT 0 NOT NULL"), 55 array('sql_alter', "TABLE spip_versions ADD objet VARCHAR (25) DEFAULT '' NOT NULL AFTER id_objet"), 53 56 // Les id_objet restent les id_articles puisque les révisions n'étaient possibles que sur les articles 54 array('sql_updateq', "spip_versions",array('objet'=>'article'),"objet=''"),57 array('sql_updateq', "spip_versions", array('objet' => 'article'), "objet=''"), 55 58 // Changement des clefs primaires également 56 array('sql_alter', "TABLE spip_versions DROP PRIMARY KEY"),57 array('sql_alter', "TABLE spip_versions ADD PRIMARY KEY (id_version, id_objet, objet)"),58 59 array('sql_alter', "TABLE spip_versions_fragments CHANGE id_article id_objet bigint(21) DEFAULT 0 NOT NULL"),60 array('sql_alter', "TABLE spip_versions_fragments ADD objet VARCHAR (25) DEFAULT '' NOT NULL AFTER id_objet"),59 array('sql_alter', "TABLE spip_versions DROP PRIMARY KEY"), 60 array('sql_alter', "TABLE spip_versions ADD PRIMARY KEY (id_version, id_objet, objet)"), 61 62 array('sql_alter', "TABLE spip_versions_fragments CHANGE id_article id_objet bigint(21) DEFAULT 0 NOT NULL"), 63 array('sql_alter', "TABLE spip_versions_fragments ADD objet VARCHAR (25) DEFAULT '' NOT NULL AFTER id_objet"), 61 64 // Les id_objet restent les id_articles puisque les révisions n'étaient possibles que sur les articles 62 array('sql_updateq', "spip_versions_fragments",array('objet'=>'article'),"objet=''"),65 array('sql_updateq', "spip_versions_fragments", array('objet' => 'article'), "objet=''"), 63 66 // Changement des clefs primaires également 64 array('sql_alter', "TABLE spip_versions_fragments DROP PRIMARY KEY"),65 array('sql_alter', "TABLE spip_versions_fragments ADD PRIMARY KEY (id_objet, objet, id_fragment, version_min)"),67 array('sql_alter', "TABLE spip_versions_fragments DROP PRIMARY KEY"), 68 array('sql_alter', "TABLE spip_versions_fragments ADD PRIMARY KEY (id_objet, objet, id_fragment, version_min)"), 66 69 array('revisions_upate_meta'), 67 70 ); 68 71 $maj['1.1.2'] = array( 69 72 array('revisions_upate_meta'), 70 array('sql_updateq', "spip_versions",array('objet'=>'article'),"objet=''"),71 array('sql_updateq', "spip_versions_fragments",array('objet'=>'article'),"objet=''"),73 array('sql_updateq', "spip_versions", array('objet' => 'article'), "objet=''"), 74 array('sql_updateq', "spip_versions_fragments", array('objet' => 'article'), "objet=''"), 72 75 ); 73 76 $maj['1.1.3'] = array( 74 array('sql_alter', "TABLE spip_versions DROP KEY id_objet"),75 array('sql_alter', "TABLE spip_versions ADD INDEX id_version (id_version)"),76 array('sql_alter', "TABLE spip_versions ADD INDEX id_objet (id_objet)"),77 array('sql_alter', "TABLE spip_versions ADD INDEX objet (objet)")77 array('sql_alter', "TABLE spip_versions DROP KEY id_objet"), 78 array('sql_alter', "TABLE spip_versions ADD INDEX id_version (id_version)"), 79 array('sql_alter', "TABLE spip_versions ADD INDEX id_objet (id_objet)"), 80 array('sql_alter', "TABLE spip_versions ADD INDEX objet (objet)") 78 81 ); 79 82 $maj['1.1.4'] = array( 80 array('sql_alter', "TABLE spip_versions CHANGE permanent permanent char(3) DEFAULT '' NOT NULL"),81 array('sql_alter', "TABLE spip_versions CHANGE champs champs text DEFAULT '' NOT NULL"),83 array('sql_alter', "TABLE spip_versions CHANGE permanent permanent char(3) DEFAULT '' NOT NULL"), 84 array('sql_alter', "TABLE spip_versions CHANGE champs champs text DEFAULT '' NOT NULL"), 82 85 ); 83 86 $maj['1.2.0'] = array( … … 91 94 } 92 95 93 function revisions_uncompress_fragments() {94 95 $res = sql_select("*", "spip_versions_fragments","compress=".intval(1));96 while ($row = sql_fetch($res)){96 function revisions_uncompress_fragments() { 97 98 $res = sql_select("*", "spip_versions_fragments", "compress=" . intval(1)); 99 while ($row = sql_fetch($res)) { 97 100 $fragment = @gzuncompress($row['fragment']); 98 101 99 102 // si la decompression echoue, on met en base le flag 'corrompu-gz' 100 103 // et au dump le framgment compresse dans un fichier 101 if (strlen($row['fragment']) AND $fragment ===false){102 $dir_tmp = sous_repertoire(_DIR_TMP, "versions_fragments_corrompus");103 $f = $row['id_fragment'] ."-".$row['objet']."-".$row['id_objet'];104 spip_log("Fragment gz corrompu $f", "maj"._LOG_ERREUR);105 $f = $f ."-gz.txt";106 ecrire_fichier($dir_tmp . $f, $row['fragment']);104 if (strlen($row['fragment']) AND $fragment === false) { 105 $dir_tmp = sous_repertoire(_DIR_TMP, "versions_fragments_corrompus"); 106 $f = $row['id_fragment'] . "-" . $row['objet'] . "-" . $row['id_objet']; 107 spip_log("Fragment gz corrompu $f", "maj" . _LOG_ERREUR); 108 $f = $f . "-gz.txt"; 109 ecrire_fichier($dir_tmp . $f, $row['fragment']); 107 110 $fragment = "corrompu-gz"; 108 111 } … … 113 116 ); 114 117 115 sql_updateq("spip_versions_fragments",$set,"id_fragment=".intval($row['id_fragment'])." AND id_objet=".intval($row['id_objet'])." AND objet=".sql_quote($row['objet'])." AND version_min=".intval($row['version_min'])); 116 if (time()>_TIME_OUT) return; 117 } 118 119 sql_updateq("spip_versions_fragments",array('compress'=>-1)); 120 121 } 122 123 function revisions_repair_unserialized_fragments(){ 124 $res = sql_select("*","spip_versions_fragments","compress=".intval(-1)); 118 sql_updateq("spip_versions_fragments", $set, 119 "id_fragment=" . intval($row['id_fragment']) . " AND id_objet=" . intval($row['id_objet']) . " AND objet=" . sql_quote($row['objet']) . " AND version_min=" . intval($row['version_min'])); 120 if (time() > _TIME_OUT) { 121 return; 122 } 123 } 124 125 sql_updateq("spip_versions_fragments", array('compress' => -1)); 126 127 } 128 129 function revisions_repair_unserialized_fragments() { 130 $res = sql_select("*", "spip_versions_fragments", "compress=" . intval(-1)); 125 131 $n = sql_count($res); 126 spip_log("$n fragments a verifier", "maj");127 while ($row = sql_fetch($res)){132 spip_log("$n fragments a verifier", "maj"); 133 while ($row = sql_fetch($res)) { 128 134 $fragment = $row['fragment']; 129 135 $set = array( … … 132 138 133 139 // verifier que le fragment est bien serializable 134 if (unserialize($fragment)===false AND strncmp($fragment,"corrompu",8)!==0){135 $dir_tmp = sous_repertoire(_DIR_TMP, "versions_fragments_corrompus");140 if (unserialize($fragment) === false AND strncmp($fragment, "corrompu", 8) !== 0) { 141 $dir_tmp = sous_repertoire(_DIR_TMP, "versions_fragments_corrompus"); 136 142 $set['fragment'] = revisions_repair_serialise($fragment); 137 if (strncmp($set['fragment'], "corrompu",8)==0){143 if (strncmp($set['fragment'], "corrompu", 8) == 0) { 138 144 $f = $row['id_fragment'] . "-" . $row['objet'] . "-" . $row['id_objet']; 139 145 spip_log("Fragment serialize corrompu $f", "maj" . _LOG_ERREUR); … … 142 148 } 143 149 } 144 sql_updateq("spip_versions_fragments",$set,$w = "id_fragment=".intval($row['id_fragment'])." AND id_objet=".intval($row['id_objet'])." AND objet=".sql_quote($row['objet'])." AND version_min=".intval($row['version_min'])); 150 sql_updateq("spip_versions_fragments", $set, 151 $w = "id_fragment=" . intval($row['id_fragment']) . " AND id_objet=" . intval($row['id_objet']) . " AND objet=" . sql_quote($row['objet']) . " AND version_min=" . intval($row['version_min'])); 145 152 #spip_log($w,"maj"); 146 153 147 if (time()>_TIME_OUT) return; 148 } 149 } 150 151 function revisions_repair_serialise($serialize){ 152 if (unserialize($serialize)) 154 if (time() > _TIME_OUT) { 155 return; 156 } 157 } 158 } 159 160 function revisions_repair_serialise($serialize) { 161 if (unserialize($serialize)) { 153 162 return $serialize; 163 } 154 164 155 165 // verifier les strings 156 preg_match_all(",s:(\d+):\"(.*)\";(?=}|\w:\d+),Uims", $serialize,$matches,PREG_SET_ORDER);166 preg_match_all(",s:(\d+):\"(.*)\";(?=}|\w:\d+),Uims", $serialize, $matches, PREG_SET_ORDER); 157 167 $serialize_repair = $serialize; 158 foreach ($matches as $match){168 foreach ($matches as $match) { 159 169 $s = $match[2]; 160 170 $l = $match[1]; 161 if (strlen($s) !==$l){162 if (strlen($s) <$l){163 $s = str_replace("\r\n", "\n",$s);164 $s = str_replace("\r", "\n",$s);165 $s = str_replace("\n", "\r\n",$s);166 } 167 if (strlen($s) >$l){168 $s = str_replace("\r\n", "\n",$s);169 $s = str_replace("\r", "\n",$s);170 } 171 if (strlen($s) <$l){172 $s .= str_pad("", $l-strlen($s)," ");173 } 174 if (strlen($s) ==$l){175 $s = str_replace($match[2], $s,$match[0]);176 $serialize_repair = str_replace($match[0], $s,$serialize_repair);177 } 178 } 179 } 180 if (unserialize($serialize_repair)) 171 if (strlen($s) !== $l) { 172 if (strlen($s) < $l) { 173 $s = str_replace("\r\n", "\n", $s); 174 $s = str_replace("\r", "\n", $s); 175 $s = str_replace("\n", "\r\n", $s); 176 } 177 if (strlen($s) > $l) { 178 $s = str_replace("\r\n", "\n", $s); 179 $s = str_replace("\r", "\n", $s); 180 } 181 if (strlen($s) < $l) { 182 $s .= str_pad("", $l-strlen($s), " "); 183 } 184 if (strlen($s) == $l) { 185 $s = str_replace($match[2], $s, $match[0]); 186 $serialize_repair = str_replace($match[0], $s, $serialize_repair); 187 } 188 } 189 } 190 if (unserialize($serialize_repair)) { 181 191 return $serialize_repair; 192 } 182 193 183 194 // on essaye brutalement 184 195 $serialize_repair = $serialize; 185 $serialize_repair = str_replace("\r\n", "\n",$serialize_repair);186 $serialize_repair = str_replace("\r", "\n",$serialize_repair);187 if (unserialize($serialize_repair)) 196 $serialize_repair = str_replace("\r\n", "\n", $serialize_repair); 197 $serialize_repair = str_replace("\r", "\n", $serialize_repair); 198 if (unserialize($serialize_repair)) { 188 199 return $serialize_repair; 189 $serialize_repair = str_replace("\n","\r\n",$serialize_repair); 190 if (unserialize($serialize_repair)) 200 } 201 $serialize_repair = str_replace("\n", "\r\n", $serialize_repair); 202 if (unserialize($serialize_repair)) { 191 203 return $serialize_repair; 204 } 192 205 193 206 #echo "Impossible de reparer la chaine :"; … … 195 208 #var_dump($matches); 196 209 #die("corrompu-serialize"); 197 return 210 return "corrompu-serialize"; 198 211 } 199 212 … … 213 226 /** 214 227 * Mettre a jour la meta des versions 228 * 215 229 * @return void 216 230 */ 217 function revisions_upate_meta() {231 function revisions_upate_meta() { 218 232 // Si dans une installation antérieure ou un upgrade, les articles étaient versionnés 219 233 // On crée la meta correspondante 220 234 // mettre les metas par defaut 221 $config = charger_fonction('config', 'inc');235 $config = charger_fonction('config', 'inc'); 222 236 $config(); 223 if (isset($GLOBALS['meta']['articles_versions']) and $GLOBALS['meta']['articles_versions'] == 'oui') {224 ecrire_meta('objets_versions', serialize(array('articles')));237 if (isset($GLOBALS['meta']['articles_versions']) and $GLOBALS['meta']['articles_versions'] == 'oui') { 238 ecrire_meta('objets_versions', serialize(array('articles'))); 225 239 } 226 240 effacer_meta('articles_versions'); 227 if (!$versions = unserialize($GLOBALS['meta']['objets_versions'])) 241 if (!$versions = unserialize($GLOBALS['meta']['objets_versions'])) { 228 242 $versions = array(); 229 $versions = array_map('table_objet_sql',$versions); 230 ecrire_meta('objets_versions',serialize($versions)); 243 } 244 $versions = array_map('table_objet_sql', $versions); 245 ecrire_meta('objets_versions', serialize($versions)); 231 246 } 232 247 -
_core_/plugins/revisions/revisions_ieconfig.php
r65096 r93622 2 2 3 3 /** 4 * Enregistrer les config avec le plugin IEConfig 4 * Enregistrer les config avec le plugin IEConfig 5 5 * 6 6 * @package SPIP\Revisions\Pipelines 7 **/ 8 if (!defined("_ECRIRE_INC_VERSION")) return; 7 **/ 8 if (!defined("_ECRIRE_INC_VERSION")) { 9 return; 10 } 9 11 10 12 /** … … 12 14 * 13 15 * @pipeline ieconfig_metas 14 * @param array $table 16 * @param array $table Description des configurations 15 17 * @return array Description des configurations 16 **/17 function revisions_ieconfig_metas($table) {18 **/ 19 function revisions_ieconfig_metas($table) { 18 20 $table['revisions']['titre'] = _T('revisions:titre_revisions'); 19 21 $table['revisions']['icone'] = 'revision-16.png'; 20 22 $table['revisions']['metas_serialize'] = 'objets_versions'; 21 23 22 24 return $table; 23 25 }
Note: See TracChangeset
for help on using the changeset viewer.