]> CyberLeo.Net >> Repos - SourceForge/phpwiki.git/blob - lib/plugin/Diff.php
getName should not translate
[SourceForge/phpwiki.git] / lib / plugin / Diff.php
1 <?php
2
3 /**
4  * Copyright 1999, 2000, 2001, 2002, 2004 $ThePhpWikiProgrammingTeam
5  *
6  * This file is part of PhpWiki.
7  *
8  * PhpWiki is free software; you can redistribute it and/or modify
9  * it under the terms of the GNU General Public License as published by
10  * the Free Software Foundation; either version 2 of the License, or
11  * (at your option) any later version.
12  *
13  * PhpWiki is distributed in the hope that it will be useful,
14  * but WITHOUT ANY WARRANTY; without even the implied warranty of
15  * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the
16  * GNU General Public License for more details.
17  *
18  * You should have received a copy of the GNU General Public License along
19  * with PhpWiki; if not, write to the Free Software Foundation, Inc.,
20  * 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301 USA.
21  */
22 /**
23  * lib/diff.php converted to a plugin by electrawn,
24  * plugin cleaned up by rurban,
25  * code by dairiki
26  *
27  * Would make sense to see arbitrary diff's between any files or revisions.
28  */
29
30 require_once 'lib/diff.php';
31
32 class WikiPlugin_Diff
33     extends WikiPlugin
34 {
35
36     function getDescription()
37     {
38         return _("Display differences between revisions.");
39     }
40
41     // Establish default values for each of this plugin's arguments.
42     // todo: makes only sense with more args.
43     function getDefaultArguments()
44     {
45         return array('pagename' => '[pagename]',
46             'versions' => false,
47             'version' => false,
48             'previous' => 'major', // author, minor or major
49         );
50     }
51
52     function PageInfoRow($label, $rev, &$request)
53     {
54
55         global $WikiTheme;
56
57         $row = HTML::tr(HTML::td(array('align' => 'right'), $label));
58         if ($rev) {
59             $author = $rev->get('author');
60             $dbi = $request->getDbh();
61
62             $iswikipage = (isWikiWord($author) && $dbi->isWikiPage($author));
63             $authorlink = $iswikipage ? WikiLink($author) : $author;
64
65             $linked_version = WikiLink($rev, 'existing', $rev->getVersion());
66             $row->pushContent(HTML::td(fmt("version %s", $linked_version)),
67                 HTML::td($WikiTheme->getLastModifiedMessage($rev,
68                     false)),
69                 HTML::td(fmt("by %s", $authorlink)));
70         } else {
71             $row->pushContent(HTML::td(array('colspan' => '3'), _("None")));
72         }
73         return $row;
74     }
75
76     function run($dbi, $argstr, &$request, $basepage)
77     {
78         extract($this->getArgs($argstr, $request));
79         if (is_array($versions)) {
80             // Version selection from pageinfo.php display:
81             rsort($versions);
82             list ($version, $previous) = $versions;
83         }
84
85         // Check if user is allowed to get the Page.
86         if (!mayAccessPage('view', $pagename)) {
87             return $this->error(sprintf(_("Illegal access to page %s: no read access"),
88                 $pagename));
89         }
90
91         // abort if page doesn't exist
92         $page = $request->getPage($pagename);
93         $current = $page->getCurrentRevision();
94         if ($current->getVersion() < 1) {
95             $html = HTML(HTML::p(fmt("Page ā€œ%sā€ does not exist.",
96                 WikiLink($pagename, 'unknown'))));
97             return $html; //early return
98         }
99
100         if ($version) {
101             if (!($new = $page->getRevision($version)))
102                 NoSuchRevision($request, $page, $version);
103             $new_version = fmt("version %d", $version);
104         } else {
105             $new = $current;
106             $new_version = _("current version");
107         }
108
109         if (preg_match('/^\d+$/', $previous)) {
110             if (!($old = $page->getRevision($previous)))
111                 NoSuchRevision($request, $page, $previous);
112             $old_version = fmt("version %d", $previous);
113             $others = array('major', 'minor', 'author');
114         } else {
115             switch ($previous) {
116                 case 'author':
117                     $old = $new;
118                     while ($old = $page->getRevisionBefore($old)) {
119                         if ($old->get('author') != $new->get('author'))
120                             break;
121                     }
122                     $old_version = _("revision by previous author");
123                     $others = array('major', 'minor');
124                     break;
125                 case 'minor':
126                     $old = $page->getRevisionBefore($new);
127                     $old_version = _("previous revision");
128                     $others = array('major', 'author');
129                     break;
130                 case 'major':
131                 default:
132                     $old = $new;
133                     while ($old && $old->get('is_minor_edit'))
134                         $old = $page->getRevisionBefore($old);
135                     if ($old)
136                         $old = $page->getRevisionBefore($old);
137                     $old_version = _("predecessor to the previous major change");
138                     $others = array('minor', 'author');
139                     break;
140             }
141         }
142
143         $new_link = WikiLink($new, '', $new_version);
144         $old_link = $old ? WikiLink($old, '', $old_version) : $old_version;
145         $page_link = WikiLink($page);
146
147         $html = HTML(HTML::p(fmt("Differences between %s and %s of %s.",
148             $new_link, $old_link, $page_link)));
149
150         $otherdiffs = HTML::p(_("Other diffs:"));
151         $label = array('major' => _("Previous Major Revision"),
152             'minor' => _("Previous Revision"),
153             'author' => _("Previous Author"));
154         foreach ($others as $other) {
155             $args = array('pagename' => $pagename, 'previous' => $other);
156             if ($version)
157                 $args['version'] = $version;
158             if (count($otherdiffs->getContent()) > 1)
159                 $otherdiffs->pushContent(", ");
160             else
161                 $otherdiffs->pushContent(" ");
162             $otherdiffs->pushContent(Button($args, $label[$other]));
163         }
164         $html->pushContent($otherdiffs);
165
166         if ($old and $old->getVersion() == 0)
167             $old = false;
168
169         $html->pushContent(HTML::Table($this->PageInfoRow(_("Newer page:"), $new,
170                 $request),
171             $this->PageInfoRow(_("Older page:"), $old,
172                 $request)));
173
174         if ($new && $old) {
175             $diff = new Diff($old->getContent(), $new->getContent());
176
177             if ($diff->isEmpty()) {
178                 $html->pushContent(HTML::hr(),
179                     HTML::p(_("Content of versions "), $old->getVersion(),
180                         _(" and "), $new->getVersion(), _(" is identical.")));
181                 // If two consecutive versions have the same content, it is because the page was
182                 // renamed, or metadata changed: ACL, owner, markup.
183                 // We give the reason by printing the summary.
184                 if (($new->getVersion() - $old->getVersion()) == 1) {
185                     $html->pushContent(HTML::p(_("Version "), $new->getVersion(),
186                         _(" was created because: "), $new->get('summary')));
187                 }
188             } else {
189                 $fmt = new HtmlUnifiedDiffFormatter;
190                 $html->pushContent($fmt->format($diff));
191             }
192         }
193
194         return $html;
195     }
196 }
197
198 // Local Variables:
199 // mode: php
200 // tab-width: 8
201 // c-basic-offset: 4
202 // c-hanging-comment-ender-p: nil
203 // indent-tabs-mode: nil
204 // End: