source: spip-zone/_core_/plugins/revisions/inc/suivi_versions.php @ 31476

Last change on this file since 31476 was 31476, checked in by kent1@…, 11 years ago

Les révisions sur les mots, les breves et peut être les groupes de mots?

File size: 9.8 KB
Line 
1<?php
2
3/***************************************************************************\
4 *  SPIP, Systeme de publication pour l'internet                           *
5 *                                                                         *
6 *  Copyright (c) 2001-2009                                                *
7 *  Arnaud Martin, Antoine Pitrou, Philippe Riviere, Emmanuel Saint-James  *
8 *                                                                         *
9 *  Ce programme est un logiciel libre distribue sous licence GNU/GPL.     *
10 *  Pour plus de details voir le fichier COPYING.txt ou l'aide en ligne.   *
11\***************************************************************************/
12
13if (!defined("_ECRIRE_INC_VERSION")) return;
14
15include_spip('inc/revisions');
16include_spip('inc/diff');
17
18// http://doc.spip.org/@afficher_para_modifies
19function afficher_para_modifies ($texte, $court = false) {
20        // Limiter la taille de l'affichage
21        if ($court) $max = 200;
22        else $max = 2000;
23
24        $paras = explode ("\n",$texte);
25        for ($i = 0; $i < count($paras) AND strlen($texte_ret) < $max; $i++) {
26                if (strpos($paras[$i], '"diff-')) $texte_ret .= $paras[$i]."\n\n";
27#               if (strlen($texte_ret) > $max) $texte_ret .= '(...)';
28        }
29        $texte = $texte_ret;
30        return $texte;
31}
32
33
34// Retourne le titre de la rubrique demandee, pour affichage de la chaine
35// "deplace de XX vers YY"
36// http://doc.spip.org/@titre_rubrique
37function titre_rubrique($id_rubrique) {
38        if (!$id = intval($id_rubrique))
39                return _T('info_sans_titre');
40
41        return typo(sql_getfetsel('titre', 'spip_rubriques', "id_rubrique=$id"));
42}
43
44
45// http://doc.spip.org/@afficher_suivi_versions
46function afficher_suivi_versions ($debut = 0, $id_secteur = 0, $uniq_auteur = false, $lang = "", $court = false,$type="") {
47        changer_typo($lang);
48        $lang_dir = lang_dir($lang);
49        $nb_aff = 10;
50
51        if ($uniq_auteur) {
52                $req_where = " AND id_auteur = $uniq_auteur";
53        }
54
55        //if (strlen($lang) > 0)
56        //      $req_where .= " AND articles.lang=" . sql_quote($lang);
57
58        //if ($id_secteur > 0)
59        //      $req_where .= " AND articles.id_secteur = ".intval($id_secteur);
60
61        //$req_where = "objet='article' AND versions.id_version > 1 $req_where";
62        $req_where = "id_version > 1 $req_where";
63
64        //$req_sel = "versions.id_version, versions.id_auteur, versions.date, versions.id_objet, versions.objet, articles.statut, articles.titre";
65        $req_sel = "id_version, id_auteur, date, id_objet, objet";
66        //$req_from = 'spip_versions AS versions LEFT JOIN spip_articles AS articles ON versions.id_objet = articles.id_article';
67
68        $liste_objets_versionnees = is_array(unserialize($GLOBALS['meta']['objets_versions'])) ? unserialize($GLOBALS['meta']['objets_versions']) : array();
69
70        $revisions = '';
71        $items = array();
72        $result = sql_select($req_sel, 'spip_versions', $req_where, '', 'date DESC', "$debut, $nb_aff");
73        while ($row = sql_fetch($result)) {
74                        $id_objet = $row['id_objet'];
75                        $objet = $row['objet'];
76                        $table_objet = table_objet($objet);
77                        if (autoriser('voir',$objet,$id_objet) && in_array($table_objet,$liste_objets_versionnees)){
78                                $table = table_objet_sql($objet);
79                                $id_table_objet = id_table_objet($objet);
80
81                                $row2 = sql_fetsel('*',$table,$id_table_objet.'='.$row['id_objet']);
82                                $statut = $row2['statut'] ? $row2['statut'] : 'publie';
83
84                                $id_version = $row['id_version'];
85                                $id_auteur = $row['id_auteur'];
86                                $date = $row['date'];
87                                $titre = typo(supprime_img($row2['titre'].' ('.$row['objet'].')',''));
88
89                                // l'id_auteur peut etre un numero IP (edition anonyme)
90                                if ($id_auteur == intval($id_auteur)
91                                AND $row_auteur = sql_fetsel('nom,email', 'spip_auteurs', "id_auteur = ".sql_quote($id_auteur))) {
92                                        $nom = typo($row_auteur["nom"]);
93                                        $email = $row_auteur['email'];
94                                } else {
95                                        $nom = $id_auteur;
96                                        $email = '';
97                                }
98
99                                $aff = revisions_bouton($id_objet,$objet, $id_auteur, $id_version, $titre, $statut, $date, $lang_dir, $nom);
100                                if (!$court) {
101                                                $bouton_id = "b$id_version-$id_article-$id_auteur";
102                                                $aff = bouton_block_depliable($aff,false,$bouton_id)
103                                                  . debut_block_depliable(false,$bouton_id)
104                                                  . revisions_diff ($id_objet,$objet, $id_version, $court)
105                                                  . fin_block();
106                                }
107                                $revisions .= "\n<div class='tr_liste' style='padding: 5px; border-top: 1px solid #aaaaaa;'>$aff</div>";
108                        }
109        }
110        if (!$revisions) return '';
111        else return
112          revisions_entete_boite($court, $debut, $id_secteur, $lang, $nb_aff, $req_from, $req_where, $uniq_auteur)
113          . $revisions
114          . fin_block()
115          . fin_cadre();
116}
117
118// http://doc.spip.org/@revisions_diff
119function revisions_diff ($id_objet,$objet, $id_version, $court=true)
120{
121        $textes = revision_comparee($id_objet,$objet, $id_version, 'diff');
122        if (!is_array($textes)) return $textes;
123        $rev = '';
124        $nb = 0;
125        foreach ($textes as $var => $t) {
126                if ($n=strlen($t)) {
127                        if ($court)
128                                $nb += $n;
129                        else {
130                                $aff = propre_diff($t);
131                                if ($GLOBALS['les_notes']) {
132                                        $aff .= '<p>'.$GLOBALS['les_notes'].'</p>';
133                                        $GLOBALS['les_notes'] = '';
134                                }
135                                $rev .= "<blockquote class='serif1'>$aff</blockquote>";
136                        }
137                }
138        }
139        return $court ? _T('taille_octets', array('taille' => $nb)) : $rev;
140}
141
142// http://doc.spip.org/@revisions_bouton
143function revisions_bouton($id_objet,$objet, $id_auteur, $id_version, $titre, $statut, $date, $lang_dir, $nom)
144{
145        $titre_bouton = "<span class='arial2'>";
146        $titre_bouton .= puce_statut($statut);
147        $titre_bouton .= "\n&nbsp;<a class='$statut' style='font-weight: bold;' href='" . generer_url_ecrire("objets_versions","objet=$objet&id_objet=$id_objet") . "'>$titre</a>";
148        $titre_bouton .= "<span class='arial1' dir='$lang_dir'>";
149        $titre_bouton .= "\n".date_relative($date)." "; # laisser un peu de privacy aux redacteurs
150        $titre_bouton .= "</span>";
151        if (strlen($nom)>0) $titre_bouton .= "($nom)";
152        $titre_bouton .= "</span>";
153        return $titre_bouton;
154}
155
156// http://doc.spip.org/@revisions_entete_boite
157function revisions_entete_boite($court, $debut, $id_secteur, $lang, $nb_aff, $req_from, $req_where, $uniq_auteur)
158{
159
160        $titre_table =  '<b>' . _T('icone_suivi_revisions').aide('suivimodif')  . '</b>';
161        if ($court)
162                $titre_table = afficher_plus(generer_url_ecrire("suivi_revisions"))
163                . $titre_table;
164
165        $total = sql_countsel($req_from, $req_where);
166        if ($total >= 150) $total = 149;
167        $id_liste = 't'.substr(md5("$req_where 149"),0,8);
168        $bouton = bouton_block_depliable($titre_table,true,$id_liste);
169        $revisions = debut_cadre('liste',"revision-24.png",'',$bouton)
170        . debut_block_depliable(true,$id_liste);
171
172        if ($total > $nb_aff) {
173                $nb_tranches = ceil($total / $nb_aff);
174
175                $revisions .= "\n<div class='arial2' style='background-color: #dddddd; padding: 5px;'>\n";
176
177                for ($i = 0; $i < $nb_tranches; $i++) {
178                        if ($i > 0) $revisions .= " | ";
179                        if ($i*$nb_aff == $debut)
180                                $revisions .= "<b>";
181                        else {
182                                $next = ($i * $nb_aff);
183                                $revisions .= "<a href='".generer_url_ecrire('suivi_revisions', "debut=$next&id_secteur=$id_secteur&id_auteur=$uniq_auteur&lang_choisie=$lang")."'>";
184                        }
185                        $revisions .= (($i * $nb_aff) + 1);
186                        if ($i*$nb_aff == $debut) $revisions .= "</b>";
187                        else $revisions .= "</a>";
188                }
189                $revisions .= "</div>";
190        }
191        return $revisions;
192}
193
194// retourne un array() des champs modifies a la version id_version
195// le format =
196//    - diff => seulement les modifs (suivi_revisions)
197//    - apercu => idem, mais en plus tres cout s'il y en a bcp
198//    - complet => tout, avec surlignage des modifications (objets_versions)
199// http://doc.spip.org/@revision_comparee
200function revision_comparee($id_objet, $objet, $id_version, $format='diff', $id_diff=NULL) {
201        include_spip('inc/diff');
202
203        // chercher le numero de la version precedente
204        if (!$id_diff) {
205                $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");
206        }
207
208        if ($id_version && $id_diff) {
209
210                // si l'ordre est inverse, on remet a l'endroit
211                if ($id_diff > $id_version) {
212                        $t = $id_version;
213                        $id_version = $id_diff;
214                        $id_diff = $t;
215                }
216
217                $old = recuperer_version($id_objet,$objet, $id_diff);
218                $new = recuperer_version($id_objet,$objet, $id_version);
219
220                $textes = array();
221
222                // Mode "diff": on ne s'interesse qu'aux champs presents dans $new
223                // Mode "complet": on veut afficher tous les champs
224                switch ($format) {
225                        case 'complet':
226                                $champs = liste_champs_versionnes('spip_articles','articles');
227                                break;
228                        case 'diff':
229                        case 'apercu':
230                        default:
231                                $champs = array_keys($new);
232                                break;
233                }
234
235                foreach ($champs as $champ) {
236                        // si la version precedente est partielle,
237                        // il faut remonter dans le temps
238                        $id_ref = $id_diff-1;
239                        while (!isset($old[$champ])
240                        AND $id_ref>0) {
241                                $prev = recuperer_version($id_objet,$objet, $id_ref--);
242                                if (isset($prev[$champ]))
243                                        $old[$champ] = $prev[$champ];
244                        }
245                        if (!strlen($new[$champ]) && !strlen($old[$champ])) continue;
246
247                        // si on n'a que le vieux, ou que le nouveau, on ne
248                        // l'affiche qu'en mode "complet"
249                        if ($format == 'complet')
250                                $textes[$champ] = strlen($new[$champ])
251                                        ? $new[$champ] : $old[$champ];
252
253                        // si on a les deux, le diff nous interesse, plus ou moins court
254                        if (isset($new[$champ])
255                        AND isset($old[$champ])) {
256                                // cas particulier : id_rubrique
257                                if (in_array($champ, array('id_rubrique'))) {
258                                        $textes[$champ] = _T('version_deplace_rubrique',
259                                                                                 array('from'=> titre_rubrique($old[$champ])
260                                                                                           ,'to'=>titre_rubrique($new[$champ]))
261                                                                                 );
262                                }
263
264                                // champs textuels
265                                else {
266                                        $diff = new Diff(new DiffTexte);
267                                        $n = preparer_diff($new[$champ]);
268                                        $o = preparer_diff($old[$champ]);
269                                        $textes[$champ] = afficher_diff($diff->comparer($n,$o));
270                                        if ($format == 'diff' OR $format == 'apercu')
271                                                $textes[$champ] = afficher_para_modifies($textes[$champ], ($format == 'apercu'));
272                                }
273                        }
274                }
275        }
276
277        // que donner par defaut ? (par exemple si id_version=1)
278        if (!$textes)
279                $textes = recuperer_version($id_objet,$objet, $id_version);
280
281        return $textes;
282}
283
284?>
Note: See TracBrowser for help on using the repository browser.