$t) { if ($n=strlen($t)) { if ($court) $nb += $n; else { $aff = propre_diff($t); if ($GLOBALS['les_notes']) { $aff .= '

'.$GLOBALS['les_notes'].'

'; $GLOBALS['les_notes'] = ''; } $rev .= "
$aff
"; } } } return $court ? _T('taille_octets', array('taille' => $nb)) : $rev; } /** * Retrouver le champ d'un objet, pour une version demandee * @param string $objet * @param int $id_objet * @param int $id_version * @param string $champ * @param array $champs */ function retrouver_champ_version_objet($objet,$id_objet,$id_version,$champ,&$champs){ if (isset($champs[$champ])) return; // Remonter dans le temps pour trouver le champ en question // pour la version demandee $id_ref = $id_version-1; $prev = array(); while (!isset($prev[$champ]) AND $id_ref>0) { $prev = recuperer_version($id_objet,$objet, $id_ref--); } if (isset($prev[$champ])) $champs[$champ] = $prev[$champ]; else { // le champ n'a jamais ete versionne : // il etait initialement vide if (strncmp($champ,'jointure_',9)==0) $champs[$champ] = ''; else $champs[$champ] = ''; } } /** * retourne un array() des champs modifies a la version id_version * le format = * - diff => seulement les modifs (page revisions) * - apercu => idem, mais en plus tres cout s'il y en a bcp * - complet => tout, avec surlignage des modifications (page revision) * * http://code.spip.net/@revision_comparee * * @param int $id_objet * @param string $objet * @param int $id_version * @param string $format * @param null $id_diff * @return array */ function revision_comparee($id_objet, $objet, $id_version, $format='diff', $id_diff=NULL) { include_spip('inc/diff'); // chercher le numero de la version precedente if (!$id_diff) { $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"); } if ($id_version && $id_diff) { // si l'ordre est inverse, on remet a l'endroit if ($id_diff > $id_version) { $t = $id_version; $id_version = $id_diff; $id_diff = $t; } $old = recuperer_version($id_objet,$objet, $id_diff); $new = recuperer_version($id_objet,$objet, $id_version); $textes = array(); // Mode "diff": on ne s'interesse qu'aux champs presents dans $new // Mode "complet": on veut afficher tous les champs switch ($format) { case 'complet': $champs = liste_champs_versionnes(table_objet_sql($objet)); break; case 'diff': case 'apercu': default: $champs = array_keys($new); break; } // memoriser les cas les plus courant $afficher_diff_champ = charger_fonction('champ','afficher_diff'); $afficher_diff_jointure = charger_fonction('jointure','afficher_diff'); foreach ($champs as $champ) { // Remonter dans le temps pour trouver le champ en question // pour chaque version retrouver_champ_version_objet($objet,$id_objet,$id_version,$champ,$new); retrouver_champ_version_objet($objet,$id_objet,$id_diff,$champ,$old); if (!strlen($new[$champ]) && !strlen($old[$champ])) continue; // si on n'a que le vieux, ou que le nouveau, on ne // l'affiche qu'en mode "complet" if ($format == 'complet') $textes[$champ] = strlen($new[$champ]) ? $new[$champ] : $old[$champ]; // si on a les deux, le diff nous interesse, plus ou moins court if (isset($new[$champ]) AND isset($old[$champ])) { if (!$afficher_diff = charger_fonction($objet."_".$champ,'afficher_diff',true) AND !$afficher_diff = charger_fonction($champ,'afficher_diff',true)) $afficher_diff = (strncmp($champ,'jointure_',9)==0?$afficher_diff_jointure:$afficher_diff_champ); $textes[$champ] = $afficher_diff($champ,$old[$champ],$new[$champ],$format); } } } // que donner par defaut ? (par exemple si id_version=1) if (!$textes) $textes = recuperer_version($id_objet,$objet, $id_version); return $textes; } ?>