2 rcs_id('$Id: PageHistory.php,v 1.21 2002-02-25 03:33:10 carstenklapp Exp $');
5 require_once('lib/plugin/RecentChanges.php');
7 class _PageHistory_PageRevisionIter
8 extends WikiDB_PageRevisionIterator
10 function _PageHistory_PageRevisionIter($rev_iter, $params) {
12 $this->_iter = $rev_iter;
17 $this->_since = $since;
19 $this->_include_major = empty($exclude_major_revisions);
20 if (! $this->_include_major)
21 $this->_include_minor = true;
23 $this->_include_minor = !empty($include_minor_revisions);
25 if (empty($include_all_revisions))
27 else if (isset($limit))
28 $this->_limit = $limit;
35 if (isset($this->_limit)) {
36 if ($this->_limit <= 0) {
43 while ( ($rev = $this->_iter->next()) ) {
44 if (isset($this->_since) && $rev->get('mtime') < $this->_since) {
48 if ($rev->get('is_minor_edit') ? $this->_include_minor : $this->_include_major)
63 class _PageHistory_HtmlFormatter
64 extends _RecentChanges_HtmlFormatter
66 function include_versions_in_URLs() {
71 return array(fmt("PageHistory for %s",
72 WikiLink($this->_args['page'])),
77 function _javascript($script) {
78 return HTML::script(array('language' => 'JavaScript',
79 'type' => 'text/javascript'),
80 new RawXml("<!-- //\n$script\n// -->"));
83 function description() {
84 // Doesn't work (PHP bug?): $desc = parent::description() . "\n";
85 $button = HTML::input(array('type' => 'submit',
86 'value' => _("compare revisions"),
87 'class' => 'wikiaction'));
88 return array(_RecentChanges_HtmlFormatter::description(), "\n",
89 $this->_javascript(sprintf('document.write("%s");',
90 _("Check any two boxes to compare revisions."))),
91 HTML::noscript(fmt("Check any two boxes then %s.", $button)));
95 function format ($changes) {
96 $this->_itemcount = 0;
98 $pagename = $this->_args['page'];
100 $html[] = _RecentChanges_HtmlFormatter::format($changes);
102 $html[] = HTML::input(array('type' => 'hidden',
106 $action = WikiURL($pagename);
109 $action = SCRIPT_NAME;
110 $html[] = HTML::input(array('type' => 'hidden',
111 'name' => 'pagename',
112 'value' => $pagename));
115 return HTML(HTML::form(array('method' => 'get',
117 'name' => 'diff-select'),
121 var diffCkBoxes = document.forms["diff-select"].elements["versions[]"];
123 function diffCkBox_onclick() {
124 // If two checkboxes are checked, submit form
126 for (i = 0; i < diffCkBoxes.length; i++)
127 if (diffCkBoxes[i].checked && ++nchecked >= 2)
131 for (i = 0; i < diffCkBoxes.length; i++)
132 diffCkBoxes[i].onclick = diffCkBox_onclick;'));
135 function diffLink ($rev) {
136 return HTML::input(array('type' => 'checkbox',
137 'name' => 'versions[]',
138 'value' => $rev->getVersion()));
141 function pageLink ($rev) {
142 return HTML::a(array('href' => $this->pageURL($rev),
144 fmt("Version %d", $rev->getVersion()));
147 function format_revision ($rev) {
148 $class = 'rc-' . $this->importance($rev);
150 $time = $this->time($rev);
151 if ($rev->get('is_minor_edit')) {
152 $minor_flag = HTML(" ",
153 HTML::span(array('class' => 'pageinfo-minoredit'),
154 "(" . _("minor edit") . ")"));
157 $time = HTML::strong(array('class' => 'pageinfo-majoredit'), $time);
161 return HTML::li(array('class' => $class),
162 $this->diffLink($rev), ' ',
163 $this->pageLink($rev), ' ',
165 $this->summaryAsHTML($rev),
167 $this->authorLink($rev),
173 class _PageHistory_RssFormatter
174 extends _RecentChanges_RssFormatter
176 function include_versions_in_URLs() {
180 function image_properties () {
184 function textinput_properties () {
188 function channel_properties () {
191 $rc_url = WikiURL($request->getArg('pagename'), false, 'absurl');
193 $title = sprintf("%s: %s",
195 split_pagename($this->_args['page']));
197 return array('title' => $title,
198 'dc:description' => _("History of changes."),
200 'dc:date' => Iso8601DateTime(time()));
204 function item_properties ($rev) {
205 if (!($title = $this->summary($rev)))
206 $title = sprintf(_("Version %d"), $rev->getVersion());
208 return array( 'title' => $title,
209 'link' => $this->pageURL($rev),
210 'dc:date' => $this->time($rev),
211 'dc:contributor' => $rev->get('author'),
212 'wiki:version' => $rev->getVersion(),
213 'wiki:importance' => $this->importance($rev),
214 'wiki:status' => $this->status($rev),
215 'wiki:diff' => $this->diffURL($rev),
220 class WikiPlugin_PageHistory
221 extends WikiPlugin_RecentChanges
223 function getName () {
224 return _("PageHistory");
227 function getDescription () {
228 return sprintf(_("List PageHistory for %s"),'[pagename]');
231 function getDefaultArguments() {
232 return array('days' => false,
233 'show_minor' => true,
234 'show_major' => true,
236 'page' => '[pagename]',
240 function getDefaultFormArguments() {
241 $dflts = WikiPlugin_RecentChanges::getDefaultFormArguments();
242 $dflts['textinput'] = 'page';
246 function getMostRecentParams ($args) {
247 $params = WikiPlugin_RecentChanges::getMostRecentParams($args);
248 $params['include_all_revisions'] = true;
252 function getChanges ($dbi, $args) {
253 $page = $dbi->getPage($args['page']);
254 $iter = $page->getAllRevisions();
255 $params = $this->getMostRecentParams($args);
256 return new _PageHistory_PageRevisionIter($iter, $params);
259 function format ($changes, $args) {
261 $format = $args['format'];
263 $fmt_class = $Theme->getFormatter('PageHistory', $format);
265 if ($format == 'rss')
266 $fmt_class = '_PageHistory_RssFormatter';
268 $fmt_class = '_PageHistory_HtmlFormatter';
271 $fmt = new $fmt_class($args);
272 return $fmt->format($changes);
275 function run ($dbi, $argstr, $request) {
276 $args = $this->getArgs($argstr, $request);
277 if (empty($args['page']))
278 return $this->makeForm("", $request);
279 // Hack alert: format() is a NORETURN for rss formatters.
281 return $this->format($this->getChanges($dbi, $args), $args);
285 // (c-file-style: "gnu")
290 // c-hanging-comment-ender-p: nil
291 // indent-tabs-mode: nil